Gp:Calculate-and-Draw-Tiles を更新する

このレッスンの最初に、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(連想リスト)に格納された値を取得することにより、内部的に設定されます。しかし、ここではその値を優先する必要があります。

オブジェクト作成方法引数を受け入れるように、gp:Calculate-and-Draw-Tiles を修正するには

  1. 関数の引数に、変数 ObjectCreationStyle を追加します。
  2. ローカル変数から ObjectCreationStyle を除去します。

    関数の 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
  3. gp:Calculate-and-Draw-Tiles の最初の setq 式を、次のように修正します。
    (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 も、変更する必要があります。