商行 发表于 2011-3-24 13:59:49

直线、曲线长度测量程序

(defun curvelength (ent)
(setq obj (vlax-ename->vla-object ent))
(setq len (vlax-curve-getdistatparam obj (vlax-curve-getendparam obj)))
len
)
(defun c:cc ()
(setq suml 0)
(vl-load-com)
(setq ss (ssget) n 0)
(while (< n (sslength ss))
(setq suml (+ suml (curvelength (ssname ss n))))
(setq n (1+ n))
)
suml
)

669423907 发表于 2011-6-5 15:39:23

谢谢楼主的好程序!

jiangqian124 发表于 2024-10-21 22:32:17

非常好用    。谢谢分享

阿猪蛋 发表于 2024-11-11 08:39:59

谢谢楼主的好程序!

llkill 发表于 2011-6-4 14:28:28

好东西啊 u系诶下一下

chengx2000 发表于 2011-6-6 22:33:18

有些不明白的地方想请问楼主和论坛上的能人:
函数vlax-curve-getDistAtParam是返回曲线从开始到指定参数的曲线段的长度,这里的指定参数是什么意思:(vlax-curve-getDistAtParam curve-obj param)参数param其实就是一个数值啊
而函数vlax-curve-getEndParam 是一个返回曲线端点的参数的函数,那么这个参数指的是什么呢?是不是就是曲线的长度值?
我在我随意画的一根SPline线上比较了一下(vlax-curve-getendparam obj)和(vlax-curve-getdistatparam obj (vlax-curve-getendparam obj))的值(obj即为SPline),发现相差不多。这使得我很怀疑vlax-curve-getEndParam得到就是曲线长度。
请高人指点。

mandala 发表于 2011-6-7 10:43:35

chengx2000 发表于 2011-6-6 22:33 static/image/common/back.gif
有些不明白的地方想请问楼主和论坛上的能人:
函数vlax-curve-getDistAtParam是返回曲线从开始到指定参数 ...

直线中,参数值为点在直线上距离起点长度;直线起点参数值为0,终点参数值为直线的长度;

Param 在圆弧、园、椭圆中,参数值为圆心到曲线起点逆时针旋转到该点的弧度度值;园、椭圆起点参数值为0,终点参数值为2pi,圆弧起点参数对应圆弧DXF 的50码值,终点参数对应圆弧DXF 的51码值.

Param 在polyline中,参数值为计算点在polyline顶点上的顺序位置值,该值整数为计算点在polyline上的顶点顺序,以0为计数起点,小数部分为计算点在该poly片段上的长度比率。

Param 在在Spline中,是以Spline的拟合点进行直线连线,参数表示在该直线上距起点的距离。起点参数值为0,终点参数值为直线连线的总长度。

jackynine 发表于 2011-6-7 11:49:41

稍加整理就可自由调用

chengx2000 发表于 2011-6-7 19:40:49

回复 mandala 的帖子

说实在话真没看懂,不过非常感谢了,看来道行还不高。继续学习。

chengx2000 发表于 2011-6-7 19:42:30

回复 mandala 的帖子

请问楼主能不能给个图,详细说明一下,谢谢!

mandala 发表于 2011-6-7 21:26:34

本帖最后由 mandala 于 2011-6-7 21:28 编辑

给你个gu_xl版主写的一篇文章,我觉得他说得灰常滴清楚。

我就是看了这篇文章才茅塞顿开的,你不可能智商比我还低吧:




vlax-curve-get族函数中参数在各种曲线中的含义-Gu_xl CAD开发技术博客-

vlax-curve-get族函数,包括如下一些函数:

vlax-curve-getPointAtDist

vlax-curve-getPointAtParam

vlax-curve-getDistAtPoint

vlax-curve-getDistAtParam

vlax-curve-getParamAtPoint

vlax-curve-getParamAtDist

vlax-curve-getStartParam

vlax-curve-getendParam

vlax-curve-getStartPoint

vlax-curve-getEndPoint

vlax-curve-getFirstDeriv

vlax-curve-getSecondDeriv

vlax-curve-getSecondDeriv

等,这些函数的使用时均要用到曲线参数,要用好这些函数,必须要搞明白曲线参数的含义,下面我就曲线参数在各种曲线中的含义解释如下:

