找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 922|回复: 7

[弹指神通]:獲取復線點擊子段的信息(圓弧﹐直線﹐長度﹐起點﹐終點﹐圓心點)

[复制链接]
发表于 2005-10-4 13:27:21 | 显示全部楼层 |阅读模式

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

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

×
[php]
(defun hy_pickcoordSEG(ename pt / obj PP PA n1 n2 p1 p2 dis mp bulge gongao
                       rad centerp golist);;;獲取點擊子段的信息
  (setq obj (vlax-ename->vla-object ename)
         pp (vlax-curve-getclosestpointto obj (trans pT 1 0))
          pa (vlax-curve-getparamatpoint obj pp))
  (setq n1 (fix pa) n2 (fix (+ 1 pa)))
  (if (> n2 (length (massoc 10 (entget ename)))) (setq n2 0))
  (setq p1 (vlax-curve-getpointatparam obj n1)
        p2 (vlax-curve-getpointatparam obj n2)
        )
  (setq dis (distance p1 p2))
  (SETQ MP (MAPCAR '(LAMBDA (x y) (/ (+ x y) 2)) p1 p2))
  (if (/= 0 (setq bulge (vla-getbulge obj n1)));;凸度=弓高/(* 0.5 弦長)
    (progn
      (setq gongao (abs (* (/ dis 2) bulge)));;弓高
      (setq rad (/ (+ (expt gongao 2) (expt (/ dis 2) 2)) (* 2 gongao )));GET THE RADIUS
      (cond ((> 0 bulge)
                  (setq centerp (polar mp (- (angle p1 p2) (* 0.5 pi)) (- rad gongao))
                        golist (list (cons 0 "ARC")
                                     (CONS "STP" (LIST p2))
                                     (CONS "ENP" (LIST p1))
                                     (CONS "CEN" (list centerp))))
             )
            ((< 0 bulge)
                 (setq centerp (polar mp (+ (angle p1 p2) (* 0.5 pi)) (- rad gongao))
                       golist (list (cons 0 "ARC")
                                     (CONS "STP" (LIST p1))
                                     (CONS "ENP" (LIST p2))
                                     (CONS "CEN" (list centerp))))
           )
            )
    )
    (setq golist (list (cons 0 "LINE")
                       (CONS "LEN" dis)
                       (CONS "STP" (list p1))
                       (CONS "ENP" (list p2))))
             
  )
  GOLIST
  )
[/php]
測試﹕(defun c:tt() (setq en (entsel "\n選復線的子段:"))
                               (hy_pickcoordSEG(car en) (cadr en))
)
如果選中圓弧段返回
((0 . "ARC") ("STP" (14.7963 9.04745 0.0)) ("ENP" (10.6489 9.02818 0.0)) ("CEN" (12.7237 8.81554 0.0)))
"STP" 代表圓弧的起點
"ENP" 代表圓弧的終點
"CEN" 代表圓弧的圓心
如果選中直線段返回
((0 . "LINE") ("LEN" . 2.24709) ("STP" (3.9658 10.5263 0.0)) ("ENP" (5.95223 11.5768 0.0)))
"LEN" 代表直線段長度
"STP" 代表直線段起點
"ENP" 代表直線段終點
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-4 16:12:13 | 显示全部楼层
未严格测试

  1. (defun getsubseg (obj p / pn pa p1 p2)
  2.   (setq        pn (vlax-curve-getclosestpointto obj p)
  3.         pa (fix (vlax-curve-getparamatpoint obj pn))
  4.         p1 (vlax-curve-getpointatparam obj pa)
  5.         p2 (vlax-curve-getpointatparam obj (1+ pa))
  6.   )
  7.   (if (zerop (vla-getbulge obj pa))
  8.     (list '(0 . "LINE") (cons "LEN" (distance p1 p2)) p1 p2)
  9.     (list '(0 . "ARC") (cons "CEN" (osnap p1 "cen")) p1 p2)
  10.   )
  11. )
  12. (defun c:tt (/ e)
  13.   (if (setq e (entsel "\nPick Pline: "))
  14.     (getsubseg (vlax-ename->vla-object (car e)) (cadr e))
  15.   )
  16. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-4 16:36:37 | 显示全部楼层
斑竹的思路是很不错的用OSNAP抓点确实要简便许多但是
这样做有一个缺点就是取得的圆弧段的起点和终点不一定是分解
后圆的起点,终点.不知道斑竹有没有考虑过圆弧的顺逆问题..
也就是说只返回两端点但是不能判断哪个是起点哪个是终点
我的程序主要功能是取得各个子段的信息从而可以方便重新模拟出复线图形
还有就是个人认为:总觉得用抓点取得圆心比不上用几何计算出来的有安全感..呵呵..
发现有不完善的一个BUG 当取得的点是最后一子段的话参数已经超出范围故出错..程序中应加判断取消这个错误
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-4 17:38:06 | 显示全部楼层
这样改一改

  1. (defun getsubseg (obj p / pn pa p1 p2 pcen v)
  2.   (setq        pn (vlax-curve-getclosestpointto obj (trans p 1 0))
  3.         pa (fix (vlax-curve-getparamatpoint obj pn))
  4.         p1 (vlax-curve-getpointatparam obj pa)
  5.         p2 (vlax-curve-getpointatparam obj (1+ pa))
  6.   )
  7.   (if (zerop (vla-getbulge obj pa))
  8.     (list '(0 . "LINE") (cons "LEN" (distance p1 p2)) p1 p2)
  9.     (progn
  10.       (setq v         (vlax-curve-getsecondderiv obj pa)
  11.             pcen (mapcar '+ p1 v)
  12.       )
  13.       (if (not (equal (distance pcen p1) (distance pcen p2) 0.000001))
  14.         (setq pcen (mapcar '- p1 v))
  15.       )
  16.       (list
  17.         '(0 . "ARC")
  18.         (cons "CEN" pcen)
  19.         p1
  20.         p2
  21.       )
  22.     )
  23.   )
  24. )
  25. (defun c:tt (/ e l)
  26.   (if (setq e (entsel "\nPick Pline: "))
  27.     (progn
  28.       (setq l (getsubseg (vlax-ename->vla-object (car e)) (cadr e)))
  29.       (command ".line" (nth 2 l) (cdr (nth 1 l)) "")
  30.     )
  31.   )
  32. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-4 18:15:17 | 显示全部楼层
这样圆弧的起点终点还是不对...圆弧的起点终点默认都是以逆时钟来画圆弧的..
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-4 19:20:54 | 显示全部楼层
是按 Pline 绘制的顺序,如果非要转换成 逆时针的,判断一下即可
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-5 08:05:16 | 显示全部楼层
就是啊..呵呵..还是要判断的..圆弧生成的顺序和PLINE的顺序不一定是一致的..所以还是要判断凸度的正负来确定圆弧的顺逆..
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 15:57 , Processed in 0.179267 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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