モデル空間のポインタを取得する

ActiveX 関数を使用して図形を追加する場合、その図形をモデル空間またはペーパー空間のどちらに挿入するかを確認する必要があります(ActiveX の用語では、図形はオブジェクトですが、このチュートリアルでは今後も図形という用語を使用します)。新しい図形を作成する空間を AutoCAD に伝えるには、その空間のポインタを取得する必要があります。あいにく、モデル空間のポインタ取得は、単一の関数で実現できるほど簡単ではありません。次のコードは、取得方法を示しています。

(vla-get-ModelSpace (vla-get-ActiveDocument
  (vlax-get-Acad-Object)))

このコードは、内側から外側に向けて実行されます。まず、vlax-get-Acad-Object 関数によって、AutoCAD のポインタを取得します。このポインタは、vla‑get‑ActiveDocument 関数に渡されます。この関数は、AutoCAD 内のアクティブな図面(ドキュメント)のポインタを取得します。次に、アクティブなドキュメントのポインタは、vla‑get‑ModelSpace 関数に渡されます。この関数は、現在の図面のモデル空間のポインタを取得します。

これは、何度も入力したい式ではありません。たとえば、ActiveX を使用してポリラインを追加するコードは、モデル空間を表す式全体を使用すると、次に示すように、非常に複雑になります。

(setq pline (vla-addLightweightPolyline
  (vla-get-ModelSpace
    (vla-get-ActiveDocument
      (vlax-get-Acad-Object)
    )
  )
  VLADataPts)
)
(vla-put-closed pline T)

この関数は、容易には覚えられません。それだけでなく、プログラム内で図形を作成するすべての個所で、ネストされた同じ式を繰り返さなければなりません。そこで、グローバル変数の数少ない優れた使い方の 1 つを紹介します。庭園の歩道アプリケーションでは、モデル空間に多数の図形を追加することになるので(歩道内のタイルを考えてみてください)、次のコードのように、モデル空間のポインタを格納するグローバル変数を設定します。

(setq *ModelSpace* (vla-get-ModelSpace (vla-get-ActiveDocument 
                 (vlax-get-Acad-Object))))

ActiveX の図形作成関数を呼び出すときはいつでも、変数 *ModelSpace* を使用することができます。この方法で注意しなければならない点は、図形を描く前に、変数 *ModelSpace* を準備しておかなければならないことだけです。このため、この変数を設定する setq を、アプリケーションがロードされたときに呼び出すようにします。つまり、vl-load-com を呼び出した直後に呼び出します。これらの呼び出しは、プログラム内のどの defun よりも前に置かれることになります。この結果、それらは、ファイルがロードされると直ちに実行されます。