BOUNDARY用弧岛的办法太卡了
图中的效果怎么才能实现,不用BOUNDARY太卡了,这样做就算不是封闭区域也可以得到一个矩形能写一个我学习下么?
本帖最后由 Gu_xl 于 2018-6-19 11:52 编辑
;;动态框绘制 By 明经通道 Gu_xl
(defun c:DynRect (/ GR GetScreenCoords
LL LMTS LOOP LU P1
P2 P3 P4 PT RL
RU S1 S2 S3 S4
)
;;取得当前绘图区屏幕的左下角和右上角的坐标
(defun GetScreenCoords
(/ c03 c08 c04 c05 c07 c06 c09 c01 c02)
(setq c03 (getvar "viewctr")
c03 (trans c03 1 2)
c08 (getvar "viewsize")
c04 (getvar "screensize")
c07 (car c04)
c06 (cadr c04)
c09 (/ (* c08 c07) c06)
c01 (list (- (car c03) (* 0.5 c09)) (- (cadr c03) (* 0.5 c08)))
c02 (list (+ (car c03) (* 0.5 c09)) (+ (cadr c03) (* 0.5 c08)))
c01 (trans c01 2 1)
c02 (trans c02 2 1)
)
(list c01 c02)
)
(setq loop t)
(while loop
(setq lmts (GetScreenCoords))
(setq gr (grread t 15 0))
(cond ((= 5 (car gr))
(setq pt (cadr gr))
(if (and
(setq s1 (ssget "F"
(list pt (list (car pt) (cadadr lmts) 0))
'((0 . "*line,arc,circle"))
)
) ;_ 向上
(setq s2 (ssget "F"
(list pt (list (car pt) (cadar lmts) 0))
'((0 . "*line,arc,circle"))
)
) ;_ 向下
(setq s3 (ssget "F"
(list pt (list (caar lmts) (cadr pt) 0))
'((0 . "*line,arc,circle"))
)
) ;_ 向左
(setq s4 (ssget "F"
(list pt (list (caadr lmts) (cadr pt) 0))
'((0 . "*line,arc,circle"))
)
) ;_ 向右
)
(progn
(setq p1 (trans (cadar (cdddar (ssnamex s1))) 0 1)) ;_ 上点
(setq p2 (trans (cadar (cdddar (ssnamex s2))) 0 1)) ;_ 下点
(setq p3 (trans (cadar (cdddar (ssnamex s3))) 0 1)) ;_ 左点
(setq p4 (trans (cadar (cdddar (ssnamex s4))) 0 1)) ;_ 右点
(setq ll (apply 'mapcar (cons 'min (list p1 p2 p3 p4)))) ;_ 左下角点
(setq ru (apply 'mapcar (cons 'max (list p1 p2 p3 p4)))) ;_ 右上角点
(setq lu (list (car ll) (cadr ru) 0)) ;_ 左上角点
(setq rl (list (car ru) (cadr ll) 0)) ;_ 右下角点
(redraw)
(grdraw ll lu 1)
(grdraw lu ru 1)
(grdraw ru rl 1)
(grdraw rl ll 1)
)
(redraw)
)
)
((= 3 (car gr))
(setq loop nil)
(command "_rectang" "_non" ll "_non" ru)
)
)
)
(redraw)
(princ)
) 本帖最后由 飞鱼StrawHaat 于 2018-6-16 23:49 编辑
taoyi0727 发表于 2018-6-14 16:28
用这个方法还是比用BOUNDARY弧岛的办法快很多
思路是看的海龙工具里的,主要函数来自明经,我就是个DI ...
上面G版的回复接近于完美答案了,我上传的附件作用仅仅在于精简了你原来的代码而已,不值一哂。
ssget构建的选择集中图元的顺序和图元对象被拾取、选择的顺序相关,因此,不管是栏选(F)还是窗交(C),只要选择的顺序是从光标处至视图边框,该选择集中的第一个图元就是选择集所有图元中距光标最近的,所以,如果通过求交点的方法,只需要求得该图元和光标处直线的交点即可,没必要求得所有交点再进行比较。
自己琢磨出来了 但是不会高级函数,都是一般的函数堆出来的,代码好长,大神们都帮我改改吗?
有一个函数是自贡黄明儒的 HH:TwoEntsInters 两对象交点列表
有一个函数不知道是谁的了 fp 屏幕两对角坐标
大神们都帮我改改
评分的评论有字数限制,lisp动态处理的思路建议你去 Lee Mac 的个人网站 http://www.lee-mac.com 学习 明经币每次只能送一个,给你送10次吧。 飞鱼StrawHaat 发表于 2018-6-14 13:11
明经币每次只能送一个,给你送10次吧。
主要是英文不会 就只认识字母 看那些英文网站有难度
我后面又修改了下不会出现错误
但是新的问题又来了用这种方法只能找到Z轴在0上的交点 有好多图Z轴不是在0上,只是无限接近z轴0位,每次打开文件都先全图Z轴归0的话,这个程序就不通用了
有没有投影找交点的办法,或着好点的思路
本帖最后由 taoyi0727 于 2018-6-14 14:09 编辑
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=79868
8楼的代码可以解决这个问题
他的方法是复制出1个一个的实体,把这个实体Z归0,再求交点,然后删除实体
刚试了下问题又绕回来了 用这个图多在卡爆了
用这个方法还是比用BOUNDARY弧岛的办法快很多
思路是看的海龙工具里的,主要函数来自明经,我就是个DIY小能手
谢谢 飞鱼StrawHaat 的支持
不知道为什么我发的贴没什么人理,哎~,没难度?还是太难?可能是太忙
有大神给优化一下就好了 Gu_xl 发表于 2018-6-15 16:33
谢G版的回复,明明用ssget里有选arc,有的arc就找不到点
找到原因了
把 '((0 . "*line,arc.circle"))
改成'((0 . "*line,arc,circle"))
页:
[1]
2