def addCoolOrbits(self, remainingOrbitTime): "Add the minimum radius cool orbits." if len(self.boundaryLayer.loops) < 1: return insetBoundaryLoops = intercircle.getInsetLoopsFromLoops(self.perimeterWidth, self.boundaryLayer.loops) if len(insetBoundaryLoops) < 1: insetBoundaryLoops = self.boundaryLayer.loops largestLoop = euclidean.getLargestLoop(insetBoundaryLoops) loopArea = abs(euclidean.getPolygonArea(largestLoop)) if loopArea < self.minimumArea: center = 0.5 * (euclidean.getMaximumFromPoints(largestLoop) + euclidean.getMinimumFromPoints(largestLoop)) centerXBounded = max(center.real, self.cornerMinimum.real) centerXBounded = min(centerXBounded, self.cornerMaximum.real) centerYBounded = max(center.imag, self.cornerMinimum.imag) centerYBounded = min(centerYBounded, self.cornerMaximum.imag) center = complex(centerXBounded, centerYBounded) maximumCorner = center + self.halfCorner minimumCorner = center - self.halfCorner largestLoop = euclidean.getSquareLoop(minimumCorner, maximumCorner) pointComplex = euclidean.getXYComplexFromVector3(self.oldLocation) if pointComplex != None: largestLoop = euclidean.getLoopStartingNearest(self.perimeterWidth, pointComplex, largestLoop) intercircle.addOrbitsIfLarge( self.distanceFeedRate, largestLoop, self.orbitalFeedRatePerSecond, remainingOrbitTime, self.highestZ )
def parseLine( self, line ): "Parse a gcode line and add it to the raft skein." splitLine = line.split() if len( splitLine ) < 1: return firstWord = splitLine[ 0 ] if firstWord == 'G1': if self.extrusionStart: line = self.getRaftedLine( splitLine ) elif firstWord == 'M101': if self.isStartupEarly: self.isStartupEarly = False return elif firstWord == 'M108': self.setOperatingFlowString( splitLine ) elif firstWord == '(<boundaryPoint>': line = self.getBoundaryLine( splitLine ) elif firstWord == '(</extrusion>)': self.extrusionStart = False self.addLine( self.operatingLayerEndLine ) elif firstWord == '(<layer>': self.layerIndex += 1 boundaryLayer = None layerHeight = self.extrusionTop + float( splitLine[ 1 ] ) if len( self.boundaryLayers ) > 0: boundaryLayer = self.boundaryLayers[ self.layerIndex ] layerHeight = boundaryLayer.z if self.operatingJump != None: line = '(<layer> ' + self.getRounded( layerHeight ) + ' )' if self.layerStarted and self.addLineLayerStart: self.addLine( '(</layer>)' ) self.layerStarted = False if self.layerIndex > len( self.supportSegmentTables ) + 1: self.addLine( self.operatingLayerEndLine ) self.operatingLayerEndLine = '' if self.addLineLayerStart: self.addLine( line ) self.addLineLayerStart = True line = '' supportSegments = self.getSupportSegments() if self.layerIndex == 1: if len( supportSegments ) < 1: self.addTemperature( self.raftPreferences.temperatureShapeNextLayers.value ) if self.raftPreferences.addRaftElevateNozzleOrbitSetAltitude.value: boundaryLoops = boundaryLayer.loops if len( boundaryLoops ) > 0: temperatureChangeTimeBeforeNextThreads = self.raftPreferences.temperatureChangeTimeBeforeNextThreads.value intercircle.addOperatingOrbits( boundaryLoops, euclidean.getXYComplexFromVector3( self.oldLocation ), self, temperatureChangeTimeBeforeNextThreads, layerHeight ) if len( supportSegments ) > 0: self.addSupportLayerTemperature( supportSegments, layerHeight ) self.addLine( line )
def getRaftedLine( self, splitLine ): "Get elevated gcode line with operating feedrate." location = gcodec.getLocationFromSplitLine( self.oldLocation, splitLine ) self.feedrateMinute = gcodec.getFeedrateMinute( self.feedrateMinute, splitLine ) self.oldLocation = location z = location.z if self.operatingJump != None: z += self.operatingJump if not self.isFirstLayerWithinTemperatureAdded and not self.isSurroundingLoop: self.isFirstLayerWithinTemperatureAdded = True self.addTemperature( self.raftPreferences.temperatureShapeFirstLayerWithin.value ) if self.raftPreferences.addRaftElevateNozzleOrbitSetAltitude.value: boundaryLoops = self.boundaryLayers[ self.layerIndex ].loops if len( boundaryLoops ) > 1: intercircle.addOperatingOrbits( boundaryLoops, euclidean.getXYComplexFromVector3( self.oldLocation ), self, self.raftPreferences.temperatureChangeTimeBeforeNextThreads.value, z ) return self.getGcodeFromFeedrateMovementZ( self.feedrateMinute, location.dropAxis( 2 ), z )
def parseLine( self, coolPreferences, line ): "Parse a gcode line and add it to the cool skein." splitLine = line.split() if len( splitLine ) < 1: return firstWord = splitLine[ 0 ] if firstWord == 'G1': self.linearMove( splitLine ) elif firstWord == '(<boundaryPoint>': self.boundaryLoop.append( gcodec.getLocationFromSplitLine( None, splitLine ).dropAxis( 2 ) ) elif firstWord == '(<layer>': remainingOrbitTime = coolPreferences.minimumLayerTime.value - self.layerTime if remainingOrbitTime > 0.0 and self.boundaryLayer != None: intercircle.addOperatingOrbits( self.boundaryLayer.loops, euclidean.getXYComplexFromVector3( self.oldLocation ), self, remainingOrbitTime, self.highestZ ) z = float( splitLine[ 1 ] ) self.boundaryLayer = euclidean.LoopLayer( z ) self.highestZ = z self.layerTime = 0.0 elif firstWord == '(<surroundingLoop>)': self.boundaryLoop = [] self.boundaryLayer.loops.append( self.boundaryLoop ) self.addLine( line )
def addCoolOrbits( self, remainingOrbitTime ): "Add the minimum radius cool orbits." if len( self.boundaryLayer.loops ) < 1: return insetBoundaryLoops = intercircle.getInsetLoopsFromLoops( self.perimeterWidth, self.boundaryLayer.loops ) if len( insetBoundaryLoops ) < 1: insetBoundaryLoops = self.boundaryLayer.loops largestLoop = euclidean.getLargestLoop( insetBoundaryLoops ) loopArea = abs( euclidean.getPolygonArea( largestLoop ) ) if loopArea < self.minimumArea: center = 0.5 * ( euclidean.getMaximumFromPoints( largestLoop ) + euclidean.getMinimumFromPoints( largestLoop ) ) centerXBounded = max( center.real, self.boundingRectangle.cornerMinimum.real ) centerXBounded = min( centerXBounded, self.boundingRectangle.cornerMaximum.real ) centerYBounded = max( center.imag, self.boundingRectangle.cornerMinimum.imag ) centerYBounded = min( centerYBounded, self.boundingRectangle.cornerMaximum.imag ) center = complex( centerXBounded, centerYBounded ) maximumCorner = center + self.halfCorner minimumCorner = center - self.halfCorner largestLoop = euclidean.getSquareLoop( minimumCorner, maximumCorner ) pointComplex = euclidean.getXYComplexFromVector3( self.oldLocation ) if pointComplex != None: largestLoop = euclidean.getLoopStartingNearest( self.perimeterWidth, pointComplex, largestLoop ) intercircle.addOrbitsIfLarge( self.distanceFeedRate, largestLoop, self.orbitalFeedRatePerSecond, remainingOrbitTime, self.highestZ )