明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4911|回复: 16

直线、曲线长度测量程序

  [复制链接]
发表于 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
)
发表于 2011-6-5 15:39:23 | 显示全部楼层
谢谢楼主的好程序!
回复 支持 0 反对 1

使用道具 举报

发表于 2024-10-21 22:32:17 | 显示全部楼层
非常好用    。谢谢分享
发表于 2024-11-11 08:39:59 | 显示全部楼层
谢谢楼主的好程序!
发表于 2011-6-4 14:28:28 | 显示全部楼层
好东西啊 u系诶下一下
发表于 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得到就是曲线长度。
请高人指点。
发表于 2011-6-7 10:43:35 | 显示全部楼层
chengx2000 发表于 2011-6-6 22:33
有些不明白的地方想请问楼主和论坛上的能人:
函数vlax-curve-getDistAtParam  是返回曲线从开始到指定参数 ...

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

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

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

Param 在在Spline中,是以Spline的拟合点进行直线连线,参数表示在该直线上距起点的距离。起点参数值为0,终点参数值为直线连线的总长度。
发表于 2011-6-7 11:49:41 | 显示全部楼层
稍加整理就可自由调用
发表于 2011-6-7 19:40:49 | 显示全部楼层
回复 mandala 的帖子

说实在话真没看懂,不过非常感谢了,看来道行还不高。继续学习。
发表于 2011-6-7 19:42:30 | 显示全部楼层
回复 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 返回顺着曲线长度方向的给定距离的点[CAD AutoCAD 机械设计应用与二次开发-明经通道]  
FSO文件夹和文件操作函数 - ade_guo@126的日志 - 网易博客.历史上的今天.
相关文章.
最近读者
登录后,您可以在此留下足迹。.
小小的我 .评论
点击登录|昵称:
   取消
验证码:换一张  上一页 1... -1-1-1-1-1-1-1... -1下一页..
    .




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

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

网易博客欢迎你的加入

请输入登录信息

用户名:    密  码:.

  








发表于 2011-8-27 17:21:59 | 显示全部楼层
超好用,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-21 01:35 , Processed in 0.157529 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表