diff --git a/documentation/fabmetheus_utilities.euclidean.html b/documentation/fabmetheus_utilities.euclidean.html index 1924856..d9e5c0a 100644 --- a/documentation/fabmetheus_utilities.euclidean.html +++ b/documentation/fabmetheus_utilities.euclidean.html @@ -125,13 +125,13 @@
__repr__(self)
Get the string representation of this surrounding loop.
-
addPerimeterInner(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence)
Add to the perimeter and the inner island.
+
addPerimeterInner(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence)
Add to the perimeter and the inner island.
addToBoundary(self, vector3)
Add vector3 to boundary.
addToLoop(self, vector3)
Add vector3 to loop.
-
addToThreads(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence)
Add to paths from the last location. perimeter>inner >fill>paths or fill> perimeter>inner >paths
+
addToThreads(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence)
Add to paths from the last location. perimeter>inner >fill>paths or fill> perimeter>inner >paths
getFillLoops(self, penultimateFillLoops)
Get last fill loops from the outside loop and the loops inside the inside loops.
@@ -139,9 +139,9 @@
getSurroundingBoundaries(self)
Get the boundary of the surronding loop plus any boundaries of the innerNestedRings.
-
transferClosestFillLoops(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence)
Transfer closest fill loops.
+
transferClosestFillLoops(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence)
Transfer closest fill loops.
-
transferInfillPaths(self, extrusionHalfWidth, oldOrderedLocation, skein, threadSequence)
Transfer the infill paths.
+
transferInfillPaths(self, extrusionSpacingHalfWidth, oldOrderedLocation, skein, threadSequence)
Transfer the infill paths.
transferPaths(self, paths)
Transfer paths.
@@ -285,8 +285,8 @@
addSegmentToPixelTable(beginComplex, endComplex, pixelDictionary, shortenDistanceBegin, shortenDistanceEnd, width)
Add line segment to the pixel table.
addSquareTwoToPixelDictionary(pixelDictionary, point, value, width)
Add square with two pixels around the center to pixel dictionary.
addSurroundingLoopBeginning(distanceFeedRate, loop, z)
Add surrounding loop beginning to gcode output.
-
addToThreadsFromLoop(extrusionHalfWidth, gcodeType, loop, oldOrderedLocation, skein)
Add to threads from the last location from loop.
-
addToThreadsRemove(extrusionHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence)
Add to threads from the last location from surrounding loops.
+
addToThreadsFromLoop(extrusionSpacingHalfWidth, gcodeType, loop, oldOrderedLocation, skein)
Add to threads from the last location from loop.
+
addToThreadsRemove(extrusionSpacingHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence)
Add to threads from the last location from surrounding loops.
addValueSegmentToPixelTable(beginComplex, endComplex, pixelDictionary, value, width)
Add line segment to the pixel table.
addValueToOutput(depth, keyInput, output, value)
Add value to the output.
addXIntersectionIndexesFromLoop(frontOverWidth, loop, solidIndex, xIntersectionIndexLists, width, yList)
Add the x intersection indexes for a loop.
@@ -382,7 +382,7 @@
getLoopConvexCentroid(polygonComplex)
Get centroid of the convex hull of a complex polygon.
getLoopInsideContainingLoop(containingLoop, loops)
Get a loop that is inside the containing loop.
getLoopLength(polygon)
Get the length of a polygon perimeter.
-
getLoopStartingNearest(extrusionHalfWidth, location, loop)
Add to threads from the last location from loop.
+
getLoopStartingNearest(extrusionSpacingHalfWidth, location, loop)
Add to threads from the last location from loop.
getLoopWithoutCloseEnds(close, loop)
Get loop without close ends.
getLoopWithoutCloseSequentialPoints(close, loop)
Get loop without close sequential points.
getMaximum(firstComplex, secondComplex)
Get a complex with each component the maximum of the respective components of a pair of complexes.
@@ -439,7 +439,7 @@
getThreeSignificantFigures(number)
Get number rounded to three significant figures as a string.
getTopPath(path)
Get the top of the path.
getTopPaths(paths)
Get the top of the paths.
-
getTransferClosestSurroundingLoop(extrusionHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence)
Get and transfer the closest remaining surrounding loop.
+
getTransferClosestSurroundingLoop(extrusionSpacingHalfWidth, nestedRings, oldOrderedLocation, skein, threadSequence)
Get and transfer the closest remaining surrounding loop.
getTransferredPaths(insides, loop)
Get transferred paths from inside paths.
getTransferredSurroundingLoops(insides, loop)
Get transferred paths from inside surrounding loops.
getTranslatedComplexPath(path, translateComplex)
Get the translated complex path.
@@ -485,7 +485,7 @@
subtractXIntersectionsTable(subtractFromTable, subtractTable)
Subtract the subtractTable from the subtractFromTable.
swapList(elements, indexBegin, indexEnd)
Swap the list elements.
toggleHashtable(hashtable, key, value)
Toggle a hashtable between having and not having a key.
-
transferClosestFillLoop(extrusionHalfWidth, oldOrderedLocation, remainingFillLoops, skein)
Transfer the closest remaining fill loop.
+
transferClosestFillLoop(extrusionSpacingHalfWidth, oldOrderedLocation, remainingFillLoops, skein)
Transfer the closest remaining fill loop.
transferClosestPath(oldOrderedLocation, remainingPaths, skein)
Transfer the closest remaining path.
transferClosestPaths(oldOrderedLocation, remainingPaths, skein)
Transfer the closest remaining paths.
transferPathsToSurroundingLoops(nestedRings, paths)
Transfer paths to surrounding loops.
diff --git a/documentation/skeinforge_application.skeinforge_plugins.craft_plugins.fill.html b/documentation/skeinforge_application.skeinforge_plugins.craft_plugins.fill.html index ff56f7a..26e150b 100644 --- a/documentation/skeinforge_application.skeinforge_plugins.craft_plugins.fill.html +++ b/documentation/skeinforge_application.skeinforge_plugins.craft_plugins.fill.html @@ -406,8 +406,8 @@
addPathIndexSecondSegment(gridPixel, pathIndexTable, pixelTable, segmentSecondPixel)
Add the path index of the closest segment found toward the second segment.
addPointOnPath(path, pathIndex, pixelTable, point, pointIndex, width)
Add a point to a path and the pixel table.
addPointOnPathIfFree(path, pathIndex, pixelTable, point, pointIndex, width)
Add the closest point to a path, if the point added to a path is free.
-
addSparseEndpoints(doubleExtrusionWidth, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, solidSurfaceThickness, surroundingXIntersections)
Add sparse endpoints.
-
addSparseEndpointsFromSegment(doubleExtrusionWidth, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, segment, solidSurfaceThickness, surroundingXIntersections)
Add sparse endpoints from a segment.
+
addSparseEndpoints(doubleExtrusionSpacing, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, solidSurfaceThickness, surroundingXIntersections)
Add sparse endpoints.
+
addSparseEndpointsFromSegment(doubleExtrusionSpacing, endpoints, fillLine, horizontalSegmentLists, infillSolidity, removedEndpoints, segment, solidSurfaceThickness, surroundingXIntersections)
Add sparse endpoints from a segment.
addYIntersectionPathToList(pathIndex, pointIndex, y, yIntersection, yIntersectionPaths)
Add the y intersection path to the y intersection paths.
compareDistanceFromCenter(self, other)
Get comparison in order to sort y intersections in ascending order of distance from the center.
comparePointIndexDescending(self, other)
Get comparison in order to sort y intersections in descending order of point index.
@@ -431,14 +431,14 @@
isAddedPointOnPathFree(path, pixelTable, point, pointIndex, width)
Determine if the point added to a path is intersecting the pixel table or the path.
isAddedPointOnPathIntersectingPath(begin, path, point, pointIndex)
Determine if the point added to a path is intersecting the path by checking line intersection.
isIntersectingLoopsPaths(loops, paths, pointBegin, pointEnd)
Determine if the segment between the first and second point is intersecting the loop list.
-
isPointAddedAroundClosest(pixelTable, layerExtrusionWidth, paths, removedEndpointPoint, width)
Add the closest removed endpoint to the path, with minimal twisting.
+
isPointAddedAroundClosest(pixelTable, layerExtrusionSpacing, paths, removedEndpointPoint, width)
Add the closest removed endpoint to the path, with minimal twisting.
isSegmentAround(aroundSegments, segment)
Determine if there is another segment around.
isSegmentCompletelyInAnIntersection(segment, xIntersections)
Add sparse endpoints from a segment.
isSegmentInX(segment, xFirst, xSecond)
Determine if the segment overlaps within x.
isSharpCorner(beginComplex, centerComplex, endComplex)
Determine if the three complex points form a sharp corner.
-
isSidePointAdded(pixelTable, closestPath, closestPathIndex, closestPointIndex, layerExtrusionWidth, removedEndpointPoint, width)
Add side point along with the closest removed endpoint to the path, with minimal twisting.
+
isSidePointAdded(pixelTable, closestPath, closestPathIndex, closestPointIndex, layerExtrusionSpacing, removedEndpointPoint, width)
Add side point along with the closest removed endpoint to the path, with minimal twisting.
main()
Display the fill dialog.
-
removeEndpoints(pixelTable, layerExtrusionWidth, paths, removedEndpoints, aroundWidth)
Remove endpoints which are added to the path.
+
removeEndpoints(pixelTable, layerExtrusionSpacing, paths, removedEndpoints, aroundWidth)
Remove endpoints which are added to the path.
setIsOutside(yCloseToCenterPath, yIntersectionPaths)
Determine if the yCloseToCenterPath is outside.
writeOutput(fileName, shouldAnalyze=True)
Fill an inset gcode file.

