Skip to content
Browse files

Too many things to mention minor and major things

Analyze-statistics has been improved.
-STATISTICS: If you enter correct diameter and density of filament you get correct weight.
-STATISTICS: There is an option for correcting printtime calculation but it is not really working as it only adds a certain delay per action.
-Extrusion calculation is a bit different.
-FILL: Fill should now be working better not sparing out tight spots.
-RAFT: First Layer travel feedrate added but works partly..
and a few minor things...
  • Loading branch information...
1 parent 8cd4d67 commit 1cc39a7740fa172b1c4fce26620f7aadfacbf4af @ahmetcemturan committed
Showing with 254 additions and 261 deletions.
  1. +9 −9 documentation/fabmetheus_utilities.euclidean.html
  2. +5 −5 documentation/skeinforge_application.skeinforge_plugins.craft_plugins.fill.html
  3. +18 −18 fabmetheus_utilities/euclidean.py
  4. +2 −2 fabmetheus_utilities/gcodec.py
  5. +1 −1 fabmetheus_utilities/version.txt
  6. +44 −33 skeinforge_application/skeinforge_plugins/analyze_plugins/statistic.py
  7. +3 −3 skeinforge_application/skeinforge_plugins/craft_plugins/Obsolete/feed.py
  8. +1 −1 skeinforge_application/skeinforge_plugins/craft_plugins/Obsolete/tower.py
  9. +0 −1 skeinforge_application/skeinforge_plugins/craft_plugins/carve.py
  10. +2 −3 skeinforge_application/skeinforge_plugins/craft_plugins/clip.py
  11. +1 −1 skeinforge_application/skeinforge_plugins/craft_plugins/comb.py
  12. +14 −12 skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py
  13. +75 −84 skeinforge_application/skeinforge_plugins/craft_plugins/fill.py
  14. +2 −2 skeinforge_application/skeinforge_plugins/craft_plugins/inset.py
  15. +2 −2 skeinforge_application/skeinforge_plugins/craft_plugins/jitter.py
  16. +1 −1 skeinforge_application/skeinforge_plugins/craft_plugins/lash.py
  17. +4 −4 skeinforge_application/skeinforge_plugins/craft_plugins/limit.py
  18. +57 −65 skeinforge_application/skeinforge_plugins/craft_plugins/raft.py
  19. +4 −4 skeinforge_application/skeinforge_plugins/craft_plugins/skin.py
  20. +1 −1 skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py
  21. +6 −7 skeinforge_application/skeinforge_plugins/craft_plugins/speed.py
  22. +1 −1 skeinforge_application/skeinforge_plugins/craft_plugins/wipe.py
  23. +1 −1 skeinforge_application/skeinforge_plugins/profile_plugins/extrusion.py
