直线、曲线长度测量程序
(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
) 谢谢楼主的好程序! 非常好用 。谢谢分享 谢谢楼主的好程序!
好东西啊 u系诶下一下 有些不明白的地方想请问楼主和论坛上的能人:
函数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得到就是曲线长度。
请高人指点。 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,终点参数值为直线连线的总长度。 稍加整理就可自由调用 回复 mandala 的帖子
说实在话真没看懂,不过非常感谢了,看来道行还不高。继续学习。 回复 mandala 的帖子
请问楼主能不能给个图,详细说明一下,谢谢!
本帖最后由 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的博客!
注册登录后,你也可以拥有自己的个人博客,还可以和博友更好的交流。
网易博客欢迎你的加入
请输入登录信息
用户名: 密码:.
超好用,谢谢!
页:
[1]
2