Python Forum
Help moding python script to edit Gcode
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Help moding python script to edit Gcode
#1
Hi there!
I'm new to python, haven't done any coding in 20 years. I used to do Basic code for the Basic stamp controller.
Anyways, I have a script that a nice person made for me that will strip the comment lines out of my Gcode. The software I use to create the Gcode is LightBurn.
LightBurn software adds a ; to the beginning of every comment line. My CNC controller does not understand ; and goes nuts!!! But I would rather keep the comment lines instead of stripping it out. To do this I would need to add a( at the start of the comment line and ) at the end. So basically I'd like Python to find any line that starts with ; and then add ( ) to that whole line. I googled to try to learn this myself but couldn't come up with info geared to what I'm after.
Here is the script and some sample code. Any help would be great!


import sys
import os

if len(sys.argv) != 2:
print('Usage: python nocomment.py <file.gcode>')
sys.exit(1)

in_file = os.path.abspath(sys.argv[1])

if not os.path.isfile(in_file):
print(in_file + ' does not exist!')
sys.exit(1)

with open(in_file, 'r+') as f:
out_lines = []
for line in f.readlines():
if not line.lstrip().startswith(';'):
out_lines.append(line)

if(len(out_lines) > 0):
f.seek(0)
f.truncate()
f.writelines(out_lines)

print('comment removal complete for ' + in_file)


And the sample Gcode:

; LightBurn 0.9.20
; GRBL-M3 (1.1e or earlier) device profile, user origin
; Bounds: X103.74 Y238.22 to X190.39 Y319.63

;USER START SCRIPT



;USER START SCRIPT

G00 G17 G40 G21 G54
G90
G0 X0 Y0
G91
; Scan+Cut @ 1200 mm/min, 100% power
M9
M5
G0X16.15Y6.26
; Layer C01
M3
G1X0.39F1200S255
G1X72.62Y0.2F2800S0
G1X-0.69F1200S255
G1X-3.3F2800S0
G1X-2.8F1200S255
G1X-0.7S0
G1X-3.5S255

Thanks
Glen
Reply
#2
Please use the bbcode "python" tags for your code.

Looks like the meat is here:
if not line.lstrip().startswith(';'):
    out_lines.append(line)
If it's not commented, add it to out_lines. You just need to do something else when it is a comment. Perhaps something like:

if line.lstrip().startswith(';'):
    out.lines.append("(" + line + ")")
else:
    out_lines.append(line)
Reply
#3
Hi,
Thanks for the help!
I gave it a try and this is the message I'm getting in the command prompt window.
I tried moving the Else around on the line a bit but didn't help.

Microsoft Windows [Version 10.0.17134.1]
© 2018 Microsoft Corporation. All rights reserved.

C:\Users\Glen>d:

D:\>cd lightburn

D:\lightburn>comment.py test.gc
File "D:\lightburn\comment.py", line 19
else:
^
SyntaxError: invalid syntax

D:\lightburn>

Edit got the else figured out but now have this issue.

D:\lightburn>comment.py test.gc
Traceback (most recent call last):
File "D:\lightburn\comment.py", line 18, in <module>
out.lines.append("(" + line + ")")
NameError: name 'out' is not defined

D:\lightburn>


Thanks
Glen
Reply
#4
import sys
import os

if len(sys.argv) != 2:
    print('Usage: python nocomment.py <file.gcode>')
    sys.exit(1)
    
in_file = os.path.abspath(sys.argv[1])

if not os.path.isfile(in_file):
    print(in_file + ' does not exist!')
    sys.exit(1)

with open(in_file, 'r+') as f:
    out_lines = []
    for line in f.readlines():
       if line.lstrip().startswith(';'):
        out.lines.append("(" + line + ")")
       else:
        out_lines.append(line)
            
    if(len(out_lines) > 0):
        f.seek(0)
        f.truncate()
        f.writelines(out_lines)
        
print('comment line complete for ' + in_file)
Reply
#5
Ok getting closer edited it to get ride of the . and changed it to _ HERE---- out.lines ------
but now it looks like this.

(; LightBurn 0.9.20
)(; GRBL-M3 (1.1e or earlier) device profile, user origin
)(; Bounds: X103.74 Y238.22 to X190.39 Y319.63
)
(;USER START SCRIPT
) 


(;USER START SCRIPT
)
G00 G17 G40 G21 G54
G90
G0 X0 Y0
G91
(; Scan+Cut @ 1200 mm/min, 100% power
)M9
M5
G0X16.15Y6.26
(; Layer C01
)M3
Glen
Reply
#6
Some fix done,try this.
import sys
import os

if len(sys.argv) != 2:
    print('Usage: python nocomment.py <file.gcode>')
    sys.exit(1)
in_file = os.path.abspath(sys.argv[1])

