カーブ関数

パラメータ

【パラメータ】は一次元のカーブの任意の位置を表す実数です。カーブ上の点を特定するための番地にあたります。代数幾何の関数をグラフに描くときの媒介変数のようなイメージでしょうか。いろいろな図形タイプがあるので、その値の取り方は様々です。カーブ上の任意の位置を表す値なので、【パラメータ】とその位置の長さである「始点からの距離」やカーブ上の点の「三次元の座標」は相互に変換できる関係にあります。

autolisp curve function paramater
AutoLISP関数
(vlax-curve-getStartParam curve-obj)
curve-obj:【図形名】、またはVLAオブジェクト
カーブの始点のパラメータを返します。
戻り値:実数、またはnil
AutoLISP関数
(vlax-curve-getEndParam curve-obj)
curve-obj:【図形名】、またはVLAオブジェクト
カーブの終点のパラメータを返します。
戻り値:nil、またはnil以外

vlax-curve-getStartParam 関数は始点の【パラメータ】を返します。

vlax-curve-getEndParam 関数は終点の【パラメータ】を返します。

curve-obj 引数には、調べたいカーブの【図形名】か VLA オブジェクトを指定します。
二つの関数が nil を返す場合は、放射線や構築線の場合で、始点や終点が存在しない場合です。

下は、図形を選択すると、図形タイプと、始点と終点の【パラメータ】を表示するものです。

(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-getStartParam ename)))
   (prompt " ")
   (prompt (vl-princ-to-string (vlax-curve-getEndParam ename)))
   (prompt " )")
)

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

図形を選択(選択なしで終了)[最後(L)]:
LINE : パラメータ(始点 終点) ( 0.0 285.624 )
図形を選択(選択なしで終了)[最後(L)]:
LWPOLYLINE : パラメータ(始点 終点) ( 0.0 4.0 )
図形を選択(選択なしで終了)[最後(L)]:
POLYLINE : パラメータ(始点 終点) ( 0.0 32.0 )
図形を選択(選択なしで終了)[最後(L)]:
POLYLINE : パラメータ(始点 終点) ( 0.0 8.0 )
図形を選択(選択なしで終了)[最後(L)]:
SPLINE : パラメータ(始点 終点) ( 0.0 423.95 )
図形を選択(選択なしで終了)[最後(L)]:
HELIX : パラメータ(始点 終点) ( 0.0 18.8496 )
図形を選択(選択なしで終了)[最後(L)]:
CIRCLE : パラメータ(始点 終点) ( 0.0 6.28319 )
図形を選択(選択なしで終了)[最後(L)]:
ELLIPSE : パラメータ(始点 終点) ( 0.0 6.28319 )
図形を選択(選択なしで終了)[最後(L)]:
ARC : パラメータ(始点 終点) ( 0.553978 3.0654 )
図形を選択(選択なしで終了)[最後(L)]:
RAY : パラメータ(始点 終点) ( 0.0 nil )
図形を選択(選択なしで終了)[最後(L)]:
XLINE : パラメータ(始点 終点) ( nil nil )

【パラメータ】の値の範囲は、図形タイプによってさまざまです。

図形タイプ 【パラメータ】の割り当て
直線 始点を 0.0 、終点は直線の長さ
ライトウェイトポリライン
2D/3Dポリライン(直線)
始点は 0.0、一番目の辺では 0.0~1.0、二番目の辺では 1.0~2.0 といった割り当て。終点のパラメータは N-1:N は頂点数、閉じている場合は終点も数える
2Dポリライン(フィット) 始点を 0.0、終点は 2(N-1):Nは頂点数、閉じている場合は終点も数える
2D/3Dポリライン(スプライン) - 開いている場合 2次、3次とも始点は 0.0、終点は2次の場合は 8(N-2) (N≧3)、3次の場合は 8(N-3) (N≧3):N は頂点数
2D/3Dポリライン(スプライン) - 閉じている場合 2次、3次とも始点は 0.0、終点は2次3次とも 8(N-1) (N≧3):N は頂点数(閉じている終点も含む)
スプライン(フィット) 始点を 0.0、終点はフィット点を直線で結んだ直線距離の合計。拡大縮小しても以前の【パラメータ】が保存されるが、フィット点を移動すると新しい距離で【パラメータ】が計算される
スプライン(制御点) 始点を 0.0 、終点は開いている場合 1 (2≦N≦3) N-3 (N≧4):N は制御点数、閉じている場合 2 (N=3) N-2 (N≧4):N は制御点数(閉じている終点も含む)
らせん EXPLODE コマンドで【分解】して変換できるスプライン(フィット)に準じる
円、楕円 始点を 0.0 、終点は 2π の固定値
円弧 それぞれ始点と終点の角度、ラジアン
放射線、構築線 端点は 0.0、無限遠点は nil

始点の【パラメータ】は多くの場合 0.0 ですが、円弧の場合は異なります。

ライトウェイトポリラインなどの例でも明らかなように、等間隔の【パラメータ】は図形上等距離を表しません。

AutoLISP関数
(vlax-curve-getParamAtPoint curve-obj point)
curve-obj:【図形名】、またはVLAオブジェクト
point:リスト
指定された点(WCS)でのカーブのパラメータを返します。
戻り値:実数、またはnil

