明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1183|回复: 19

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

[复制链接]
发表于 2020-11-4 11:15 | 显示全部楼层 |阅读模式
2明经币
麻烦各位大神,小弟有一个新的想法,然后在论坛里面没有找到关于这个想法的插件,如果有大神知道的话,麻烦有空的话,帮小弟解决一下哟
1.输入命令(提示框选选择两根构造线)
2.按下空格键,修剪线段之间的构造线
附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

写了个简单的代码,省去了不少判断代码,要求选择的两个构造线是平行的 (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 "") ;不与en ...
发表于 2020-11-4 11:15 | 显示全部楼层
本帖最后由 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 (ssname  ss 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) ;生成对象
        
)


回复

使用道具 举报

发表于 2020-11-4 20:24 | 显示全部楼层
如果仅修剪屏幕内的话,选择后求出中线,tr命令F参数即可,如果是屏幕外,好像比较麻烦,图太大的话z e后低于1像素则修剪不了
回复

使用道具 举报

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

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

使用道具 举报

发表于 2020-11-5 04:25 | 显示全部楼层
用entmake比较合适吧.

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

使用道具 举报

 楼主| 发表于 2020-11-5 08:26 | 显示全部楼层
本帖最后由 999999 于 2020-11-5 08:44 编辑
wyl219 发表于 2020-11-5 05:25
写了个简单的代码,省去了不少判断代码,要求选择的两个构造线是平行的

(defun c:ttt ()

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

使用道具 举报

 楼主| 发表于 2020-11-5 08:44 | 显示全部楼层
wyl219 发表于 2020-11-5 05:25
写了个简单的代码,省去了不少判断代码,要求选择的两个构造线是平行的

(defun c:ttt ()

大神,您醒的可真的早呀
回复

使用道具 举报

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

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

使用道具 举报

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

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

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2020-11-5 10:35 | 显示全部楼层
能改为直线或复线更实用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-10 09:15 , Processed in 0.186577 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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