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方向性修剪的问题,为什么运行不了,你看一下我在帖子的回复。
页: 1 [2] 3
查看完整版本: 修剪水平线和垂直线