找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2710|回复: 17

[求助] [求助]:急:发现我原来计算闭和LWPOLYLINE长度的方法不对,请教各位该怎样算?

[复制链接]
发表于 2002-4-17 03:35:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我原来的方法为:

(setq p (car (entsel)))
(setq p1 (vlax-curve-getDistAtPoint p (vlax-curve-getEndPoint p)))

p1 就是长度,不论是用“C”闭合还是用“END”来闭合,结果总是零。在R2000合R14里一样。如果LWPOLYLINE有一道口子,就没有问题。

请教各位,在LISP中如何计算“闭合”LWPOLYLINE的长度。

我原来用笨办法计算原始PLINE线长度,各子段长度相加就行了,但无法计算经过“F”或“S”PEDIT的,后来就用开始说用的法子,却无法计算出闭合线的长度。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 23个

财富等级: 恭喜发财

发表于 2002-4-17 05:34:06 | 显示全部楼层
能不能这样做?
把闭合的Lwpolyline先改为非闭合,求出length后再改回去?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

发表于 2002-4-17 05:41:14 | 显示全部楼层
看来不行喔...那位大虾有办法解决?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-17 09:29:00 | 显示全部楼层
笨法子(我的思路,程序就不写了,我很菜):
由于你的原值里闭合线长度为0,所以将选择集中的闭合多段线构造新的选择集(70,1),遍历每一闭合线,求各顶点距离得每一线长,求和后返回再与你的函数原值相加。
刚才谈到:我原来的“笨”办法合你所说的一样,但是,LWPOLYLINE经过FIT或SPLINE化后就难计算了,样条曲线的计算太复杂,我看了一本参考书,足有20万字,还是不好找(没看懂),找不到参数(太菜)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-17 10:24:44 | 显示全部楼层
(setq pe(vlax-curve-getendparam p))
(setq p1 (vlax-curve-getdistatparam) p pe)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-17 10:29:37 | 显示全部楼层

Re: [求助]:急:发现我原来计算闭和LWPOLYLINE长度的方法不对,请教各位该怎样算?

最初由 长清 发布
[B]我原来的方法为:

(setq p (car (entsel)))
(setq p1 (vlax-curve-getDistAtPoint p (vlax-curve-getEndPoint p)))

p1 就是长度,不论是用“C”闭合还是用“END”来闭合,结果总是零。在R2000合R14里一样。如... [/B]

对于求曲线的一些程序,尽量使用getEndParam来代替getEndPoint

因为对于参数曲线来说,PARAM是唯一的,而点是可以重合的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-4-17 20:07:21 | 显示全部楼层
最初由 binbin 发布
[B](setq pe(vlax-curve-getendparam p))
(setq p1 (vlax-curve-getdistatparam) p pe) [/B]


可行,谢谢。
程序应为:
(setq pe(vlax-curve-getendparam p))
(setq p1 (vlax-curve-getdistatparam p pe))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-18 07:01:22 | 显示全部楼层
受教了,原来vlisp的函数这么好用,我要努力学习了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-18 09:22:07 | 显示全部楼层

事情还没有结束

让我们看看vlax-curve-getDistAtParam的帮助吧!
----------------------
vlax-curve-getDistAtParam 样例曲线(样条曲线)
获得曲线的开始参数:

_$ (setq startSpline (vlax-curve-getStartParam splineObj))

0.0

曲线从参数 0 开始。
获得曲线的结束点:

_$ (setq endSpline (vlax-curve-getEndParam splineObj))

17.1546

曲线的结束参数为 17.1546。
确定到曲线中点的参数:

_$ (vlax-curve-getDistAtParam splineObj
   ( / (- endspline startspline) 2))

8.99417

从开始点到中点的距离为 8.99417。
----------------------
总的长度=开始点到中点的距离X2
但是事实不是这样!!
谁可以解释一下?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-18 09:57:12 | 显示全部楼层

好像。。。

1。类似(vlax-curve-getDistAtParam splineObj ( / (- endspline startspline) 2))的算法只适用于直线,曲线段的Param变化并不是线性的。
2。(vlax-curve-getDistAtPoint)不只在计算闭合多义线时有错误,计算非闭合多义线上的点有时也不对,先求Param,再(vlax-curve-getDistAtParam) 比较保靠。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-18 11:09:29 | 显示全部楼层
不对吧,帮助举的例子就是曲线!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-18 11:35:10 | 显示全部楼层
最初由 binbin 发布
[B]不对吧,帮助举的例子就是曲线! [/B]


见图:


                               
登录/注册后可看大图


正确方法:要使用距离值,然后用getPointAtDist来求中点,因为距离的一半肯定是中点,而参数值的一般,对曲线来说“不一定”是中点处的参数值。


下面是测试过程:

命令: (setq e (car (entsel)))  ;;得到SPLINE实体名

选择对象: <图元名: 40079d58>

命令: (setq dis (xdrx_getarea e)) ;;XDRX_API函数得到曲线的长度和面积
(34206.0 908.163)  ;;得到长度是908.163

命令: list    ;;用LISP命令验证长度

选择对象: 找到 1 个

选择对象:

                  SPLINE    Layer: "0"
                            Space: Model space
                   Handle = 2B
                           Length: 908.1630   ;;可以看到长度和上面API求得相等
                            Order: 4
                       Properties: Planar, Non-Rational, Non-Periodic
                 Parametric Range: Start   0.0000
                                     End 823.6885
                 .................................


命令: !dis
(34206.0 908.163)

命令: (setq b (cadr dis))  ;;得到SPLINE长度
908.163

命令: (setq c (/ b 2.0))   ;;得到一半的长度值
454.081

命令: (setq p (xdrx_curve_getPointAtDist e c)) ;;用XDRX_API函数得到指定距离处的点,这个就是中点
(418.517 69.6382 0.0)

命令: (getpoint)  ;;用LISP的getpoint,使用MID捕捉,验证SPLINE验证中点值
mid
于 (418.517 69.6382 0.0)

结论:中点相等!!!

所以,求曲线的中点之类的操作,要使用距离的一半,然后使用距离求点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2002-4-19 09:22:28 | 显示全部楼层
单单求曲线长度的真正笨办法,我以前这样用:
;;;(setq en(car(entsel))
(command "area" "e" en)
(getvar "PERIMETER")

如果计算部分长度,先设置Undo mark,然后截断,求长度后返回。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-4-19 22:45:24 | 显示全部楼层
最初由 ll_j 发布
[B]单单求曲线长度的真正笨办法,我以前这样用:
;;;(setq en(car(entsel))
(command "area" "e" en)
(getvar "PERIMETER")

如果计算部分长度,先设置Undo mark,然后截断,求长度后返回。 [/B]


这是R2000的系统变量,在R14里没有。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2002-4-20 13:06:13 | 显示全部楼层
就是R14变量。我上网的机器上只有R14。我在R12就用过。可以试试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-5 10:33 , Processed in 0.460974 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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