AutoCADのDWGファイル名から文字を抽出してフィールド入力する方法|可変文字数や括弧付きファイル名への対応

CAD

AutoCADでは、図面ファイル名に含まれる情報を取得してフィールドへ自動入力する仕組みを作ることができます。しかし、ファイル名の一部を抽出する場合、途中の文字数が変わったり、同じ記号が複数存在したりすると、単純な文字位置指定では正しく取得できないことがあります。この記事では、括弧で区切られたDWGファイル名から必要な文字だけを取得する方法と、可変長の文字列に対応する考え方について解説します。

固定位置での文字抽出が失敗する理由

AutoLISPでファイル名から文字を取得する場合、substr関数を使って「何文字目から何文字取得する」という指定を行う方法があります。しかし、この方法はファイル名の構造が完全に固定されている場合にしか安定して動作しません。

例えば、aaa(bbb)(cc).dwgでは2つ目の括弧がcc部分を示しますが、aaa(bbb)(cc)(ddd).dwgでは後ろにもう一つ括弧が追加されます。そのため、最後の括弧位置を基準に計算すると、cc部分ではなく「cc)(ddd」のように余分な文字まで取得してしまうことがあります。

今回のようなケースでは、文字数ではなく「括弧の位置」を基準にして抽出する方法が適しています。

ファイル名の括弧位置を利用して抽出する考え方

ファイル名から必要な情報を取得する場合は、以下のように区切り文字を利用します。

・最初の「(」の位置を取得する
・最初の「)」の位置を取得する
・次の「(」の位置を取得する
・次の「)」の位置を取得する

このように括弧の場所を順番に取得すれば、bbbの文字数が変わっても対応できます。また、dddが存在する場合でもccだけを正確に取り出すことができます。

AutoLISPで2つ目の括弧内だけを取得する例

例えば、cc部分を取得したい場合は、2つ目の括弧の開始位置と終了位置を取得して、その間だけsubstrで抜き出します。

以下のような考え方になります。

(setq p1 (vl-string-position (ascii “(“) flfname))
(setq p2 (vl-string-position (ascii “(“) flfname (+ p1 1)))
(setq p3 (vl-string-position (ascii “)”) flfname (+ p2 1)))
(setq cc (substr flfname (+ p2 2) (- p3 p2 1)))

ポイントは、最初に見つかった括弧ではなく、2番目の括弧を検索している点です。これによりbbbの長さが変わっても影響を受けません。

dddがある場合とない場合を判定する方法

ddd部分が存在するかどうかを判断する場合は、3つ目の括弧が存在するか確認します。3つ目の「(」が見つからなければ、ファイル名はaaa(bbb)(cc).dwg形式だと判断できます。

逆に3つ目の括弧が存在する場合は、aaa(bbb)(cc)(ddd).dwg形式なので、ccの取得位置は変わりませんが、dddも追加で取得できます。

例えば、以下のようなファイル名でも対応できます。

aaa(test01)(A12).dwg
aaa(test999)(A12)(B05).dwg

どちらの場合でも括弧の位置を基準にすることで、bbbの長さに関係なく正しい値を取得できます。

現在のコードで修正したほうがよいポイント

現在のコードでは、pos2で最初に見つかった「)」を取得しています。そのため、ccを取得したい場合でも、後ろにdddがあるファイルでは最後の部分まで含めた計算になってしまいます。

また、setq pos3 (- fnlen pos2 3)のようにファイル末尾から逆算する方法も、後ろに追加情報が増えるファイル名では対応できません。

ファイル名の規則が変わる可能性がある場合は、文字数計算ではなく、区切り記号の位置を順番に取得する処理へ変更するほうが安全です。

AutoCADフィールドへ反映する場合の注意点

AutoCADのフィールドで$(getvar,”Users1″)のように取得する場合、AutoLISP側でUSERS1~USERS3へ正しい値をセットできていれば、自動更新で表示できます。

ただし、フィールド表示が更新されない場合は、REGENだけではなく、フィールド更新コマンドや図面再読み込みが必要になる場合があります。

また、ファイル名から取得する情報を図面表題欄などで使用する場合は、命名規則をできるだけ統一しておくことで、後々のトラブルを減らすことができます。

まとめ

AutoCADでDWGファイル名から文字を取得する場合、可変長の文字列や追加項目があるファイル名では、文字位置を固定して取得する方法は不安定になります。

今回のようなaaa(bbb)(cc).dwgとaaa(bbb)(cc)(ddd).dwgの両方に対応するには、括弧の位置を順番に検索し、その間の文字を取得する方法が適しています。

ファイル名の構造を解析して必要な部分だけを取り出すようにAutoLISPを組むことで、将来的に項目が増えた場合でも修正しやすいフィールド連携を作成できます。

コメント

タイトルとURLをコピーしました