このレッスンの最初に、gp:Calculate‑and‑Draw-Tiles では、リアクタ コールバックから呼び出されたときに、オブジェクトの作成に ActiveX を使用するように限定する必要があることを説明しました。これは、必要な場合は、ユーザが選択したオブジェクト作成方法(ActiveX、entmake、または command)を優先することを意味しています。先ほど更新したコードの、gp:command-ended 関数内に、次のようなタイル作図ルーチンが含まれています。
(setq tileList (gp:Calculate-and-Draw-Tiles
;; path data list without correct tile list.
NewReactorData
;; Object creation function.
;; Within a reactor this *MUST* be ActiveX.
"ActiveX"
)
)
gp:Calculate-and-Draw-Tiles に 2 つのパラメータを渡しています。1 つは、NewReactorData(元の連想リスト gp_PathData の形式のリスト)です。もう 1 つは、文字列 "ActiveX" (これによりオブジェクト作成スタイルを設定)です。しかし、gp:Calculate‑and‑Draw‑Tiles の現在の定義を見てください(この関数は gpdraw.lsp で定義されています)。次に、この関数の引数とローカル変数の宣言部を示します。
(defun gp:Calculate-and-Draw-Tiles (BoundaryData /
PathLength TileSpace
TileRadius SpaceFilled
SpaceToFill RowSpacing
offsetFromCenter rowStartPoint
pathWidth pathAngle
ObjectCreationStyle TileList)
現在、引数は 1 つだけ指定され、ObjectCreationStyle がローカル変数として宣言されている点に注意してください。変数 ObjectCreationStyle が、この関数内でどのように設定されるかを、次に示します。
(setq ObjectCreationStyle (strcase (cdr (assoc 3 BoundaryData))))
現在、ObjectCreationStyle は、変数 BoundaryData(連想リスト)に格納された値を取得することにより、内部的に設定されます。しかし、ここではその値を優先する必要があります。
関数の defun 文は、次のようになります。
(defun gp:Calculate-and-Draw-Tiles (BoundaryData ObjectCreationStyle
/ PathLength TileSpace
TileRadius SpaceFilled
SpaceToFile RowSpacing
offsetFromCenter rowStartPoint
pathWidth pathAngle
TileList) ; remove ObjectCreationStyle from locals
1 つの変数を、引数(スラッシュの前)とローカル変数(スラッシュの後)の両方で宣言すると、Visual LISP はそれを指摘することに注意してください。たとえば、ObjectCreationStyle を引数と変数の両方で宣言し、次に、gp:Calculate‑and‑Draw‑Tiles 関数に対して Visual LISP 構文チェック ツールを使用すると、[作成出力]ウィンドウに次のメッセージが表示されます。
; *** WARNING: same symbol before and after / in arguments list: OBJECTCREATIONSTYLE
(setq
PathLength (cdr (assoc 41 BoundaryData))
TileSpace (cdr (assoc 43 BoundaryData))
TileRadius (cdr (assoc 42 BoundaryData))
SpaceToFill (- PathLength TileRadius)
RowSpacing (* (+ TileSpace (* TileRadius 2.0))
(sin (Degrees->Radians 60))
)
SpaceFilled RowSpacing
offsetFromCenter 0.0
offsetDistance (+ (* TileRadius 2.0) TileSpace) 2.0)
rowStartPoint (cdr (assoc 10 BoundaryData))
pathWidth (cdr (assoc 40 BoundaryData))
pathAngle (cdr (assoc 50 BoundaryData))
) ;_ end of setq
(if (not ObjectCreationStyle)
(setq ObjectCreationStyle (strcase (cdr (assoc 3 BoundaryData))))
)
ObjectCreationStyle の元の割り当て文は、削除されました。これでコードは、ObjectCreationStyle に対して値が提供されたかどうかをチェックし、検出するようになりました。ObjectCreationStyle が設定されていない(値が nil)場合、関数はその値を、変数 BoundaryData から割り当てます。
gp:Calculate‑and‑Draw-Tiles も、変更する必要があります。