考える必要があるアプリケーションのもう 1 つの重要な面は、それぞれのポリライン図形に対して作成されたオブジェクト リアクタにアタッチする情報の種類です。レッスン 6 で、リアクタに gp_PathData(連想リスト)の内容をアタッチするコードを追加しました。連想リストに新しいキー フィールド(100)を追加することにより、gp_PathData に格納されるデータを拡張しました。この新しいサブリストは、ポリライン境界に関連付けられたすべての円図形のポインタのリストです。
ポリライン境界を再計算するのに必要な作業のために、次の 4 つのキー値を、gp_pathData にさらに追加します。
;;; StartingPoint ; ;;; (12 . BottomStartingPoint) 15------------------------14 ; ;;; (15 . TopStartingPoint) | | ; ;;; EndingPoint 10 ----pathAngle---> 11 ; ;;; (13 . BottomEndingPoint) | | ; ;;; (14 . TopEndingPoint) 12------------------------13 ; ;;; ;
これらの点は、ユーザがコーナー グリップを新しい位置にドラッグしたときは常に、ポリライン境界を再計算するのに必要です。この情報は、既に gpdraw.lsp の gp:drawOutline 関数内に存在します。しかし、この関数の戻り値を見てください。現在は、ポリライン オブジェクトのポインタのみが返されます。したがって、次の 3 つのことを行う必要があります。
周囲の点を組み立てるのは、単純です。gp:drawOutline のコードを見てください。ローカル変数 p1 はキー値 12 に、p2 はキー値 13 に、p3 はキー値 14 に、p4 はキー値 15 に対応します。次の関数呼び出しを追加して、この情報を組み立てることができます。
(setq polyPoints(list (cons 12 p1) (cons 13 p2) (cons 14 p3) (cons 15 p4) ))
ポリラインの周囲の点とポリラインのポインタが返されるように関数を修正するのも、簡単です。gp:drawOutline の最後の式として、返す 2 項目の情報のリストを作成するだけです。
(list pline polyPoints)
(defun gp:drawOutline (BoundaryData / PathAngle Width HalfWidth StartPt PathLength angm90 angp90 p1 p2 p3 p4 poly2Dpoints poly3Dpoints plineStyle pline polyPoints ) ;; extract the values from the list BoundaryData. (setq PathAngle (cdr (assoc 50 BoundaryData)) Width (cdr (assoc 40 BoundaryData)) HalfWidth (/ Width 2.00) StartPt (cdr (assoc 10 BoundaryData)) PathLength (cdr (assoc 41 BoundaryData)) angp90 (+ PathAngle (Degrees->Radians 90)) angm90 (- PathAngle (Degrees->Radians 90)) p1 (polar StartPt angm90 HalfWidth) p2 (polar p1 PathAngle PathLength) p3 (polar p2 angp90 Width) p4 (polar p3 (+ PathAngle (Degrees->Radians 180)) PathLength) poly2Dpoints (apply 'append (mapcar '3dPoint->2dPoint (list p1 p2 p3 p4)) ) poly3Dpoints (mapcar 'float (append p1 p2 p3 p4)) ;; get the polyline style. plineStyle (strcase (cdr (assoc 4 BoundaryData))) ;; Add polyline to the model space using ActiveX automation. pline (if (= plineStyle "LIGHT") ;; create a lightweight polyline. (vla-addLightweightPolyline *ModelSpace* ; Global Definition for Model Space (gp:list->variantArray poly2Dpoints) ;data conversion ) ;_ end of vla-addLightweightPolyline ;; or create a regular polyline. (vla-addPolyline *ModelSpace* (gp:list->variantArray poly3Dpoints) ;data conversion ) ;_ end of vla-addPolyline ) ;_ end of if polyPoints (list (cons 12 p1) (cons 13 p2) (cons 14 p3) (cons 15 p4) ) ) ;_ end of setq (vla-put-closed pline T) (list pline polyPoints) ) ;_ end of defun
(setq PolylineName (gp:drawOutline gp_PathData))
これを、次のように変更します。
(setq PolylineList (gp:drawOutline gp_PathData) PolylineName (car PolylineList) gp_pathData (append gp_pathData (cadr PolylineList)) ) ;_ end of setq
これで、変数 gp_PathData には、リアクタ関数に必要なすべての情報が格納されるようになります。