(求助)麻烦各位大神,请问一下,怎么快速实现修剪两个构造线之间的线段
麻烦各位大神,小弟有一个新的想法,然后在论坛里面没有找到关于这个想法的插件,如果有大神知道的话,麻烦有空的话,帮小弟解决一下哟1.输入命令(提示框选选择两根构造线)
2.按下空格键,修剪线段之间的构造线
本帖最后由 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) ;生成对象
)
如果仅修剪屏幕内的话,选择后求出中线,tr命令F参数即可,如果是屏幕外,好像比较麻烦,图太大的话z e后低于1像素则修剪不了 tryhi 发表于 2020-11-4 20:24
如果仅修剪屏幕内的话,选择后求出中线,tr命令F参数即可,如果是屏幕外,好像比较麻烦,图太大的话z e后低 ...
主要是栏选的话,有的两个线之间间距小,而且屏幕缩小的话容易修剪掉其他的呢 用entmake比较合适吧.
1.用ssget "X" '((0 . "XLINE")),因为构造线是无限延长的,所以在一个二维平面上,只要两个构造线不是平行的,那么必定相交.可以在fill里用-4筛选方向矢量(组码11)与选择线不同的构造线
2.通过一开始选择的两条构造线的组码10和11,算出两条线上的两点坐标,
3.遍历第二个选择集,以相同的方式获得每条线的两点坐标,并通过这两点坐标与上面获取到的一条线的两点坐标取交点,作为新生成的射线坐标(组码10).组码11根据相对位置继承构造线或取负值. 本帖最后由 999999 于 2020-11-5 08:44 编辑
wyl219 发表于 2020-11-5 05:25
写了个简单的代码,省去了不少判断代码,要求选择的两个构造线是平行的
(defun c:ttt ()
大神您好,我试了一下您写的代码,很好用,谢谢您,,请问能不能帮忙实现“框选两根构造线”,然后自动删除构造线之间的线,(由于横向构造线第一次被修剪后它就不是构造线啦,所以能不能再帮忙改成线段也能够补修剪,只要在构造线之间) wyl219 发表于 2020-11-5 05:25
写了个简单的代码,省去了不少判断代码,要求选择的两个构造线是平行的
(defun c:ttt ()
大神,您醒的可真的早呀 999999 发表于 2020-11-5 08:26
大神您好,我试了一下您写的代码,很好用,谢谢您,,请问能不能帮忙实现“框选两根构造线” ...
可以是可以,根据图元类型增加分支就好了,不过,这种无差别处理有什么实际价值么? wyl219 发表于 2020-11-5 09:15
可以是可以,根据图元类型增加分支就好了,不过,这种无差别处理有什么实际价值么?
框选的话更速度一些,然后单击选线的话,假如屏幕缩小了,然后两根辅助线离的近,单选容易选错呢,然后放大再选的话,从时间上,方便程度来讲,更没有那么理想,嘻嘻,,
搞个动画您帮忙看一下,您有空可以帮忙改一下吗?谢谢啦
能改为直线或复线更实用
页:
[1]
2