明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3001|回复: 23

[源码] <*** 修剪水平線和垂直線 ***>

  [复制链接]
发表于 2023-7-1 07:52:50 | 显示全部楼层 |阅读模式
本帖最后由 lee50310 于 2023-7-17 04:40 编辑

<*** 修剪水平線和垂直線***>


執行指令 ttim
功能功能如動圖所示

源碼已分享  請在 9樓 下載





本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 收起 理由
hubeiwdlue + 1 很给力!
dtucad + 1 赞一个!

查看全部评分

"觉得好,就打赏"
    共1人打赏
发表于 2023-7-5 12:39:19 | 显示全部楼层
本帖最后由 jiman 于 2023-7-5 12:47 编辑

我也贴一版供大家参考。上几天有网友发帖求这个,再次借楼贴一下供大家参考。
(defun c:TTrim2( / #Vcomecho startPt endPt ss horizEntList vertEntList startTempValue endTempValue ssLen borderHorizLine1 borderHorizLine2 tempEnt borderVertLine1 borderVertLine2 tempPt1 tempPt2 i  TempValue1 TempValue2)
    (setq #Vcomecho (getvar "cmdecho"))
    (setq #Vosmode (getvar "osmode"))       ;获取捕捉对象的系统变量
    (setvar "cmdecho" 0)  
    (setvar "osmode" 0)                     ;设置不捕捉
    (setq startPt(getpoint "框选起点\n"))
    (setq endPt(getcorner startPt "框选终点\n"))
    (setq ss(ssget "_C" startPt endPt  (list(cons 0 "LINE"))))
    (setq horizEntList '())                 ;水平直线的表集合
    (setq vertEntList '())                  ;竖直直线的表集合
    (setq startTempValue 0)
    (setq endTempValue 0)
    (setq i 0)
    (if (/= ss nil)
        (progn
            (setq ssLen(sslength ss))
            ;将所选直线分类为水平和竖直,放置两个表中   
            (while (< i ssLen)
                (setq startTempValue (cadr(assoc 10(entget (ssname ss i)))))
                (setq endTempValue (cadr(assoc 11(entget (ssname ss i)))))
                (if (= startTempValue endTempValue) (setq vertEntList (cons (ssname ss i) vertEntList)) (setq horizEntList (cons (ssname ss i) horizEntList)))
                (setq i (+ i 1))
            )
            ;判断直线数量,少于2条则退出程序
            (cond
                ( (< (length horizEntList) 2)
                (progn
                    (alert "框选的水平和竖直线都不能少于2条!")
                    (setvar "cmdecho" #Vcomecho)
                    (setvar "osmode" #Vosmode)
                    (quit)
                )
                )
                ( (< (length vertEntList) 2)
                (progn
                    (alert "框选的水平和竖直线都不能少于2条!")
                    (setvar "cmdecho" #Vcomecho)
                    (setvar "osmode" #Vosmode)
                    (quit)
                )
                )
            )
            ;获取水平边界线
            (setq borderHorizLine1 (nth 0 horizEntList))
            (setq borderHorizLine2 (nth 0 horizEntList))
            (foreach tempEnt horizEntList
                (if (< (caddr(assoc 10 (entget borderHorizLine1)) ) (caddr(assoc 10 (entget tempEnt))))
                    (setq borderHorizLine1 tempEnt)
                )
                (if (> (caddr(assoc 10 (entget borderHorizLine2)) ) (caddr(assoc 10 (entget tempEnt))))
                    (setq borderHorizLine2 tempEnt)
                )
            )
            ;获取竖直边界线
            (setq borderVertLine1 (nth 0 vertEntList))
            (setq borderVertLine2 (nth 0 vertEntList))
            (foreach tempEnt vertEntList
                (if (> (cadr(assoc 10 (entget borderVertLine1)) ) (cadr(assoc 10 (entget tempEnt))))
                    (setq borderVertLine1 tempEnt)
                )
                (if (< (cadr(assoc 10 (entget borderVertLine2)) ) (cadr(assoc 10 (entget tempEnt))))
                    (setq borderVertLine2 tempEnt)
                )
            )

            ;剪裁;通过计算赋值,排除窗交的点处于框选的直线上从而导致剪裁失效
            (if (> (cadr endPt) (cadr startPt) )
                (progn
                    (setq i 0)
                    (while (< i (length vertEntList))
                        (if (< ( abs (- (cadr (cdr (assoc 10 (entget (nth i vertEntList)))) ) (cadr (cdr (assoc 10 (entget borderHorizLine1)) ) )) )  (abs (- (cadr (cdr (assoc 10 (entget (nth i vertEntList)))) ) (cadr (cdr (assoc 10 (entget borderHorizLine2)) ) )) ))
                            (entmakex (list (cons 0 "LINE") (assoc 10 (entget (nth i vertEntList))) (list 11 (car (cdr (assoc 10 (entget (nth i vertEntList)))) ) (cadr (cdr (assoc 10 (entget borderHorizLine1)) ) ) 0)) )
                            (entmakex (list (cons 0 "LINE")  (assoc 10 (entget (nth i vertEntList))) (list 11 (car (cdr (assoc 10 (entget (nth i vertEntList)))) ) (cadr (cdr (assoc 10 (entget borderHorizLine2)) ) ) 0)) )
                        )
                        (if (< ( abs (- (cadr (cdr (assoc 11 (entget (nth i vertEntList)))) ) (cadr (cdr (assoc 10 (entget borderHorizLine1)) ) )) )  (abs (- (cadr (cdr (assoc 11 (entget (nth i vertEntList)))) ) (cadr (cdr (assoc 10 (entget borderHorizLine2)) ) )) ))
                            (entmakex (list (cons 0 "LINE")  (assoc 11 (entget (nth i vertEntList))) (list 10 (car (cdr (assoc 10 (entget (nth i vertEntList)))) ) (cadr (cdr (assoc 10 (entget borderHorizLine1)) ) ) 0)) )
                            (entmakex (list (cons 0 "LINE")  (assoc 11 (entget (nth i vertEntList))) (list 10 (car (cdr (assoc 10 (entget (nth i vertEntList)))) ) (cadr (cdr (assoc 10 (entget borderHorizLine2)) ) ) 0)) )
                        )
                        (entdel (nth i vertEntList))
                        (setq i (+ i 1))
                    )

                )
                (progn
                    (setq i 0)
                    (while (< i (length horizEntList))
                        (if (< ( abs (- (car (cdr (assoc 10 (entget (nth i horizEntList)))) ) (car (cdr (assoc 10 (entget borderVertLine1)) ) )) )  (abs (- (car (cdr (assoc 10 (entget (nth i horizEntList)))) ) (cadr (cdr (assoc 10 (entget borderVertLine2)) ) )) ))
                            (entmakex (list (cons 0 "LINE")  (assoc 10 (entget (nth i horizEntList))) (list 11 (car (cdr (assoc 10 (entget borderVertLine1))) ) (cadr (cdr (assoc 10 (entget (nth i horizEntList))) ) ) 0)) )
                            (entmakex (list (cons 0 "LINE")  (assoc 10 (entget (nth i horizEntList))) (list 11 (car (cdr (assoc 10 (entget borderVertLine2))) ) (cadr (cdr (assoc 10 (entget (nth i horizEntList))) ) ) 0)) )
                        )
                        (if (< ( abs (- (car (cdr (assoc 11 (entget (nth i horizEntList)))) ) (cadr (cdr (assoc 10 (entget borderVertLine1)) ) )) )  (abs (- (cadr (cdr (assoc 11 (entget (nth i horizEntList)))) ) (cadr (cdr (assoc 10 (entget borderVertLine2)) ) )) ))
                            (entmakex (list (cons 0 "LINE") (cons 10 (cdr (assoc 11 (entget (nth i horizEntList))))) (list 11 (car (cdr (assoc 10 (entget borderVertLine1))) ) (cadr (cdr (assoc 10 (entget (nth i horizEntList) )) ) ) 0)) )
                            (entmakex (list (cons 0 "LINE") (cons 10 (cdr (assoc 11 (entget (nth i horizEntList))))) (list 11 (car (cdr (assoc 10 (entget borderVertLine2))) ) (cadr (cdr (assoc 10 (entget (nth i horizEntList))) ) ) 0)) )
                        )
                        (entdel (nth i horizEntList))
                        (setq i (+ i 1))
                    )
                )
            )
        )
    )
    (setvar "cmdecho" #Vcomecho)
    (setvar "osmode" #Vosmode)
    (princ)
)

评分

参与人数 1明经币 +1 收起 理由
lee50310 + 1 赞一个!

查看全部评分

 楼主| 发表于 2023-7-1 22:53:34 | 显示全部楼层
本帖最后由 lee50310 于 2023-7-2 06:01 编辑
kzd2004 发表于 2023-7-1 22:34
刚刚测试了一下,非常感谢,目前使用稳定,大佬能否把原码发一下,就是想把命令改成"t2",这样要快些。{:1_1 ...

ok
源碼分享.....
執行指令 ttim


本帖子中包含更多资源

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

x
发表于 2023-7-20 23:19:10 | 显示全部楼层
jiman 发表于 2023-7-5 12:39
我也贴一版供大家参考。上几天有网友发帖求这个,再次借楼贴一下供大家参考。
(defun c:TTrim2( / #Vcomec ...

参数类型错误!!!cad2022
发表于 2023-7-1 08:25:06 | 显示全部楼层
谢谢lee50310分享的程序
发表于 2023-7-1 09:25:30 | 显示全部楼层
谢谢分享,这个在什么地方可能需要使用呀。
发表于 2023-7-1 09:45:14 | 显示全部楼层
谢谢楼主分享!
发表于 2023-7-1 11:06:04 | 显示全部楼层
大佬最近要爆发啊 分享了很多好用的插件。
发表于 2023-7-1 11:37:53 | 显示全部楼层
大佬无处不在,更新这么快,感谢分享哦~
发表于 2023-7-1 12:39:32 | 显示全部楼层
谢谢楼主分享!
发表于 2023-7-1 22:34:04 | 显示全部楼层
本帖最后由 kzd2004 于 2023-7-1 22:38 编辑

刚刚测试了一下,非常感谢,目前使用稳定,大佬能否把原码发一下,就是想把命令改成"t2",这样要快些。
发表于 2023-7-2 10:50:10 | 显示全部楼层
感谢分享、
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-28 21:15 , Processed in 0.202260 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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