999999 发表于 2020-11-4 11:15:25

(求助)麻烦各位大神,请问一下,怎么快速实现修剪两个构造线之间的线段

麻烦各位大神,小弟有一个新的想法,然后在论坛里面没有找到关于这个想法的插件,如果有大神知道的话,麻烦有空的话,帮小弟解决一下哟
1.输入命令(提示框选选择两根构造线)
2.按下空格键,修剪线段之间的构造线

wyl219 发表于 2020-11-4 11:15:26

本帖最后由 wyl219 于 2020-11-5 05:35 编辑

写了个简单的代码,省去了不少判断代码,要求选择的两个构造线是平行的

(defun c:ttt ()
      (setq en1 (car (entsel "选择左下构造线")))
      (setq en2 (car (entsel "选择右上构造线")))
      (setq ed1 (entget en1))
      
      (setq ss (ssget "X" (list (cons 0 "XLINE")
                                                                                                (cons -4 "<AND")
                                                                                                (cons -4 "/=")
                                                                                                (assoc 11 ed1)
                                                                                                (cons -4 "/=")
                                                                                                (cons 11 (mapcar '- (cdr(assoc 11 ed1))))
                                                                                                (cons -4 "AND>") ;不与en1平行
                                                                                        )))
      
      (setq get_line (lambda (ed) (list (cdr (assoc 10 ed )) (mapcar '+(cdr (assoc 10 ed ) ) (cdr (assoc 11 ed ))))))
      
      (setq line_en1 (get_line (entget en1)))
      (setq line_en2 (get_line (entget en2)));获取两个构造线上的一段
      
      
      (repeat (setq i (sslength ss))
                (setq i (1- i))
                (setq en_now (ssnamess i))
                (setq ed_now (entget en_now))
                (setq line_now (get_line (entget en_now)))
               
                (setq pt1 (apply 'inters (append line_en1 line_now (list nil)) ));获取交点
                (setq pt2 (apply 'inters (append line_en2 line_now (list nil)) ));获取交点
               
                (if (or (< (nth 1 (assoc 11 ed_now)) 0)
                                        (< (nth 2 (assoc 11 ed_now)) 0)) ;这里条件还没琢磨透,当构造线是斜线的时候.可能会弄错
                        (progn;如果方向矢量xy中有一个小于0
                              (entmake_ray ed_now
                                        pt1
                                        (cdr (assoc 11 ed_now))
                              )
                              (entmake_ray ed_now
                                        pt2
                                        (mapcar '- (cdr (assoc 11 ed_now)))
                              )
                        )
                        (progn;如果方向矢量xy均大于0
                              (entmake_ray ed_now
                                        pt2
                                        (cdr (assoc 11 ed_now))
                              )
                              (entmake_ray ed_now
                                        pt1
                                        (mapcar '- (cdr (assoc 11 ed_now)))
                              )
                        )
                );end if
                (entdel en_now);删除原构造线
      )
)



(defun entmake_ray (ed dxf10 dxf11 / del_dxf)
      (setq del_dxf (list -1 0 330 5 100 100 10 11 )      );100出现了两次
      (foreach x del_dxf
                (setq ed (vl-remove (assoc x ed) ed))
      );删除无用的组码,对于颜色等,如果是随层,信息表里不会出现对应信息
      
      (setq ed (append
                                                 (list
                                                         (cons 0 "RAY")
                                                         (cons 100 "AcDbEntity")
                                                         (cons 100 "AcDbRay")
                                                         (cons 10 dxf10)
                                                         (cons 11 dxf11)
                                                 )
                                                 ed
                                       ));添加必要代码
      
      (entmake ed) ;生成对象
      
)


tryhi 发表于 2020-11-4 20:24:08

如果仅修剪屏幕内的话,选择后求出中线,tr命令F参数即可,如果是屏幕外,好像比较麻烦,图太大的话z e后低于1像素则修剪不了

999999 发表于 2020-11-5 00:07:38

tryhi 发表于 2020-11-4 20:24
如果仅修剪屏幕内的话,选择后求出中线,tr命令F参数即可,如果是屏幕外,好像比较麻烦,图太大的话z e后低 ...

主要是栏选的话,有的两个线之间间距小,而且屏幕缩小的话容易修剪掉其他的呢

wyl219 发表于 2020-11-5 04:25:04

用entmake比较合适吧.

1.用ssget "X" '((0 . "XLINE")),因为构造线是无限延长的,所以在一个二维平面上,只要两个构造线不是平行的,那么必定相交.可以在fill里用-4筛选方向矢量(组码11)与选择线不同的构造线
2.通过一开始选择的两条构造线的组码10和11,算出两条线上的两点坐标,
3.遍历第二个选择集,以相同的方式获得每条线的两点坐标,并通过这两点坐标与上面获取到的一条线的两点坐标取交点,作为新生成的射线坐标(组码10).组码11根据相对位置继承构造线或取负值.

999999 发表于 2020-11-5 08:26:14

本帖最后由 999999 于 2020-11-5 08:44 编辑

wyl219 发表于 2020-11-5 05:25
写了个简单的代码,省去了不少判断代码,要求选择的两个构造线是平行的

(defun c:ttt ()

大神您好,我试了一下您写的代码,很好用,谢谢您,,请问能不能帮忙实现“框选两根构造线”,然后自动删除构造线之间的线,(由于横向构造线第一次被修剪后它就不是构造线啦,所以能不能再帮忙改成线段也能够补修剪,只要在构造线之间)

999999 发表于 2020-11-5 08:44:26

wyl219 发表于 2020-11-5 05:25
写了个简单的代码,省去了不少判断代码,要求选择的两个构造线是平行的

(defun c:ttt ()


大神,您醒的可真的早呀

wyl219 发表于 2020-11-5 09:15:57

999999 发表于 2020-11-5 08:26
大神您好,我试了一下您写的代码,很好用,谢谢您,,请问能不能帮忙实现“框选两根构造线” ...

可以是可以,根据图元类型增加分支就好了,不过,这种无差别处理有什么实际价值么?

999999 发表于 2020-11-5 09:31:37

wyl219 发表于 2020-11-5 09:15
可以是可以,根据图元类型增加分支就好了,不过,这种无差别处理有什么实际价值么?

框选的话更速度一些,然后单击选线的话,假如屏幕缩小了,然后两根辅助线离的近,单选容易选错呢,然后放大再选的话,从时间上,方便程度来讲,更没有那么理想,嘻嘻,,
搞个动画您帮忙看一下,您有空可以帮忙改一下吗?谢谢啦

bai2000 发表于 2020-11-5 10:35:25

能改为直线或复线更实用
页: [1] 2
查看完整版本: (求助)麻烦各位大神,请问一下,怎么快速实现修剪两个构造线之间的线段