MrDraw/SkeinPyPy/fabmetheus_utilities/miscellaneous/nophead/gRead.py
daid 77d04ceab8 Removed patches for different skeinforge versions. Only SF48 now.
Updated build script to create win32/linux/macos versions.
Fixed the defaults to they work with PLA.
Fixed the temperature plugin default "ON" problem.
Removed all profiles except for PLA.
2012-02-10 17:20:03 +01:00

103 lines
3.5 KiB
Python

from vector3 import Vector3
# Get the entire text of a file.
# @param fileName name of the file
# @return entire text of a file.
def getFileText(fileName):
file = open( fileName, 'r')
fileText = file.read()
file.close()
return fileText
# Get the all the lines of text of a text.
# @param text text
# @return the lines of text of a text
def getTextLines(text):
return text.replace('\r', '\n').split('\n')
# Get the double value of the word after the first letter.
# @param word string with value starting after the first letter
# @return double value of the word after the first letter
def getDoubleAfterFirstLetter(word):
return float( word[1 :] )
# Get index of the first occurence of the given letter in the split line, starting with the second word. Return - 1 if letter is not found
def getIndexOfStartingWithSecond(letter, splitLine):
for wordIndex in xrange( 1, len(splitLine) ):
word = splitLine[ wordIndex ]
firstLetter = word[0]
if firstLetter == letter:
return wordIndex
return - 1
class gRead:
def __init__(self,fileName, layers,gcodeText = ''):
if gcodeText == '':
gcodeText = getFileText(fileName)
textLines = getTextLines(gcodeText)
self.last_pos = Vector3()
self.layers = layers
self.layer = None
self.thread = None
self.skeinforge = 0
self.max_z = -9999999999
for line in textLines:
self.parseLine(line)
self.newLayer()
def parseLine(self, line):
if line.startswith( "(" ):
if line.startswith( "(<layer>" ):
self.newLayer()
return
splitLine = line.split()
if len(splitLine) < 1:
return 0
firstWord = splitLine[0]
if firstWord == 'G1':
self.linearMove(splitLine)
if firstWord == 'M110': #filament height only sent by skeinforge at the moment
self.skeinforge = 1
self.newThread()
if firstWord == 'M103': #extruder off
if self.skeinforge:
self.newThread() #end of thread if skeinforge
if firstWord == 'G92': #offset coordinate system
self.newThread() #for RepRap
# Set a point to the gcode split line.
def setPointComponent( self, point, splitLine ):
indexOfX = getIndexOfStartingWithSecond( "X", splitLine )
if indexOfX > 0:
point.x = getDoubleAfterFirstLetter( splitLine[indexOfX] )
indexOfY = getIndexOfStartingWithSecond( "Y", splitLine )
if indexOfY > 0:
point.y = getDoubleAfterFirstLetter( splitLine[indexOfY] )
indexOfZ = getIndexOfStartingWithSecond( "Z", splitLine )
if indexOfZ > 0:
point.z = getDoubleAfterFirstLetter( splitLine[indexOfZ] )
def newLayer(self):
self.newThread()
if self.layer:
self.layers.append(self.layer)
self.layer = []
def newThread(self):
if self.thread:
self.layer.append(self.thread)
self.thread = []
def linearMove( self, splitLine ):
if self.thread != None:
pos = self.last_pos.copy()
self.setPointComponent( pos, splitLine )
if pos.z > self.max_z:
# self.newLayer()
self.max_z = pos.z
if pos.z < self.last_pos.z:
self.newThread()
if self.skeinforge or pos.z < self.max_z:
self.thread.append(pos)
self.last_pos = pos