找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: st788796

[每日一码] Spline精确包围盒ClosestPointToProjection应用

  [复制链接]

已领礼包: 61个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-12-3 15:26:35 | 显示全部楼层
本帖最后由 Highflybird 于 2013-12-3 15:30 编辑

我再精简一下:

  1. ;;;----------------------------------------------------;
  2. ;;;功能: 曲线的包围盒                                       ;
  3. ;;;输入: 曲线的图元名                                       ;
  4. ;;;输出: 曲线的包围盒的四个角点(2d)                    ;
  5. ;;;----------------------------------------------------;
  6. (defun Cur:BoundingPoints (Curve / ll ur pts x)
  7.   (vla-getboundingbox (vlax-ename->vla-object Curve) 'll 'ur)
  8.   (setq ll (vlax-safearray->list ll))
  9.   (setq ur (vlax-safearray->list ur))
  10.   ;;(command "rectangle" ll ur)                                ; For comparing if it's a spline.
  11.   (foreach n '((1 0 0) (0 1 0))                                ; Add  '(0 0 1) for 3d box.
  12.     (foreach p (list ll ur)
  13.       (setq x (vlax-curve-getClosestPointToProjection curve p n T))
  14.       (and x (setq pts (cons x pts)))
  15.     )
  16.   )
  17.   (setq ll (apply 'mapcar (cons 'min pts)))
  18.   (setq ur (apply 'mapcar (cons 'max pts)))
  19.   (list ll (list (car ur) (cadr ll) 0)
  20.         ur (list (car ll) (cadr ur) 0)
  21.   )
  22. )


点评

试了一下,程序到;;(command "rectangle" ll ur)得出矩形,同运行完后是一样的。 而且找一个大一点盒子,还是得用vla-getboundingbox,或者屏幕四个角?也不是得出最小包围盒,看来还是得用你的《论矩阵》,是不是?  详情 回复 发表于 2014-4-19 10:09
对这个Spline Box , 稍加修改, 不需要旋转 spline 就可以改造为适合 UCS  详情 回复 发表于 2013-12-3 16:13
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2013-12-3 16:13:56 | 显示全部楼层

对这个Spline Box , 稍加修改, 不需要旋转 spline 就可以改造为适合 UCS

点评

是的,无须旋转实体,就可以求出UCS下的。找一个稍微大一点的方形,然后用这个方法即可。  详情 回复 发表于 2013-12-3 16:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-12-3 16:30:53 | 显示全部楼层
st788796 发表于 2013-12-3 16:13
对这个Spline Box , 稍加修改, 不需要旋转 spline 就可以改造为适合 UCS

是的,无须旋转实体,就可以求出UCS下的。找一个稍微大一点的方形,然后用这个方法即可。

点评

再扩展下, Spline 的 Box 无需使用 GetboundingBox, 使用 ControlPoint 的 Box 即可 下面代码转换关系还不到,高飞版主给诊断诊断  详情 回复 发表于 2013-12-4 07:54
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2013-12-3 17:15:34 | 显示全部楼层
本帖最后由 st788796 于 2013-12-3 18:09 编辑

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2013-12-4 07:54:17 | 显示全部楼层
本帖最后由 st788796 于 2013-12-4 07:56 编辑
Highflybird 发表于 2013-12-3 16:30
是的,无须旋转实体,就可以求出UCS下的。找一个稍微大一点的方形,然后用这个方法即可。

再扩展下, Spline 的 Box 无需使用 GetboundingBox, 使用 ControlPoint 的 Box 即可
下面代码转换关系还不对,高飞版主给诊断诊断
  1. (defun Spline:Box (e / el pts ll)
  2.   (if (and (setq el (entget e))
  3.            (= (cdr (assoc 0 el)) "SPLINE")
  4.       )
  5.     (progn
  6.       (setq
  7.         pts (mapcar 'cdr
  8.                     (vl-remove-if-not '(lambda (x) (= (car x) 10)) el)
  9.             )
  10.         ll  (list (apply 'mapcar (cons 'min pts))
  11.                   (apply 'mapcar (cons 'max pts))
  12.             )
  13.       )
  14.       (foreach n (list (getvar "ucsxdir") (getvar "ucsydir"))
  15.         (foreach p ll
  16.           (setq x (vlax-curve-getclosestpointtoprojection e p n t))
  17.           (and x (setq ptl (cons x ptl)))
  18.         )
  19.       )
  20.       (list (apply 'mapcar (cons 'min ptl))
  21.             (apply 'mapcar (cons 'max ptl))
  22.       )
  23.     )
  24.   )
  25. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-12-4 11:41:40 | 显示全部楼层
