3D 点を 2D 点に変換する

庭園の歩道のもう 1 つの役に立つ関数は、3D 点を 2D 点に変換する関数です。AutoCAD は通常、3D 座標を使用して動作します。しかし、ライトウェイト ポリラインのように、常に 2D の図形もあります。getpoint 関数が返す点は 3D なので、それらを 2D 点に変換する関数の作成が必要です。

3D 点を 2D 点に変換するには

  1. コンソール ウィンドウのプロンプトに対して、次のように入力します。
    (defun 3dPoint->2dPoint (3dpt)(list (car 3dpt) (cadr 3dpt)))
  2. この関数をテストするには、コンソール プロンプトに対して次のように入力します。
    (3dpoint->2dpoint (list 10 20 0))

    上記の関数は正常に動作しますが、庭園の歩道アプリケーションでは、他に考えなければならないことがあります。LISP 関数では数値は整数でも実数でもかまいませんが、このレッスンの後半で使用する ActiveX 関数では異なります。ActiveX 関数では、実数が要求されます。整数ではなく、常に実数が返されるように、関数を簡単に修正できます。

  3. コンソール プロンプトに対して、次のコードを入力します。
    (defun 3dPoint->2dPoint (3dpt)(list (float(car 3dpt)) 
    (float(cadr 3dpt))))
  4. 関数をもう一度実行します。
    (3dpoint->2dpoint (list 10 20 0))

    今度は、戻り値が実数であることに注目してください(小数点が表示されています)。

  5. 今度は、getpoint 関数を使用して、もう一度テストします。コンソール プロンプトに対して、次のように入力します。
    (setq myPoint(getpoint))
  6. AutoCAD の作図領域で点をクリックします。

    getpoint 関数は、3D 点を返します。

  7. コンソール プロンプトに対して、次のように入力します。
    (3dPoint->2Dpoint myPoint)

    2D 点が返されることに注目してください。

    作成した 3dPoint‑>2dPoint 関数を、gpmain.lsp ファイルに追加します。新しいコードは、次のようになります。

    ;;;--------------------------------------------------------------;
    ;;; Function: 3dPoint->2dPoint                                   ;
    ;;;--------------------------------------------------------------;
    ;;; Description: This function takes one parameter representing a;
    ;;;              3D point (list of three integers or reals), and ;
    ;;;              converts it into a 2D point (list of two reals).;
    ;;;              There is no error checking on the 3D point      ;
    ;;;              parameter -- it is assumed to be a valid point. ;
    ;;;--------------------------------------------------------------;
    ;;; To do: Add some kind of parameter checking so that this      ;
    ;;;        function won't crash a program if it is passed a      ;
    ;;;        null value, or some other kind of data type than a    ;
    ;;;        3D point.                                             ;
    ;;;--------------------------------------------------------------;
    (defun 3dPoint->2dPoint (3dpt)
      (list (float(car 3dpt)) (float(cadr 3dpt)))
    )

    関数の冒頭に、将来、この関数に対して行わなければならない作業が、コメントとして記入されている点に注意してください。この関数の信頼性を高めるには、無効なデータが渡されてもクラッシュしないように、この関数にどのような安全機構を組み込むかを考える必要があります。

    ヒント: numberp および listp 関数...

    (listp '(1 1 0)) => T
    (numberp 3.4) => T