直线中,参数值为点在直线上距离起点长度;直线起点参数值为0,终点参数值为直线的长度;

Param 在圆弧、园、椭圆中,参数值为圆心到曲线起点逆时针旋转到该点的弧度度值;园、椭圆起点参数值为0,终点参数值为2pi,圆弧起点参数对应圆弧DXF 的50码值,终点参数对应圆弧DXF 的51码值.

Param 在polyline中,参数值为计算点在polyline顶点上的顺序位置值,该值整数为计算点在polyline上的顶点顺序,以0为计数起点,小数部分为计算点在该poly片段上的长度比率。

Param 在在Spline中,是以Spline的拟合点进行直线连线,参数表示在该直线上距起点的距离。起点参数值为0,终点参数值为直线连线的总长度。

vlax-curve-getFirstDeriv 函数是返回曲线在指定位置的一阶导数(在 WCS 中),其实(vlax-curve-getFirstDeriv obj param) 函数计算的值是曲线上在参数值为param点处的切线方向,该值是一个表 '(x y z), 运用下列方法可计算出在参数param处的切线方向的角度值:
(setq ang (angle (setq pt (vlax-curve-getpointatparam obj param)) (mapcar '+ pt (vlax-curve-getFirstDeriv obj param)))) 。

vlax-curve-getSecondDeriv 函数计算的是曲线法线方向值,该值是一个表 '(x y z), ,运用上述方法同样可计算法线角度。如果计算点处曲线是直线,则返回'(0.0 0.0 0.0)。

明白了参数的含义后,就可以通过上述函数进行各种曲线计算了,下面给出一些具体的应用举例:

   ;;;判断点是否在曲线上 gxl-pointoncurve pt curve
;;;测试 (gxl-ptoncurve (getpoint) (car (entsel)))
;;;(vlax-curve-getClosestPointTo (car (entsel)) (getpoint))
(defun gxl-ptoncurve (pt curve)
(equal pt (vlax-curve-getClosestPointTo curve pt) 0.00001)
)


;;;==================================================================
;;;ax:GetCurveLength 返回曲线长度
;|功能
返回曲线长度
语法
(gxl-ax:GetCurveLength curve)
参数
直线、圆弧、圆、多段线、优化多段线、样条曲线等图元
返回值
曲线长度
样例
(gxl-ax:GetCurveLength (car (entsel)))

|;
;;;==================================================================
(defun gxl-ax:GetCurveLength (curve /)
(if (= 'ENAME (type curve))
(setq curve (vlax-ename->vla-object curve))
   )
(vlax-curve-getDistAtParam
    curve
    (vlax-curve-getEndParam curve)
)
)


;;; (gxl-Ax:GetMidpointCurve curve) 计算曲线中点
(defun gxl-Ax:GetMidpointCurve (curve / d)
(setq d (/ (gxl-ax:GetCurveLength curve) 2))
(vlax-curve-getPointAtDist curve d)
)


;;;==================================================================
;;;checkarc 判断多段线是否有圆弧(凸度/=0)的子段
;|功能
判断多段线是否有圆弧(凸度/=0)的子段
语法
(checkarc ename)
参数
ename:图元名
返回值
T:有圆弧段
nil:无圆弧段

|;
;;;==================================================================
(defun checkarc (ename)
   (setq obj (vlax-ename->vla-object ename))
(setq plist (vlax-safearray->list
(vlax-variant-value
(vla-get-coordinates obj))))
(setq n 0 bu nil)
(repeat (/ (length plist) 2)
    (if (/= (vla-getbulge obj n) 0)
      (setq bu T)
   )
    (setq n (+ n 1))
)
bu
)

;;;==================================================================
;;;coodsofsegbynum 返回多段线第n子段的端点坐标
;|功能
返回多段线第n子段的端点坐标
语法
(coodsofsegbynum obj n)
参数
obj:图元名
n:代表子段位置的整数
返回值
坐标列表

|;
;;;==================================================================
(defun coodsofsegbynum (obj n / en)
    (vlax-curve-getPointAtParam obj n)
)

;;;==================================================================
;;;coordsofsegbypick 返回多义线所点击子段的端点坐标
;;;(coordsofsegbypick (car (entsel)) (getpoint))
;|功能
返回多义线所点击子段的端点坐标
语法
(coordsofsegbypick ename p)
参数
ename:图元名
p:点
返回值
坐标列表
|;
;;;==================================================================
;;;(coordsofsegbypick (car (setq e (entsel))) (cadr e))
(defun coordsofsegbypick (obj p / pp n)
    (setq pp (vlax-curve-getclosestpointto obj (trans p 1 0))
          n (fix (vlax-curve-getparamatpoint obj pp)))
    (coodsofsegbynum obj n)
    )
;;; coords2ptsegbypick 返回多义线所点击子段的两个端点坐标,起点为靠近选择点 '(p1 p2)
;;;(coords2ptsegbypick (car (setq e (entsel))) (cadr e))
(defun coords2ptsegbypick (obj p / pp n p1 p2)
    (setq pp (vlax-curve-getclosestpointto obj (trans p 1 0))
          n (fix (vlax-curve-getparamatpoint obj pp))
   nn (numbersofseg obj)
   )
    (setq p1 (coodsofsegbynum obj n))
(if (vlax-curve-isClosed obj)
    (progn
      (if (< n nn)
(setq p2 (coodsofsegbynum obj (1+ n)))
(setq p2 (coodsofsegbynum obj 0))
)
      (if (< (distance p p1) (distance p p2))
(list p1 p2)
(list p2 p1)
)
      )
    (progn
      (if (< n nn)
(setq p2 (coodsofsegbynum obj (1+ n)))
(setq p2 (coodsofsegbynum obj (1- n)))
)
      (if (< (distance p p1) (distance p p2))
(list p1 p2)
(list p2 p1)
)
      )
    )

)
;;;coordsClosesegbypick 返回多义线靠近所点击子段的端点坐标
;;; (coordsClosesegbypick (car (setq e (entsel))) (cadr e))
(defun coordsClosesegbypick (obj p)
(car (coords2ptsegbypick obj p))
)
;(vlax-curve-isClosed (vlax-ename->vla-object (car (setq e (entsel)))))
;(vlax-curve-getparamatpoint (vlax-ename->vla-object (car (setq e (entsel)))) (vlax-curve-getclosestpointto obj (trans (cadr e) 1 0)))
;;;返回多段线第n点的坐标,n起始值为0 (coodsofnumpoint ename n)
;;;例如:(coodsofnumpoint (car (entsel)) 2)
(defun coodsofnumpoint (obj n / plist)
(vlax-curve-getPointAtParam obj n)


)

;;;返回多段线子段的数量,0为起始 (numbersofseg (car (entsel)))
(defun numbersofseg (obj / plist)
(if (vlax-curve-isClosed obj)
(fix (1- (vlax-curve-getendParam obj)))
   (fix (vlax-curve-getendParam obj))
    )
)






分享到搜狐微博



引文来源关于 vlax-curve-get族函数中参数在各种曲线中的含义-Gu_xl CAD开发技术博客-搜狐博客评论这张
转发至微博
0人|分享到:         阅读(37)| 评论(0)| 引用 (0) |举报 .

PointOnCurve 返回顺着曲线长度方向的给定距离的点
FSO文件夹和文件操作函数 - ade_guo@126的日志 - 网易博客.历史上的今天.
相关文章.
最近读者
登录后,您可以在此留下足迹。.
小小的我 .评论
点击登录|昵称:
   取消
验证码:换一张上一页 1... -1-1-1-1-1-1-1... -1下一页..
    .




   
页脚
公司简介 - 联系方法 - 招聘信息 - 客户服务 - 相关法律 - 博客风格 - 手机博客 - 订阅此博客
网易公司版权所有 ?1997-2011
×
登录网易通行证
欢迎通过Google搜索来到sdxylijian的博客!

注册登录后,你也可以拥有自己的个人博客,还可以和博友更好的交流。

网易博客欢迎你的加入

请输入登录信息

用户名:    密码:.










zhang007 发表于 2011-8-27 17:21:59

超好用,谢谢!
页: [1] 2
查看完整版本: 直线、曲线长度测量程序