Open4

DXFファイルの文字列を抽出する

ひでひで

AutoCADなどのCADソフトでしばしば使用される中間ファイル「DXF」から文字列を取得すればいいのか。
その方法を以下のコードで紹介します。
pythonではDXFファイルを操作するためのライブラリ(ezdxf)が用意されています。
pythonのライブラリは本当になんでもあって便利だ笑

import ezdxf

def get_text_from_dxf(file_path):
    doc = ezdxf.readfile(file_path)  # ←DXFファイルを開く
    msp = doc.modelspace()           # ←図面の内容を取得
    all_texts = []                   # ←空の箱を用意
    
    for entity in msp:               # ←図面の部品を一つずつ調べる
        if entity.dxftype() == 'TEXT': # ←その部品がテキストかチェック
            text_content = entity.dxf.text  # ←テキストの中身を取得
            all_texts.append(text_content)  # ←箱に入れる
            print(text_content)       # ←画面に表示
    
    return all_texts                 # ←集めたテキストを返す

ひでひで

どのようなテキストが含まれているかを確認するは関数をそのまま使用すると表示されます。
get_text_from_dxf(file_path)
ぜひ、ターミナルなどで試して確認してください。

ひでひで

正規表現などを利用すると更に自分が取得したい特定の文字列を抽出することが可能になります。
DXFファイルから電話番号を抽出するなんてことはないかもしれませんが、以下のように正規表現を組み合わせることで特定の文字列や数値の抽出が可能になります。
(かもしれないというかないなこんなこと笑)

import ezdxf


def extract_specific_strings(all_texts):
    """電話番号を抽出"""
    
    print("=== 電話番号を検索 ===")
    # xxx-xxxx-xxxx xは数値
    pattern = r'\d{3}-\d{4}-\d{4}'
    
    found_patterns = []
    
    for text in all_texts:
        matches = re.findall(pattern, text)
        if matches:
            found_patterns.extend(matches)
            print(f"発見: '{text}' → {matches}")
    
    # 重複を除去(必要な場合)
    unique_patterns = list(set(found_patterns))
    
    return unique_patterns

all_texts = get_text_from_dxf(file_path)
patterns = find_hyphen_patterns_3plus(all_texts)

print(f"\n=== 結果 ===")
print(f"抽出されたパターン数: {len(patterns)}")
for i, pattern in enumerate(patterns, 1):
    print(f"{i}. {pattern}")

ひでひで

DXFファイルのテキストの種類

DXFファイルにおけるテキストの種類は、主に「TEXT」エンティティと「MTEXT」エンティティの2種類があります。
TEXTエンティティは、1行のテキストを表現します。
MTEXTエンティティは、複数行のテキストや書式設定をサポートします。

TEXTエンティティ:
1行のテキストを表現する基本的なエンティティです。
位置、高さ、回転角、文字列などの属性を持ちます。
単純なテキスト表示に適しています。
MTEXTエンティティ:
複数行のテキストを表現できます。
フォント、色、サイズなどの書式設定を適用できます。
高度なテキスト表現や、より複雑なテキストレイアウトに適しています。