xyp1964
发表于 2023-6-26 21:12:34
kzd2004 发表于 2023-6-25 21:53
大佬,这个哪儿有?能分享吗?
;; 提供一个思路
kzd2004
发表于 2023-6-26 21:31:46
本帖最后由 kzd2004 于 2023-6-26 22:03 编辑
xyp1964 发表于 2023-6-26 21:12
;; 提供一个思路
大佬,我用的是auto2022,用不了。怎么调用xyp-CurveIntersLeng。
jiman
发表于 2023-6-26 22:48:38
kzd2004 发表于 2023-6-26 18:53
万分感谢!
这一版应该还可以吧。
(defun c:TTrim2( / #Vcomecho startPt endPt ss horizEntList vertEntList startTempValue endTempValue ssLen borderHorizLine1 borderHorizLine2 tempEnt borderVertLine1 borderVertLine2 tempPt1 tempPt2 iTempValue1 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)
)
kzd2004
发表于 2023-6-27 07:12:10
本帖最后由 kzd2004 于 2023-6-27 07:16 编辑
jiman 发表于 2023-6-26 22:48
这一版应该还可以吧。
(defun c:TTrim2( / #Vcomecho startPt endPt ss horizEntList vertEntList start ...
非常感谢你的帮助,尤其是这么晚了,这次已经能用了,谢谢你了。
jiman
发表于 2023-6-27 07:59:58
kzd2004 发表于 2023-6-27 07:12
非常感谢你的帮助,尤其是这么晚了,这次已经能用了,谢谢你了。
你们这个gif是AutoCAD自带的工具录屏的吗?
kzd2004
发表于 2023-6-27 21:47:13
本帖最后由 kzd2004 于 2023-6-27 21:49 编辑
jiman 发表于 2023-6-27 07:59
你们这个gif是AutoCAD自带的工具录屏的吗?
不是的,先录视频再转gif.两个小软件。
kzd2004
发表于 2023-6-28 22:38:10
xyp1964 发表于 2023-6-26 21:12
;; 提供一个思路
大佬,收到回复一下。
kzd2004
发表于 2023-6-29 13:39:54
kzd2004 发表于 2023-6-26 21:31
大佬,我用的是auto2022,用不了。怎么调用xyp-CurveIntersLeng。
大佬,看到请回复一下。
kzd2004
发表于 2023-6-29 13:41:20
kzd2004 发表于 2023-6-27 07:12
非常感谢你的帮助,尤其是这么晚了,这次已经能用了,谢谢你了。
用了几天,感觉不稳定,从上往下经常失效,不知道什么原因?
kzd2004
发表于 2023-6-29 13:44:21
xyp1964 发表于 2023-6-26 21:12
;; 提供一个思路
大佬,你在吗?请回复我一下,tt方向性修剪的问题,为什么运行不了,你看一下我在帖子的回复。