解決しなければならない最後の問題は、個々の点が格納された変数(p1、p2、p3、p4)を、vla‑addLightweightpolyline 関数が要求する形式に変換する方法です。まず、ヘルプを参照します。
ヘルプにより、AddLightWeightPolyline には、バリアント型の倍精度浮動小数点数型配列でポリラインの頂点を指定する必要があることが分かります。この項目のヘルプの記述内容は、次のとおりです。
The array of 2D WCS coordinates specifying the vertices of the polyline. At least two points (four elements) are required for constructing a lightweight polyline. The array size must be a multiple of 2.
バリアント型は、各種の型のデータを格納する ActiveX の構造体です。文字列、整数、配列は、すべてバリアント型で表現することができます。バリアント型には、データを識別する情報と一緒にデータが格納されます。
これまでに 4 つの点を取得しましたが、それらは (x, y, z) 形式です。これら 4 つの点を、次に示すようなリストに変換します。
(x1 y1 x2 y2 x3 y3 x4 y4)
append 関数は、複数のリストを受け入れ、それらを結合します。次の式を使用して、ActiveX 関数に対応した 4 点のリストを作成することができます。
(setq polypoints (append (3dPoint->2dPoint p1) (3dPoint->2dPoint p2) (3dPoint->2dPoint p3) (3dPoint->2dPoint p4)))
3dPoint‑>2dPoint 関数を 4 回も入力するのは、少し面倒です。mapcar 関数と apply 関数を使用すれば、コードを非常に短くできます。mapcar は、1 つまたは複数のリスト内の個々の要素に対して関数を実行します。apply は引数のリストを、指定された関数に渡します。最終的なコードは、次のようになります。
(setq polypoints (apply 'append (mapcar '3dPoint->2dPoint (list p1 p2 p3 p4))))
mapcar を呼び出す前の点のリストは、次のような形です。
((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) (x4 y4 z4))
mapcar を呼び出した後の点のリストは、次のような形になります。
((x1 y1) (x2 y2) (x3 y3) (x4 y4))
最終的に、mapcar から返されたリストに対して append 関数が適用され、次のようなリストが得られます。
(x1 y1 x2 y2 x3 y3 x4 y4)