View
18 documentation/fabmetheus_utilities.euclidean.html
@@ -125,13 +125,13 @@
<dl><dt><a name="NestedBand-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;surrounding&nbsp;loop.</tt></dd></dl>
-<dl><dt><a name="NestedBand-addPerimeterInner"><strong>addPerimeterInner</strong></a>(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Add&nbsp;to&nbsp;the&nbsp;perimeter&nbsp;and&nbsp;the&nbsp;inner&nbsp;island.</tt></dd></dl>
+<dl><dt><a name="NestedBand-addPerimeterInner"><strong>addPerimeterInner</strong></a>(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Add&nbsp;to&nbsp;the&nbsp;perimeter&nbsp;and&nbsp;the&nbsp;inner&nbsp;island.</tt></dd></dl>
<dl><dt><a name="NestedBand-addToBoundary"><strong>addToBoundary</strong></a>(self, vector3)</dt><dd><tt>Add&nbsp;vector3&nbsp;to&nbsp;boundary.</tt></dd></dl>
<dl><dt><a name="NestedBand-addToLoop"><strong>addToLoop</strong></a>(self, vector3)</dt><dd><tt>Add&nbsp;vector3&nbsp;to&nbsp;loop.</tt></dd></dl>
-<dl><dt><a name="NestedBand-addToThreads"><strong>addToThreads</strong></a>(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Add&nbsp;to&nbsp;paths&nbsp;from&nbsp;the&nbsp;last&nbsp;location.&nbsp;perimeter&gt;inner&nbsp;&gt;fill&gt;paths&nbsp;or&nbsp;fill&gt;&nbsp;perimeter&gt;inner&nbsp;&gt;paths</tt></dd></dl>
+<dl><dt><a name="NestedBand-addToThreads"><strong>addToThreads</strong></a>(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Add&nbsp;to&nbsp;paths&nbsp;from&nbsp;the&nbsp;last&nbsp;location.&nbsp;perimeter&gt;inner&nbsp;&gt;fill&gt;paths&nbsp;or&nbsp;fill&gt;&nbsp;perimeter&gt;inner&nbsp;&gt;paths</tt></dd></dl>
<dl><dt><a name="NestedBand-getFillLoops"><strong>getFillLoops</strong></a>(self, penultimateFillLoops)</dt><dd><tt>Get&nbsp;last&nbsp;fill&nbsp;loops&nbsp;from&nbsp;the&nbsp;outside&nbsp;loop&nbsp;and&nbsp;the&nbsp;loops&nbsp;inside&nbsp;the&nbsp;inside&nbsp;loops.</tt></dd></dl>
@@ -139,9 +139,9 @@
<dl><dt><a name="NestedBand-getSurroundingBoundaries"><strong>getSurroundingBoundaries</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;boundary&nbsp;of&nbsp;the&nbsp;surronding&nbsp;loop&nbsp;plus&nbsp;any&nbsp;boundaries&nbsp;of&nbsp;the&nbsp;innerNestedRings.</tt></dd></dl>
-<dl><dt><a name="NestedBand-transferClosestFillLoops"><strong>transferClosestFillLoops</strong></a>(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Transfer&nbsp;closest&nbsp;fill&nbsp;loops.</tt></dd></dl>
+<dl><dt><a name="NestedBand-transferClosestFillLoops"><strong>transferClosestFillLoops</strong></a>(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Transfer&nbsp;closest&nbsp;fill&nbsp;loops.</tt></dd></dl>
-<dl><dt><a name="NestedBand-transferInfillPaths"><strong>transferInfillPaths</strong></a>(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Transfer&nbsp;the&nbsp;infill&nbsp;paths.</tt></dd></dl>
+<dl><dt><a name="NestedBand-transferInfillPaths"><strong>transferInfillPaths</strong></a>(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Transfer&nbsp;the&nbsp;infill&nbsp;paths.</tt></dd></dl>
<dl><dt><a name="NestedBand-transferPaths"><strong>transferPaths</strong></a>(self, paths)</dt><dd><tt>Transfer&nbsp;paths.</tt></dd></dl>
@@ -285,8 +285,8 @@
<dl><dt><a name="-addSegmentToPixelTable"><strong>addSegmentToPixelTable</strong></a>(beginComplex, endComplex, pixelDictionary, shortenDistanceBegin, shortenDistanceEnd, width)</dt><dd><tt>Add&nbsp;line&nbsp;segment&nbsp;to&nbsp;the&nbsp;pixel&nbsp;table.</tt></dd></dl>
<dl><dt><a name="-addSquareTwoToPixelDictionary"><strong>addSquareTwoToPixelDictionary</strong></a>(pixelDictionary, point, value, width)</dt><dd><tt>Add&nbsp;square&nbsp;with&nbsp;two&nbsp;pixels&nbsp;around&nbsp;the&nbsp;center&nbsp;to&nbsp;pixel&nbsp;dictionary.</tt></dd></dl>
<dl><dt><a name="-addSurroundingLoopBeginning"><strong>addSurroundingLoopBeginning</strong></a>(distanceFeedRate, loop, z)</dt><dd><tt>Add&nbsp;surrounding&nbsp;loop&nbsp;beginning&nbsp;to&nbsp;gcode&nbsp;output.</tt></dd></dl>
- <dl><dt><a name="-addToThreadsFromLoop"><strong>addToThreadsFromLoop</strong></a>(extrusionHalfWidth, gcodeType, loop, oldOrderedLocation, skein)</dt><dd><tt>Add&nbsp;to&nbsp;threads&nbsp;from&nbsp;the&nbsp;last&nbsp;location&nbsp;from&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-addToThreadsRemove"><strong>addToThreadsRemove</strong></a>(extrusionHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Add&nbsp;to&nbsp;threads&nbsp;from&nbsp;the&nbsp;last&nbsp;location&nbsp;from&nbsp;surrounding&nbsp;loops.</tt></dd></dl>
+ <dl><dt><a name="-addToThreadsFromLoop"><strong>addToThreadsFromLoop</strong></a>(extrusionSpacingHalfWidth, gcodeType, loop, oldOrderedLocation, skein)</dt><dd><tt>Add&nbsp;to&nbsp;threads&nbsp;from&nbsp;the&nbsp;last&nbsp;location&nbsp;from&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-addToThreadsRemove"><strong>addToThreadsRemove</strong></a>(extrusionSpacingHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Add&nbsp;to&nbsp;threads&nbsp;from&nbsp;the&nbsp;last&nbsp;location&nbsp;from&nbsp;surrounding&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-addValueSegmentToPixelTable"><strong>addValueSegmentToPixelTable</strong></a>(beginComplex, endComplex, pixelDictionary, value, width)</dt><dd><tt>Add&nbsp;line&nbsp;segment&nbsp;to&nbsp;the&nbsp;pixel&nbsp;table.</tt></dd></dl>
<dl><dt><a name="-addValueToOutput"><strong>addValueToOutput</strong></a>(depth, keyInput, output, value)</dt><dd><tt>Add&nbsp;value&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
<dl><dt><a name="-addXIntersectionIndexesFromLoop"><strong>addXIntersectionIndexesFromLoop</strong></a>(frontOverWidth, loop, solidIndex, xIntersectionIndexLists, width, yList)</dt><dd><tt>Add&nbsp;the&nbsp;x&nbsp;intersection&nbsp;indexes&nbsp;for&nbsp;a&nbsp;loop.</tt></dd></dl>
@@ -382,7 +382,7 @@
<dl><dt><a name="-getLoopConvexCentroid"><strong>getLoopConvexCentroid</strong></a>(polygonComplex)</dt><dd><tt>Get&nbsp;centroid&nbsp;of&nbsp;the&nbsp;convex&nbsp;hull&nbsp;of&nbsp;a&nbsp;complex&nbsp;polygon.</tt></dd></dl>
<dl><dt><a name="-getLoopInsideContainingLoop"><strong>getLoopInsideContainingLoop</strong></a>(containingLoop, loops)</dt><dd><tt>Get&nbsp;a&nbsp;loop&nbsp;that&nbsp;is&nbsp;inside&nbsp;the&nbsp;containing&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-getLoopLength"><strong>getLoopLength</strong></a>(polygon)</dt><dd><tt>Get&nbsp;the&nbsp;length&nbsp;of&nbsp;a&nbsp;polygon&nbsp;perimeter.</tt></dd></dl>
- <dl><dt><a name="-getLoopStartingNearest"><strong>getLoopStartingNearest</strong></a>(extrusionHalfWidth, location, loop)</dt><dd><tt>Add&nbsp;to&nbsp;threads&nbsp;from&nbsp;the&nbsp;last&nbsp;location&nbsp;from&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-getLoopStartingNearest"><strong>getLoopStartingNearest</strong></a>(extrusionSpacingHalfWidth, location, loop)</dt><dd><tt>Add&nbsp;to&nbsp;threads&nbsp;from&nbsp;the&nbsp;last&nbsp;location&nbsp;from&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-getLoopWithoutCloseEnds"><strong>getLoopWithoutCloseEnds</strong></a>(close, loop)</dt><dd><tt>Get&nbsp;loop&nbsp;without&nbsp;close&nbsp;ends.</tt></dd></dl>
<dl><dt><a name="-getLoopWithoutCloseSequentialPoints"><strong>getLoopWithoutCloseSequentialPoints</strong></a>(close, loop)</dt><dd><tt>Get&nbsp;loop&nbsp;without&nbsp;close&nbsp;sequential&nbsp;points.</tt></dd></dl>
<dl><dt><a name="-getMaximum"><strong>getMaximum</strong></a>(firstComplex, secondComplex)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;maximum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;complexes.</tt></dd></dl>
@@ -439,7 +439,7 @@
<dl><dt><a name="-getThreeSignificantFigures"><strong>getThreeSignificantFigures</strong></a>(number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;three&nbsp;significant&nbsp;figures&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
<dl><dt><a name="-getTopPath"><strong>getTopPath</strong></a>(path)</dt><dd><tt>Get&nbsp;the&nbsp;top&nbsp;of&nbsp;the&nbsp;path.</tt></dd></dl>
<dl><dt><a name="-getTopPaths"><strong>getTopPaths</strong></a>(paths)</dt><dd><tt>Get&nbsp;the&nbsp;top&nbsp;of&nbsp;the&nbsp;paths.</tt></dd></dl>
- <dl><dt><a name="-getTransferClosestSurroundingLoop"><strong>getTransferClosestSurroundingLoop</strong></a>(extrusionHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Get&nbsp;and&nbsp;transfer&nbsp;the&nbsp;closest&nbsp;remaining&nbsp;surrounding&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-getTransferClosestSurroundingLoop"><strong>getTransferClosestSurroundingLoop</strong></a>(extrusionSpacingHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence)</dt><dd><tt>Get&nbsp;and&nbsp;transfer&nbsp;the&nbsp;closest&nbsp;remaining&nbsp;surrounding&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-getTransferredPaths"><strong>getTransferredPaths</strong></a>(insides, loop)</dt><dd><tt>Get&nbsp;transferred&nbsp;paths&nbsp;from&nbsp;inside&nbsp;paths.</tt></dd></dl>
<dl><dt><a name="-getTransferredSurroundingLoops"><strong>getTransferredSurroundingLoops</strong></a>(insides, loop)</dt><dd><tt>Get&nbsp;transferred&nbsp;paths&nbsp;from&nbsp;inside&nbsp;surrounding&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-getTranslatedComplexPath"><strong>getTranslatedComplexPath</strong></a>(path, translateComplex)</dt><dd><tt>Get&nbsp;the&nbsp;translated&nbsp;complex&nbsp;path.</tt></dd></dl>
@@ -485,7 +485,7 @@
<dl><dt><a name="-subtractXIntersectionsTable"><strong>subtractXIntersectionsTable</strong></a>(subtractFromTable, subtractTable)</dt><dd><tt>Subtract&nbsp;the&nbsp;subtractTable&nbsp;from&nbsp;the&nbsp;subtractFromTable.</tt></dd></dl>
<dl><dt><a name="-swapList"><strong>swapList</strong></a>(elements, indexBegin, indexEnd)</dt><dd><tt>Swap&nbsp;the&nbsp;list&nbsp;elements.</tt></dd></dl>
<dl><dt><a name="-toggleHashtable"><strong>toggleHashtable</strong></a>(hashtable, key, value)</dt><dd><tt>Toggle&nbsp;a&nbsp;hashtable&nbsp;between&nbsp;having&nbsp;and&nbsp;not&nbsp;having&nbsp;a&nbsp;key.</tt></dd></dl>
- <dl><dt><a name="-transferClosestFillLoop"><strong>transferClosestFillLoop</strong></a>(extrusionHalfWidth, oldOrderedLocation, remainingFillLoops, skein)</dt><dd><tt>Transfer&nbsp;the&nbsp;closest&nbsp;remaining&nbsp;fill&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-transferClosestFillLoop"><strong>transferClosestFillLoop</strong></a>(extrusionSpacingHalfWidth, oldOrderedLocation, remainingFillLoops, skein)</dt><dd><tt>Transfer&nbsp;the&nbsp;closest&nbsp;remaining&nbsp;fill&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-transferClosestPath"><strong>transferClosestPath</strong></a>(oldOrderedLocation, remainingPaths, skein)</dt><dd><tt>Transfer&nbsp;the&nbsp;closest&nbsp;remaining&nbsp;path.</tt></dd></dl>
<dl><dt><a name="-transferClosestPaths"><strong>transferClosestPaths</strong></a>(oldOrderedLocation, remainingPaths, skein)</dt><dd><tt>Transfer&nbsp;the&nbsp;closest&nbsp;remaining&nbsp;paths.</tt></dd></dl>
<dl><dt><a name="-transferPathsToSurroundingLoops"><strong>transferPathsToSurroundingLoops</strong></a>(nestedRings, paths)</dt><dd><tt>Transfer&nbsp;paths&nbsp;to&nbsp;surrounding&nbsp;loops.</tt></dd></dl>
View
10 documentation/skeinforge_application.skeinforge_plugins.craft_plugins.fill.html
@@ -406,8 +406,8 @@
<dl><dt><a name="-addPathIndexSecondSegment"><strong>addPathIndexSecondSegment</strong></a>(gridPixel, pathIndexTable, pixelTable, segmentSecondPixel)</dt><dd><tt>Add&nbsp;the&nbsp;path&nbsp;index&nbsp;of&nbsp;the&nbsp;closest&nbsp;segment&nbsp;found&nbsp;toward&nbsp;the&nbsp;second&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-addPointOnPath"><strong>addPointOnPath</strong></a>(path, pathIndex, pixelTable, point, pointIndex, width)</dt><dd><tt>Add&nbsp;a&nbsp;point&nbsp;to&nbsp;a&nbsp;path&nbsp;and&nbsp;the&nbsp;pixel&nbsp;table.</tt></dd></dl>
<dl><dt><a name="-addPointOnPathIfFree"><strong>addPointOnPathIfFree</strong></a>(path, pathIndex, pixelTable, point, pointIndex, width)</dt><dd><tt>Add&nbsp;the&nbsp;closest&nbsp;point&nbsp;to&nbsp;a&nbsp;path,&nbsp;if&nbsp;the&nbsp;point&nbsp;added&nbsp;to&nbsp;a&nbsp;path&nbsp;is&nbsp;free.</tt></dd></dl>
- <dl><dt><a name="-addSparseEndpoints"><strong>addSparseEndpoints</strong></a>(doubleExtrusionWidth, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, solidSurfaceThickness, surroundingXIntersections)</dt><dd><tt>Add&nbsp;sparse&nbsp;endpoints.</tt></dd></dl>
- <dl><dt><a name="-addSparseEndpointsFromSegment"><strong>addSparseEndpointsFromSegment</strong></a>(doubleExtrusionWidth, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, segment, solidSurfaceThickness, surroundingXIntersections)</dt><dd><tt>Add&nbsp;sparse&nbsp;endpoints&nbsp;from&nbsp;a&nbsp;segment.</tt></dd></dl>
+ <dl><dt><a name="-addSparseEndpoints"><strong>addSparseEndpoints</strong></a>(doubleExtrusionSpacing, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, solidSurfaceThickness, surroundingXIntersections)</dt><dd><tt>Add&nbsp;sparse&nbsp;endpoints.</tt></dd></dl>
+ <dl><dt><a name="-addSparseEndpointsFromSegment"><strong>addSparseEndpointsFromSegment</strong></a>(doubleExtrusionSpacing, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, segment, solidSurfaceThickness, surroundingXIntersections)</dt><dd><tt>Add&nbsp;sparse&nbsp;endpoints&nbsp;from&nbsp;a&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-addYIntersectionPathToList"><strong>addYIntersectionPathToList</strong></a>(pathIndex, pointIndex, y, yIntersection, yIntersectionPaths)</dt><dd><tt>Add&nbsp;the&nbsp;y&nbsp;intersection&nbsp;path&nbsp;to&nbsp;the&nbsp;y&nbsp;intersection&nbsp;paths.</tt></dd></dl>
<dl><dt><a name="-compareDistanceFromCenter"><strong>compareDistanceFromCenter</strong></a>(self, other)</dt><dd><tt>Get&nbsp;comparison&nbsp;in&nbsp;order&nbsp;to&nbsp;sort&nbsp;y&nbsp;intersections&nbsp;in&nbsp;ascending&nbsp;order&nbsp;of&nbsp;distance&nbsp;from&nbsp;the&nbsp;center.</tt></dd></dl>
<dl><dt><a name="-comparePointIndexDescending"><strong>comparePointIndexDescending</strong></a>(self, other)</dt><dd><tt>Get&nbsp;comparison&nbsp;in&nbsp;order&nbsp;to&nbsp;sort&nbsp;y&nbsp;intersections&nbsp;in&nbsp;descending&nbsp;order&nbsp;of&nbsp;point&nbsp;index.</tt></dd></dl>
@@ -431,14 +431,14 @@
<dl><dt><a name="-isAddedPointOnPathFree"><strong>isAddedPointOnPathFree</strong></a>(path, pixelTable, point, pointIndex, width)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;point&nbsp;added&nbsp;to&nbsp;a&nbsp;path&nbsp;is&nbsp;intersecting&nbsp;the&nbsp;pixel&nbsp;table&nbsp;or&nbsp;the&nbsp;path.</tt></dd></dl>
<dl><dt><a name="-isAddedPointOnPathIntersectingPath"><strong>isAddedPointOnPathIntersectingPath</strong></a>(begin, path, point, pointIndex)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;point&nbsp;added&nbsp;to&nbsp;a&nbsp;path&nbsp;is&nbsp;intersecting&nbsp;the&nbsp;path&nbsp;by&nbsp;checking&nbsp;line&nbsp;intersection.</tt></dd></dl>
<dl><dt><a name="-isIntersectingLoopsPaths"><strong>isIntersectingLoopsPaths</strong></a>(loops, paths, pointBegin, pointEnd)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;segment&nbsp;between&nbsp;the&nbsp;first&nbsp;and&nbsp;second&nbsp;point&nbsp;is&nbsp;intersecting&nbsp;the&nbsp;loop&nbsp;list.</tt></dd></dl>
- <dl><dt><a name="-isPointAddedAroundClosest"><strong>isPointAddedAroundClosest</strong></a>(pixelTable, layerExtrusionWidth, paths, removedEndpointPoint, width)</dt><dd><tt>Add&nbsp;the&nbsp;closest&nbsp;removed&nbsp;endpoint&nbsp;to&nbsp;the&nbsp;path,&nbsp;with&nbsp;minimal&nbsp;twisting.</tt></dd></dl>
+ <dl><dt><a name="-isPointAddedAroundClosest"><strong>isPointAddedAroundClosest</strong></a>(pixelTable, layerExtrusionSpacing, paths, removedEndpointPoint, width)</dt><dd><tt>Add&nbsp;the&nbsp;closest&nbsp;removed&nbsp;endpoint&nbsp;to&nbsp;the&nbsp;path,&nbsp;with&nbsp;minimal&nbsp;twisting.</tt></dd></dl>
<dl><dt><a name="-isSegmentAround"><strong>isSegmentAround</strong></a>(aroundSegments, segment)</dt><dd><tt>Determine&nbsp;if&nbsp;there&nbsp;is&nbsp;another&nbsp;segment&nbsp;around.</tt></dd></dl>
<dl><dt><a name="-isSegmentCompletelyInAnIntersection"><strong>isSegmentCompletelyInAnIntersection</strong></a>(segment, xIntersections)</dt><dd><tt>Add&nbsp;sparse&nbsp;endpoints&nbsp;from&nbsp;a&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-isSegmentInX"><strong>isSegmentInX</strong></a>(segment, xFirst, xSecond)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;segment&nbsp;overlaps&nbsp;within&nbsp;x.</tt></dd></dl>
<dl><dt><a name="-isSharpCorner"><strong>isSharpCorner</strong></a>(beginComplex, centerComplex, endComplex)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;three&nbsp;complex&nbsp;points&nbsp;form&nbsp;a&nbsp;sharp&nbsp;corner.</tt></dd></dl>
- <dl><dt><a name="-isSidePointAdded"><strong>isSidePointAdded</strong></a>(pixelTable, closestPath, closestPathIndex, closestPointIndex, layerExtrusionWidth, removedEndpointPoint, width)</dt><dd><tt>Add&nbsp;side&nbsp;point&nbsp;along&nbsp;with&nbsp;the&nbsp;closest&nbsp;removed&nbsp;endpoint&nbsp;to&nbsp;the&nbsp;path,&nbsp;with&nbsp;minimal&nbsp;twisting.</tt></dd></dl>
+ <dl><dt><a name="-isSidePointAdded"><strong>isSidePointAdded</strong></a>(pixelTable, closestPath, closestPathIndex, closestPointIndex, layerExtrusionSpacing, removedEndpointPoint, width)</dt><dd><tt>Add&nbsp;side&nbsp;point&nbsp;along&nbsp;with&nbsp;the&nbsp;closest&nbsp;removed&nbsp;endpoint&nbsp;to&nbsp;the&nbsp;path,&nbsp;with&nbsp;minimal&nbsp;twisting.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;fill&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-removeEndpoints"><strong>removeEndpoints</strong></a>(pixelTable, layerExtrusionWidth, paths, removedEndpoints, aroundWidth)</dt><dd><tt>Remove&nbsp;endpoints&nbsp;which&nbsp;are&nbsp;added&nbsp;to&nbsp;the&nbsp;path.</tt></dd></dl>
+ <dl><dt><a name="-removeEndpoints"><strong>removeEndpoints</strong></a>(pixelTable, layerExtrusionSpacing, paths, removedEndpoints, aroundWidth)</dt><dd><tt>Remove&nbsp;endpoints&nbsp;which&nbsp;are&nbsp;added&nbsp;to&nbsp;the&nbsp;path.</tt></dd></dl>
<dl><dt><a name="-setIsOutside"><strong>setIsOutside</strong></a>(yCloseToCenterPath, yIntersectionPaths)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;yCloseToCenterPath&nbsp;is&nbsp;outside.</tt></dd></dl>
<dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName, shouldAnalyze<font color="#909090">=True</font>)</dt><dd><tt>Fill&nbsp;an&nbsp;inset&nbsp;gcode&nbsp;file.</tt></dd></dl>
</td></tr></table><p>
View
36 fabmetheus_utilities/euclidean.py
@@ -199,9 +199,9 @@ def addSurroundingLoopBeginning( distanceFeedRate, loop, z ):
pointVector3 = Vector3(point.real, point.imag, z)
distanceFeedRate.addLine( distanceFeedRate.getBoundaryLine( pointVector3 ) )
-def addToThreadsFromLoop(extrusionHalfWidth, gcodeType, loop, oldOrderedLocation, skein):
+def addToThreadsFromLoop(extrusionSpacingHalfWidth, gcodeType, loop, oldOrderedLocation, skein):
"""Add to threads from the last location from loop."""
- loop = getLoopStartingNearest(extrusionHalfWidth, oldOrderedLocation.dropAxis(), loop)
+ loop = getLoopStartingNearest(extrusionSpacingHalfWidth, oldOrderedLocation.dropAxis(), loop)
oldOrderedLocation.x = loop[0].real
oldOrderedLocation.y = loop[0].imag
gcodeTypeStart = gcodeType
@@ -212,10 +212,10 @@ def addToThreadsFromLoop(extrusionHalfWidth, gcodeType, loop, oldOrderedLocation
skein.addGcodeFromThreadZ(loop + [loop[0]], oldOrderedLocation.z)
skein.distanceFeedRate.addLine('(</%s>)' % gcodeType)
-def addToThreadsRemove(extrusionHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence):
+def addToThreadsRemove(extrusionSpacingHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence):
"""Add to threads from the last location from surrounding loops."""
while len(nestedRings) > 0:
- getTransferClosestSurroundingLoop(extrusionHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence)
+ getTransferClosestSurroundingLoop(extrusionSpacingHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence)
def addValueSegmentToPixelTable( beginComplex, endComplex, pixelDictionary, value, width ):
"""Add line segment to the pixel table."""
@@ -1159,12 +1159,12 @@ def getLoopLength( polygon ):
polygonLength += abs( point - secondPoint )
return polygonLength
-def getLoopStartingNearest(extrusionHalfWidth, location, loop):
+def getLoopStartingNearest(extrusionSpacingHalfWidth, location, loop):
"""Add to threads from the last location from loop."""
nearestIndex = getNearestDistanceIndex(location, loop).index
loop = getAroundLoop(nearestIndex, nearestIndex, loop)
nearestPoint = getNearestPointOnSegment(loop[0], loop[1], location)
- if abs(nearestPoint - loop[0]) > extrusionHalfWidth and abs(nearestPoint - loop[1]) > extrusionHalfWidth:
+ if abs(nearestPoint - loop[0]) > extrusionSpacingHalfWidth and abs(nearestPoint - loop[1]) > extrusionSpacingHalfWidth:
loop = [nearestPoint] + loop[1 :] + [loop[0]]
elif abs(nearestPoint - loop[0]) > abs(nearestPoint - loop[1]):
loop = loop[1 :] + [loop[0]]
@@ -1658,7 +1658,7 @@ def getTopPaths(paths):
top = max(top, point.z)
return top
-def getTransferClosestSurroundingLoop(extrusionHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence):
+def getTransferClosestSurroundingLoop(extrusionSpacingHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence):
"""Get and transfer the closest remaining surrounding loop."""
if len(nestedRings) > 0:
oldOrderedLocation.z = nestedRings[0].z
@@ -1670,7 +1670,7 @@ def getTransferClosestSurroundingLoop(extrusionHalfWidth, nestedRings, oldOrdere
closestDistance = distance
closestSurroundingLoop = remainingSurroundingLoop
nestedRings.remove(closestSurroundingLoop)
- closestSurroundingLoop.addToThreads(extrusionHalfWidth, oldOrderedLocation, skein, threadSequence)
+ closestSurroundingLoop.addToThreads(extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence)
return closestSurroundingLoop
def getTransferredPaths( insides, loop ):
@@ -2047,7 +2047,7 @@ def toggleHashtable( hashtable, key, value ):
else:
hashtable[key] = value
-def transferClosestFillLoop(extrusionHalfWidth, oldOrderedLocation, remainingFillLoops, skein):
+def transferClosestFillLoop(extrusionSpacingHalfWidth, oldOrderedLocation, remainingFillLoops, skein):
"""Transfer the closest remaining fill loop."""
closestDistance = 987654321987654321.0
closestFillLoop = None
@@ -2061,7 +2061,7 @@ def transferClosestFillLoop(extrusionHalfWidth, oldOrderedLocation, remainingFil
closestFillLoop = newClosestFillLoop
newClosestFillLoop = getLoopInsideContainingLoop(closestFillLoop, remainingFillLoops)
remainingFillLoops.remove(closestFillLoop)
- addToThreadsFromLoop(extrusionHalfWidth, 'loop', closestFillLoop[:], oldOrderedLocation, skein)
+ addToThreadsFromLoop(extrusionSpacingHalfWidth, 'loop', closestFillLoop[:], oldOrderedLocation, skein)
def transferClosestPath( oldOrderedLocation, remainingPaths, skein ):
"""Transfer the closest remaining path."""
@@ -2302,24 +2302,24 @@ def addToLoop(self, vector3):
self.loop.append(vector3.dropAxis())
self.z = vector3.z
- def addPerimeterInner(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence):
+ def addPerimeterInner(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence):
"""Add to the perimeter and the inner island."""
if self.loop is None:
skein.distanceFeedRate.addLine('(<perimeterPath>)')
transferClosestPaths(oldOrderedLocation, self.perimeterPaths[:], skein)
skein.distanceFeedRate.addLine('(</perimeterPath>)')
else:
- addToThreadsFromLoop(extrusionHalfWidth, 'perimeter', self.loop[:], oldOrderedLocation, skein)
+ addToThreadsFromLoop(extrusionSpacingHalfWidth, 'perimeter', self.loop[:], oldOrderedLocation, skein)
skein.distanceFeedRate.addLine('(</boundaryPerimeter>)')
- addToThreadsRemove(extrusionHalfWidth, self.innerNestedRings[:], oldOrderedLocation, skein, threadSequence)
+ addToThreadsRemove(extrusionSpacingHalfWidth, self.innerNestedRings[:], oldOrderedLocation, skein, threadSequence)
- def addToThreads(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence):
+ def addToThreads(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence):
"""Add to paths from the last location. perimeter>inner >fill>paths or fill> perimeter>inner >paths"""
addSurroundingLoopBeginning(skein.distanceFeedRate, self.boundary, self.z)
threadFunctionDictionary = {
'infill' : self.transferInfillPaths, 'loops' : self.transferClosestFillLoops, 'perimeter' : self.addPerimeterInner}
for threadType in threadSequence:
- threadFunctionDictionary[threadType](extrusionHalfWidth, oldOrderedLocation, skein, threadSequence)
+ threadFunctionDictionary[threadType](extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence)
skein.distanceFeedRate.addLine('(</nestedRing>)')
def getFillLoops(self, penultimateFillLoops):
@@ -2359,15 +2359,15 @@ def getSurroundingBoundaries(self):
surroundingBoundaries.append(nestedRing.boundary)
return surroundingBoundaries
- def transferClosestFillLoops(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence):
+ def transferClosestFillLoops(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence):
"""Transfer closest fill loops."""
if len( self.extraLoops ) < 1:
return
remainingFillLoops = self.extraLoops[:]
while len( remainingFillLoops ) > 0:
- transferClosestFillLoop(extrusionHalfWidth, oldOrderedLocation, remainingFillLoops, skein)
+ transferClosestFillLoop(extrusionSpacingHalfWidth, oldOrderedLocation, remainingFillLoops, skein)
- def transferInfillPaths(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence):
+ def transferInfillPaths(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence):
"""Transfer the infill paths."""
transferClosestPaths(oldOrderedLocation, self.infillPaths[:], skein)
View
4 fabmetheus_utilities/gcodec.py
@@ -385,8 +385,8 @@ def getLineWithZ(self, line, splitLine, z):
return getLineWithValueString('Z', line, splitLine, self.getRounded(z))
def getLineWithE(self, line, splitLine, e):
- """Get the line with a z."""
- return getLineWithValueString('E', line, splitLine, self.getRounded(z))
+ """Get the line with a e."""
+ return getLineWithValueString('E', line, splitLine, self.getRounded(e))
def getRounded(self, number):
"""Get number rounded to the number of carried decimal places as a string."""
View
2 fabmetheus_utilities/version.txt
@@ -1 +1 @@
-SFACT_V2.0 11.08.01 help at www.reprapfordummies.net
+SFACT_V3.0b 20.08.01 help at www.reprapfordummies.net
View
77 skeinforge_application/skeinforge_plugins/analyze_plugins/statistic.py
@@ -56,6 +56,7 @@
from fabmetheus_utilities import settings
from skeinforge_application.skeinforge_utilities import skeinforge_polyfile
from skeinforge_application.skeinforge_utilities import skeinforge_profile
+from skeinforge_application.skeinforge_plugins.craft_plugins import dimension
import cStringIO
import math
import sys
@@ -122,8 +123,9 @@ def __init__(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.calculatedPrintTime = settings.FloatSpin().getFromValue( 0, 'Calculated Print Time (seconds):', self,10000, 1 )
- self.realPrintTime = settings.FloatSpin().getFromValue( 0, 'Real Print Time (seconds):', self,10000, 1 )
+ self.calculatedPrintTime = settings.FloatSpin().getFromValue( 0, 'Calculated Print Time (seconds):', self,100000, 1 )
+ self.realPrintTime = settings.FloatSpin().getFromValue( 0, 'Real Print Time (seconds):', self,100000, 1 )
+ self.totalCommandsEntered = settings.FloatSpin().getFromValue( 0, 'Total Command Count:', self,100000, 1 )
settings.LabelSeparator().getFromRepository(self)
self.density = settings.FloatSpin().getFromValue( 500.0, 'Density (kg/m3):', self, 2000.0, 1000.0 )
self.fileNameInput = settings.FileNameInput().getFromFileName( [ ('Gcode text files', '*.gcode') ], 'Open File to Generate Statistics for', self, '')
@@ -187,35 +189,31 @@ def getCraftedGcode(self, gcodeText, repository):
roundedLow = euclidean.getRoundedPoint( self.cornerMinimum )
roundedExtent = euclidean.getRoundedPoint( extent )
axisString = " axis extrusion starts at "
- FilamentRadius = self.repository.FilamentDiameter.value /2
+ FilamentRadius = repository.FilamentDiameter.value /2
filamentCrossSectionArea = (FilamentRadius * FilamentRadius)*math.pi
- extrusionXSection =(((self.extrusionHeight+self.extrusionWidth)/2/2)*((self.extrusionHeight+self.extrusionWidth)/2/2))*math.pi
- volumeExtruded = extrusionXSection * self.totalDistanceExtruded
- mass = (volumeExtruded /1000)* repository.density.value /1000
- self.delay = (repository.realPrintTime.value - repository.calculatedPrintTime.value) / self.totalCommandcount
+ extrusionXSection =(((self.extrusionHeight+self.extrusionWidth)/4)**2)*math.pi
+ volumeExtruded = extrusionXSection * self.totalDistanceExtruded / 1000
+ mass = (volumeExtruded /1000)* repository.density.value
+ self.delay = (repository.realPrintTime.value - repository.calculatedPrintTime.value ) / repository.totalCommandsEntered.value
self.estimatedBuildTime = self.delay * self.totalCommandcount + self.totalBuildTime
machineTimeCost = repository.machineTime.value * self.estimatedBuildTime / 3600.0
self.filamentInOutRatio = filamentCrossSectionArea / ((((self.extrusionHeight+self.extrusionWidth)/4)*((self.extrusionHeight+self.extrusionWidth)/4)*math.pi))
- self.totalDistanceFilament = self.totalDistanceExtruded / self.filamentInOutRatio
+ self.totalDistanceFilament = self.totalDistanceExtruded
averageFeedRate = self.totalDistanceTraveled / self.estimatedBuildTime
+ materialCost = repository.material.value * mass /1000
- 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( "Procedures used (in sequence.." )
+ for procedure in self.procedures:
+ self.addLine(procedure)
self.addLine(' ')
- self.addLine('Extent')
+ self.addLine('Dimensions')
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( "Calculated Build time is %s." % euclidean.getDurationString(self.totalBuildTime))
- self.addLine( "Estimated Build time is %s." % euclidean.getDurationString( self.estimatedBuildTime))
- self.addLine( "Delay is %s seconds per command ." % self.delay )
- self.addLine( "Filament used is %s cm." % euclidean.getThreeSignificantFigures( self.totalDistanceFilament /10 ))
+ self.addLine('Statistics')
+
self.addLine( "Distance traveled is %s m." % euclidean.getThreeSignificantFigures( self.totalDistanceTraveled/1000 ) )
self.addLine( "Distance extruded is %s m." % euclidean.getThreeSignificantFigures( self.totalDistanceExtruded/1000 ) )
if self.extruderSpeed is not None:
@@ -225,33 +223,46 @@ def getCraftedGcode(self, gcodeText, repository):
self.addLine( "Feed rate average is %s mm/s, (%s mm/min)." % ( euclidean.getThreeSignificantFigures( averageFeedRate ), euclidean.getThreeSignificantFigures( 60.0 * averageFeedRate ) ) )
self.addLine( "A Total of %s commands will be executed." % self.totalCommandcount)
self.addLine(' ')
- self.addLine('Filament')
- self.addLine( "Cross section area is %s mm2." % euclidean.getThreeSignificantFigures( filamentCrossSectionArea ) )
- self.addLine('Filament In / Out ratio is %s' % euclidean.getThreeSignificantFigures (self.filamentInOutRatio))
+
+
+ self.addLine('Time')
+ self.addLine( "Calculated Build time is %s." % euclidean.getDurationString(self.totalBuildTime))
+ self.addLine( "Corrected Build time is %s." % euclidean.getDurationString( self.estimatedBuildTime))
+ self.addLine( "Delay is %s seconds per command ." % self.delay )
+
self.addLine(' ')
- self.addLine('Material')
+ self.addLine('Consumption')
self.addLine( "Extrusion Cross section area is %s mm2." % euclidean.getThreeSignificantFigures( extrusionXSection))
self.addLine( "Mass extruded is %s grams." % euclidean.getThreeSignificantFigures( mass ) )
self.addLine( "Volume extruded is %s cc." % euclidean.getThreeSignificantFigures( volumeExtruded) )
+ self.addLine( "Filament used is %s m." % euclidean.getThreeSignificantFigures( self.totalDistanceFilament /10000 ))
+
self.addLine(' ')
- self.addLine('Meta')
- self.addLine( "Text has %s lines and a size of %s KB." % ( self.numberOfLines, kilobytes ) )
- if self.version is not None:
- self.addLine( "Version is " + self.version )
+ 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( "Procedures" )
- for procedure in self.procedures:
- self.addLine(procedure)
+
if self.profileName is not None:
self.addLine(' ')
self.addLine( 'Profile' )
self.addLine(self.profileName)
self.addLine(' ')
- self.addLine('Slice')
+ self.addLine('Info')
self.addLine( "Layer thickness is %s mm." % euclidean.getThreeSignificantFigures( self.extrusionHeight ) )
self.addLine( "Perimeter width is %s mm." % euclidean.getThreeSignificantFigures( self.extrusionWidth ) )
-
-
+ self.addLine( "Filament Cross section area is %s mm2." % euclidean.getThreeSignificantFigures( filamentCrossSectionArea ) )
+ self.addLine('Filament In / Out ratio is %s' % euclidean.getThreeSignificantFigures (self.filamentInOutRatio))
+ self.addLine( "Text has %s lines and a size of %s KB." % ( self.numberOfLines, kilobytes ) )
+ self.addLine('')
+ if self.profileName is not None:
+ self.addLine(' ')
+ self.addLine( "Profile used to Skein: " )
+ self.addLine(self.profileName)
+ self.addLine( ' ' )
+ if self.version is not None:
+ self.addLine( "You are using SFACT Version " + self.version )
self.addLine(' ')
return self.output.getvalue()
View
6 skeinforge_application/skeinforge_plugins/craft_plugins/Obsolete/feed.py
@@ -92,7 +92,7 @@ def __init__(self):
self.activateFeed = settings.BooleanSetting().getFromValue('Activate Feed:', self, True)
self.mainFeed = 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.travelFeedRatePerSecond = settings.FloatSpin().getFromValue(2.0, 'Travel Feed Rate (mm/s):', self, 50.0, 16.0)
+ self.travelFeedRate = settings.FloatSpin().getFromValue(2.0, 'Travel Feed Rate (mm/s):', self, 50.0, 16.0)
self.executeTitle = 'Feed'
def execute(self):
@@ -117,7 +117,7 @@ def getCraftedGcode(self, gcodeText, repository):
"""Parse gcode text and store the feed gcode."""
self.repository = repository
self.mainFeed = repository.mainFeed.value
- self.travelFeedRateMinute = 60.0 * self.repository.travelFeedRatePerSecond.value
+ self.travelFeedRateMinute = 60.0 * self.repository.travelFeedRate.value
self.lines = archive.getTextLines(gcodeText)
self.parseInitialization()
for line in self.lines[self.lineIndex :]:
@@ -147,7 +147,7 @@ def parseInitialization(self):
self.absolutePerimeterWidth = abs(float(splitLine[1]))
self.distanceFeedRate.addTagBracketedLine('maximumZDrillFeedRatePerSecond', self.repository.maximumZDrillFeedRatePerSecond.value)
self.distanceFeedRate.addTagBracketedLine('operatingFeedRatePerSecond', self.mainFeed)
- self.distanceFeedRate.addTagBracketedLine('travelFeedRatePerSecond', self.repository.travelFeedRatePerSecond.value)
+ self.distanceFeedRate.addTagBracketedLine('travelFeedRate', self.repository.travelFeedRate.value)
self.distanceFeedRate.addLine(line)
def parseLine(self, line):
View
2 skeinforge_application/skeinforge_plugins/craft_plugins/Obsolete/tower.py
@@ -318,7 +318,7 @@ def parseInitialization(self):
self.minimumBelow = 0.1 * float(splitLine[1])
elif firstWord == '(<extrusionWidth>':
self.extrusionWidth = float(splitLine[1])
- elif firstWord == '(<travelFeedRatePerSecond>':
+ elif firstWord == '(<travelFeedRate>':
self.travelFeedRateMinute = 60.0 * float(splitLine[1])
self.distanceFeedRate.addLine(line)
View
1 skeinforge_application/skeinforge_plugins/craft_plugins/carve.py
@@ -202,7 +202,6 @@ def getCarvedSVG(self, carving, fileName, repository):
return ''
extrusionHeight = carving.getCarveLayerThickness()
decimalPlacesCarried = euclidean.getDecimalPlacesCarried(repository.extraDecimalPlaces.value, extrusionHeight)
- extrusionWidth = repository.extrusionWidth.value
svgWriter = svg_writer.SVGWriter(
repository.addLayerTemplateToSVG.value,
carving.getCarveCornerMaximum(),
View
5 skeinforge_application/skeinforge_plugins/craft_plugins/clip.py
@@ -269,12 +269,11 @@ def parseInitialization( self, clipRepository ):
elif firstWord == '(<extrusionWidth>':
self.extrusionWidth = float(splitLine[1])
absolutePerimeterWidth = abs( self.extrusionWidth )
- self.clipLength = (self.extrusionHeight - (clipRepository.clipOverPerimeterWidth.value * self.extrusionHeight * (math.pi/4)))*4
- #self.clipLength = (self.extrusionHeight - (clipRepository.clipOverPerimeterWidth.value * self.extrusionHeight * (math.pi/4)))*4
+ self.clipLength = (self.extrusionHeight - (self.extrusionHeight * (0.7853)))*2
self.connectingStepLength = 0.5 * absolutePerimeterWidth
self.layerPixelWidth = 0.1 * absolutePerimeterWidth
self.maximumConnectionDistance = clipRepository.maximumConnectionDistanceOverPerimeterWidth.value * absolutePerimeterWidth
- elif firstWord == '(<travelFeedRatePerSecond>':
+ elif firstWord == '(<travelFeedRate>':
self.travelFeedRateMinute = 60.0 * float(splitLine[1])
self.distanceFeedRate.addLine(line)
View
2 skeinforge_application/skeinforge_plugins/craft_plugins/comb.py
@@ -380,7 +380,7 @@ def parseInitialization( self, combRepository ):
self.combInset = 0.7 * extrusionWidth
self.betweenInset = 0.4 * extrusionWidth
self.uTurnWidth = 0.5 * self.betweenInset
- elif firstWord == '(<travelFeedRatePerSecond>':
+ elif firstWord == '(<travelFeedRate>':
self.travelFeedRateMinute = 60.0 * float(splitLine[1])
self.distanceFeedRate.addLine(line)
View
26 skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py
@@ -147,8 +147,8 @@ def __init__(self):
settings.LabelDisplay().getFromName('- Firmware Related Stuff -', self )
extrusionDistanceFormatLatentStringVar = settings.LatentStringVar()
self.extrusionDistanceFormatChoiceLabel = settings.LabelDisplay().getFromName('Extrusion Values should be: ', self )
- settings.Radio().getFromRadio( extrusionDistanceFormatLatentStringVar, 'in Absolute units (Sprinter, Marlin, SCFW, FiveD , a.o.)', self, True )
- self.relativeExtrusionDistance = settings.Radio().getFromRadio( extrusionDistanceFormatLatentStringVar, 'in Relative units (Teacup a.o.)', self, False )
+ settings.Radio().getFromRadio( extrusionDistanceFormatLatentStringVar, 'in Absolute units', self, True )
+ self.relativeExtrusionDistance = settings.Radio().getFromRadio( extrusionDistanceFormatLatentStringVar, 'in Relative units', self, False )
settings.LabelSeparator().getFromRepository(self)
self.executeTitle = 'Dimension'
@@ -170,12 +170,12 @@ def __init__(self):
self.isExtruderActive = False
self.layerIndex = -1
self.lineIndex = 0
- self.maximumZTravelFeedRatePerSecond = None
+ self.maximumZTravelFeedRate = None
self.oldLocation = None
self.operatingFlowRate = None
self.retractionRatio = 1.0
self.totalExtrusionDistance = 0.0
- self.travelFeedRatePerSecond = None
+ self.travelFeedRate = None
self.zDistanceRatio = 5.0
def addLinearMoveExtrusionDistanceLine( self, extrusionDistance ):
@@ -205,14 +205,16 @@ def getCraftedGcode(self, gcodeText, repository):
self.newfilamentPackingDensity = repository.filamentPackingDensity.value * self.calibrationFactor
print('****************Filament Packing Density (For Calibration)**********************:')
print( self.newfilamentPackingDensity )
- self.flowScaleSixty = 60.0 * ((((self.extrusionHeight+self.extrusionWidth)/4)*((self.extrusionHeight+self.extrusionWidth)/4)*math.pi)/filamentPackingArea) / self.calibrationFactor
+ self.flowScaleSixty = 60.0 * ((((self.extrusionHeight+self.extrusionWidth)/4) ** 2 * math.pi )/filamentPackingArea) / self.calibrationFactor
+ if self.calibrationFactor is None:
+ print('Mesaured extrusion width cant be 0, either un-check calibration or set mewsured width to what you have measured!')
if self.operatingFlowRate is 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 is not None and self.travelFeedRatePerSecond is not None:
- self.zDistanceRatio = self.travelFeedRatePerSecond / self.maximumZTravelFeedRatePerSecond
+ if self.maximumZTravelFeedRate is not None and self.travelFeedRate is not None:
+ self.zDistanceRatio = self.travelFeedRate / self.maximumZTravelFeedRate
for lineIndex in xrange(self.lineIndex, len(self.lines)):
self.parseLine( lineIndex )
return self.distanceFeedRate.output.getvalue()
@@ -342,9 +344,9 @@ def parseInitialization(self):
elif firstWord == '(<extrusionHeight>':
self.extrusionHeight = float(splitLine[1])
elif firstWord == '(<maximumZDrillFeedRatePerSecond>':
- self.maximumZTravelFeedRatePerSecond = float(splitLine[1])
- elif firstWord == '(<maximumZTravelFeedRatePerSecond>':
- self.maximumZTravelFeedRatePerSecond = float(splitLine[1])
+ self.maximumZTravelFeedRate = float(splitLine[1])
+ elif firstWord == '(<maximumZTravelFeedRate>':
+ self.maximumZTravelFeedRate = float(splitLine[1])
elif firstWord == '(<operatingFeedRatePerSecond>':
self.feedRateMinute = 60.0 * float(splitLine[1])
elif firstWord == '(<operatingFlowRate>':
@@ -352,8 +354,8 @@ def parseInitialization(self):
self.flowRate = self.operatingFlowRate
elif firstWord == '(<extrusionWidth>':
self.extrusionWidth = float(splitLine[1])
- elif firstWord == '(<travelFeedRatePerSecond>':
- self.travelFeedRatePerSecond = float(splitLine[1])
+ elif firstWord == '(<travelFeedRate>':
+ self.travelFeedRate = float(splitLine[1])
self.distanceFeedRate.addLine(line)
def parseLine( self, lineIndex ):
View
159 skeinforge_application/skeinforge_plugins/craft_plugins/fill.py
@@ -10,15 +10,11 @@
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.
+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.
+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.
@@ -31,8 +27,7 @@
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.
+The shells interior perimeter loops. Adding extra shells makes the object stronger & heavier.
====Extra Shells on Alternating Solid Layers====
Default is two.
@@ -234,16 +229,17 @@
import sys
-__author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
+__author__ = 'Enrique Perez (perez_enrique@yahoo.com) modified by Action68 (ahmetcemturan@gmail.com) SFACT home at reprafordummies.net'
__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, gridRadius, isBothOrNone, isDoubleJunction, isJunctionWide, paths, pixelTable, width ):
+def addAroundGridPoint( arounds, gridPoint, gridPointInsetX, gridPointInsetY, gridPoints, gridSearchRadius, isBothOrNone, isDoubleJunction, isJunctionWide, paths, pixelTable, width ):
"""Add the path around the grid point."""
closestPathIndex = None
aroundIntersectionPaths = []
+ gridSearchRadius = self.infillSpacing / self.infillSolidity #todo ACT fix it is it gridRadius
for aroundIndex in xrange( len(arounds) ):
loop = arounds[ aroundIndex ]
for pointIndex in xrange(len(loop)):
@@ -258,10 +254,10 @@ def addAroundGridPoint( arounds, gridPoint, gridPointInsetX, gridPointInsetY, gr
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 ) )
+ # 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 )
@@ -350,13 +346,13 @@ def addPointOnPathIfFree( path, pathIndex, pixelTable, point, pointIndex, width
if isAddedPointOnPathFree( path, pixelTable, point, pointIndex, width ):
addPointOnPath( path, pathIndex, pixelTable, point, pointIndex, width )
-def addSparseEndpoints( doubleExtrusionWidth, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, solidSurfaceThickness, surroundingXIntersections ):
+def addSparseEndpoints( doubleExtrusionSpacing, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, solidSurfaceThickness, surroundingXIntersections ):
"""Add sparse endpoints."""
horizontalEndpoints = horizontalSegmentLists[fillLine]
for segment in horizontalEndpoints:
- addSparseEndpointsFromSegment( doubleExtrusionWidth, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, segment, solidSurfaceThickness, surroundingXIntersections )
+ addSparseEndpointsFromSegment( doubleExtrusionSpacing, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, segment, solidSurfaceThickness, surroundingXIntersections )
-def addSparseEndpointsFromSegment( doubleExtrusionWidth, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, segment, solidSurfaceThickness, surroundingXIntersections ):
+def addSparseEndpointsFromSegment( doubleExtrusionSpacing, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, segment, solidSurfaceThickness, surroundingXIntersections ):
"""Add sparse endpoints from a segment."""
endpointFirstPoint = segment[0].point
endpointSecondPoint = segment[1].point
@@ -370,7 +366,7 @@ def addSparseEndpointsFromSegment( doubleExtrusionWidth, endpoints, fillLine, ho
if int( round( round( fillLine * infillSolidity ) / infillSolidity ) ) == fillLine:
endpoints += segment
return
- if abs( endpointFirstPoint - endpointSecondPoint ) < doubleExtrusionWidth:
+ if abs( endpointFirstPoint - endpointSecondPoint ) < doubleExtrusionSpacing:
endpoints += segment
return
if not isSegmentAround( horizontalSegmentLists[ fillLine - 1 ], segment ):
@@ -379,7 +375,7 @@ def addSparseEndpointsFromSegment( doubleExtrusionWidth, endpoints, fillLine, ho
if not isSegmentAround( horizontalSegmentLists[ fillLine + 1 ], segment ):
endpoints += segment
return
- if not solidSurfaceThickness:
+ if solidSurfaceThickness is 0:
removedEndpoints += segment
return
if isSegmentCompletelyInAnIntersection( segment, surroundingXIntersections ):
@@ -396,7 +392,8 @@ def addYIntersectionPathToList( pathIndex, pointIndex, y, yIntersection, yInters
yIntersectionPaths.append( yIntersectionPath )
def compareDistanceFromCenter(self, other):
- """Get comparison in order to sort y intersections in ascending order of distance from the center."""
+ """Get comparison in order to sort y intersections in ascending order of distance from the center. ACT"""
+
distanceFromCenter = abs( self.yMinusCenter )
distanceFromCenterOther = abs( other.yMinusCenter )
if distanceFromCenter > distanceFromCenterOther:
@@ -432,7 +429,7 @@ def createFillForSurroundings(nestedRings, radius, shouldExtraLoopsBeAdded):
def getAdditionalLength( path, point, pointIndex ):
"""Get the additional length added by inserting a point into a path."""
- if not pointIndex:
+ if pointIndex is 0:
return abs( point - path[0] )
if pointIndex == len(path):
return abs( point - path[-1] )
@@ -453,7 +450,7 @@ def getCraftedTextFromText(gcodeText, repository=None):
return FillSkein().getCraftedGcode( repository, gcodeText )
def getClosestOppositeIntersectionPaths( yIntersectionPaths ):
- """Get the close to center paths, starting with the first and an additional opposite if it exists."""
+ """Get the close to center paths, starting with the first and an additional opposite if it exists.""" #todo extra perimeters order
yIntersectionPaths.sort( compareDistanceFromCenter )
beforeFirst = yIntersectionPaths[0].yMinusCenter < 0.0
yCloseToCenterPaths = [ yIntersectionPaths[0] ]
@@ -465,8 +462,8 @@ def getClosestOppositeIntersectionPaths( yIntersectionPaths ):
return yCloseToCenterPaths
def getExtraFillLoops(loops, radius):
- """Get extra loops between inside and outside loops."""
- greaterThanRadius = 1.4 * radius
+ """Get extra loops between inside and outside loops. Extra perimeters"""
+ greaterThanRadius = radius / 0.7853 #todo was *1.4 ACT (radius /0.7853) how much the tight spots are covered by the extra loops
extraFillLoops = []
centers = intercircle.getCentersFromPoints(intercircle.getPointsFromLoops(loops, greaterThanRadius), greaterThanRadius)
for center in centers:
@@ -681,7 +678,7 @@ def isIntersectingLoopsPaths( loops, paths, pointBegin, pointEnd ):
# return True
# return False
-def isPointAddedAroundClosest( pixelTable, layerExtrusionWidth, paths, removedEndpointPoint, width ):
+def isPointAddedAroundClosest( pixelTable, layerExtrusionSpacing, paths, removedEndpointPoint, width ):
"""Add the closest removed endpoint to the path, with minimal twisting."""
closestDistanceSquared = 999999999987654321.0
closestPathIndex = None
@@ -695,14 +692,14 @@ def isPointAddedAroundClosest( pixelTable, layerExtrusionWidth, paths, removedEn
closestPathIndex = pathIndex
if closestPathIndex is None:
return
- if closestDistanceSquared < 0.8 * layerExtrusionWidth * layerExtrusionWidth:
+ if closestDistanceSquared < 0.88617 * layerExtrusionSpacing **2: #todo 0.8 idi maybe 0.88617
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, layerExtrusionWidth, removedEndpointPoint, width )
+ return isSidePointAdded( pixelTable, closestPath, closestPathIndex, closestPointIndex, layerExtrusionSpacing, removedEndpointPoint, width )
def isSegmentAround( aroundSegments, segment ):
"""Determine if there is another segment around."""
@@ -741,7 +738,7 @@ def isSharpCorner( beginComplex, centerComplex, endComplex ):
centerEndComplex /= centerEndLength
return euclidean.getDotProduct( centerBeginComplex, centerEndComplex ) > 0.9
-def isSidePointAdded( pixelTable, closestPath, closestPathIndex, closestPointIndex, layerExtrusionWidth, removedEndpointPoint, width ):
+def isSidePointAdded( pixelTable, closestPath, closestPathIndex, closestPointIndex, layerExtrusionSpacing, 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
@@ -769,7 +766,7 @@ def isSidePointAdded( pixelTable, closestPath, closestPathIndex, closestPointInd
else:
insertPointAfter = removedEndpointPoint
removedMinusClosestNormalized = removedMinusClosest / removedMinusClosestLength
- perpendicular = removedMinusClosestNormalized * complex( 0.0, layerExtrusionWidth )
+ perpendicular = removedMinusClosestNormalized * complex( 0.0, layerExtrusionSpacing )
sidePoint = removedEndpointPoint + perpendicular
#extra check in case the line to the side point somehow slips by the line to the perpendicular
sidePointOther = removedEndpointPoint - perpendicular
@@ -795,12 +792,12 @@ def isSidePointAdded( pixelTable, closestPath, closestPathIndex, closestPointInd
addPointOnPathIfFree( closestPath, closestPathIndex, pixelTable, insertPointAfter, closestPointIndex, width )
return True
-def removeEndpoints( pixelTable, layerExtrusionWidth, paths, removedEndpoints, aroundWidth ):
+def removeEndpoints( pixelTable, layerExtrusionSpacing, paths, 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( pixelTable, layerExtrusionWidth, paths, removedEndpointPoint, aroundWidth ):
+ if isPointAddedAroundClosest( pixelTable, layerExtrusionSpacing, paths, removedEndpointPoint, aroundWidth ):
removedEndpoints.remove( removedEndpoint )
def setIsOutside( yCloseToCenterPath, yIntersectionPaths ):
@@ -823,15 +820,15 @@ class FillRepository:
"""A class to handle the fill settings."""
def __init__(self):
"""Set the default settings, execute title & settings fileName."""
+ print ("initialising fill")
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('- Main Fill Settings -', self )
- self.infillSolidity = settings.FloatSpin().getFromValue( 0.05, 'Infill Solidity (ratio):', self, 1.00, 0.35 )
+ self.infillSolidity = settings.FloatSpin().getFromValue( 0.05, 'Infill Solidity (ratio):', self, 1.00, 0.35 )
self.infillSpacingScaler = settings.FloatSpin().getFromValue( 0.75, 'Extrusion Lines extra Spacing (Scaler):', self, 1.25, 1.0 )
self.infillPerimeterOverlap = settings.FloatSpin().getFromValue( 0.500, 'Infill Overlap over Perimeter (Scaler):', self, 1.500, 1.0 )
settings.LabelSeparator().getFromRepository(self)
@@ -841,12 +838,11 @@ def __init__(self):
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('- Top and Bottom Layers -', self )
+ settings.LabelDisplay().getFromName('- Top and Bottom Layers -', self )
self.solidSurfaceThickness = settings.IntSpin().getFromValue( 0, 'Fully filled Layers (each top and bottom):', self, 5, 2 )
settings.LabelSeparator().getFromRepository(self)
- settings.LabelDisplay().getFromName('- Extrusion Sequence -', self )
+ settings.LabelDisplay().getFromName('- Extrusion Sequence -', self )
self.startFromChoice = settings.MenuButtonDisplay().getFromName('Start New Layer From :', self)
self.startFromLowerLeft = settings.MenuRadio().getFromMenuButtonDisplay(self.startFromChoice, 'Lower Left', self, True)
self.startFromNearest = settings.MenuRadio().getFromMenuButtonDisplay(self.startFromChoice, 'Nearest', self, False)
@@ -859,10 +855,10 @@ def __init__(self):
self.threadSequencePerimeterInfill = settings.MenuRadio().getFromMenuButtonDisplay(self.threadSequenceChoice, 'Perimeter > Infill > Loops', self, False)
self.threadSequencePerimeterLoops = settings.MenuRadio().getFromMenuButtonDisplay(self.threadSequenceChoice, 'Perimeter > Loops > Infill', self, True)
settings.LabelSeparator().getFromRepository(self)
- settings.LabelDisplay().getFromName('- How to make the infill -', self )
+ settings.LabelDisplay().getFromName('- How to make the infill -', self )
self.infillPatternLabel = settings.LabelDisplay().getFromName('Infill Pattern:', self )
infillLatentStringVar = settings.LatentStringVar()
- self.infillPatternLine = settings.Radio().getFromRadio( infillLatentStringVar, 'Line', self, True )
+ self.infillPatternLine = settings.Radio().getFromRadio( infillLatentStringVar, 'Line', self, True )
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 )
@@ -896,7 +892,6 @@ class FillSkein:
def __init__(self):
self.bridgeWidthMultiplier = 1.0
self.distanceFeedRate = gcodec.DistanceFeedRate()
- self.infillSpacingScaler = 1
self.extruderActive = False
self.fillInset = 0.18
self.isPerimeter = False
@@ -912,17 +907,18 @@ def __init__(self):
self.thread = None
self.infillSpacing = None
+
def addFill(self, layerIndex):
"""Add fill to the carve layer."""
-# if layerIndex > 2:
-# return
+ # if layerIndex > 2:
+ # return
settings.printProgressByNumber(layerIndex, len(self.rotatedLayers), 'fill')
alreadyFilledArounds = []
pixelTable = {}
arounds = []
- infillSpacing = self.infillSpacing
- self.layerExtrusionWidth = self.infillSpacing
- layerFillInset = self.fillInset
+ betweenWidth = self.repository.infillSpacingScaler.value * self.extrusionWidth*0.5 *(0.7853)
+ self.layerExtrusionSpacing = self.infillSpacing # spacing between fill lines
+ layerFillInset = self.fillInset # the distance between perimeter incl loops and the fill pattern
rotatedLayer = self.rotatedLayers[layerIndex]
self.distanceFeedRate.addLine('(<layer> %s )' % rotatedLayer.z)
layerRotation = self.getLayerRotation(layerIndex)
@@ -940,15 +936,15 @@ def addFill(self, layerIndex):
extraShells = self.repository.extraShellsBase.value
if rotatedLayer.rotation is not None:
extraShells = 0
- infillSpacing *= self.bridgeWidthMultiplier
- self.layerExtrusionWidth *= self.bridgeWidthMultiplier
+ self.infillSpacing *= self.bridgeWidthMultiplier
+ self.layerExtrusionSpacing *= self.bridgeWidthMultiplier
layerFillInset *= self.bridgeWidthMultiplier
self.distanceFeedRate.addLine('(<bridgeRotation> %s )' % rotatedLayer.rotation)
- aroundInset = 0.25 * self.layerExtrusionWidth
- aroundWidth = 0.25 * self.layerExtrusionWidth
+ aroundInset = 0.25 * self.layerExtrusionSpacing
+ aroundWidth = 0.25 * self.layerExtrusionSpacing
self.lastExtraShells = extraShells
gridPointInsetX = 0.5 * layerFillInset
- doubleExtrusionWidth = 2.0 * self.layerExtrusionWidth
+ doubleExtrusionSpacing = 2.0 * self.layerExtrusionSpacing
endpoints = []
infillPaths = []
layerInfillSolidity = self.infillSolidity
@@ -962,17 +958,17 @@ def addFill(self, layerIndex):
else:
self.isJunctionWide = False
rotatedLoops = []
-# for nestedRing in rotatedLayer.nestedRings:
-# nestedRing.fillBoundaries = intercircle.getInsetLoopsFromLoop( nestedRing.boundary, infillSpacing )
-# nestedRing.lastExistingFillLoops = nestedRing.fillBoundaries
+ # for nestedRing in rotatedLayer.nestedRings:
+ # nestedRing.fillBoundaries = intercircle.getInsetLoopsFromLoop( nestedRing.boundary, betweenWidth )
+ # nestedRing.lastExistingFillLoops = nestedRing.fillBoundaries
nestedRings = euclidean.getOrderedNestedRings(rotatedLayer.nestedRings)
-# if isPerimeterPathInSurroundLoops( nestedRings ):
-# extraShells = 0
- createFillForSurroundings(nestedRings, infillSpacing, False)
+ # if isPerimeterPathInSurroundLoops( nestedRings ):
+ # extraShells = 0
+ createFillForSurroundings(nestedRings, betweenWidth, False)
for extraShellIndex in xrange(extraShells):
- createFillForSurroundings(nestedRings, self.layerExtrusionWidth, True)
+ createFillForSurroundings(nestedRings, self.layerExtrusionSpacing, True)
fillLoops = euclidean.getFillOfSurroundings(nestedRings, None)
- slightlyGreaterThanFill = 1.01 * layerFillInset
+ slightlyGreaterThanFill = 0.95 * layerFillInset #todo was 1.01 ACT 0.95 How much the parallel fill is filled
for loop in fillLoops:
alreadyFilledLoop = []
alreadyFilledArounds.append(alreadyFilledLoop)
@@ -994,11 +990,11 @@ def addFill(self, layerIndex):
return
back = euclidean.getBackOfLoops(arounds)
front = euclidean.getFrontOfLoops(arounds)
- front = math.ceil(front / self.layerExtrusionWidth) * self.layerExtrusionWidth
+ front = math.ceil(front / self.layerExtrusionSpacing) * self.layerExtrusionSpacing
fillWidth = back - front
- numberOfLines = int(math.ceil(fillWidth / self.layerExtrusionWidth))
+ numberOfLines = int(math.ceil(fillWidth / self.layerExtrusionSpacing))
self.frontOverWidth = 0.0
- self.horizontalSegmentLists = euclidean.getHorizontalSegmentListsFromLoopLists(alreadyFilledArounds, front, numberOfLines, rotatedLoops, self.layerExtrusionWidth)
+ self.horizontalSegmentLists = euclidean.getHorizontalSegmentListsFromLoopLists(alreadyFilledArounds, front, numberOfLines, rotatedLoops, self.layerExtrusionSpacing)
self.surroundingXIntersectionLists = []
self.yList = []
gridCircular = False
@@ -1008,16 +1004,16 @@ def addFill(self, layerIndex):
gridCircular = True
layerInfillSolidity = 0.0
xIntersectionIndexLists = []
- self.frontOverWidth = euclidean.getFrontOverWidthAddXListYList(front, surroundingCarves, numberOfLines, xIntersectionIndexLists, self.layerExtrusionWidth, self.yList)
+ self.frontOverWidth = euclidean.getFrontOverWidthAddXListYList(front, surroundingCarves, numberOfLines, xIntersectionIndexLists, self.layerExtrusionSpacing, self.yList)
for fillLine in xrange(len(self.horizontalSegmentLists)):
xIntersectionIndexList = xIntersectionIndexLists[fillLine]
surroundingXIntersections = euclidean.getIntersectionOfXIntersectionIndexes(self.doubleSolidSurfaceThickness, xIntersectionIndexList)
self.surroundingXIntersectionLists.append(surroundingXIntersections)
- addSparseEndpoints(doubleExtrusionWidth, endpoints, fillLine, self.horizontalSegmentLists, layerInfillSolidity, removedEndpoints, self.solidSurfaceThickness, surroundingXIntersections)
+ addSparseEndpoints(doubleExtrusionSpacing, endpoints, fillLine, self.horizontalSegmentLists, layerInfillSolidity, removedEndpoints, self.solidSurfaceThickness, surroundingXIntersections)
else:
for fillLine in xrange(len(self.horizontalSegmentLists)):
- addSparseEndpoints(doubleExtrusionWidth, endpoints, fillLine, self.horizontalSegmentLists, layerInfillSolidity, removedEndpoints, self.solidSurfaceThickness, None)
- paths = euclidean.getPathsFromEndpoints(endpoints, 5.0 * self.layerExtrusionWidth, pixelTable, aroundWidth)
+ addSparseEndpoints(doubleExtrusionSpacing, endpoints, fillLine, self.horizontalSegmentLists, layerInfillSolidity, removedEndpoints, self.solidSurfaceThickness, None)
+ paths = euclidean.getPathsFromEndpoints(endpoints, 5.0 * self.layerExtrusionSpacing, pixelTable, aroundWidth)
if gridCircular:
startAngle = euclidean.globalGoldenAngle * float(layerIndex)
for gridPoint in self.getGridPoints(fillLoops, reverseRotation):
@@ -1029,10 +1025,10 @@ def addFill(self, layerIndex):
oldRemovedEndpointLength = len(removedEndpoints) + 1
while oldRemovedEndpointLength - len(removedEndpoints) > 0:
oldRemovedEndpointLength = len(removedEndpoints)
- removeEndpoints(pixelTable, self.layerExtrusionWidth, paths, removedEndpoints, aroundWidth)
+ removeEndpoints(pixelTable, self.layerExtrusionSpacing, paths, removedEndpoints, aroundWidth)
paths = euclidean.getConnectedPaths(paths, pixelTable, aroundWidth)
for path in paths:
- addPath(self.layerExtrusionWidth, infillPaths, path, layerRotation)
+ addPath(self.layerExtrusionSpacing, infillPaths, path, layerRotation)
euclidean.transferPathsToSurroundingLoops(nestedRings, infillPaths)
self.addThreadsBridgeLayer(layerIndex, nestedRings, rotatedLayer)
@@ -1094,7 +1090,7 @@ def addGridCircle(self, center, infillPaths, layerRotation, pixelTable, rotatedL
euclidean.addLoopToPixelTable(loop, loopPixelDictionary, width)
if not euclidean.isPixelTableIntersecting(pixelTable, loopPixelDictionary):
if euclidean.getIsInFilledRegion(rotatedLoops, euclidean.getLeftPoint(loop)):
- addLoop(self.layerExtrusionWidth, infillPaths, loop, layerRotation)
+ addLoop(self.layerExtrusionSpacing, infillPaths, loop, layerRotation)
return
insideIndexPaths = []
insideIndexPath = None
@@ -1127,7 +1123,7 @@ def addGridCircle(self, center, infillPaths, layerRotation, pixelTable, rotatedL
if not len(path):
path.append(loop[insideIndex])
path.append(loop[(insideIndex + 1) % len(loop)])
- addPath(self.layerExtrusionWidth, infillPaths, path, layerRotation)
+ addPath(self.layerExtrusionSpacing, infillPaths, path, layerRotation)
def addGridLinePoints( self, begin, end, gridPoints, gridRotationAngle, offset, y ):
"""Add the segments of one line of a grid to the infill."""
@@ -1148,7 +1144,7 @@ def addRemainingGridPoints(
"""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 )
+ addAroundGridPoint( arounds, gridPoint, gridPointInsetX, gridPointInsetY, gridPoints, self.gridSearchRadius, isBothOrNone, self.isDoubleJunction, self.isJunctionWide, paths, pixelTable, width )
def addRotatedCarve(self, currentLayer, layerDelta, reverseRotation, surroundingCarves):
"""Add a rotated carve to the surrounding carves."""
@@ -1160,7 +1156,7 @@ def addRotatedCarve(self, currentLayer, layerDelta, reverseRotation, surrounding
for nestedRing in nestedRings:
planeRotatedLoop = euclidean.getPointsRoundZAxis(reverseRotation, nestedRing.boundary)
rotatedCarve.append(planeRotatedLoop)
- outsetRadius = float(abs(layerDelta)) * self.extrusionHeight
+ outsetRadius = float(abs(layerDelta)) * self.extrusionHeight #todo investigate
rotatedCarve = intercircle.getInsetSeparateLoopsFromLoops(-outsetRadius, rotatedCarve)
surroundingCarves.append(rotatedCarve)
@@ -1168,11 +1164,11 @@ def addThreadsBridgeLayer(self, layerIndex, nestedRings, rotatedLayer):
"""Add the threads, add the bridge end & the layer end tag."""
if self.oldOrderedLocation is None or self.repository.startFromLowerLeft.value:
self.oldOrderedLocation = getLowerLeftCorner(nestedRings)
- extrusionHalfWidth = 0.5 * self.layerExtrusionWidth
+ extrusionSpacingHalfWidth = 0.5 * self.layerExtrusionSpacing
threadSequence = self.threadSequence
if layerIndex < 1:
threadSequence = ['perimeter', 'loops', 'infill']
- euclidean.addToThreadsRemove(extrusionHalfWidth, nestedRings, self.oldOrderedLocation, self, threadSequence)
+ euclidean.addToThreadsRemove(extrusionSpacingHalfWidth, nestedRings, self.oldOrderedLocation, self, threadSequence)
if rotatedLayer.rotation is not None:
self.distanceFeedRate.addLine('(</bridgeRotation>)')
self.distanceFeedRate.addLine('(</layer>)')
@@ -1206,18 +1202,13 @@ def getCraftedGcode( self, repository, gcodeText ):
self.threadSequence = ['perimeter', 'infill', 'loops']
if repository.threadSequencePerimeterLoops.value:
self.threadSequence = ['perimeter', 'loops', 'infill']
- if self.repository.infillPerimeterOverlap.value > 0.45:
- print('Executing Fill procedure')
- print('Filling the inside of the Object(s)')
self.parseInitialization()
if self.extrusionWidth is None:
print('Warning, nothing will be done because self.extrusionWidth in getCraftedGcode in FillSkein was None.')
return ''
- #self.infillSpacing = ((self.extrusionHeight/2) * (((0.785))) *2)+(self.extrusionWidth - self.extrusionHeight)
- self.infillSpacing = (self.extrusionWidth * (((0.785))))
+ self.betweenWidth = self.extrusionWidth * self.repository.infillSpacingScaler.value *(0.7853)
print('Spacing between parallel lines in fill (mm):', (self.infillSpacing))
- #self.fillInset = self.extrusionHeight/2 *(((0.785)))*2+(self.extrusionWidth - self.extrusionHeight)/2
- self.fillInset = (self.extrusionWidth+self.extrusionHeight)/2*(((0.785)))
+ self.fillInset = self.infillSpacing / self.repository.infillPerimeterOverlap.value
print('Fill Overlap over Perimeter (mm):', self.fillInset)
self.infillSolidity = repository.infillSolidity.value
if self.isGridToBeExtruded():
@@ -1282,8 +1273,9 @@ def getLayerRotation(self, layerIndex):
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 and not gridXStep % 3:
- gridXStep += 1
+ if self.repository.infillPatternGridHexagonal.value:
+ if gridXStep % 3 == 0:
+ gridXStep += 1
return gridXStep
def isGridToBeExtruded(self):
@@ -1296,7 +1288,7 @@ 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.layerExtrusionWidth - self.frontOverWidth ) )
+ fillLine = int( round( gridPoint.imag / self.layerExtrusionSpacing - self.frontOverWidth ) )
if fillLine >= len( self.horizontalSegmentLists ) or fillLine < 0:
return False
lineSegments = self.horizontalSegmentLists[fillLine]
@@ -1327,7 +1319,7 @@ def parseInitialization(self):
self.extrusionWidth = float(splitLine[1])
threadSequenceString = ' '.join( self.threadSequence )
self.distanceFeedRate.addTagBracketedLine('threadSequenceString', threadSequenceString )
- self.infillSpacing = self.extrusionWidth * (((0.785)))
+ self.infillSpacing = self.extrusionWidth * self.repository.infillSpacingScaler.value * (0.7853)
self.distanceFeedRate.addTagRoundedLine('infillSpacing', self.infillSpacing)
elif firstWord == '(</extruderInitialization>)':
self.distanceFeedRate.addLine('(<procedureName> fill </procedureName>)')
@@ -1338,7 +1330,6 @@ def parseInitialization(self):
self.bridgeWidthMultiplier = float(splitLine[1])
elif firstWord == '(<extrusionHeight>':
self.extrusionHeight = float(splitLine[1])
-# self.distanceFeedRate.addTagRoundedLine('infillSpacing', self.infillSpacing)
self.distanceFeedRate.addLine(line)
def parseLine( self, lineIndex ):
View
4 skeinforge_application/skeinforge_plugins/craft_plugins/inset.py
@@ -372,8 +372,8 @@ def parseInitialization(self):
elif firstWord == '(<extrusionWidth>':
self.extrusionWidth = float(splitLine[1])
self.halfExtrusionWidth = 0.5 * self.extrusionWidth
- self.overlapRemovalWidth = self.extrusionWidth * (((0.785)))* self.repository.overlapRemovalWidthScaler.value
- #self.overlapRemovalWidth = (self.extrusionHeight/2*(((0.785)))*2)+(self.extrusionWidth-self.extrusionHeight)
+ self.overlapRemovalWidth = self.extrusionWidth * (0.7853) * self.repository.overlapRemovalWidthScaler.value
+
self.distanceFeedRate.addLine(line)
def parseLine(self, line):
View
4 skeinforge_application/skeinforge_plugins/craft_plugins/jitter.py
@@ -198,7 +198,7 @@ def parseInitialization( self, jitterRepository ):
elif firstWord == '(<extrusionWidth>':
self.extrusionWidth = float(splitLine[1])
self.jitter = jitterRepository.jitterOverPerimeterWidth.value * self.extrusionWidth
- elif firstWord == '(<travelFeedRatePerSecond>':
+ elif firstWord == '(<travelFeedRate>':
self.travelFeedRateMinute = 60.0 * float(splitLine[1])
self.distanceFeedRate.addLine(line)
@@ -222,7 +222,7 @@ def parseLine(self, line):
self.addTailoredLoopPath()
elif firstWord == '(<layer>':
self.layerCount.printProgressIncrement('jitter')
- self.layerGolden = math.fmod(self.layerGolden + 0.61803398874989479, 1.0)
+ self.layerGolden = math.fmod(self.layerGolden + 0.61803398874989479, 1.0) # x-n*y
self.layerJitter = self.jitter * self.layerGolden - 0.5
elif firstWord == '(<loop>' or firstWord == '(<perimeter>':
self.isLoopPerimeter = True
View
2 skeinforge_application/skeinforge_plugins/craft_plugins/lash.py
@@ -88,7 +88,7 @@ def __init__(self):
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 if you have backlash in your axes. \nBut its better to fix the mechanical problem!', self, False )
+ self.activateLash = settings.BooleanSetting().getFromValue('Activate Lash if you have backlash in your axes', self, False )
self.xBacklash = settings.FloatSpin().getFromValue( 0.0, 'X Backlash (mm):', self, 0.5, 0.0 )
self.yBacklash = settings.FloatSpin().getFromValue( 0.0, 'Y Backlash (mm):', self, 0.5, 0.0 )
self.executeTitle = 'Lash'
View
8 skeinforge_application/skeinforge_plugins/craft_plugins/limit.py
@@ -105,8 +105,8 @@ def __init__(self):
def getCraftedGcode(self, gcodeText, repository):
"""Parse gcode text and store the limit gcode."""
self.maximumZDrillFeedRatePerSecond = repository.maximumZFeedRatePerSecond.value
- self.maximumZTravelFeedRatePerSecond = repository.maximumZFeedRatePerSecond.value
- self.maximumZFeedRatePerSecond = self.maximumZTravelFeedRatePerSecond
+ self.maximumZTravelFeedRate = repository.maximumZFeedRatePerSecond.value
+ self.maximumZFeedRatePerSecond = self.maximumZTravelFeedRate
self.repository = repository
self.lines = archive.getTextLines(gcodeText)
self.parseInitialization()
@@ -163,7 +163,7 @@ def parseInitialization(self):
elif firstWord == '(<maximumZDrillFeedRatePerSecond>':
self.maximumZDrillFeedRatePerSecond = float(splitLine[1])
elif firstWord == '(<extrusionWidth>':
- self.distanceFeedRate.addTagBracketedLine('maximumZTravelFeedRatePerSecond', self.maximumZTravelFeedRatePerSecond )
+ self.distanceFeedRate.addTagBracketedLine('maximumZTravelFeedRate', self.maximumZTravelFeedRate )
self.distanceFeedRate.addLine(line)
def parseLine( self, lineIndex ):
@@ -183,7 +183,7 @@ def parseLine( self, lineIndex ):
elif firstWord == 'M101':
self.maximumZFeedRatePerSecond = self.maximumZDrillFeedRatePerSecond
elif firstWord == 'M103':
- self.maximumZFeedRatePerSecond = self.maximumZTravelFeedRatePerSecond
+ self.maximumZFeedRatePerSecond = self.maximumZTravelFeedRate
self.distanceFeedRate.addLine(line)
View
122 skeinforge_application/skeinforge_plugins/craft_plugins/raft.py
@@ -115,7 +115,7 @@
===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 g Rate Infill Multiplier, the thinner the infill, the lower the 'Object First Layer Feed Rate Infill Multiplier', the thicker the infill.
+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.
@@ -217,6 +217,7 @@
from skeinforge_application.skeinforge_utilities import skeinforge_polyfile
from skeinforge_application.skeinforge_utilities import skeinforge_profile
import math
+import os
import sys
@@ -229,10 +230,12 @@
#raft outline temperature http://hydraraptor.blogspot.com/2008/09/screw-top-pot.html
def getCraftedText( fileName, text='', repository=None):
"""Raft the file or text."""
+ print ('Calculating raft, base and supports')
return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository)
def getCraftedTextFromText(gcodeText, repository=None):
"""Raft a gcode linear move text."""
+ print ('parsing Gcode for raft - lines')
if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'raft'):
return gcodeText
if repository is None:
@@ -243,12 +246,14 @@ def getCraftedTextFromText(gcodeText, repository=None):
def getCrossHatchPointLine( crossHatchPointLineTable, y ):
"""Get the cross hatch point line."""
+ print ('Creating cross-hatch')
if not crossHatchPointLineTable.has_key(y):
crossHatchPointLineTable[ y ] = {}
return crossHatchPointLineTable[ y ]
def getEndpointsFromYIntersections( x, yIntersections ):
"""Get endpoints from the y intersections."""
+ print ('Getting Endpoints')
endpoints = []
for yIntersectionIndex in xrange( 0, len( yIntersections ), 2 ):
firstY = yIntersections[ yIntersectionIndex ]
@@ -283,8 +288,9 @@ def getExtendedLineSegment(extensionDistance, lineSegment, loopXIntersections):
def getLoopsBySegmentsDictionary(segmentsDictionary, width):
"""Get loops from a horizontal segments dictionary."""
+ print ('Getting loops')
points = []
- for endpoint in getVerticalEndpoints(segmentsDictionary, width, 0.1 * width, width):
+ for endpoint in getVerticalEndpoints(segmentsDictionary, width, 0.1*width, width): #todo 0.1 ??
points.append(endpoint.point)
for endpoint in euclidean.getEndpointsFromSegmentTable(segmentsDictionary):
points.append(endpoint.point)
@@ -296,6 +302,7 @@ def getNewRepository():
def getVerticalEndpoints(horizontalSegmentsTable, horizontalStep, verticalOverhang, verticalStep):
"""Get vertical endpoints."""
+ print ('Getting vertical Endpoints')
interfaceSegmentsTableKeys = horizontalSegmentsTable.keys()
interfaceSegmentsTableKeys.sort()
verticalTableTable = {}
@@ -342,6 +349,7 @@ class RaftRepository:
"""A class to handle the raft settings."""
def __init__(self):
"""Set the default settings, execute title & settings fileName."""
+ print ('Initalizing Raft repsitory')
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, '')
@@ -349,41 +357,27 @@ def __init__(self):
'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)
+ 'Add Raft Elevate Nozzle Orbit:', self, True)
settings.LabelSeparator().getFromRepository(self)
-
settings.LabelDisplay().getFromName('- Support -', self)
self.supportMaterialChoice = settings.MenuButtonDisplay().getFromName('Where to add support: ', 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, 'Add support if flatter than (degrees):', self, 80, 50)
+ 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, 'Add support if flatter than (degrees):', self, 80.0, 50.0)
self.supportCrossHatch = settings.BooleanSetting().getFromValue('Cross Hatch instead of Lines', self, False)
- self.interfaceInfillDensity = settings.FloatSpin().getFromValue(
- 0.1, 'Interface/Support Lines Density (ratio):', self, 0.5, 0.25)
- self.interfaceLayerThicknessOverLayerThickness = settings.FloatSpin().getFromValue(
- 0.8, 'Interface/Support Layer Thickness over Layer Thickness:', self, 1.5, 1.0)
- self.supportFeedRate = settings.FloatSpin().getFromValue(
- 10.0, 'Support Feed Rate mm/sec:', self, 50.0,15.0)
- self.supportFlowRateOverOperatingFlowRate = settings.FloatSpin().getFromValue(
- 0.5, 'Support Flow Rate (scaler):', self, 2.0, 1.0)
- self.supportGapOverPerimeterExtrusionWidth = settings.FloatSpin().getFromValue(
- 0.5, 'Support Gap over Perimeter Extrusion Width (ratio):', self, 1.5, 1.0)
- self.raftAdditionalMarginOverLengthPercent = settings.FloatSpin().getFromValue(
- 0.0, 'Raft/Support extension in (%):', self, 10.0, 5.0)
- self.raftMargin = settings.FloatSpin().getFromValue(
- 0.0, 'Raft/Support extension in(mm):', self, 5.0, 2.0)
+ self.interfaceInfillDensity = settings.FloatSpin().getFromValue(0.1, 'Interface/Support Lines Density (ratio):', self, 0.5, 0.25)
+ self.interfaceLayerThicknessOverLayerThickness = settings.FloatSpin().getFromValue( 0.8, 'Interface/Support Layer Thickness over Layer Thickness:', self, 1.5, 1.0)
+ self.supportFeedRate = settings.FloatSpin().getFromValue(10.0, 'Support Feed Rate mm/sec:', self, 50.0,15.0)
+ self.supportFlowRateScaler = settings.FloatSpin().getFromValue( 0.5, 'Support Flow Rate (scaler):', self, 2.0, 1.0)
+ self.supportGapOverPerimeterExtrusionWidth = settings.FloatSpin().getFromValue( 0.5, 'Support Gap over Perimeter Extrusion Width (ratio):', self, 1.5, 1.0)
+ self.raftAdditionalMarginOverLengthPercent = settings.FloatSpin().getFromValue( 0.0, 'Raft/Support extension in (%):', self, 10.0, 0.0)
+ self.raftMargin = settings.FloatSpin().getFromValue(0.0, 'Raft/Support extension in(mm):', self, 5.0, 2.0)
settings.LabelSeparator().getFromRepository(self)
settings.LabelDisplay().getFromName('- Name of Support Macro files (gcode) -', 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')
+ self.nameOfSupportEndFile = settings.StringSetting().getFromValue('Name of Support End File:', self, 'support_end.gmc')
+ self.nameOfSupportStartFile = settings.StringSetting().getFromValue('Name of Support Start File:', self, 'support_start.gmc')
settings.LabelSeparator().getFromRepository(self)
settings.LabelDisplay().getFromName('- Print Adhesion to Printbed Objects first layer -', self)
self.operatingNozzleLiftOverLayerThickness = settings.FloatSpin().getFromValue( -0.1, 'Extra Nozzle clearance over Object(ratio):', self, 0.3, 0.0)
@@ -412,11 +406,7 @@ def __init__(self):
self.initialCircling = settings.BooleanSetting().getFromValue('Initial Circling:', self, False)
self.infillOverhangOverExtrusionWidth = settings.FloatSpin().getFromValue(
0.0, 'Infill Overhang over Extrusion Width (ratio):', self, 5.0, 3.00)
-
settings.LabelSeparator().getFromRepository(self)
-
-
-
self.executeTitle = 'Raft'
def execute(self):
@@ -425,10 +415,10 @@ def execute(self):
for fileName in fileNames:
writeOutput(fileName)
-
-class RaftSkein:
+class RaftSkein :
"""A class to raft a skein of extrusions."""
def __init__(self):
+ print ('Skeining the Raft')
self.addLineLayerStart = True
self.baseTemperature = None
self.beginLoop = None
@@ -449,6 +439,7 @@ def __init__(self):
self.extrusionHeight = 0.4
self.lineIndex = 0
self.lines = None
+ self.isExtruderActive = False
self.objectFirstLayerInfillTemperature = None
self.objectFirstLayerPerimeterTemperature = None
self.objectNextLayersTemperature = None
@@ -461,17 +452,17 @@ def __init__(self):
self.operatingJump = None
self.orbitalFeedRatePerSecond = 2.01
self.extrusionWidth = 0.6
- self.supportFeedRate = 20
+ self.supportFeedRate = 33
self.supportFlowRate = None
self.supportLayers = []
self.supportLayersTemperature = None
self.supportedLayersTemperature = None
- self.travelFeedRateMinute = None
- self.isExtruderActive = False
- self.objectFirstLayerTravelSpeed = 20
+ self.travelFeedRateMinute = 55
+
def addBaseLayer(self):
"""Add a base layer."""
+ print ('adding Base Layer')
baseLayerThickness = self.extrusionHeight * self.baseLayerThicknessOverLayerThickness
zCenter = self.extrusionTop + 0.5 * baseLayerThickness
z = zCenter + baseLayerThickness * self.repository.baseNozzleLiftOverBaseLayerThickness.value
@@ -495,6 +486,7 @@ def addBaseSegments(self, baseExtrusionWidth):
def addEmptyLayerSupport( self, boundaryLayerIndex ):
"""Add support material to a layer if it is empty."""
+ print ('Adding Support to empty layers')
supportLayer = SupportLayer([])
self.supportLayers.append(supportLayer)
if len( self.boundaryLayers[ boundaryLayerIndex ].loops ) > 0:
@@ -522,6 +514,7 @@ def addFlowRateValueIfDifferent( self, flowRate ):
def addInterfaceLayer(self):
"""Add an interface layer."""
+ print ('Adding Interface layers')
interfaceLayerThickness = self.extrusionHeight * self.interfaceLayerThicknessOverLayerThickness
zCenter = self.extrusionTop + 0.5 * interfaceLayerThickness
z = zCenter + interfaceLayerThickness * self.repository.interfaceNozzleLiftOverInterfaceLayerThickness.value
@@ -576,7 +569,7 @@ def addLayerFromEndpoints(
step,
z):
"""Add a layer from endpoints and raise the extrusion top."""
- extrusionHeightRatioSquared = extrusionHeightRatio * extrusionHeightRatio
+ extrusionHeightRatioSquared = extrusionHeightRatio ** 2
feedRateMinute = self.feedRateMinute * feedRateMultiplier / extrusionHeightRatioSquared
if len(endpoints) < 1:
return
@@ -604,6 +597,7 @@ def addLayerLine(self, z):
def addOperatingOrbits(self, boundaryLoops, pointComplex, temperatureChangeTime, z):
"""Add the orbits before the operating layers."""
+ print ('Adding Orbit lines')
if len(boundaryLoops) < 1:
return
insetBoundaryLoops = intercircle.getInsetLoopsFromLoops(self.extrusionWidth, boundaryLoops)
@@ -616,6 +610,7 @@ def addOperatingOrbits(self, boundaryLoops, pointComplex, temperatureChangeTime,
def addRaft(self):
"""Add the raft."""
+ print ('Adding the Raft')
if len(self.boundaryLayers) < 0:
print('this should never happen, there are no boundary layers in addRaft')
return
@@ -628,7 +623,7 @@ def addRaft(self):
self.setCornersZ()
self.cornerMinimumComplex = self.cornerMinimum.dropAxis()
originalExtent = self.cornerMaximumComplex - self.cornerMinimumComplex
- self.raftOutsetRadius = self.repository.raftMargin.value + (max(originalExtent.real, originalExtent.imag) * self.repository.raftAdditionalMarginOverLengthPercent.value / 100) + 0.001
+ self.raftOutsetRadius = self.repository.raftMargin.value + ((self.repository.raftAdditionalMarginOverLengthPercent.value * 0.01) * max(originalExtent.real, originalExtent.imag))+0.1
self.setBoundaryLayers()
outsetSeparateLoops = intercircle.getInsetSeparateLoopsFromLoops(-self.raftOutsetRadius, self.boundaryLayers[0].loops, 0.8)
self.interfaceIntersectionsTable = {}
@@ -674,6 +669,7 @@ def addRaft(self):
def addRaftPerimeters(self):
"""Add raft perimeters if there is a raft."""
+ print ('Add perimeters to raft')
for supportLayer in self.supportLayers:
supportSegmentTable = supportLayer.supportSegmentTable
if len(supportSegmentTable) > 0:
@@ -686,6 +682,7 @@ def addRaftPerimeters(self):
def addRaftPerimetersByLoops(self, loops, outset):
"""Add raft perimeters to the gcode for loops."""
+ print ('Add loops to raft')
loops = intercircle.getInsetSeparateLoopsFromLoops(-outset, loops)
for loop in loops:
self.distanceFeedRate.addLine('(<raftPerimeter>)')
@@ -742,17 +739,12 @@ def addSupportLayerTemperature(self, endpoints, z):
for aroundBoundaryLoop in aroundBoundaryLoops:
euclidean.addLoopToPixelTable(aroundBoundaryLoop, aroundPixelTable, aroundWidth)
paths = euclidean.getPathsFromEndpoints(endpoints, 1.5 * self.interfaceStep, aroundPixelTable, aroundWidth)
- feedRateMinuteMultiplied = (self.supportFeedRate *60)
+ feedRateMinuteMultiplied = self.supportFeedRate *60
supportFlowRateMultiplied = self.supportFlowRate
- travelFeedRateMultiplied = self.repository.objectFirstLayerTravelSpeed.value * 60
if not self.layerIndex:
+ feedRateMinuteMultiplied = self.repository.objectFirstLayerFeedRateInfillMultiplier.value * 60
supportFlowRateMultiplied = self.repository.objectFirstLayerFlowRateInfillMultiplier.value * self.repository.objectFirstLayerFeedRateInfillMultiplier.value
- self.addFlowRateValueIfDifferent(supportFlowRateMultiplied)
- if self.isExtruderActive:
- feedRateMinuteMultiplied = self.repository.objectFirstLayerFeedRateInfillMultiplier.value * 60
- if not self.isExtruderActive:
- feedRateMinuteMultiplied = self.repository.objectFirstLayerTravelSpeed.value * 60
- return
+ self.addFlowRateValueIfDifferent(supportFlowRateMultiplied)
for path in paths:
self.distanceFeedRate.addGcodeFromFeedRateThreadZ(feedRateMinuteMultiplied, path, self.travelFeedRateMinute, z)
self.addFlowRateLineIfDifferent(str(self.oldFlowRateInput))
@@ -795,7 +787,6 @@ def addTemperatureOrbits( self, endpoints, temperature, z ):
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:
@@ -828,6 +819,7 @@ def getCraftedGcode(self, gcodeText, repository):
self.supportEndLines = settings.getLinesInAlterationsOrGivenDirectory(repository.nameOfSupportEndFile.value)
self.supportStartLines = settings.getLinesInAlterationsOrGivenDirectory(repository.nameOfSupportStartFile.value)
self.lines = archive.getTextLines(gcodeText)
+ self.objectFirstLayerTravelSpeed = self.repository.objectFirstLayerTravelSpeed.value
self.parseInitialization()
self.temperatureChangeTimeBeforeRaft = 0.0
if self.repository.initialCircling.value:
@@ -879,20 +871,17 @@ def getRaftedLine( self, splitLine ):
z += self.operatingJump
flowRate = self.oldFlowRateInput
temperature = self.objectNextLayersTemperature
-# travelFeedRateMultiplied = self.repository.objectFirstLayerTravelSpeed * 60
if not self.layerIndex:
if self.isPerimeterPath:
feedRateMinuteMultiplied = self.repository.objectFirstLayerFeedRatePerimeterMultiplier.value * 60
flowRate = self.repository.objectFirstLayerFlowRatePerimeterMultiplier.value * self.repository.objectFirstLayerFeedRatePerimeterMultiplier.value
temperature = self.objectFirstLayerPerimeterTemperature
- if not self.isExtruderActive:
- feedRateMinuteMultiplied = self.repository.objectFirstLayerTravelSpeed.value *60
else:
feedRateMinuteMultiplied = self.repository.objectFirstLayerFeedRateInfillMultiplier.value * 60
flowRate = self.repository.objectFirstLayerFlowRateInfillMultiplier.value * self.repository.objectFirstLayerFeedRateInfillMultiplier.value
temperature = self.objectFirstLayerInfillTemperature
- if not self.isExtruderActive:
- feedRateMinuteMultiplied = self.repository.objectFirstLayerTravelSpeed.value *60
+ if not self.isExtruderActive:
+ feedRateMinuteMultiplied = self.objectFirstLayerTravelSpeed * 60
self.addFlowRateValueIfDifferent(flowRate)
self.addTemperatureLineIfDifferent(temperature)
return self.distanceFeedRate.getLinearGcodeMovementWithFeedRate(feedRateMinuteMultiplied, location.dropAxis(), z)
@@ -962,16 +951,16 @@ def parseInitialization(self):
elif firstWord == '(<operatingFlowRate>':
self.oldFlowRateInput = float(splitLine[1])
self.operatingFlowRate = self.oldFlowRateInput
- self.supportFlowRate = self.supportFeedRate * self.repository.supportFlowRateOverOperatingFlowRate.value
+ self.supportFlowRate = self.supportFeedRate * self.repository.supportFlowRateScaler.value
elif firstWord == '(<extrusionWidth>':
self.extrusionWidth = float(splitLine[1])
self.quarterPerimeterWidth = 0.25 * self.extrusionWidth
- self.supportOutset = self.extrusionWidth + self.extrusionWidth * self.repository.supportGapOverPerimeterExtrusionWidth.value
+ self.supportOutset = self.extrusionWidth * self.repository.supportGapOverPerimeterExtrusionWidth.value #todo check ACT
elif firstWord == '(<supportLayersTemperature>':
self.supportLayersTemperature = float(splitLine[1])
elif firstWord == '(<supportedLayersTemperature>':
self.supportedLayersTemperature = float(splitLine[1])
- elif firstWord == '(<travelFeedRatePerSecond>':
+ elif firstWord == '(<travelFeedRate>':
self.travelFeedRateMinute = 60.0 * float(splitLine[1])
self.distanceFeedRate.addLine(line)
@@ -1037,11 +1026,12 @@ def parseLine(self, line):
def setBoundaryLayers(self):
"""Set the boundary layers."""
- if self.repository.supportChoiceNone.value:
+ print ('Setting the boundary layers.')
+ if self.repository.supportChoiceNone.value : #**************************
return
- if len(self.boundaryLayers) < 2:
+ elif len(self.boundaryLayers) < 2:
return
- if self.repository.supportChoiceEmptyLayersOnly.value:
+ elif self.repository.supportChoiceEmptyLayersOnly.value:#**************************
supportLayer = SupportLayer([])
self.supportLayers.append(supportLayer)
for boundaryLayerIndex in xrange(1, len(self.boundaryLayers) -1):
@@ -1062,7 +1052,7 @@ def setBoundaryLayers(self):
self.extendXIntersections( boundaryLoops, self.supportOutset, self.supportLayers[supportLayerIndex].xIntersectionsTable)
for supportLayer in self.supportLayers:
self.addToFillXIntersectionIndexTables(supportLayer)
- if self.repository.supportChoiceExteriorOnly.value:
+ if self.repository.supportChoiceExteriorOnly.value:#**************************
for supportLayerIndex in xrange(1, len(self.supportLayers)):
self.subtractJoinedFill(supportLayerIndex)
for supportLayer in self.supportLayers:
@@ -1080,6 +1070,7 @@ def setBoundaryLayers(self):
def setCornersZ(self):
"""Set maximum and minimum corners and z."""
+ print ('Set maximum and minimum corners and z.')
boundaryLoop = None
boundaryLayer = None
layerIndex = - 1
@@ -1111,6 +1102,7 @@ def setCornersZ(self):
def subtractJoinedFill( self, supportLayerIndex ):
"""Join the fill then subtract it from the support layer table."""
+ print ('Join the fill then subtract it from the support layer table')
supportLayer = self.supportLayers[supportLayerIndex]
fillXIntersectionsTable = supportLayer.fillXIntersectionsTable
belowFillXIntersectionsTable = self.supportLayers[ supportLayerIndex - 1 ].fillXIntersectionsTable
@@ -1132,7 +1124,7 @@ def __init__( self, supportLoops ):
self.supportLoops = supportLoops
self.supportSegmentTable = {}
self.xIntersectionsTable = {}
- self.isExtruderActive = False
+# self.isExtruderActive = False
def __repr__(self):
"""Get the string representation of this loop layer."""
View
8 skeinforge_application/skeinforge_plugins/craft_plugins/skin.py
@@ -79,7 +79,7 @@ def __init__(self):
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: this is experimental. \nIt prints the perimeters and loops only at half the layer height that is specified under carve.', self, False )
+ self.activateSkin = settings.BooleanSetting().getFromValue('Activate Skin: this is experimental', self, False )
self.clipOverPerimeterWidth = settings.FloatSpin().getFromValue(0.50, 'Clip Over Perimeter Width (scaler):', self, 1.50, 1.00)
self.layersFrom = settings.IntSpin().getSingleIncrementFromValue(0, 'Do Not Skin the first ... Layers:', self, 912345678, 3)
self.executeTitle = 'Skin'
@@ -159,14 +159,14 @@ def parseInitialization(self):
elif firstWord == '(<extrusionHeight>':
self.quarterLayerThickness = 0.25 * float(splitLine[1])
+ self.halfLayerThickness = 0.5 * float(splitLine[1])
elif firstWord == '(<operatingFlowRate>':
self.oldFlowRate = float(splitLine[1])
elif firstWord == '(<extrusionWidth>':
extrusionWidth = float(splitLine[1])
- self.halfPerimeterWidth = 0.5 * extrusionWidth
self.quarterPerimeterWidth = 0.25 * extrusionWidth
- #self.clipLength = (self.quarterLayerThickness - (self.repository.clipOverPerimeterWidth.value * self.quarterLayerThickness * (((0.785)))))*4
- self.clipLength = (self.quarterLayerThickness - (clipRepository.clipOverPerimeterWidth.value * self.quarterLayerThickness * (((0.785)))))*4
+ self.halfPerimeterWidth = 0.5 * extrusionWidth
+ self.clipLength = (self.halfLayerThickness - (self.repository.clipOverPerimeterWidth.value * self.quarterLayerThickness * ((0.7853))))*4
elif firstWord == '(<travelFeedRatePerSecond>':
self.travelFeedRateMinute = 60.0 * float(splitLine[1])
self.distanceFeedRate.addLine(line)
View
2 skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py
@@ -265,7 +265,7 @@ def parseInitialization(self):
self.extrusionWidth = float(splitLine[1])
self.skirtOutset = (self.repository.gapOverPerimeterWidth.value + 0.5) * self.extrusionWidth
self.distanceFeedRate.addTagRoundedLine('skirtOutset', self.skirtOutset)
- elif firstWord == '(<travelFeedRatePerSecond>':
+ elif firstWord == '(<travelFeedRate>':
self.travelFeedRateMinute = 60.0 * float(splitLine[1])
self.distanceFeedRate.addLine(line)
View
13 skeinforge_application/skeinforge_plugins/craft_plugins/speed.py
@@ -152,7 +152,7 @@ def __init__(self):
self.bridgeFlowRateScaler = settings.FloatSpin().getFromValue( 0.5, 'Bridge Flow Rate (scaler):', self, 1.3, 1.0 )
settings.LabelSeparator().getFromRepository(self)
settings.LabelSeparator().getFromRepository(self)
- self.travelFeedRatePerSecond = settings.FloatSpin().getFromValue( 40.0, 'Travel Feed Rate (mm/s):', self, 200.0, 130.0 )
+ self.travelFeedRate = settings.FloatSpin().getFromValue( 40.0, 'Travel Feed Rate (mm/s):', self, 200.0, 130.0 )
self.executeTitle = 'Speed'
def execute(self):
@@ -193,7 +193,7 @@ def getCraftedGcode(self, gcodeText, repository):
self.repository = repository
self.mainFeed = repository.mainFeed.value
self.perimeterFeed = repository.perimeterFeed.value
- self.travelFeedRateMinute = 60.0 * self.repository.travelFeedRatePerSecond.value
+ self.travelFeedRate = self.repository.travelFeedRate.value
self.lines = archive.getTextLines(gcodeText)
self.parseInitialization()
for line in self.lines[self.lineIndex :]:
@@ -215,14 +215,14 @@ def getSpeededLine(self, line, splitLine):
"""Get gcode line with feed rate."""
if gcodec.getIndexOfStartingWithSecond(