end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

ezdxf for python で autocadのdxf にある表の属性値を抽出

どうやら、表の各行を INSERT ブロック図で作成し、 各カラムの枠は ATTDEF、枠に表示する値は ATTRIB による拡張属性で、 作成することもできるみたい。

このような表の内容を ezdxf for python で抽出する場合は以下

import ezdxf
import re

def main():
    target_dxf = 'DXFS/hogehoge.dxf'
    target_doc = ezdxf.readfile( target_dxf )

    selector = {"dxftype":"INSERT","name":"NS_OyaBuhinA_*"}
    inserts = query_entities_from_entitydb( target_doc, selector )
    
    for i, insert in enumerate( inserts ):
        # 表示/非表示 属性
        #if hasattr(insert.dxf, "invisible"):
        #    print( insert.dxf.invisible )

        # ATTRIB
        for attrib in insert.attribs:
            print( attrib, attrib.dxfattribs() )
            
        # ATTDEF
        for attdef in target_doc.blocks.get( insert.dxf.name ):
            if attdef.dxftype() != "ATTDEF":
                continue
            print( attdef, attdef.dxfattribs() )

    
def query_entities_from_entitydb( doc, selector ):
    query_str = "*"
    if "dxftype" in selector:
        query_str = selector["dxftype"]

    attr_conds = {}
    if "name" in selector:
        re_pattern = selector["name"].replace("*",".*")
        attr_conds["name"] = re.compile(re_pattern)

    ret_entities = []
    for entity in  doc.entitydb.query( query_str ):
        is_found = True
        for attr_key, attr_val in attr_conds.items():
            if attr_key=="name" and not attr_val.match( entity.dxf.name ):
                is_found = False
                break
        if is_found == True:
            ret_entities.append( entity )

    return ret_entities

if __name__ == '__main__':
    main()