明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1243|回复: 8

[讨论] 直线两端变断线

[复制链接]
发表于 2017-10-10 19:48:47 | 显示全部楼层 |阅读模式
这是一个可以把一条直线两端变断线的程序,并标记。为什么一直提示错误。请高手帮忙给看看。


(defun C:TT (/     ENT_BD          L        LEN   CX    JS          ENAME        ELIST
                ENTNA ST    ED          DIS        ST1   ED1   ANGE  ANGS        SY
                TC
               )

  (PROMPT "\n选择需要打断的线:")
  (setq ENT_BD (car (cdr (SSGETFIRST))))
  (while (= ENT_BD nil) (setq ENT_BD (SSGET '((0 . "LINE")))))
    (SETVAR "osmode" 0)
  (setq L (GETDIST "\n两端需要断开的长度:<10>"))
  (if (= L "")
    (setq L 10)
  )
  (if (= L nil)
    (setq L 10)
  )
  (setq SY (GETSTRING "\n是否保留两端断开线段?[是-Y][否-N]<Y>:"))
  (if (= SY "")
    (setq SY "Y")
  )
  (setq LEN (SSLENGTH ENT_BD))
  (setq CX 0)
  (setq JS 0)
  (repeat LEN
    (setq ENAME (SSNAME ENT_BD CX))
    (setq ELIST (ENTGET ENAME))
    (setq ENTNA (DXF 0 ELIST))
    (if        (= ENTNA "LINE")
      (progn (setq ST (DXF 10 ELIST))
             (setq ED (DXF 11 ELIST))
             (setq DIS (DISTANCE ST ED))
             (setq TC (DXF 8 ELIST))
             (setq ANGS (ANGLE ST ED))
             (setq ST1 (POLAR ST ANGS L))
             (setq BJ0 (POLAR ST1 (+ ANGS (/ PI 2)) 1.5))
             (setq BJ1 (POLAR ST1 (+ ANGS (/ PI 2) PI) 1.5))
             (setq ANGE (ANGLE ED ST))
             (setq ED1 (POLAR ED ANGE L))
             (setq BJ2 (POLAR ED1 (+ ANGS (/ PI 2)) 1.5))
             (setq BJ3 (POLAR ED1 (+ ANGS (/ PI 2) PI) 1.5))
             (ENTDEL ENAME)
             (if (or (= SY "Y") (= SY "y"))
               (progn (ENTMAKE (LIST (cons 0 "LINE")
                                     (cons 8 TC)
                                     (cons 10 ST)
                                     (cons 11 ST1)
                               )
                      )
                      (ENTMAKE (LIST (cons 0 "LINE")
                                     (cons 8 TC)
                                     (cons 10 ST1)
                                     (cons 11 ED1)
                               )
                      )
                      (ENTMAKE (LIST (cons 0 "LINE")
                                     (cons 8 TC)
                                     (cons 10 ED1)
                                     (cons 11 ED)
                               )
                      )
                      (ENTMAKE (LIST (cons 0 "LINE")
                                     (cons 8 T@33)
                                     (cons 10 BJ0)
                                     (cons 11 BJ1)
                               )
                      )
                      (ENTMAKE (LIST (cons 0 "LINE")
                                     (cons 8 T@33)
                                     (cons 10 BJ2)
                                     (cons 11 BJ3)
                               )
                      )
               )
             )
             (if (or (= SY "N") (= SY "n"))
               (ENTMAKE        (LIST (cons 0 "LINE")
                              (cons 8 TC)
                              (cons 10 ST1)
                              (cons 11 ED1)
                        )
               )
             )
             (setq JS (+ JS 1))
      )
    )
    (setq CX (+ CX 1))
  )
      (PRINC)
)


发表于 2017-10-10 20:26:52 | 显示全部楼层
  1. (defun dxf (grc lst)  (cdr (assoc grc lst))
  2. )

  3. (defun c:tt (/ ent_bd l len cx js ename elist entna st ed dis st1 ed1 ange angs sy tc)

  4.   (prompt "\n选择需要打断的线:")
  5.   (setq ent_bd (car (cdr (ssgetfirst))))
  6.   (while (= ent_bd nil) (setq ent_bd (ssget '((0 . "LINE")))))
  7.   (setvar "osmode" 0)
  8.   (setq l (getdist "\n两端需要断开的长度:<10>"))
  9.   (if (= l "")
  10.     (setq l 10)
  11.   )
  12.   (if (= l nil)
  13.     (setq l 10)
  14.   )
  15.   (setq sy (getstring "\n是否保留两端断开线段?[是-Y][否-N]<Y>:"))
  16.   (if (= sy "")
  17.     (setq sy "Y")
  18.   )
  19.   (setq len (sslength ent_bd))
  20.   (setq cx 0)
  21.   (setq js 0)
  22.   (repeat len
  23.     (setq ename (ssname ent_bd cx))
  24.     (setq elist (entget ename))
  25.     (setq entna (dxf 0 elist))
  26.     (if        (= entna "LINE")
  27.       (progn (setq st (dxf 10 elist))
  28.              (setq ed (dxf 11 elist))
  29.              (setq dis (distance st ed))
  30.              (setq tc (dxf 8 elist))
  31.              (setq angs (angle st ed))
  32.              (setq st1 (polar st angs l))
  33.              (setq bj0 (polar st1 (+ angs (/ pi 2)) 1.5))
  34.              (setq bj1 (polar st1 (+ angs (/ pi 2) pi) 1.5))
  35.              (setq ange (angle ed st))
  36.              (setq ed1 (polar ed ange l))
  37.              (setq bj2 (polar ed1 (+ angs (/ pi 2)) 1.5))
  38.              (setq bj3 (polar ed1 (+ angs (/ pi 2) pi) 1.5))
  39.              (entdel ename)
  40.              (if (or (= sy "Y") (= sy "y"))
  41.                (progn (entmake (list (cons 0 "LINE")
  42.                                      (cons 8 tc)
  43.                                      (cons 10 st)
  44.                                      (cons 11 st1)
  45.                                )
  46.                       )
  47.                       (entmake (list (cons 0 "LINE")
  48.                                      (cons 8 tc)
  49.                                      (cons 10 st1)
  50.                                      (cons 11 ed1)
  51.                                )
  52.                       )
  53.                       (entmake (list (cons 0 "LINE")
  54.                                      (cons 8 tc)
  55.                                      (cons 10 ed1)
  56.                                      (cons 11 ed)
  57.                                )
  58.                       )
  59.                       (entmake (list (cons 0 "LINE")
  60.                                      (cons 8 tc)
  61.                                      (cons 10 bj0)
  62.                                      (cons 11 bj1)
  63.                                )
  64.                       )
  65.                       (entmake (list (cons 0 "LINE")
  66.                                      (cons 8 tc)
  67.                                      (cons 10 bj2)
  68.                                      (cons 11 bj3)
  69.                                )
  70.                       )
  71.                )
  72.              )
  73.              (if (or (= sy "N") (= sy "n"))
  74.                (entmake        (list (cons 0 "LINE")
  75.                               (cons 8 tc)
  76.                               (cons 10 st1)
  77.                               (cons 11 ed1)
  78.                         )
  79.                )
  80.              )
  81.              (setq js (+ js 1))
  82.       )
  83.     )
  84.     (setq cx (+ cx 1))
  85.   )
  86.   (princ)
  87. )

补了个函数 改了两个变量 能用了 不知道是不是这个意思
发表于 2017-10-11 06:12:48 | 显示全部楼层
感谢分享及修正程序!!!!!
发表于 2017-10-11 13:14:23 | 显示全部楼层
;; tt(直线两端定距打断)
(defun c:tt ()
  (setq d0 (Udist 7 "" "两端需要断开的长度<输入或鼠标直接量取>" d0 nil))
  (setq sy (Ukword 1 "Y N" "保留两端断开线段: Y-保留/N-删除" sy))
  (setq i -1)
  (princ "\n选择需要打断的线: ")
  (if (setq ss (ssget '((0 . "line"))))
    (while (setq s1 (ssname ss (setq i (1+ i))))
      (setq p1 (xyp-DXF 10 s1)
            p2 (xyp-DXF 11 s1)
            ll (distance p1 p2)
      )
      (if (> ll (* d0 2))
        (progn
          (setq        rad (angle p1 p2)
                p11 (polar p1 rad d0)
                p22 (polar p2 rad (- d0))
          )
          (if (= sy "Y")
            (foreach pt (list p22 p11) (xyp-breakE s1 pt pt))
            (progn
              (xyp-breakE s1 p2 p22)
              (xyp-breakE s1 p11 p1)
            )
          )
        )
      )
    )
  )
  (princ)
)
 楼主| 发表于 2017-10-13 16:17:38 | 显示全部楼层
vectra 发表于 2017-10-10 20:26
补了个函数 改了两个变量 能用了 不知道是不是这个意思

谢谢大师的帮忙,太完美了。
 楼主| 发表于 2017-10-13 16:28:32 | 显示全部楼层
xyp1964 发表于 2017-10-11 13:14
;; tt(直线两端定距打断)
(defun c:tt ()
  (setq d0 (Udist 7 "" "两端需要断开的长度" d0 nil))

谢谢,挺好用的。
发表于 2017-10-16 08:55:36 | 显示全部楼层
回帖是一种美德!感谢楼主的无私分享 谢谢
发表于 2017-10-17 09:58:22 | 显示全部楼层
路过,顶一下
发表于 2018-8-7 15:37:55 | 显示全部楼层
本帖最后由 thomaslai 于 2018-8-8 10:35 编辑
vectra 发表于 2017-10-10 20:26
补了个函数 改了两个变量 能用了 不知道是不是这个意思

请问大师  能否打断后选取被打断的线段  或者自动换图层呢??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-19 06:15 , Processed in 0.159019 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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