libredwgとdxfgrabberを使用して、win10のdwg / dxf情報を解析します

CADファイルの情報は、その後の処理と分析のために作業で解析する必要があるためです。これが私のメソッドの簡単な紹介です。作業上の理由から特定の実装を詳細に説明することはできません。ここではコアコード部分のみを示します。

1.ツールのインストール

  • libredwg:dwgファイルの解析に使用されます。特定のインストールチュートリアルについては、私の記事を参照してください:windows10CAD解析ライブラリlibredwgインストールレコード
  • dxfgrabber:Pythonでdxfファイルを解析するために使用されます。特定のインストールコマンドは次のとおりです。
pip install dxfgrabber

2、dwgからdxf

ここではdwg2dxf.exeを使用する必要があります。これは、前にインストールしたlibredwgフォルダーにあり、pythonを使用してコマンドラインを呼び出してdwgファイルを変換します。なぜここで変形するのですか?dwgはAutoCADの暗号化されたファイルであるため、バージョンごとに解析方法が異なり、dxf形式はオープンソースファイル形式です。現在、pythonを使用して情報を直接解析しています。

    commd="dwg2dxf.exe"    
    # 设置转化工具参数
    verbosity = " -v{}".format(verbosity)
    versions = " --r{}".format(versions)
    outfile = ' -o "{}"'.format(outfile_path)

    try:
        subprocess.run(
            '"' + commd + '"' + verbosity + versions + outfile + " " + '"' + infiles + '"',
            timeout=20,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
        # rc, out = subprocess.getstatusoutput('"'+commd+'"' + verbosity + versions + outfile +" "+ '"'+infiles+'"')
        # print(out)
    except:
        error_txt.append(infiles)
        print("dwg to dxf fail!!!,please check to see if it contains "
              "'gbk' char .({})".format('"' + commd + '"' + verbosity + versions + outfile + " " + '"' + infiles + '"'))

3つ目は、Pythonを使用してdxfファイルを解析する

ここDxfgrabberが使用されており、特定の使用方法はその開発ドキュメントを参照できます。

import dxfgrabber

dxf = dxfgrabber.readfile(file_name)

    # 解析dxf文件
    # 存储文本
    txt=[]
    insert_block=[]
    for type in dxf.entities:
        if type.dxftype == "MTEXT":
            # 保存多行文本信息
            txt.append(TEXTINFO(type.raw_text,
                                type.insert[0],type.insert[1],
                                type.height,type.rect_width,
                                type.font,type.line_spacing))

        elif type.dxftype == "TEXT":
            # 保存单行文本信息、
            txt.append(TEXTINFO(type.text,
                                type.insert[0],type.insert[1],
                                type.height,type.width,
                                type.font))
        elif type.dxftype=="LINE":
              print("=======================>")
              print("坐标:", type.start,type.end)
        elif type.dxftype == "INSERT":
            if not type.name in dxf.blocks:
                continue

            block_info=BLOCKINFO()
            blocks=dxf.blocks[type.name]
            for entity in blocks:
                if entity.dxftype=="TEXT":
                    block_info.add_text(entity.text,
                                        entity.insert[0], entity.insert[1],
                                        entity.height, entity.width,
                                        entity.font)
                elif entity.dxftype == "MTEXT":
                    block_info.add_text(entity.raw_text,
                                        entity.insert[0], entity.insert[1],
                                        entity.height, entity.rect_width,
                                        entity.font, entity.line_spacing)

                elif entity.dxftype=="LINE":
                    block_info.add_line(entity.start,entity.end)
            insert_block.append(block_info)

4、まとめ

この方法では、dwgデータ情報の一部を分析できますが、レイヤ情報を解決できないか、一部の情報が欠落しているため、情報を再構築するときに混乱が生じます。もちろん、この方法にも利点があります。CADに依存せずに直接実行でき、速度は比較的高速です。フォローアップでは、objectARXを使用してCAD情報を解析することも記録します。比較的、この方法は比較的安定しています。結局のところ、AutoCADの低レベルコードを直接使用するため、比較的正確で解析が簡単です。関連する仕事をするときは、友達がObjectARXを優先することをお勧めします。インターネット上にもたくさんの資料があります。

おすすめ

転載: blog.csdn.net/wxplol/article/details/105070922