def __init__( self, repository, skein ): "Initialize the skein window." self.arrowshape = ( 24, 30, 9 ) self.addCanvasMenuRootScrollSkein( repository, skein, '_behold', 'Behold Viewer' ) self.center = 0.5 * self.screenSize self.motionStippleName = 'gray75' halfCenter = 0.5 * self.center.real negativeHalfCenter = - halfCenter self.halfCenterModel = halfCenter / skein.scale negativeHalfCenterModel = - self.halfCenterModel roundedHalfCenter = euclidean.getThreeSignificantFigures( self.halfCenterModel ) roundedNegativeHalfCenter = euclidean.getThreeSignificantFigures( negativeHalfCenterModel ) self.negativeAxisLineX = tableau.ColoredLine( Vector3(), 'darkorange', None, Vector3( negativeHalfCenter ), 'X Negative Axis: Origin -> %s,0,0' % roundedNegativeHalfCenter ) self.negativeAxisLineY = tableau.ColoredLine( Vector3(), 'gold', None, Vector3( 0.0, negativeHalfCenter ), 'Y Negative Axis: Origin -> 0,%s,0' % roundedNegativeHalfCenter ) self.negativeAxisLineZ = tableau.ColoredLine( Vector3(), 'skyblue', None, Vector3( 0.0, 0.0, negativeHalfCenter ), 'Z Negative Axis: Origin -> 0,0,%s' % roundedNegativeHalfCenter ) self.positiveAxisLineX = tableau.ColoredLine( Vector3(), 'darkorange', None, Vector3( halfCenter ), 'X Positive Axis: Origin -> %s,0,0' % roundedHalfCenter ) self.positiveAxisLineY = tableau.ColoredLine( Vector3(), 'gold', None, Vector3( 0.0, halfCenter ), 'Y Positive Axis: Origin -> 0,%s,0' % roundedHalfCenter ) self.positiveAxisLineZ = tableau.ColoredLine( Vector3(), 'skyblue', None, Vector3( 0.0, 0.0, halfCenter ), 'Z Positive Axis: Origin -> 0,0,%s' % roundedHalfCenter ) self.repository.axisRulings.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.repository.bandHeight.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) self.repository.bottomBandBrightness.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) self.repository.bottomLayerBrightness.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) self.repository.fromTheBottom.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) self.repository.fromTheTop.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) self.setWindowNewMouseTool( display_line.getNewMouseTool, self.repository.displayLine ) self.setWindowNewMouseTool( view_move.getNewMouseTool, self.repository.viewMove ) self.setWindowNewMouseTool( view_rotate.getNewMouseTool, self.repository.viewRotate ) self.repository.numberOfFillBottomLayers.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) self.repository.numberOfFillTopLayers.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) self.repository.viewpointLatitude.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.repository.viewpointLongitude.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.repository.widthOfAxisNegativeSide.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.repository.widthOfAxisPositiveSide.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.repository.widthOfFillBottomThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.repository.widthOfFillTopThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.repository.widthOfInfillThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.repository.widthOfLoopThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.repository.widthOfPerimeterInsideThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.repository.widthOfPerimeterOutsideThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.repository.widthOfRaftThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) self.addMouseToolsBind() self.negativeRulings = [] self.positiveRulings = [] for rulingIndex in xrange( 1, int( math.ceil( self.halfCenterModel / self.rulingSeparationWidthMillimeters ) ) ): modelDistance = rulingIndex * self.rulingSeparationWidthMillimeters self.negativeRulings.append( Ruling( modelDistance, self.getRoundedRulingText( 1, - modelDistance ) ) ) self.positiveRulings.append( Ruling( modelDistance, self.getRoundedRulingText( 1, modelDistance ) ) ) self.rulingExtentHalf = 0.5 * self.rulingExtent
def parseGcode( self, gcodeText ): "Parse gcode text and store the statistics." self.absolutePerimeterWidth = 0.4 self.characters = 0 self.cornerHigh = Vector3( - 999999999.0, - 999999999.0, - 999999999.0 ) self.cornerLow = Vector3( 999999999.0, 999999999.0, 999999999.0 ) self.extruderActive = False self.extruderSpeed = 0.0 self.extruderToggled = 0 self.feedRateMinute = 600.0 self.layerThickness = 0.4 self.numberOfLines = 0 self.procedures = [] self.totalBuildTime = 0.0 self.totalDistanceExtruded = 0.0 self.totalDistanceTraveled = 0.0 lines = gcodec.getTextLines( gcodeText ) for line in lines: self.parseLine( line ) averageFeedRate = self.totalDistanceTraveled / self.totalBuildTime self.characters += self.numberOfLines kilobytes = round( self.characters / 1024.0 ) halfPerimeterWidth = 0.5 * self.absolutePerimeterWidth halfExtrusionCorner = Vector3( halfPerimeterWidth, halfPerimeterWidth, halfPerimeterWidth ) self.cornerHigh += halfExtrusionCorner self.cornerLow -= halfExtrusionCorner extent = self.cornerHigh - self.cornerLow roundedHigh = euclidean.getRoundedPoint( self.cornerHigh ) roundedLow = euclidean.getRoundedPoint( self.cornerLow ) roundedExtent = euclidean.getRoundedPoint( extent ) axisString = " axis, the extrusion starts at " crossSectionArea = 0.9 * self.absolutePerimeterWidth * self.layerThickness # 0.9 if from the typical fill density if self.extrusionDiameter != None: crossSectionArea = math.pi / 4.0 * self.extrusionDiameter * self.extrusionDiameter volumeExtruded = 0.001 * crossSectionArea * self.totalDistanceExtruded self.addLine( "On the 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( "On the 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( "On the 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( "The average feedRate is %s mm/s, (%s mm/min)." % ( euclidean.getThreeSignificantFigures( averageFeedRate ), euclidean.getThreeSignificantFigures( 60.0 * averageFeedRate ) ) ) self.addLine( "The cross section area is %s mm2." % euclidean.getThreeSignificantFigures( crossSectionArea ) ) if self.extrusionDiameter != None: self.addLine( "The extrusion diameter is %s mm." % euclidean.getThreeSignificantFigures( self.extrusionDiameter ) ) self.addLine( "The extruder speed is %s" % euclidean.getThreeSignificantFigures( self.extruderSpeed ) ) self.addLine( "The extruder was extruding %s percent of the time." % euclidean.getThreeSignificantFigures( 100.0 * self.totalDistanceExtruded / self.totalDistanceTraveled ) ) self.addLine( "The extruder was toggled %s times." % self.extruderToggled ) self.addLine( "The layer thickness is %s mm." % euclidean.getThreeSignificantFigures( self.layerThickness ) ) if self.operatingFeedRatePerSecond != None: flowRate = crossSectionArea * self.operatingFeedRatePerSecond self.addLine( "The operating flow rate is %s mm3/s." % euclidean.getThreeSignificantFigures( flowRate ) ) self.addLine( 'The perimeter extrusion fill density ratio is %s' % euclidean.getThreeSignificantFigures( crossSectionArea / self.absolutePerimeterWidth / self.layerThickness ) ) self.addLine( "The perimeter width is %s mm." % euclidean.getThreeSignificantFigures( self.absolutePerimeterWidth ) ) self.addLine( " " ) self.addLine( "The following procedures have been performed on the skein:" ) for procedure in self.procedures: self.addLine( procedure ) self.addLine( " " ) self.addLine( "The text has %s lines and a size of %s KB." % ( self.numberOfLines, kilobytes ) ) self.addLine( "The total build time is %s s." % int( round( self.totalBuildTime ) ) ) self.addLine( "The total distance extruded is %s mm." % euclidean.getThreeSignificantFigures( self.totalDistanceExtruded ) ) self.addLine( "The total distance traveled is %s mm." % euclidean.getThreeSignificantFigures( self.totalDistanceTraveled ) ) if self.version != None: self.addLine( "The version is " + self.version ) self.addLine( "The volume extruded is %s cc." % euclidean.getThreeSignificantFigures( volumeExtruded ) )
def __init__(self, repository, skein): "Initialize the skein window." self.arrowshape = (24, 30, 9) self.addCanvasMenuRootScrollSkein(repository, skein, '_behold', 'Behold Viewer') self.center = 0.5 * self.screenSize self.motionStippleName = 'gray75' halfCenter = 0.5 * self.center.real negativeHalfCenter = -halfCenter self.halfCenterModel = halfCenter / skein.scale negativeHalfCenterModel = -self.halfCenterModel roundedHalfCenter = euclidean.getThreeSignificantFigures( self.halfCenterModel) roundedNegativeHalfCenter = euclidean.getThreeSignificantFigures( negativeHalfCenterModel) self.negativeAxisLineX = tableau.ColoredLine( Vector3(), 'darkorange', None, Vector3(negativeHalfCenter), 'X Negative Axis: Origin -> %s,0,0' % roundedNegativeHalfCenter) self.negativeAxisLineY = tableau.ColoredLine( Vector3(), 'gold', None, Vector3(0.0, negativeHalfCenter), 'Y Negative Axis: Origin -> 0,%s,0' % roundedNegativeHalfCenter) self.negativeAxisLineZ = tableau.ColoredLine( Vector3(), 'skyblue', None, Vector3(0.0, 0.0, negativeHalfCenter), 'Z Negative Axis: Origin -> 0,0,%s' % roundedNegativeHalfCenter) self.positiveAxisLineX = tableau.ColoredLine( Vector3(), 'darkorange', None, Vector3(halfCenter), 'X Positive Axis: Origin -> %s,0,0' % roundedHalfCenter) self.positiveAxisLineY = tableau.ColoredLine( Vector3(), 'gold', None, Vector3(0.0, halfCenter), 'Y Positive Axis: Origin -> 0,%s,0' % roundedHalfCenter) self.positiveAxisLineZ = tableau.ColoredLine( Vector3(), 'skyblue', None, Vector3(0.0, 0.0, halfCenter), 'Z Positive Axis: Origin -> 0,0,%s' % roundedHalfCenter) self.repository.axisRulings.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.repository.bandHeight.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate) self.repository.bottomBandBrightness.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate) self.repository.bottomLayerBrightness.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate) self.repository.fromTheBottom.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate) self.repository.fromTheTop.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate) self.setWindowNewMouseTool(display_line.getNewMouseTool, self.repository.displayLine) self.setWindowNewMouseTool(view_move.getNewMouseTool, self.repository.viewMove) self.setWindowNewMouseTool(view_rotate.getNewMouseTool, self.repository.viewRotate) self.repository.numberOfFillBottomLayers.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate) self.repository.numberOfFillTopLayers.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate) self.repository.viewpointLatitude.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.repository.viewpointLongitude.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.repository.widthOfAxisNegativeSide.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.repository.widthOfAxisPositiveSide.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.repository.widthOfFillBottomThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.repository.widthOfFillTopThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.repository.widthOfInfillThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.repository.widthOfLoopThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.repository.widthOfPerimeterInsideThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.repository.widthOfPerimeterOutsideThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.repository.widthOfRaftThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate) self.addMouseToolsBind() self.negativeRulings = [] self.positiveRulings = [] for rulingIndex in xrange( 1, int( math.ceil(self.halfCenterModel / self.rulingSeparationWidthMillimeters))): modelDistance = rulingIndex * self.rulingSeparationWidthMillimeters self.negativeRulings.append( Ruling(modelDistance, self.getRoundedRulingText(1, -modelDistance))) self.positiveRulings.append( Ruling(modelDistance, self.getRoundedRulingText(1, modelDistance))) self.rulingExtentHalf = 0.5 * self.rulingExtent
def getCraftedGcode(self, gcodeText, repository): "Parse gcode text and store the statistics." self.absolutePerimeterWidth = 0.4 self.characters = 0 self.cornerHigh = Vector3(-999999999.0, -999999999.0, -999999999.0) self.cornerLow = Vector3(999999999.0, 999999999.0, 999999999.0) self.extruderActive = False self.extruderSpeed = 0.0 self.extruderToggled = 0 self.feedRateMinute = 600.0 self.layerThickness = 0.4 self.numberOfLines = 0 self.procedures = [] self.repository = repository self.totalBuildTime = 0.0 self.totalDistanceExtruded = 0.0 self.totalDistanceTraveled = 0.0 lines = gcodec.getTextLines(gcodeText) for line in lines: self.parseLine(line) averageFeedRate = self.totalDistanceTraveled / self.totalBuildTime self.characters += self.numberOfLines kilobytes = round(self.characters / 1024.0) halfPerimeterWidth = 0.5 * self.absolutePerimeterWidth halfExtrusionCorner = Vector3(halfPerimeterWidth, halfPerimeterWidth, halfPerimeterWidth) self.cornerHigh += halfExtrusionCorner self.cornerLow -= halfExtrusionCorner extent = self.cornerHigh - self.cornerLow roundedHigh = euclidean.getRoundedPoint(self.cornerHigh) roundedLow = euclidean.getRoundedPoint(self.cornerLow) roundedExtent = euclidean.getRoundedPoint(extent) axisString = " axis, the extrusion starts at " crossSectionArea = 0.9 * self.absolutePerimeterWidth * self.layerThickness # 0.9 if from the typical fill density if self.extrusionDiameter != None: crossSectionArea = math.pi / 4.0 * self.extrusionDiameter * self.extrusionDiameter volumeExtruded = 0.001 * crossSectionArea * self.totalDistanceExtruded self.addLine( "On the 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( "On the 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( "On the 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( "The average feedRate is %s mm/s, (%s mm/min)." % (euclidean.getThreeSignificantFigures(averageFeedRate), euclidean.getThreeSignificantFigures(60.0 * averageFeedRate))) self.addLine("The cross section area is %s mm2." % euclidean.getThreeSignificantFigures(crossSectionArea)) if self.extrusionDiameter != None: self.addLine( "The extrusion diameter is %s mm." % euclidean.getThreeSignificantFigures(self.extrusionDiameter)) self.addLine('The extrusion fill density ratio is %s' % euclidean.getThreeSignificantFigures( crossSectionArea / self.absolutePerimeterWidth / self.layerThickness)) # self.addLine( 'The perimeter extrusion fill density ratio is %s' % euclidean.getThreeSignificantFigures( crossSectionArea / self.absolutePerimeterWidth / self.layerThickness ) ) self.addLine("The extruder speed is %s" % euclidean.getThreeSignificantFigures(self.extruderSpeed)) self.addLine("The extruder was extruding %s percent of the time." % euclidean.getThreeSignificantFigures( 100.0 * self.totalDistanceExtruded / self.totalDistanceTraveled)) self.addLine("The extruder was toggled %s times." % self.extruderToggled) self.addLine("The layer thickness is %s mm." % euclidean.getThreeSignificantFigures(self.layerThickness)) if self.operatingFeedRatePerSecond != None: flowRate = crossSectionArea * self.operatingFeedRatePerSecond self.addLine("The operating flow rate is %s mm3/s." % euclidean.getThreeSignificantFigures(flowRate)) self.addLine( "The perimeter width is %s mm." % euclidean.getThreeSignificantFigures(self.absolutePerimeterWidth)) self.addLine(" ") self.addLine( "The following procedures have been performed on the skein:") for procedure in self.procedures: self.addLine(procedure) self.addLine(" ") self.addLine("The text has %s lines and a size of %s KB." % (self.numberOfLines, kilobytes)) self.addLine("The total build time is %s s." % int(round(self.totalBuildTime))) self.addLine( "The total distance extruded is %s mm." % euclidean.getThreeSignificantFigures(self.totalDistanceExtruded)) self.addLine( "The total distance traveled is %s mm." % euclidean.getThreeSignificantFigures(self.totalDistanceTraveled)) if self.version != None: self.addLine("The version is " + self.version) self.addLine("The volume extruded is %s cc." % euclidean.getThreeSignificantFigures(volumeExtruded)) return self.output.getvalue()