カーブ関数

少し残念な接線・法線ベクトル

AutoLISP関数
(vlax-curve-getFirstDeriv curve-obj param)
curve-obj:【図形名】、またはVLAオブジェクト
param:実数
パラメータで指定された位置のカーブの接線ベクトル (WCS) 返します。
戻り値:リスト

vlax-curve-getFirstDeriv 関数はカーブの接線ベクトルを返します。関数の名前は「一次導関数」を意味します。

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

param 引数には、求めたい位置の【パラメータ】を指定します。

戻り値は、WCS 上の接線ベクトルを表すリストが返ります。ベクトルの大きさはさまざまです。周期的な【パラメータ】を受け付けるカーブの場合を除いて【パラメータ】の値の範囲が不正だった場合は nil となります。また、ポリラインの始点や終点で接線ベクトルの計算に失敗して nil が返る場合があるので、戻り値のチェックが必要です。

下は、図形を選択すると長さを 10 等分してそれぞれの位置での接線ベクトルを描きます。ベクトルの大きさが画面では小さすぎて見えないかもしれません。小さな図形で試してください。ポリラインの始点や終点で計算の失敗の対処は行っていません。

(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)
  )
)

(defun curve:point: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-getEndPoint ename)
    (vlax-curve-getPointAtDist ename dist)
  )
)

(defun drawVector (origin v color /) ;_ origin,v(UCS)
  (grvecs (list color origin (vector:add origin v)))
)

(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 endParam (vlax-curve-getEndParam ename))
   (if endParam
     (foreach dist (ParamList 0.0
                              (vlax-curve-getDistAtParam ename endParam)
                              10.0
                   )
       (drawVector
         (trans (curve:point:dist ename dist) acWorld acUCS)
         (trans (vlax-curve-getFirstDeriv
                  ename
                  (curve:param:dist ename dist)
                )
                acWorld
                acUCS
                T
         )
         3
       )
     )
   )
)
curve-getFirstDeriv
AutoLISP関数
(vlax-curve-getSecondDeriv curve-obj param)
curve-obj:【図形名】、またはVLAオブジェクト
param:実数
パラメータで指定された位置のカーブの法線ベクトル (WCS) 返します。
戻り値:リスト

vlax-curve-getSecondDeriv 関数はカーブの法線ベクトルを返します。関数の名前は「二次導関数」を意味します。残念ながら、この関数が正しく動くのは円と円弧といった極めて単純な図形タイプに限られます。

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

param 引数には、求めたい位置の【パラメータ】を指定します。

戻り値は、WCS 上の法線ベクトルを表すリストが返ります。円と円弧の場合、調べた位置から円の中心を示すベクトルです。周期的な【パラメータ】を受け付けるカーブの場合を除いて【パラメータ】の値の範囲が不正だった場合は nil となります。また、ポリラインの始点や終点で計算に失敗して nil が返る場合があるので、戻り値のチェックが必要です。

下は、図形を選択すると長さを 10 等分してそれぞれの位置でのvlax-curve-getSecondDeriv 関数の戻り値のベクトルを描きます。ベクトルの大きさが画面では小さすぎて見えないかもしれません。小さな図形で試してください。ポリラインの始点や終点で計算の失敗の対処は行っていません。

(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)
  )
)

(defun curve:point: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-getEndPoint ename)
    (vlax-curve-getPointAtDist ename dist)
  )
)

(defun drawVector (origin v color /) ;_ origin,v(UCS)
  (grvecs (list color origin (vector:add origin v)))
)

(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 endParam (vlax-curve-getEndParam ename))
   (if endParam
     (foreach dist (ParamList 0.0
                              (vlax-curve-getDistAtParam ename endParam)
                              10.0
                   )
       (drawVector
         (trans (curve:point:dist ename dist) acWorld acUCS)
         (trans
           (vlax-curve-getSecondDeriv ename (curve:param:dist ename dist))
           acWorld
           acUCS
           T
         )
         6
       )
     )
   )
)
curve-getSecondDeriv