このレッスンの最初に、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 も、変更する必要があります。