少し残念な面積
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) ) ) )