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 addOutset( self, rotatedBoundaryLayer ): "Add outset to the layer." self.distanceFeedRate.addLine( '(<layer> %s )' % rotatedBoundaryLayer.z ) # Indicate that a new layer is starting. extrudateLoops = intercircle.getInsetLoopsFromLoops( - self.absoluteHalfPerimeterWidth, rotatedBoundaryLayer.loops ) sortedLoops = triangle_mesh.getLoopsInOrderOfArea( compareAreaAscending, extrudateLoops ) for sortedLoop in sortedLoops: self.addGcodeFromRemainingLoop( sortedLoop, self.absoluteHalfPerimeterWidth, rotatedBoundaryLayer.z ) self.distanceFeedRate.addLine( '(</layer>)' )
def addOutset(self, rotatedBoundaryLayer): "Add outset to the layer." extrudateLoops = intercircle.getInsetLoopsFromLoops( -self.absoluteHalfPerimeterWidth, rotatedBoundaryLayer.loops) sortedLoops = triangle_mesh.getLoopsInOrderOfArea( triangle_mesh.compareAreaAscending, extrudateLoops) for sortedLoop in sortedLoops: self.addGcodeFromRemainingLoop(sortedLoop, self.absoluteHalfPerimeterWidth, rotatedBoundaryLayer.z)
def addOperatingOrbits( self, boundaryLoops, pointComplex, temperatureChangeTime, z ): "Add the orbits before the operating layers." if len( boundaryLoops ) < 1: return insetBoundaryLoops = intercircle.getInsetLoopsFromLoops( self.perimeterWidth, boundaryLoops ) if len( insetBoundaryLoops ) < 1: insetBoundaryLoops = boundaryLoops largestLoop = euclidean.getLargestLoop( insetBoundaryLoops ) if pointComplex != None: largestLoop = euclidean.getLoopStartingNearest( self.perimeterWidth, pointComplex, largestLoop ) intercircle.addOrbitsIfLarge( self.distanceFeedRate, largestLoop, self.orbitalFeedRatePerSecond, temperatureChangeTime, z )
def addInset( self, rotatedBoundaryLayer ): "Add inset to the layer." alreadyFilledArounds = [] halfWidth = self.halfPerimeterWidth self.distanceFeedRate.addLine( '(<layer> %s )' % rotatedBoundaryLayer.z ) # Indicate that a new layer is starting. if rotatedBoundaryLayer.rotation != None: halfWidth *= self.insetRepository.bridgeWidthMultiplier.value self.distanceFeedRate.addTagBracketedLine( 'bridgeRotation', rotatedBoundaryLayer.rotation ) # Indicate the bridge rotation. extrudateLoops = intercircle.getInsetLoopsFromLoops( halfWidth, rotatedBoundaryLayer.loops ) for extrudateLoop in extrudateLoops: self.addGcodeFromRemainingLoop( extrudateLoop, alreadyFilledArounds, halfWidth, rotatedBoundaryLayer.z ) addAlreadyFilledArounds( alreadyFilledArounds, extrudateLoop, self.overlapRemovalWidth ) self.distanceFeedRate.addLine( '(</layer>)' )
def addInset( self, rotatedBoundaryLayer ): "Add inset to the layer." alreadyFilledArounds = [] halfWidth = self.halfPerimeterWidth if rotatedBoundaryLayer.rotation != None: halfWidth *= self.repository.bridgeWidthMultiplier.value self.distanceFeedRate.addTagBracketedLine( 'bridgeRotation', rotatedBoundaryLayer.rotation ) extrudateLoops = intercircle.getInsetLoopsFromLoops( halfWidth, rotatedBoundaryLayer.loops ) if self.repository.loopOrderAscendingArea.value: extrudateLoops = triangle_mesh.getLoopsInOrderOfArea( triangle_mesh.compareAreaAscending, extrudateLoops ) else: extrudateLoops = triangle_mesh.getLoopsInOrderOfArea( triangle_mesh.compareAreaDescending, extrudateLoops ) for extrudateLoop in extrudateLoops: self.addGcodeFromRemainingLoop( extrudateLoop, alreadyFilledArounds, halfWidth, rotatedBoundaryLayer.z )
def addTemperatureOrbits( self, endpoints, temperaturePreference, temperatureTimeChangePreference, z ): "Add the temperature and orbits around the support layer." if self.layerIndex < 0: return boundaryLoops = self.boundaryLayers[ self.layerIndex ].loops self.addTemperature( temperaturePreference.value ) if len( boundaryLoops ) < 1: layerCornerHigh = complex( - 999999999.0, - 999999999.0 ) layerCornerLow = complex( 999999999.0, 999999999.0 ) for endpoint in endpoints: layerCornerHigh = euclidean.getMaximum( layerCornerHigh, endpoint.point ) layerCornerLow = euclidean.getMinimum( layerCornerLow, endpoint.point ) squareLoop = euclidean.getSquareLoop( layerCornerLow, layerCornerHigh ) intercircle.addOrbitsIfLarge( self.distanceFeedRate, squareLoop, self.orbitalFeedRatePerSecond, temperatureTimeChangePreference.value, z ) return perimeterInset = 0.4 * self.perimeterWidth insetBoundaryLoops = intercircle.getInsetLoopsFromLoops( perimeterInset, boundaryLoops ) if len( insetBoundaryLoops ) < 1: insetBoundaryLoops = boundaryLoops largestLoop = euclidean.getLargestLoop( insetBoundaryLoops ) intercircle.addOrbitsIfLarge( self.distanceFeedRate, largestLoop, self.orbitalFeedRatePerSecond, temperatureTimeChangePreference.value, z )
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 )
def addOutset( self, rotatedBoundaryLayer ): "Add outset to the layer." extrudateLoops = intercircle.getInsetLoopsFromLoops( - self.absoluteHalfPerimeterWidth, rotatedBoundaryLayer.loops ) sortedLoops = triangle_mesh.getLoopsInOrderOfArea( triangle_mesh.compareAreaAscending, extrudateLoops ) for sortedLoop in sortedLoops: self.addGcodeFromRemainingLoop( sortedLoop, self.absoluteHalfPerimeterWidth, rotatedBoundaryLayer.z )