Sponsored links

【AutoLISP DXF情報】DXF図形情報を書き換える 関数substとentmod

Sponsored links
基礎編
Sponsored links

DXF図形情報からは、図形の情報を得るだけでなく、書き換えて図形編集することもできます。

Sponsored links

予備知識

図形からDXF図形情報を得る方法はコチラの記事を

DXF図形情報

(setq Ent (entget (car(entsel))))

このコードで、entsel で図形選択をして、car で図形名を取り出して、entget でDXF図形情報を得て、setq で変数Entに入れることができます。

Jagaimo
Jagaimo
(setq Obj (car(entsel))) 
    (setq Ent (entget Obj)) 
 
と分けても結果は同じなのでどちらでも分かりやすいほうで。
 

(setq Ent (entget (car(entsel)))) でTESTという名前のブロックを選択したとします。
その時にEntに入るブロックのDXF図形情報の一例です。

((-1 . ) (0 . "INSERT") (330 . ) (5 . "2F9") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Jagaimo") (100 . "AcDbBlockReference")
(2 . "TEST") (10 111.242 278.001 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

この情報は、グループコードと呼ばれる数字と情報がセットになっていて、数字から何の情報なのか検索できます。

8は画層のグループコードです。8を探してみると

(8 . "Jagaimo")

とあります。
このブロックは画層は”Jagaimo” ということです。

DXF図形情報の書き換え

AutoLISP関数 entmod と subst を使うと、このDXF図形情報を編集することができます。
試しに、DXF図形情報を書き換えて図形の画層を変更してみましょう。

画層0以外の図形を用意して、以下のコードをコマンドラインに入力して、
DXF図形情報を得て、画層情報を0にする。
ことを試してみてください。

(setq Ent (entget (car(entsel)))) ;DXF図形情報をEntに入れる
(entmod (subst (cons 8 "0")(assoc 8 Ent) Ent)) ;画層情報を"0"に書き換える

DXF図形情報を書き換えることで、図形の編集ができましたね。

では、ここで使ったDXF図形情報を編集する関数 subst entmod について解説していきます。

AutoLISP関数 subst と entmod

AutoLISP関数 subst は、リスト内にある古い項目を新しい項目に書き換える機能があります。
AutoLISP関数 entmod は、図形の定義データーを修正する機能があります。

entget で出てくるDXF図形情報は、複数の情報をまとめて並べてある”リスト”という形式です。

subst でDXF図形情報を書き換えたら、 entmod でデーター修正して図形が編集されます。

subst と entmod で図形の画層を変更する

subst に必要な引数は、新しい項目古い項目リスト
リストの中から古い項目を見つけて、新しい項目に変更してくれます。

上で例に挙げた、DXF図形情報の画層を”0″に変更するコードがこちらです。

(entmod (subst (cons 8 "0")(assoc 8 Ent) Ent))

この、画層を0に変更について、変数 Ent に以下のDXF図形情報が入っているという前提で説明します。

((-1 . ) (0 . "INSERT") (330 . ) (5 . "2F9") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Jagaimo") (100 . "AcDbBlockReference")
(2 . "TEST") (10 111.242 278.001 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

新しい項目 古い項目 リスト

先ほどの (entmod (subst (cons 8 “0”)(assoc 8 Ent) Ent)) を関数ごとにバラしました。(書き方が違うだけで内容は同じです。)

(setq New (cons 8 "0")) 
(setq Old (assoc 8 Ent))

(setq NewEnt (subst New Old Ent)) 
(entmod NewEnt)

(setq New (cons 8 “0”)) 
新しい項目は (cons 8 “0”) です。
cons はドットペアをつくる機能があり、この場合だと (8. “0”) が戻り値で、変数Newに入ります。

(setq Old (assoc 8 Ent))
古い項目は、(assoc 8 Ent)です。
assoc では、DXF図形情報リストから欲しい情報を取り出せます。グループコード8 (画層)の要素が戻り値なので、(8 . “Jagaimo”)が戻り値で、変数 Old に入ります。

(setq NewEnt (subst New Old Ent))
リストはEntに入っているDXF図形情報です。
(entmod (subst New Old Ent))で、リストの中から古い項目 (8 . “Jagaimo”) を見つけ、(8. “0”) に書き換えます
書き換えたDXF図形情報を変数NewEntに入れました。

(entmod NewEnt)
subst で書き換えるだけでは図形は編集されません。entmod で書き換えたDXF図形情報をに沿って図形が編集されます

以上が、subst entmodを使って、DXF図形情報を書き換えて図形の画層を0に変更する仕組みでした。

2つ以上の項目を変えるとき

DXF図形情報のリストを何回か変更して、最後に一回 entmod を実行すれば更新されます。

例えば、先ほどの例で、ブロックの画層を0にして、回転角度も変更してみましょう。

((-1 . ) (0 . "INSERT") (330 . ) (5 . "2F9") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Jagaimo") (100 . "AcDbBlockReference")
(2 . "TEST") (10 111.242 278.001 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

ブロックの回転角度のグループコードは 50 です。ここでは (50 . 0.0) とあるので、ブロックの回転角度は0です。

これを180度回転させてみましょう。

注意点は、ここでの回転角度はラジアンです。

ラジアンってなんだっけ??という方は、”円弧法 ラジアン”で検索を。
ここでは、半回転180度はpi (3.1415…) というだけで大丈夫です。

円周率を覚えなくても、pi でAutoCADに通じます。

(setq Ent (subst (cons 8 "0") (assoc 8 Ent) Ent)) 
(setq Ent (subst (cons 50 pi) (assoc 50 Ent) Ent)) 
(entmod Ent) 

さて、画層を0、回転角度をpi に変更したい場合、このように、Entに入ったDXF図形情報をを2回書き換えてから、(Entmod Ent) で修正することができます。

これをコマンドにするとこうなります。コマンド名は test です。

(defun c:test ( / Ent)
   (setq Ent (entget (car(entsel)))) ; 図形を選択してDXF図形情報をEntに入れる
   (setq Ent (subst (cons 8 "0") (assoc 8 Ent) Ent)) ; 8 の情報を書き換え
      (setq Ent (subst (cons 50 pi) (assoc 50 Ent) Ent)) ; 50の情報を書き換え
  (entmod Ent) 	; 書き換えたDXF図形情報に図形を修正
(princ));defun

グループコード8の画層はすべての図形に共通ですし、ブロックの他、テキスト/マルチテキストもグループコード50は回転角度なので、このコマンドで同じように画層を変えて回転角度が180°になります。

このコマンドを試してみて、”DXF図形情報を書き換えて図形を編集できる” ことを確認してください。

まとめ

  • DXF図形情報を書き換えることで図形編集ができる。
  • subst はリストの要素を書き換える機能がある。
  • entmod は図形データの修正をする機能がある。

参考記事

この記事と同じようにDXF図形情報の変更について。
テキスト/マルチテキストの文字スタイルを変更しています。

2点の角度から、ブロックか文字の角度を変更するコマンドコマンドサンプル。
DXF図形情報を編集する方法で角度を変更しています。

テキストの内容を変更するコマンドコマンドサンプル。
DXF図形情報を編集する方法でテキスト内容を変更しています。

リストやドットペアについて、もっと知りたい方はこちらにまとめました。

ActiveX図形情報を使うとシンプルになったりDXF図形情報には無いプロパティを変更することもできます。
DXF図形情報よりも複雑になるものもあるので状況と好みに合わせて併用するといいです。

プロパティ変更の練習問題です。
DXF図形情報の書き換え以外にもVisual Lispを使った方法も紹介しています。