Python 3D-принтер пост-процессор gcode ведет себя странно

Я написал небольшой почтовый процессор Gcode на Python, чтобы сделать некоторые дополнения к 3D-печати. Первоначальная проблема заключалась в том, что мне нужно было, чтобы мой 3D-принтер генерировал блок очистки каждый раз, когда он менял свою головку инструмента. Если не было смены инструмента, в этом слое все еще нужно было создать блок очистки, и конец слоя с любым инструментом был активен в конце слоя (поэтому башня продолжала набирать высоту без пропущенных слоев).

Извиняюсь, если это трудно изобразить, я добавил несколько картинок, чтобы оставить меньше для воображения:

Перед запуском процессора: https://i.imgur.com/nr1daQp.png
После запуска процессора: https://i.imgur.com/uGxWogc.png
Проблемная область https://i.imgur.com/eRaxopd.png

Проблема в том, что, когда он печатает только один цвет, он, кажется, строит только одну башню. Это можно увидеть по отсутствующему слою, а затем одна башня короче другой, так как последние 50 слоев или около того синие. Может кто-нибудь пролить свет на то, почему это происходит?

Обновление: я заметил, что в коде говорилось, что он уложил левый и правый слой башни, несмотря на то, что в модифицированном Gcode не было левого и правого. Это означало, что он должен поставить правую башню с помощью функции правописателя, а затем переписать ее с помощью функции левого писателя. Я не понимаю, почему это происходит, я вызвал функцию nextzvalue между вызовами функций записи, чтобы избежать этого. Мой обходной путь состоял в том, чтобы он напечатал немного кода, содержащего обе башни Gcode, с отдельной функцией, но я хотел бы знать, почему это происходит.

Код:

def main():
    file = open("example.gcode","r")
    lines = file.readlines()
    file.close

    oldzline = 320
    tower1count = 0
    tower2count = 0
    layercount = 0
    linecounter = 0
    numberoflayers = layercounter(lines)
    toollist=[]

    while layercount < numberoflayers:
        tower1count=0
        tower2count=0
        nextzline = nextzvalue(lines,oldzline) 
        print("layer count: ",layercount)
        for line in lines:
            linecounter +=1
            if linecounter > oldzline and linecounter < nextzline:
                if line.find("TOOL CHANGE") != -1:
                    if lines[linecounter+3].find("LAYER CHANGE") == -1:
                        if tower1count==0:
                            tower1count+=1
                            print("tower1 count 1: ",tower1count)
                            rightwriter(linecounter,lines)
                        elif tower1count==1:
                            tower2count+=1
                            print("tower2 count 1: ",tower2count)
                            if tower2count!= 2:
                                leftwriter(linecounter,lines)




        if tower1count == 0 and tower2count == 0:
            nextzline = nextzvalue(lines,oldzline)
            tower2count+=1
            tower1count+=1
            print("tower1 count 2: ",tower1count)
            print("tower2 count 2: ",tower2count)
            rightwriter(nextzline-4,lines) <<<<<<right writer code being overwritten.
            nextzline = nextzvalue(lines,oldzline)<<<<< I believe this bit is not working correctly.
            leftwriter(nextzline-4,lines) <<<< causing this to overwrite the code added by the rightwriter function. 

        elif tower1count == 0:
            nextzline = nextzvalue(lines,oldzline)
            tower1count+=1
            print("tower1 count 3: ",tower1count)
            rightwriter(nextzline-4,lines)

        elif tower2count == 0:
            nextzline = nextzvalue(lines,oldzline)
            tower2count+=1
            print("tower2 count 3: ",tower2count)
            leftwriter(nextzline-4,lines)                       
        print("tower 1: ",tower1count)
        print("tower 2: ",tower2count)
        #if layercount == 121:
            #print("sleepy time")
            #time.sleep(100)
        oldzline = nextzline
        linecounter = 0
        layercount+=1

def nextzvalue(lines,oldzvalue): # finds the nex Z value i.e. the end  of the current layer/beggining of next.
    linecount = 0
    for line in lines:
        linecount+=1
        if linecount > oldzvalue:
            if line.find("G1") != -1:
                if line.find("Z") !=-1:
                    return(linecount)

def layercounter(lines): #counts the number of layers and returns them as a number
    linecount=0
    layercount=0
    for line in lines:
        linecount+=1
        if line.find("G1") !=-1and line.find("Z") != -1:
            layercount+=1
    return(layercount)

def leftwriter(linecount,lines):
    linecount = linecount+1
    #print("making a T1 layer")
    lines[linecount] = "some gcode to draw a layer of left tower here"
    with open('Example.gcode','w') as file:
         file.writelines(lines)

def rightwriter(linecount,lines):
    linecount = linecount+1
    #print("making a T2 layer")
    lines[linecount] ="some gcode to draw a layer of right tower here"
    with open('Example.gcode','w') as file:
         file.writelines(lines)

Извиняюсь за длину этого поста.

0 ответов

Другие вопросы по тегам