【AutoCAD LISP】LISP で曲線の長さを求める方法

2022年2月27日

メジャーイメージ

LISP で線分、ポリライン、円、スプラインなどの長さを求めたいんだけど…

どうすればいいの?

こんにちは、メモだよ!!管理人です。

今回は、そんなあなたに、AutoCAD で LISP を使用して、曲線の長さを求める方法を紹介します。

 

vlax-curve-getDistAtParam 関数で、曲線の長さを取得

vlax-curve-getDistAtParam は、曲線の始点から指定されたパラメータまでの曲線の長さを返します。

なので、引数に曲線の終点を指定すれば曲線の長さを求められるということです。

では、サンプルプログラムを見てみましょう。

(defun c:GetCurveLength ()
  ; AutoCAD のオブジェクトを取得
  (setq acadObject (vlax-get-acad-object))

  ; アクティブなドキュメントを取得
  (setq activeDocument (vla-get-activedocument acadObject))
  
  ; ドキュメントの Utilyty オブジェクトを取得
  (setq utility (vla-get-utility activeDocument))
  
  ; 選択した図形の VLA オブジェクトを取得
  (vla-getentity utility 'vlaObject 'pickedPoint "\n長さを求めたいオブジェクトをを選択:")
  
  ; VLA オブジェクトが AcDbCurve でないときは、メッセージを表示して終了
  (setq objectName (vla-get-objectname vlaObject))
  (if (and (/= objectName "AcDb2dPolyline")
           (/= objectName "AcDb3dPolyline")
           (/= objectName "AcDbArc")
           (/= objectName "AcDbCircle")
           (/= objectName "AcDbEllipse")
           (/= objectName "AcDbLeader")
           (/= objectName "AcDbLine")
           (/= objectName "AcDbPolyline")
           (/= objectName "AcDbSpline")
           (/= objectName "AcDbHelix")
      )
    (progn
      (alert (strcat "選択した " objectName " の距離は計測できません。"))
      (exit)
    )
  )
  
  ; 曲線の長さを取得
  (setq curveLength (vlax-curve-getDistAtParam vlaObject (vlax-curve-getEndParam vlaObject)))
  
  ; 長さを表示
  (alert (strcat "選択した " objectName " の長さは " (rtos curveLength 2 16) " です。"))
  
  (princ)
)

この LISP をロードして、GetCurveLength コマンドを実行してみてください。

「長さを求めたいオブジェクトを選択」と表示されるので、オブジェクトを選択します。

やったー!!

選択したオブジェクトの長さが表示された!!

選択したオブジェクトの長さが表示された

長さを計測できないオブジェクトもあるので、以下の部分でそれを除外しています。

  ; VLA オブジェクトが AcDbCurve でないときは、メッセージを表示して終了
  (setq objectName (vla-get-objectname vlaObject))
  (if (and (/= objectName "AcDb2dPolyline")
           (/= objectName "AcDb3dPolyline")
           (/= objectName "AcDbArc")
           (/= objectName "AcDbCircle")
           (/= objectName "AcDbEllipse")
           (/= objectName "AcDbLeader")
           (/= objectName "AcDbLine")
           (/= objectName "AcDbPolyline")
           (/= objectName "AcDbSpline")
           (/= objectName "AcDbHelix")
      )
    (progn
      (alert (strcat "選択した " objectName " の距離は計測できません。"))
      (exit)
    )
  )

たとえば、ハッチングを選択すると、以下のように表示されます。

計測できないときのメッセージ

ちょっと驚いたのは、引出線の長さも測れるんですね。

引出線の長さというのは、以下の部分の長さのようです。

引出線の長さの部分

-API
-