本帖最后由 牢固 于 2013-12-4 11:46 编辑
st788796 发表于 2013-12-4 07:54
再扩展下, Spline 的 Box 无需使用 GetboundingBox, 使用 ControlPoint 的 Box 即可
下面代码转换关系还 ...

更正如下:
  1. (defun Spline:Box  (E / EL PTS LL DD X PTL P1 P3 P2 P4)  (if (and (setq el (entget e)) (= (cdr (assoc 0 el)) "SPLINE"))
  2.     (progn
  3.       (setq pts        (mapcar
  4.                   'cdr
  5.                   (vl-remove-if-not '(lambda (x) (= (car x) 10)) el))
  6.             ll        (list (apply 'mapcar (cons 'min pts))
  7.                       (apply 'mapcar (cons 'max pts)))
  8.             dd (* 0.5 (apply 'distance ll))
  9.             dd (list dd dd 0)
  10.             ll (mapcar '(lambda (p) (trans p 0 1)) ll)
  11.             ll (list (trans (mapcar '- (car ll) dd) 1 0) (trans (mapcar '+ (cadr ll) dd) 1 0))
  12.             )
  13.       (foreach n  (list (getvar "ucsxdir") (getvar "ucsydir"))
  14.         (foreach p  ll
  15.           (setq x (vlax-curve-getclosestpointtoprojection e p n t))
  16.           (and x (setq ptl (cons x ptl)))))
  17.       (setq ptl (mapcar '(lambda (p) (trans p 0 1)) ptl))
  18.       (setq p1 (apply 'mapcar (cons 'min ptl))
  19.             p3 (apply 'mapcar (cons 'max ptl))
  20.             p2 (list (car p1) (cadr p3) (caddr p1))
  21.             p4 (list (car p3) (cadr p1) (caddr p3))
  22.             )
  23.       (mapcar '(lambda (p) (trans p 1 0)) (list p1 p2 p3 p4))
  24.       )
  25.     )
  26.   )


点评

G 版再改改就适合所有的 Curve 类了  详情 回复 发表于 2013-12-4 11:46
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2013-12-4 11:46:16 | 显示全部楼层
本帖最后由 st788796 于 2013-12-4 11:47 编辑

G 版再改改就适合所有的 Curve 类了

GetBoundingBox +  Curve_GetClosestPointToProject

点评

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

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-12-4 11:48:14 | 显示全部楼层
st788796 发表于 2013-12-4 11:46
G 版再改改就适合所有的 Curve 类了

适合所有曲线版本:
  1. (defun gxl-GetCurveUcsBox  (curve / obj p1 p2 p3 p4 lst d)
  2.   (if (= 'ename (type curve))
  3.     (setq obj (vlax-ename->vla-object curve))
  4.     (setq obj curve)
  5.     )
  6.   (vla-GetBoundingBox obj 'p1 'p3)
  7.   (setq  p1 (trans (vlax-safearray->list p1) 0 1)
  8.   p3 (trans (vlax-safearray->list p3) 0 1)
  9.   d  (* 0.5 (distance p1 p3))
  10.   p1 (list (- (car p1) d) (- (cadr p1) d) (caddr p1))
  11.   p3 (list (+ (car p3) d) (+ (cadr p3) d) (caddr p3))
  12.   p2 (list (car p1) (cadr p3) (caddr p1))
  13.   p4 (list (car p3) (cadr p1) (caddr p1))
  14.   )
  15.   (SETQ  lst
  16.       (mapcar '(lambda (a b)
  17.            (vlax-curve-getClosestPointToProjection curve a b t))
  18.         (mapcar '(lambda (p) (trans p 1 0)) (list p1 p2 p3 p4))
  19.         (list (getvar 'ucsxdir)
  20.         (getvar 'ucsydir)
  21.         (getvar 'ucsxdir)
  22.         (getvar 'ucsydir))
  23.         )
  24.   lst (mapcar '(lambda (p) (trans p 0 1)) lst)
  25.   )
  26.   (setq  p1 (apply 'mapcar (cons 'min lst))
  27.   p3 (apply 'mapcar (cons 'max lst))
  28.   p2 (list (car p1) (cadr p3) (caddr p1))
  29.   p4 (list (car p3) (cadr p1) (caddr p1))
  30.   )
  31.   (mapcar '(lambda (p) (trans p 1 0)) (list p1 p2 p3 p4))
  32.   )

点评

稍微简化下, WCS 下返回 WCS 点, UCS 下返回 UCS 点  详情 回复 发表于 2013-12-4 14:37
赞一个! aLisp 在求 Entity Box 的时候用这个可以减少大量的 Rotate 和变换了!  详情 回复 发表于 2013-12-4 11:52

评分

参与人数 1D豆 +5 收起 理由
st788796 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2013-12-4 11:52:39 | 显示全部楼层
牢固 发表于 2013-12-4 11:48
适合所有曲线版本:

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2013-12-4 14:37:29 | 显示全部楼层
本帖最后由 st788796 于 2013-12-4 15:17 编辑
牢固 发表于 2013-12-4 11:48
适合所有曲线版本:

稍微简化下, WCS 下返回 WCS 点, UCS 下返回 UCS 点
  1. (defun Curve:Box (obj / p1 p3 lst d xdir ydir)
  2.   (vla-GetBoundingBox obj 'p1 'p3)
  3.   (setq        p1   (trans (safearray-value p1) 0 1)
  4.         p3   (trans (safearray-value p3) 0 1)
  5.         d    (* 0.5 (distance p1 p3))
  6.         lst  (list
  7.                (setq p1 (list (- (car p1) d) (- (cadr p1) d) (caddr p1)))
  8.                (setq p3 (list (+ (car p3) d) (+ (cadr p3) d) (caddr p3)))
  9.                (list (car p1) (cadr p3) (caddr p1))
  10.                (list (car p3) (cadr p1) (caddr p1))
  11.              )
  12.         xdir (getvar "ucsxdir")
  13.         ydir (getvar "ucsydir")
  14.         lst  (mapcar '(lambda (a b)
  15.                         (vlax-curve-getClosestPointToProjection obj a b t)
  16.                       )
  17.                      (mapcar '(lambda (p) (trans p 1 0)) lst)
  18.                      (list xdir ydir xdir ydir)
  19.              )
  20.         lst  (mapcar '(lambda (x) (trans x 0 1)) lst)
  21.         p1   (apply 'mapcar (cons 'min lst))
  22.         p3   (apply 'mapcar (cons 'max lst))
  23.   )
  24.   (list        p1
  25.         (list (car p1) (cadr p3) (caddr p1))
  26.         p3
  27.         (list (car p3) (cadr p1) (caddr p1))
  28.   )
  29. )

alisp只能补充一个判断函数,ARX 有 Parent 方法
  1. (defun IsCurve (obj)
  2.   (wcmatch (strcase (vla-get-objectname obj))
  3.            "*LINE,*ARC,*CIRCLE,*ELLIPSE"
  4.   )
  5. )

点评

1 我是想学习一下vlax-curve-getClosestPointToProjection是怎么用的,但没看明白,能否讲讲? 2 测量结果如图,是什么原因呢?  详情 回复 发表于 2014-1-18 08:31
请问st788796[/backcolor]大师在明经是哪位?[/backcolor]  详情 回复 发表于 2014-1-16 22:24
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

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

使用道具 举报

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

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

发表于 2014-1-16 22:24:27 | 显示全部楼层
st788796 发表于 2013-12-4 14:37
稍微简化下, WCS 下返回 WCS 点, UCS 下返回 UCS 点

alisp只能补充一个判断函数,ARX 有 Parent 方法
...

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-1-16 22:30:33 来自手机 | 显示全部楼层
lucas3 发表于 2014-1-16 22:24
请问st788796大师在明经的用户名

游客         

点评

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 01:51 , Processed in 0.197333 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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