taoyi0727 发表于 2018-6-9 21:34:19

BOUNDARY用弧岛的办法太卡了

图中的效果怎么才能实现,不用BOUNDARY太卡了,这样做就算不是封闭区域也可以得到一个矩形

能写一个我学习下么?

Gu_xl 发表于 2018-6-15 16:33:12

本帖最后由 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:36:43

本帖最后由 飞鱼StrawHaat 于 2018-6-16 23:49 编辑

taoyi0727 发表于 2018-6-14 16:28
用这个方法还是比用BOUNDARY弧岛的办法快很多
思路是看的海龙工具里的,主要函数来自明经,我就是个DI ...
上面G版的回复接近于完美答案了,我上传的附件作用仅仅在于精简了你原来的代码而已,不值一哂。
ssget构建的选择集中图元的顺序和图元对象被拾取、选择的顺序相关,因此,不管是栏选(F)还是窗交(C),只要选择的顺序是从光标处至视图边框,该选择集中的第一个图元就是选择集所有图元中距光标最近的,所以,如果通过求交点的方法,只需要求得该图元和光标处直线的交点即可,没必要求得所有交点再进行比较。

taoyi0727 发表于 2018-6-11 09:31:05

自己琢磨出来了 但是不会高级函数,都是一般的函数堆出来的,代码好长,大神们都帮我改改吗?
有一个函数是自贡黄明儒的 HH:TwoEntsInters 两对象交点列表
有一个函数不知道是谁的了 fp 屏幕两对角坐标




大神们都帮我改改

飞鱼StrawHaat 发表于 2018-6-14 13:10:19

评分的评论有字数限制,lisp动态处理的思路建议你去 Lee Mac 的个人网站 http://www.lee-mac.com 学习

飞鱼StrawHaat 发表于 2018-6-14 13:11:34

明经币每次只能送一个,给你送10次吧。

taoyi0727 发表于 2018-6-14 13:41:22

飞鱼StrawHaat 发表于 2018-6-14 13:11
明经币每次只能送一个,给你送10次吧。

主要是英文不会 就只认识字母 看那些英文网站有难度
我后面又修改了下不会出现错误
但是新的问题又来了用这种方法只能找到Z轴在0上的交点 有好多图Z轴不是在0上,只是无限接近z轴0位,每次打开文件都先全图Z轴归0的话,这个程序就不通用了
有没有投影找交点的办法,或着好点的思路

taoyi0727 发表于 2018-6-14 14:01:19

本帖最后由 taoyi0727 于 2018-6-14 14:09 编辑

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=79868

8楼的代码可以解决这个问题
他的方法是复制出1个一个的实体,把这个实体Z归0,再求交点,然后删除实体

刚试了下问题又绕回来了 用这个图多在卡爆了

taoyi0727 发表于 2018-6-14 16:28:23

用这个方法还是比用BOUNDARY弧岛的办法快很多
思路是看的海龙工具里的,主要函数来自明经,我就是个DIY小能手
谢谢 飞鱼StrawHaat 的支持
不知道为什么我发的贴没什么人理,哎~,没难度?还是太难?可能是太忙
有大神给优化一下就好了

taoyi0727 发表于 2018-6-15 17:40:21

Gu_xl 发表于 2018-6-15 16:33


谢G版的回复,明明用ssget里有选arc,有的arc就找不到点

taoyi0727 发表于 2018-6-15 17:53:55

找到原因了
把    '((0 . "*line,arc.circle"))
改成'((0 . "*line,arc,circle"))
页: [1] 2
查看完整版本: BOUNDARY用弧岛的办法太卡了