if not os.path.isfile(in_file):
    print(f'{in_file} does not exist!')
    sys.exit(1)

with open(in_file, 'r+') as f:
    out_lines = []
    for line in f:
        line = line.strip()
        if line.startswith(';'):
            out_lines.append(f'({line})')
        else:
            out_lines.append(line)

    if len(out_lines) > 0:
        f.seek(0)
        f.truncate()
        f.write('\n'.join(out_lines))

print(f'comment removal complete for {in_file}')
AntaresSky likes this post
Reply
#7
(Jan-03-2021, 03:06 AM)snippsat Wrote: Some fix done,try this.
import sys
import os

if len(sys.argv) != 2:
    print('Usage: python nocomment.py <file.gcode>')
    sys.exit(1)
in_file = os.path.abspath(sys.argv[1])

if not os.path.isfile(in_file):
    print(f'{in_file} does not exist!')
    sys.exit(1)

with open(in_file, 'r+') as f:
    out_lines = []
    for line in f:
        line = line.strip()
        if line.startswith(';'):
            out_lines.append(f'({line})')
        else:
            out_lines.append(line)

    if len(out_lines) > 0:
        f.seek(0)
        f.truncate()
        f.write('\n'.join(out_lines))

print(f'comment removal complete for {in_file}')

Thanks snippsat,
That worked!!!HAHA bonus!!!!
So why did that other bit of code not work properly and put the )on the next line?


Glen
Reply
#8
(Jan-03-2021, 03:20 AM)AntaresSky Wrote: So why did that other bit of code not work properly and put the )on the next line?
There was \n(new line) that should not be there for this task.
When use f.readlines() it add a \n automatically.
So what i did was to remove all new \n(line 16),then do the task.
Then last add \n with '\n'.join(out_lines) as writelines() does not add newline characters on its own.

A tips use repr() to see all👀
So you add it where you want to take a look.
with open(in_file, 'r+') as f:
    out_lines = []
    for line in f.readlines():
        print(repr(line))
with open(in_file, 'r+') as f:
    out_lines = []
    for line in f:
        line = line.strip()
        print(repr(line))
AntaresSky likes this post
Reply
#9
(Jan-03-2021, 11:54 AM)snippsat Wrote: When use f.readlines() it add a \n automatically.
Just a small note, that it's not readlines() that add \n. Newline ending is there in the file. And thus also present when just iterate over file-handle f and @snippsat removes it with strip().
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#10
Interesting!
So the line in the original script L.Lstrip is different then your script Line.strip?

I take it the Line.Lstrip is telling it to removed the whole line?
But I'm still not totally clear on what the Line.strip does. Can you dumb it down a bit for me?
ORIGINAL SCRIPT:
with open(in_file, 'r+') as f:
    out_lines = []
    for line in f.readlines():
        if not line.lstrip().startswith(';'):
            out_lines.append(line)
            
    if(len(out_lines) > 0):
        f.seek(0)
        f.truncate()
        f.writelines(out_lines)
YOUR NEW AND IMPROVED SCRIPT:

with open(in_file, 'r+') as f:
    out_lines = []
    for line in f:
        line = line.strip()
        if line.startswith(';'):
            out_lines.append(f'({line})')
        else:
            out_lines.append(line)
 
    if len(out_lines) > 0:
        f.seek(0)
        f.truncate()
        f.write('\n'.join(out_lines))
 
print(f'comment fix complete for {in_file}')
Glen
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Is there a *.bat DOS batch script to *.py Python Script converter? pstein 3 3,008 Jun-29-2023, 11:57 AM
Last Post: gologica
  Edit Open and Active Excel sheet in Python JoeDainton123 1 2,059 Jul-29-2020, 12:52 AM
Last Post: Larz60+
  python doc edit and run online? luckrill 0 1,552 Jul-09-2020, 01:28 PM
Last Post: luckrill
  How to kill a bash script running as root from a python script? jc_lafleur 4 5,790 Jun-26-2020, 10:50 PM
Last Post: jc_lafleur
  crontab on RHEL7 not calling python script wrapped in shell script benthomson 1 2,248 May-28-2020, 05:27 PM
Last Post: micseydel
  How do I edit saved Python 3 script? Mocap 1 2,004 Jul-17-2019, 08:41 AM
Last Post: perfringo
  Package python script which has different libraries as a single executable or script tej7gandhi 1 2,583 May-11-2019, 08:12 PM
Last Post: keames
  Need someone to help me edit this script edlentz 1 1,882 Apr-04-2019, 09:13 PM
Last Post: Larz60+
  Python code for gcode reader and representation ralmeida 1 6,189 Jul-31-2018, 09:20 AM
Last Post: DeaD_EyE
  How to run python script which has dependent python script in another folder? PrateekG 1 3,105 May-23-2018, 04:50 PM
Last Post: snippsat

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020