【问题标题】:Converting CNC drillings from old to new system (using Python)将 CNC 钻孔从旧系统转换为新系统(使用 Python)
【发布时间】:2015-12-05 05:47:57
【问题描述】:

我有这种文件(部分):

H DX=615 DY=425 DZ=22.15 -AB C=0 T=0 R=999 *MM /"def" BX=2.5 BY=452.5 BZ=25 ;M20150710.

XBO X=100 Y=50 Z=5 V=1000 R=0 x=0 y=0 D=10 N="P" F=1 ;Test F1/10P.

...

我想将其转换为新的编程系统。我要做的是首先读取标题 (H) 并将 DX、DY 和 DZ 值分别放入命名变量中。我设法做到了,但是当我开始处理我的 XBO 生产线时(一个钻孔,我需要 X、Y、Z、V、R、x、y、D、N、F 和 ;,也在单独的变量中)我的代码很快就开始看起来很丑陋。

所以我重新开始,想出了这个:

f = open("input.xxl") # open input file
for line in f:
    if Debug==1: print line
    for char in line:
        charbuffr=charbuffr+char
        if "H" in charbuffr:
            if Debug==1: print'HEADER found!'
            charbuffr=""           
        if "XBO" in charbuffr:
            if Debug==1: print'XBO found!'
            charbuffr=""       

这正确识别了单独的命令 H 和 XBO,但我现在有点卡住了。我可以使用相同的方法从 H 和 XBO 循环内的循环中提取所有变量,但这似乎不是很好的编码...

谁能让我站稳脚跟?我不想要一个完整的解决方案,因为我喜欢编码(我的主要工作是为 CNC 机器编码,与 Python 相比现在看起来很容易),但很想知道哪种方法最好......

【问题讨论】:

  • 使用字典而不是多个变量。
  • 查看str.split()dict()ast.literal_eval()

标签: python post-processing cnc


【解决方案1】:

您可以使用ast. literal_eval,而不是手动转换数据类型。该辅助函数采用['a=2', 'b="abc"'] 形式的列表并转换为字典{'a': 2, 'b': 'abc'}

import ast

def dict_from_row(row):
    """Convert a list of strings in the form 'name=value' into a dict."""
    res = []
    for entry in row:
        name, value = entry.split('=')
        res.append('"{name}": {value}'.format(name=name, value=value))
    dict_string = '{{{}}}'.format(', '.join(res))
    return ast.literal_eval(dict_string)

现在解析文件变得有点简单了:

for line in f:
    row = line.split()
    if not row:
        continue
    if row[0] == 'H':
        header = dict_from_row(row[1:4])
    elif line[0] == 'XBO':
        xbo = dict_from_row(row[1:11])

结果:

>>> header
{'DX': 615, 'DY': 425, 'DZ': 22.15}

>>> xbo
{'D': 10, 'F': 1, 'R': 0, 'V': 1000, 'X': 100, 'Y': 50, 'Z': 5, 'x': 0, 'y': 0}

【讨论】:

    【解决方案2】:

    作为灵感,你可以这样做:

    for raw_line in f:
        line = raw_line.split()
        if not line:
            continue
        if line[0] == 'H':
            header = {}
            for entry in line[1:4]:
                name, value = entry.split('=')
                header[name] = float(value)
        elif line[0] == 'XBO':
            xbo = {}
            for entry in line[1:11]:
                name, value = entry.split('=')
                try:
                    xbo[name] = int(value)
                except ValueError:
                    xbo[name] = value[1:-1] # stripping of the ""
    

    现在header包含您的域的扩展名:

    {'DX': 615.0, 'DY': 425.0, 'DZ': 22.15}
    

    xbo 其他值:

    {'D': 10,
     'F': 1,
     'N': 'P',
     'R': 0,
     'V': 1000,
     'X': 100,
     'Y': 50,
     'Z': 5,
     'x': 0,
     'y': 0}
    

    访问字典中的各个值:

    >>> header['DX']
    615.0
    

    【讨论】:

    • 感谢大家的精彩回答!现在可以继续我的项目了:)。
    • 如果能解决你的问题,你可以accept回答。
    • 好的,首先要看看如何做到这一点:)。您的回答确实解决了问题,并为该程序打开了很多其他我一开始都没有想到的可能性......
    • 嗨,更改了这些:#header[name] = float(value) > header[name] = str(value)int(value) #xbo[name] = xbo[name] = str(值)能够处理这样的行:'XBO X=DX-100'。你觉得它有什么问题吗?它似乎确实有效,但它太容易了,我认为我的代码稍后会因为这个而出现问题......谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多