明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3034|回复: 13

[讨论]有關自動旋轉對象到最小包絡框的處理方法

  [复制链接]
发表于 2004-10-5 18:31:00 | 显示全部楼层 |阅读模式
程序如下: ;;;程序名: BDY:SmallRectang
;;;程序负责的工作: 把所选的对象自动转到最小的包络框.
;;;设计:BDYCAD
;;;时间:2004-10-04
;;;使用举例  (BDY:SmallRectang (SSGET))
(defun BDY:SmallRectang (sel-ssget / pparear i pt pparear smmm ptc)
(SETQ pparear nil i 0)
(repeat 90
(setq pt (LRCenterPoint sel-ssget))
(vl-cmdf ".area" (car pt) (list (car (cadr Pt) ) (cadr pt1))
(cadr Pt) (list (car pt1 ) (cadr (cadr Pt))) "")
(setq pparear (append pparear (list(list (getvar "area") i))))
(vl-cmdf ".rotate" sel-ssget "" (caddr pt) 1)
(SETQ i (+ i 1)))
(setq smmm (cadr(CAR (vl-sort pparear (function (lambda (e1 e2)(< (car e1) (car e2))))))))
(vl-cmdf ".ROTATE" sel-ssget "" (caddr pt) smmm)
)
(defun LRCenterPoint(ss / PT_LIST LRCenterPoint-a n pt1a pt1b pt2a pt2b e1 e2 pt_x1 pt_x2
pt_xc pt_y1 pt_y2 pt_yc pt_xy pt1 pt2)
(setq PT_LIST '())
(defun LRCenterPoint-a (ENT / LL UR pt1 pt2)
(vla-getboundingbox (vlax-ename->vla-object ENT) 'LL 'UR)
(mapcar 'vlax-safearray->list (list LL UR)))
(setq n 0)
(repeat (sslength ss)
(setq PT_LIST (append PT_LIST (LRCenterPoint-a (ssname ss n))))
(setq n (1+ n)))
(setq pt1a(CAR (vl-sort PT_LIST (function (lambda (e1 e2)(< (cadr e1) (cadr e2)) ) ) )))
(setq pt1b(CAR (vl-sort PT_LIST (function (lambda (e1 e2)(< (car e1) (car e2)) ) ) )))
(setq pt2a(CAR (vl-sort PT_LIST(function (lambda (e1 e2)(>(cadr e1) (cadr e2)) ) ) )))
(setq pt2b(CAR (vl-sort PT_LIST(function (lambda (e1 e2)(>(car e1) (car e2)) ) ) )))
(setq pt1 (list (car pt1b) (cadr pt1a)) pt2 (list (car pt2b) (cadr pt2a)))
(setq pt_x1 (car pt1) pt_x2 (car pt2))
(setq pt_xc (+ (abs (/ (- pt_x2 pt_x1) 2)) pt_x1))
(setq pt_y1 (cadr pt1) pt_y2 (cadr pt2))
(setq pt_yc (+ (abs (/ (- pt_y2 pt_y1) 2)) pt_y1))
(setq pt_xy (list pt_xc pt_yc))
(list pt1 pt2 pt_xy)
)
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2004-10-5 18:54:00 | 显示全部楼层
挺好的。有一点想问一问,你程序中好像是将选择集往一个方向旋转90度,你能肯定就在这个范围内吗?
 楼主| 发表于 2004-10-5 18:54:00 | 显示全部楼层
应用举例


       

本帖子中包含更多资源

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

x
发表于 2004-10-5 18:58:00 | 显示全部楼层
应该是了。
 楼主| 发表于 2004-10-5 19:02:00 | 显示全部楼层
Alin, 程序的一次一次的转好慢的, 你有方法提高吗?
发表于 2004-10-5 19:17:00 | 显示全部楼层
我想不出还有什么更好的方法。不过有一点你要注意,如果选择对象是的spline,有些情况下getboundingbox方法得出的结果不准确。
发表于 2004-10-5 19:50:00 | 显示全部楼层
没空慢慢看程序了,BDYCAD请你介绍一下思路
 楼主| 发表于 2004-10-6 09:05:00 | 显示全部楼层
程序主要是通过使用循环90次每次旋转一度, 把选到的对象每旋转一度时把所占包络框的面积加入变量名 pparear         去. 循环完了就提取变量pparear 的面积最小值为smmm         , 再把对象旋转到面占面积最小值的角度去,
发表于 2004-10-7 13:05:00 | 显示全部楼层
下列好像有错pt1?? (vl-cmdf ".area" (car pt) (list (car (cadr Pt) ) (cadr pt1))
(cadr Pt) (list (car pt1 ) (cadr (cadr Pt))) "")
发表于 2004-10-7 23:08:00 | 显示全部楼层
好像有个趋势.对比旋转前后的面积大小,如果从小变大反向旋转.如果从大变小就就继续,如果由大-&gt;小-&gt;大,就确定中间这部是最大.


也许可以减少些计算.


只是猜测,有待证实
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-18 13:45 , Processed in 0.289241 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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