Генерация gcode из Corel Draw
Работает с dev-версией gcodetools от 27.05.2014 
https://github.com/cnc-club/gcodetools/ ... ols-dev.py
Corel X4
Файл svg-normalizer.py (модифицирует созданный экспортом Corel'а svg-файл так, чтобы inkscape его адекватно воспринимал)
Код: Выделить всё
#!/usr/env python
#svg files from corel draw export normalizer
print "svg from corel normalizing .........."
import sys
filename = sys.argv[1].strip()
f = open(filename, 'r')
lines = f.readlines()
lines = map(lambda x: x.strip() ,lines)
f = open(filename, 'w')
#modify
i = 0
while i < len(lines):
    if lines[i] in ['\n', '\r', '\r\n', '']:
        lines.pop(i)
    else:
        i += 1
#layer
for i in xrange(len(lines)-1, -1, -1):
    if lines[i] == "</svg>":
        lines.insert(i, '<svg:g inkscape:groupmode="layer" id="layer42" inkscape:label="Layer 42"/>')
        break
#xmlns
for i in xrange(len(lines)):
    if lines[i][:7] == "viewBox":
        lines.insert(i, 'xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"')
        lines.insert(i, 'xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"')
        lines.insert(i, 'xmlns:dc="http://purl.org/dc/elements/1.1/"')
        lines.insert(i, 'xmlns:cc="http://creativecommons.org/ns#"')
        lines.insert(i, 'xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"')
        lines.insert(i, 'xmlns:svg="http://www.w3.org/2000/svg"')
        break
#namedview with units
for i in xrange(len(lines)):
    if lines[i][:9] == "<metadata" or lines[i][:2] == "<g":
        lines.insert(i, '<sodipodi:namedview inkscape:document-units="mm"/>')
        break
    
#width+height
if False:
    for i in xrange(len(lines)):
        if 'width="' in lines[i] and 'height="' in lines[i]:
            lines[i] = lines[i].replace('mm"', '"')
            break
for line in lines:
    if False:
        f.write(line+'\n')
    else:
        f.write(line + " ")
    print line
        
f.close()
#print filename
#print sys.argv[0]
#import os
#print os.getcwd()
#sys.stdin.readline()
Файл cnc_club_ngc_export.bas - создать глобальный модуль Corel Draw с таким содержимым.
Код: Выделить всё
Option Explicit
Const gcodepyFile = "D:\Program Files\Inkscape-dev\share\extensions\gcodetools-dev.py"
Const svgNormalizerPyFile = "D:\Program Files\inkscape-dev\share\extensions\svg-normalizer.py"
Function genCmd(fileName, dest, _
    Optional depth = 0.35, Optional opXOffset = "50mm", Optional opYOffset = "50mm", _
    Optional Zsafe = 2, Optional postPr = "")
    Dim cmd As String
    cmd = """" & gcodepyFile & """"
    
    'cmd = addParam(cmd, "h")
    cmd = addParam(cmd, "f", fileName)
    cmd = addParam(cmd, "active-tab", "path-to-gcode")
    cmd = addParam(cmd, "path-to-gcode-depth-function", "d")
    cmd = addParam(cmd, "d", dest)
    cmd = addParam(cmd, "op-x-offset", opXOffset)
    cmd = addParam(cmd, "op-y-offset", opYOffset)
    
    cmd = addParam(cmd, "s", Zsafe)
    cmd = addParam(cmd, "c", -depth) 'z depth
    cmd = addParam(cmd, "comment-gcode", "Generated by tandem.CorelDraw script")
    
    'cmd = addParam(cmd, "min-arc-radius", 0)
    cmd = addParam(cmd, "min-arc-radius", 0.01)
    cmd = addParam(cmd, "biarc-tolerance", 0.01)
    cmd = addParam(cmd, "biarc-max-split-dept", 6)
    cmd = addParam(cmd, "feed", 100) 'feed (do not works)
    cmd = addParam(cmd, "postprocessor", postPr)
    
    '-auto_select_paths
    '  --engraving-draw-calculation-paths=ENGRAVING_DRAW_CALCULATION_PATHS
                        'Draw additional graphics to debug engraving path
    ' and more and more
    
    genCmd = cmd & " " & """" & "temp.svg" & """"
    'genCmd = cmd & " " & """" & "temp.svg" & """>nul"
    
End Function
Function addParam(txt, key, Optional val = "")
    Dim res As String
    res = txt
    If Len(key) = 1 Then
        res = res & " -" & key
    Else
        res = res & " --" & key
    End If
    If Not val = "" Then
        If IsNumeric(val) Then val = Replace(Str(val), ",", ".")
        res = res & " """ & val & """"
    End If
    addParam = res
End Function
Function getFileName(fileName, Optional number = 0)
    Dim x As Integer
    x = InStr(fileName, ".")
    If x = 0 Then
        getFileName = fileName & "_" & addZeros(number, 3) & ".ngc"
    Else
        getFileName = Left(fileName, x - 1) & "_" & addZeros(number, 3) & ".ngc"
    End If
End Function
Function getGCodetoolsFileName(fileName)
    'filename of gcodetools-file generated
    Dim x As Integer
    x = InStr(fileName, ".")
    If x = 0 Then
        getGCodetoolsFileName = fileName + "_0001."
    Else
        getGCodetoolsFileName = Left(fileName, x - 1) + "_0001." + Right(fileName, Len(fileName) - x)
    End If
    
End Function
Sub cdr_to_ngc()
    Dim Zsafe As Double
    Dim dest As String
    Dim opXOffset As String
    Dim opYOffset As String
    Dim depth As Double
    Dim tempFolder As String
    Dim postPr As String
    
    Zsafe = 1
    depth = 0.35
    dest = "C:\grav\files-test"
    tempFolder = "C:\Temp\cdrToSvgTest"
    opXOffset = "50mm"
    opYOffset = "50mm"
    postPr = "round(3);remap('(Penetrate)'->'(penet)', 'ololo'->'bo-bo-bo');"
    
    Dim waitOnReturn As Boolean: waitOnReturn = True
    Dim expopt As StructExportOptions
    Set expopt = CreateStructExportOptions
    expopt.UseColorProfile = False
    Dim expflt As ExportFilter
    Dim page As cdrExportRange
    Dim fileName As String
    Dim kilk As Integer
    
    fileName = ActiveDocument.fileName
    If fileName = "" Then fileName = "Empty"
    kilk = ActiveDocument.Pages.Count
    If MsgBox("Создать " & kilk & " NGC-файлов (" & fileName & ")?", _
                vbYesNo, "Подтверждение генерации файлов") = vbNo Then
        End
    End If
    
    Dim ind As Integer
    Dim curpageindex As Integer
    
    curpageindex = ActiveDocument.ActivePage.index
    
    Dim cmd As String
    Dim myShell As Object
    Set myShell = VBA.CreateObject("WScript.Shell")
    
    Dim genedFilename As String
    Dim newFileName As String
    
    'need to remove old file if exists
    genedFilename = getGCodetoolsFileName(fileName)
    myShell.run "cmd /c del " & tempFolder & "\" & genedFilename
    
    For ind = 1 To kilk
        'svg gen
        ActiveDocument.Pages(ind).Activate
    
        Set expflt = ActiveDocument.ExportEx("temp.svg", cdrSVG, , expopt)
        expflt.Finish
        'modify svg
        cmd = """" & svgNormalizerPyFile & """ " & "temp.svg"
        myShell.run cmd, , waitOnReturn
        'cnc gen
        cmd = genCmd(fileName, tempFolder, depth, opXOffset, opYOffset, Zsafe, postPr)
        myShell.run cmd, , waitOnReturn
        
        'moving result file
        newFileName = getFileName(fileName, ind)
        cmd = "cmd /c move " & tempFolder & "\" & genedFilename
        cmd = cmd & " " & dest & "\" & newFileName
        'MsgBox cmd
        myShell.run cmd, , waitOnReturn
        
    Next ind
    'svg del
    myShell.run "cmd /c del temp.svg"
    'del "temp.svg"
    ActiveDocument.Pages(curpageindex).Activate
    MsgBox "Готово ;)"
End Sub
Вписать настройки под себя
Const gcodepyFile = "D:\Program Files\Inkscape-dev\share\extensions\gcodetools-dev.py"
Const svgNormalizerPyFile = "D:\Program Files\inkscape-dev\share\extensions\svg-normalizer.py"
 Подставить свои пути к файлам
    Zsafe = 1
    depth = 0.35
    dest = "C:\grav\files"
 Глубина, высота безопасного перехода, директория назначения.
    tempFolder = "C:\Temp\cdrToSvg" 
 Рабочая директория, куда будут попадать файлы сгенерированные gcodetools'ом. Тут же должны размещаться файлы footer и header.
    opXOffset = "50mm"
    opYOffset = "50mm"
Координаты, где будет находиться начало осей.
    postPr = "round(3);remap('(Penetrate)'->'(penet)', 'ololo'->'bo-bo-bo');"
 Постпроцессор.
Процедура cdr_to_ngc проходится по всем листам и создаёт соответствующее количество ngc-файлов.