カーブ関数

少し残念な面積

AutoLISP関数
(vlax-curve-getArea curve-obj)
curve-obj:【図形名】、またはVLAオブジェクト
カーブの内側の面積を返します。
戻り値:実数

vlax-curve-getArea 関数はカーブに囲まれる面積を返します。

戻り値は、カーブで囲まれる面積を表す実数の値が返ります。カーブが開いていても始点と終点を直線で結んで面積を求めます。カーブが一つの平面上に載っていない場合は nil を返します。

注意点として、実験した限り面積が求まらず 0.0 が返ってくることもあります。カーブの開閉に関係しません。はっきりしたことは言えませんが、カーブの辺と辺が交差する「くびれ」が生じる図形かつカーブの一部に曲線が含まれる場合は値が求まらないようです。また、2D/3D ポリラインの場合はたとえ直線で構成されていても「くびれ」があるだけで値が求まりません。

下は、図形を選択すると、図形タイプとカーブの面積を表示するものです。

(while
  (setq ename (car (entsel "\n図形を選択(選択なしで終了)[最後(L)]:")))
   (setq edata (entget ename))
   (prompt "\n")
   (prompt (cdr (assoc 0 edata)))
   (prompt " : 面積 ")
   (prompt (vl-princ-to-string (vlax-curve-getArea ename)))
)

実行すると、例えば以下のように表示されます。

図形を選択(選択なしで終了)[最後(L)]:
LWPOLYLINE : 面積 1.0
図形を選択(選択なしで終了)[最後(L)]:
SPLINE : 面積 2.99914
図形を選択(選択なしで終了)[最後(L)]:
ARC : 面積 0.392699
図形を選択(選択なしで終了)[最後(L)]:
POLYLINE : 面積 1.0

面積

面積を求めるカーブ関数は図形の状態に左右されるので、安心して使用できるものではありませんでした。VLA オブジェクトのプロパティに Area を持つものがあり、こちらの値は図形の状態に左右されず得られます。そのため、まず平面に載っていない場合を除いて Area プロパティの値を参照し、得られないときはカーブ関数の vlax-curve-getArea を使って面積を求める curve-area 関数を作ってみます。具体的にカーブ関数を使う場合は平面に載った 3D ポリラインの場合で、やはり「くびれ」があった場合は値が得られないという制約は残ります。

(defun curve-area (ename / obj)
  (if (= (type ename) 'ENAME)
    (setq obj (vlax-ename->VLA-object ename))
    (setq obj ename)
  )
  (if (vlax-curve-isPlanar obj)
    (if (vlax-property-available-p obj 'Area)
      (vla-get-Area obj)
      (vlax-curve-getArea obj)
    )
  )
)