vlax-curve-getParamAtPoint関数は、カーブ上の点からその位置の【パラメータ】の値を得ます。

curve-obj 引数には、調べたいカーブの【図形名】か VLA オブジェクトを指定します。

point 引数は、カーブ上の点を WCS で指定します。

戻り値は、指定点の【パラメータ】です。point 引数がカーブ上に無い場合は nil を返します。近接点を求める関数などを使って確実にカーブ上の点に変換して与えてください。

下は、図形を選択すると、図形タイプと選択点における【パラメータ】を表示するものです。

(while (setq selInfo (entsel "\n図形を選択(選択なしで終了)[最後(L)]:"))
  (setq ename (car selInfo)
        point (trans (osnap (cadr selInfo) "NEA") acUCS acWorld)
        edata (entget ename)
  )
  (prompt "\n")
  (prompt (cdr (assoc 0 edata)))
  (prompt " : 選択点のパラメータ ")
  (prompt (vl-princ-to-string (vlax-curve-getParamAtPoint ename point)))
)

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

図形を選択(選択なしで終了)[最後(L)]:
LINE : 選択点のパラメータ 102.016
図形を選択(選択なしで終了)[最後(L)]:
LWPOLYLINE : 選択点のパラメータ 3.41157
図形を選択(選択なしで終了)[最後(L)]:
POLYLINE : 選択点のパラメータ 0.535942
図形を選択(選択なしで終了)[最後(L)]:
SPLINE : 選択点のパラメータ 382.726
図形を選択(選択なしで終了)[最後(L)]:
CIRCLE : 選択点のパラメータ 1.53504
AutoLISP関数
(vlax-curve-getParamAtDist curve-obj dist)
curve-obj:【図形名】、またはVLAオブジェクト
dist:実数
カーブの始点から指定した距離の位置でのカーブのパラメータを返します。
戻り値:実数、またはnil

vlax-curve-getParamAtDist関数は、始点からの距離に応じたカーブ上の点の【パラメータ】を得ます。

curve-obj 引数には、調べたいカーブの【図形名】か VLA オブジェクトを指定します。

dist 引数は、始点からの距離を指定します。

戻り値は該当の距離の【パラメータ】ですが、距離がカーブの長さを上回っている場合、nil と返ってきたり 0.0 と返ってきたり、あるいは何らかの値が返ってきたりとエラーの場合の戻り値は様々です。

注意点として、ポリラインで終点の距離を指定して終点の【パラメータ】を得ようとすると nil となりますので、【パラメータ】を正しく得られたか確認が必要です。終点に十分近ければ、直接終点の【パラメータ】を得るように、次のように関数をラップして使う方が使い勝手が良いでしょう。

(defun curve:param:dist (ename dist / clength)
  (setq clength (vlax-curve-getDistAtParam
                  ename
                  (vlax-curve-getEndParam ename)
                )
  )
  (if (equal dist clength (* clength (expt 10.0 -10)))
    (vlax-curve-getEndParam ename)
    (vlax-curve-getParamAtDist ename dist)
  )
)

下は、図形を選択すると、図形タイプと長さを 10 等分した位置の点の【パラメータ】を表示するものです。上の ラップした関数も使います。

(defun ParamList:sub (index)
  (if (<= index n)
    (cons (+ start (* step index)) (ParamList:sub (1+ index)))
  )
)

(defun ParamList (start end n / step)
  (setq step (/ (float (- end start)) n))
  (ParamList:sub 0)
)

(while
  (setq ename (car (entsel "\n図形を選択(選択なしで終了)[最後(L)]:")))
   (setq edata    (entget ename)
         endParam (vlax-curve-getEndParam ename)
   )
   (prompt "\n")
   (prompt (cdr (assoc 0 edata)))
   (if (and startParam endParam)
     (foreach dist (ParamList 0.0
                              (vlax-curve-getDistAtParam ename endParam)
                              10.0
                   )
       (prompt "\ndist : ")
       (prompt (vl-princ-to-string dist))
       (prompt " -> param : ")
       (prompt (vl-princ-to-string (curve:param:dist ename dist)))
     )
   )
)

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

図形を選択(選択なしで終了)[最後(L)]:
POLYLINE
dist : 0.0 -> param : 0.0
dist : 0.583168 -> param : 3.21975
dist : 1.16634 -> param : 6.36603
dist : 1.7495 -> param : 9.63397
dist : 2.33267 -> param : 12.7803
dist : 2.91584 -> param : 16.0
dist : 3.49901 -> param : 19.2197
dist : 4.08217 -> param : 22.366
dist : 4.66534 -> param : 25.634
dist : 5.24851 -> param : 28.7803
dist : 5.83168 -> param : 32.0
図形を選択(選択なしで終了)[最後(L)]:
SPLINE
dist : 0.0 -> param : 0.0
dist : 1.25149 -> param : 1.19578
dist : 2.50298 -> param : 2.29018
dist : 3.75447 -> param : 3.36374
dist : 5.00596 -> param : 4.52183
dist : 6.25745 -> param : 5.66729
dist : 7.50894 -> param : 6.74392
dist : 8.76043 -> param : 7.74299
dist : 10.0119 -> param : 9.14173
dist : 11.2634 -> param : 10.2976
dist : 12.5149 -> param : 11.5116