概要 - command 関数を使用せずに複合化図形を作成する(AutoLISP)

複合化図形(旧形式のポリラインやブロック)は、entmake を複数回(従属図形ごとに別々に)呼び出すことによって作成できます。

entmake は複合化図形の最初の要素を受け取ると、まず定義データを収集するテンポラリ ファイルを作成します。拡張データが存在する場合は、このデータも収集します。その後、entmake を呼び出すごとに、この関数はテンポラリ ファイルの有無をチェックします。テンポラリ ファイルがある場合、そのファイルに新しい従属図形が追加されます。複合化図形の定義が完了すると(entmake が適切なシーケンス終了(Seqend)かブロック定義終了(Endblk)従属図形を受け取った場合)、その図形の一貫性がチェックされます。一貫性がある場合、その図形は図面に追加されます。複合化図形が不完全な場合や作成がキャンセルされた場合、ファイルは削除されます。引数を指定しないで entmake を入力すると、複合化図形の作成をキャンセルできます。その場合、テンポラリ ファイルがクリアされ、nil が返されます。

複合化図形の定義が完了するまで、複合化図形は図面上にまったく表示されません。つまり、最後のシーケンス終了(Seqend)かブロック定義終了(Endblk)従属図形が、entmakeに渡されるまでは表示されません。複合化図形がまだ完全なものになっていない場合、直前に作成した従属図形を、entlast 関数を使用して検索することはできません。

以上の説明で明らかなように、entmake は一度に 1 つの複合化図形しか作成できません。複合化図形を作成しているときに entmake が無効なデータや適切でない subentityを受け取ると、無効な図形と複合化図形全体が拒否されます。

複合化図形はモデル空間またはペーパー空間のどちらか一方だけに存在できます。複合化図形を作成しているときに command を使用して、AutoCAD の MSPACE[モデル空間]と PSPACE[ペーパー空間]コマンドのいずれかを呼び出して現在の空間を変更した場合、次の entmake の呼び出しで複合化図形はキャンセルされます。これは従属図形の dxf グループ コードが 67 で、その値が図形ヘッダの dxf グループ コード 67 と異なる場合にも起こります。

ポリラインを使用する

次の例には、1 つの複合化図形である旧形式のポリラインを作成する 5 つの entmake 関数呼び出しが含まれています。ポリラインには、座標(1,1,0)、(4,6,0)、(3,2,0)に位置する 3 つの頂点があり、線種は DASHED(破線)、色は BLUE(青)です。それ以外の省略可能な定義データはすべて、既定値であると仮定します

(entmake '((0 . "POLYLINE") ; Object type
  (62 . 5)                  ; Color
  (6 . "dashed")            ; Linetype
  (66 . 1)                  ; Vertices follow
 ))

(entmake '((0 . "VERTEX")   ; Object type
  (10 1.0 1.0 0.0)          ; Start point
))

(entmake '((0 . "VERTEX")   ; Object type
  (10 4.0 6.0 0.0)          ; Second point
))

(entmake '((0 . "VERTEX")   ; Object type
  (10 3.0 2.0 0.0)          ; Third point
))

(entmake '((0 . "SEQEND"))) ; Sequence end
注: 前述のコード例が正しく実行するためには、線種 DASHED(破線)をロードする必要があります。

上の例のように、ドット ペアを定義する場合は、ドットの両側にスペースが必要です。スペースがないと、無効なドット ペアであることを示すエラー メッセージが表示されます。ドット ペアの作成のために変数に格納された値を使用する場合は、quote (')関数の代わりに、リストと cons 関数を使用する必要があります。

たとえば、次のコードは、ポリライン オブジェクトの色と線種を、変数を使用して、値から赤と破線に設定します。

(setq clr 5
         ltype "dashed")

(entmake (list (cons 0 "POLYLINE") ; Object type
  (cons 62 clr)                    ; Color
  (cons 6 ltype)                   ; Linetype
  (cons 66 1)                      ; Vertices follow
))

旧形式のポリライン図形には、必ず頂点後続フラグ(dxf グループ コード 66)を含めます。このフラグの値は 1 でなくてはならず、フラグの後には頂点図形のシーケンスが続き、シーケンス終了(Seqend)従属図形で終了します。

アプリケーションには、ポリメッシュで任意の多数の辺を持つポリゴンを表示するものもあります。ただし、AutoCAD の図形構造では、面図形が指定できる頂点の数に制限があります。ポリゴンを三角形のくさび型に分解することによって、より複雑なポリゴンを表すことができます。AutoCAD は、三角形のくさび型を 4 つの頂点からなる面として表します。この面では 2 つの隣接した頂点が同じ値を持ちます。細分化された状態で描かれないようにするために、くさびのエッジが表示されないようにしなければなりません。AutoCAD の PFACE[ポリメッシュ]コマンドは、自動的にこの細分化を実行します。ただし、アプリケーションで直接ポリメッシュを作成する場合は、そのアプリケーション自体で細分化を行わなければなりません。

1 つの面に存在する頂点の数は、この細分化処理の重要なパラメータです。AutoCAD のシステム変数 PFACEVMAX は、アプリケーションに、1 つの面図形当たりの頂点の数を与えます。この値は読み込み専用で、4 に設定されています。

ブロックを使用する

ブロック定義はブロック定義(Block)図形から始まり、ブロック定義終了(Endblk)従属図形で終わります。新しく作成したブロックは、そのブロックを参照できるシンボル テーブルに自動的に格納されます。ブロックの定義はネストすることができず、その定義自体を参照することもできません。ブロック定義には、他のブロック定義への参照を含めることができます。

注: entmake を使用してブロックを作成する前に、tblsearch を使用して新しいブロックの名前が既存のブロックの名前と重複しないことを確認してください。entmake 関数はブロック定義テーブルで名前の重複をチェックしないため、既存のブロックをうっかり再定義してしまう可能性があります。

ブロック定義には、後続属性フラグ(dxf グループ コード 66)を含めることができます。このフラグが存在し、1 に等しい場合、一連の属性(Attrib)図形が挿入オブジェクトの後に続くことになります。属性のシーケンスはシーケンス終了(Seqend)従属図形で終了します。