diff --git a/fabmetheus_utilities/euclidean.py b/fabmetheus_utilities/euclidean.py index 1cbfefc..e571551 100644 --- a/fabmetheus_utilities/euclidean.py +++ b/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('()' % 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('()') transferClosestPaths(oldOrderedLocation, self.perimeterPaths[:], skein) skein.distanceFeedRate.addLine('()') else: - addToThreadsFromLoop(extrusionHalfWidth, 'perimeter', self.loop[:], oldOrderedLocation, skein) + addToThreadsFromLoop(extrusionSpacingHalfWidth, 'perimeter', self.loop[:], oldOrderedLocation, skein) skein.distanceFeedRate.addLine('()') - 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('()') 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) diff --git a/fabmetheus_utilities/gcodec.py b/fabmetheus_utilities/gcodec.py index b3ab760..e0419e7 100644 --- a/fabmetheus_utilities/gcodec.py +++ b/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.""" diff --git a/fabmetheus_utilities/version.txt b/fabmetheus_utilities/version.txt index eb45151..691df99 100644 --- a/fabmetheus_utilities/version.txt +++ b/fabmetheus_utilities/version.txt @@ -1 +1 @@ -SFACT_V2.0 11.08.01 help at www.reprapfordummies.net \ No newline at end of file +SFACT_V3.0b 20.08.01 help at www.reprapfordummies.net \ No newline at end of file diff --git a/skeinforge_application/skeinforge_plugins/analyze_plugins/statistic.py b/skeinforge_application/skeinforge_plugins/analyze_plugins/statistic.py index 8a9c479..d87a2f9 100644 --- a/skeinforge_application/skeinforge_plugins/analyze_plugins/statistic.py +++ b/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() diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/Obsolete/feed.py b/skeinforge_application/skeinforge_plugins/craft_plugins/Obsolete/feed.py index e216ddd..65e9c8a 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/Obsolete/feed.py +++ b/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): diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/Obsolete/tower.py b/skeinforge_application/skeinforge_plugins/craft_plugins/Obsolete/tower.py index 91ebcf3..afbd4d6 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/Obsolete/tower.py +++ b/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 == '(': self.extrusionWidth = float(splitLine[1]) - elif firstWord == '(': + elif firstWord == '(': self.travelFeedRateMinute = 60.0 * float(splitLine[1]) self.distanceFeedRate.addLine(line) diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/carve.py b/skeinforge_application/skeinforge_plugins/craft_plugins/carve.py index f13842a..2a3ba08 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/carve.py +++ b/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(), diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/clip.py b/skeinforge_application/skeinforge_plugins/craft_plugins/clip.py index ead3488..71056a6 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/clip.py +++ b/skeinforge_application/skeinforge_plugins/craft_plugins/clip.py @@ -269,12 +269,11 @@ def parseInitialization( self, clipRepository ): elif firstWord == '(': 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 == '(': + elif firstWord == '(': self.travelFeedRateMinute = 60.0 * float(splitLine[1]) self.distanceFeedRate.addLine(line) diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/comb.py b/skeinforge_application/skeinforge_plugins/craft_plugins/comb.py index e18c844..367715c 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/comb.py +++ b/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 == '(': + elif firstWord == '(': self.travelFeedRateMinute = 60.0 * float(splitLine[1]) self.distanceFeedRate.addLine(line) diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py b/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py index 6c0918c..d8792c1 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py +++ b/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 == '(': self.extrusionHeight = float(splitLine[1]) elif firstWord == '(': - self.maximumZTravelFeedRatePerSecond = float(splitLine[1]) - elif firstWord == '(': - self.maximumZTravelFeedRatePerSecond = float(splitLine[1]) + self.maximumZTravelFeedRate = float(splitLine[1]) + elif firstWord == '(': + self.maximumZTravelFeedRate = float(splitLine[1]) elif firstWord == '(': self.feedRateMinute = 60.0 * float(splitLine[1]) elif firstWord == '(': @@ -352,8 +354,8 @@ def parseInitialization(self): self.flowRate = self.operatingFlowRate elif firstWord == '(': self.extrusionWidth = float(splitLine[1]) - elif firstWord == '(': - self.travelFeedRatePerSecond = float(splitLine[1]) + elif firstWord == '(': + self.travelFeedRate = float(splitLine[1]) self.distanceFeedRate.addLine(line) def parseLine( self, lineIndex ): diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/fill.py b/skeinforge_application/skeinforge_plugins/craft_plugins/fill.py index f4f85a2..a4a91c2 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/fill.py +++ b/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('( %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('( %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('()') self.distanceFeedRate.addLine('()') @@ -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 == '()': self.distanceFeedRate.addLine('( fill )') @@ -1338,7 +1330,6 @@ def parseInitialization(self): self.bridgeWidthMultiplier = float(splitLine[1]) elif firstWord == '(': self.extrusionHeight = float(splitLine[1]) -# self.distanceFeedRate.addTagRoundedLine('infillSpacing', self.infillSpacing) self.distanceFeedRate.addLine(line) def parseLine( self, lineIndex ): diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/inset.py b/skeinforge_application/skeinforge_plugins/craft_plugins/inset.py index f89a869..5448b11 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/inset.py +++ b/skeinforge_application/skeinforge_plugins/craft_plugins/inset.py @@ -372,8 +372,8 @@ def parseInitialization(self): elif firstWord == '(': 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): diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.py b/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.py index 1af2f1e..4d0b3c0 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.py +++ b/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.py @@ -198,7 +198,7 @@ def parseInitialization( self, jitterRepository ): elif firstWord == '(': self.extrusionWidth = float(splitLine[1]) self.jitter = jitterRepository.jitterOverPerimeterWidth.value * self.extrusionWidth - elif firstWord == '(': + elif firstWord == '(': self.travelFeedRateMinute = 60.0 * float(splitLine[1]) self.distanceFeedRate.addLine(line) @@ -222,7 +222,7 @@ def parseLine(self, line): self.addTailoredLoopPath() elif firstWord == '(': 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 == '(' or firstWord == '(': self.isLoopPerimeter = True diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/lash.py b/skeinforge_application/skeinforge_plugins/craft_plugins/lash.py index 2ea46c9..bc74973 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/lash.py +++ b/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' diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/limit.py b/skeinforge_application/skeinforge_plugins/craft_plugins/limit.py index b7b1285..b0ed721 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/limit.py +++ b/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 == '(': self.maximumZDrillFeedRatePerSecond = float(splitLine[1]) elif firstWord == '(': - 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) diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py b/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py index 76c62a4..c5780b0 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py +++ b/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('()') @@ -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 == '(': 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 == '(': 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 == '(': self.supportLayersTemperature = float(splitLine[1]) elif firstWord == '(': self.supportedLayersTemperature = float(splitLine[1]) - elif firstWord == '(': + elif firstWord == '(': 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.""" diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/skin.py b/skeinforge_application/skeinforge_plugins/craft_plugins/skin.py index 36262a7..357c71e 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/skin.py +++ b/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 == '(': self.quarterLayerThickness = 0.25 * float(splitLine[1]) + self.halfLayerThickness = 0.5 * float(splitLine[1]) elif firstWord == '(': self.oldFlowRate = float(splitLine[1]) elif firstWord == '(': 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 == '(': self.travelFeedRateMinute = 60.0 * float(splitLine[1]) self.distanceFeedRate.addLine(line) diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py b/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py index f2ba57c..14eed15 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py +++ b/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 == '(': + elif firstWord == '(': self.travelFeedRateMinute = 60.0 * float(splitLine[1]) self.distanceFeedRate.addLine(line) diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/speed.py b/skeinforge_application/skeinforge_plugins/craft_plugins/speed.py index 027f364..d1f4d52 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/speed.py +++ b/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('F', splitLine) > 0: return line - feedRateMinute = 60.0 * self.mainFeed + feedRateMinute = self.mainFeed * 60 if self.isBridgeLayer: feedRateMinute *= self.repository.bridgeFeedRateMultiplier.value if self.isPerimeterPath: feedRateMinute = self.repository.perimeterFeed.value * 60 - self.addFlowRateLineIfNecessary() if not self.isExtruderActive: - feedRateMinute = self.travelFeedRateMinute + feedRateMinute = self.travelFeedRate * 60 + self.addFlowRateLineIfNecessary() return self.distanceFeedRate.getLineWithFeedRate(feedRateMinute, line, splitLine) def parseInitialization(self): @@ -246,7 +246,7 @@ def parseInitialization(self): self.distanceFeedRate.addTagBracketedLine('PerimeterFlowRate', self.repository.perimeterFlowRateScaler.value * self.repository.perimeterFeed.value ) orbitalFeedRatePerSecond = self.mainFeed * self.repository.orbitalFeedRateOverOperatingFeedRate.value self.distanceFeedRate.addTagBracketedLine('orbitalFeedRatePerSecond', orbitalFeedRatePerSecond ) - self.distanceFeedRate.addTagBracketedLine('travelFeedRatePerSecond', self.repository.travelFeedRatePerSecond.value ) + self.distanceFeedRate.addTagBracketedLine('travelFeedRate', self.repository.travelFeedRate.value ) self.distanceFeedRate.addLine(line) def parseLine(self, line): """Parse a gcode line and add it to the speed skein.""" @@ -274,7 +274,6 @@ def parseLine(self, line): self.isPerimeterPath = False self.distanceFeedRate.addLine(line) - def main(): """Display the speed dialog.""" if len(sys.argv) > 1: diff --git a/skeinforge_application/skeinforge_plugins/craft_plugins/wipe.py b/skeinforge_application/skeinforge_plugins/craft_plugins/wipe.py index b280090..48b6729 100644 --- a/skeinforge_application/skeinforge_plugins/craft_plugins/wipe.py +++ b/skeinforge_application/skeinforge_plugins/craft_plugins/wipe.py @@ -230,7 +230,7 @@ def parseInitialization( self, wipeRepository ): return elif firstWord == '(': self.absolutePerimeterWidth = abs(float(splitLine[1])) - elif firstWord == '(': + elif firstWord == '(': self.travelFeedRateMinute = 60.0 * float(splitLine[1]) self.distanceFeedRate.addLine(line) diff --git a/skeinforge_application/skeinforge_plugins/profile_plugins/extrusion.py b/skeinforge_application/skeinforge_plugins/profile_plugins/extrusion.py index e3678f1..bc83b3d 100644 --- a/skeinforge_application/skeinforge_plugins/profile_plugins/extrusion.py +++ b/skeinforge_application/skeinforge_plugins/profile_plugins/extrusion.py @@ -39,7 +39,7 @@ class ExtrusionRepository: """A class to handle the export settings.""" def __init__(self): """Set the default settings, execute title & settings fileName.""" - skeinforge_profile.addListsSetCraftProfile( getCraftSequence(), 'PLA', self, 'skeinforge_plugins.profile_plugins.extrusion.html') + skeinforge_profile.addListsSetCraftProfile( getCraftSequence(), 'Default', self, 'skeinforge_plugins.profile_plugins.extrusion.html') def main():