明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5411|回复: 29

[求助]请编一个将通过文字区的线剪断的程序

  [复制链接]
发表于 2004-1-8 19:17:00 | 显示全部楼层 |阅读模式
在地形图中有许多等高线和高程标注,请大虾编一个将通过文字区的等高线剪断的程序  




zhang8755 附带了这个的图片 :



本帖子中包含更多资源

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

x
发表于 2004-1-8 20:15:00 | 显示全部楼层
在ET扩展工具—文本工具—文本屏蔽就是实现这个功能的。
发表于 2004-1-8 20:15:00 | 显示全部楼层
這個不難. 我試試.

(defun c:test(/ os st textp one tow three four)
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (setvar "cmdecho" 1)
  (setq st(ssget '((0 . "TEXT"))))
  (command "ucs" "ob"(SSNAME ST 0) )
  (SETQ TEXTP (textbox (ENTGET (SSNAME ST 0))))
  (setq one (car textp) tow (cadr textp))
  (setq three (polar one 0 (car tow)))
  (setq four (polar one (/ pi 2.0) (cadr tow)))
  (command "trim" "all" ""  "f"one three tow four """")
  (command "ucs" "")
  (setvar "osmode" os) (setvar "cmdecho" 1)
  (princ))
发表于 2004-1-8 20:28:00 | 显示全部楼层
再完善點. 我認為這樣就比較好了. 
(defun c:test (/ os st i textp one tow three four)
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (setvar "cmdecho" 1)
  (setq st (ssget '((0 . "TEXT"))))
  (setq i 0)
  (repeat (sslength st)
    (command "ucs" "ob" (SSNAME ST i))
    (SETQ textp (textbox (ENTGET (SSNAME ST 0))))
    (setq one (car textp)
          tow (cadr textp)
    )
    (setq three (polar one 0 (car tow)))
    (setq four (polar one (/ pi 2.0) (cadr tow)))
    (command "trim" "all" "" "f" one three tow four "" "")
    (command ".erase" "f" one tow"" "r"(SSNAME ST i) "")
    (command ".erase" "f" three four """r" (SSNAME ST i)"")
    (command "ucs" "")
    (setq i (1+ i))
  )
  (setvar "osmode" os)
  (setvar "cmdecho" 1)
  (princ)
)
发表于 2004-1-8 22:02:00 | 显示全部楼层
第4楼的同志做的不错嘛
我一前些过一个可是好长的
你的简单多了
不错
发表于 2004-1-9 07:37:00 | 显示全部楼层
还可以再改进,而且当线在文字领域内交叉时,剪出来的就不太好了。
发表于 2004-1-9 08:46:00 | 显示全部楼层
刚刚改好的,看看这个怎么样。
谁能改一下,让它能剪切标注文本上的线。
(defun c:testtrim (/ os st i textp one two three four)
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (setvar "cmdecho" 1)
  (setq st (ssget '((0 . "TEXT"))))
  (setq i 0)
  
  (repeat (sslength st)
    (vl-cmdf "ucs" "ob" (ssname st i))
    (SETQ textp (textbox (ENTGET (SSNAME ST 0))))
    (setq one (car  textp)
          two (cadr textp)
    )
    (setq three (polar one 0 (car two)))
    (setq four  (polar one (/ pi 2.0) (cadr two)))
    (command "trim" "" "f" one three  "" ""
             "trim" "" "f" two four   "" ""
             "trim" "" "f" one four   "" ""
             "trim" "" "f" two three  "" "")
    (command ".erase" "cp" one three two four "" "r" (SSNAME ST i) "")
    (command "ucs" "")
    (setq i (1+ i))
  );end repeat
  
  (setvar "osmode" os)
  (setvar "cmdecho" 1)
  (vl-cmdf "ucs" "")
  (princ)
)
 楼主| 发表于 2004-1-9 11:50:00 | 显示全部楼层
谢谢4楼的和7楼的
发表于 2004-1-9 12:11:00 | 显示全部楼层
4楼和7楼的程序采用了不同的剪切方式,产生了不同的效果,经测试,结果有部分不理想,4楼的甚至丢了一半线条,从程序来看不应该出现这种情况,(如图,desktop.rar文件中),不知问题出在哪里?
贴一个在et命令下修改的代码,可选择剪切边界距文字(text及mtext,会清除mtext的文字框大于文字长度的部分)的距离,并删除文字处的不需要实体,以使文字清楚显现。
  1. (defun c:texttrim (     )
  2.   (defun ucs_2_mtext (ENT / PT)

  3.     (setq PT (cdr (assoc 210 (entget ENT)))
  4.           PT (strcat "*"
  5.                (rtos (car PT) 2 8) ","
  6.                (rtos (cadr PT) 2 8) ","
  7.                (rtos (caddr PT) 2 8)
  8.              );setq
  9.     (command "_.ucs" "_za" "*0.0,0.0,0.0" PT)
  10.     (command "_.ucs" "_or" (trans (cdr (assoc 10 (entget ENT))) 0 1))
  11.   )
  12. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  13.   (defun mtextbox (MTXT / WDTH HGHT INS JUST ANG P1 P2 P3 P4)
  14.     (if (and (listp MTXT) (= "MTEXT" (cdr (assoc 0 MTXT))))
  15.       (progn
  16.         (setq WDTH (cdr (assoc 42 MTXT))
  17.               HGHT (cdr (assoc 43 MTXT))
  18.               INS  (trans (cdr (assoc 10 MTXT)) 0 1)
  19.               JUST (cdr (assoc 71 MTXT))
  20.               ANG  (cdr (assoc 50 MTXT))
  21.         )
  22.         (cond
  23.           ((= JUST 1)
  24.             (setq P1 (polar INS (- ANG (* Pi 0.5)) HGHT)
  25.                   P2 (polar P1 ANG WDTH)                 
  26.                   P3 (polar INS ANG WDTH)               
  27.                   p4 INS                                 
  28.             )
  29.           )
  30.           ((= JUST 2)
  31.             (setq P3 (polar INS ANG (/ WDTH 2))
  32.                   P4 (polar INS (+ ANG Pi) (/ WDTH 2))
  33.                   P1 (polar P4 (- ANG (* Pi 0.5)) HGHT)
  34.                   P2 (polar P1 ANG WDTH)
  35.             )
  36.           )
  37.           ((= JUST 3)
  38.             (setq P3 INS
  39.                   P4 (polar INS (+ ANG Pi) WDTH)
  40.                   P1 (polar P4 (- ANG (* Pi 0.5)) HGHT)
  41.                   P2 (polar P1 ANG WDTH)
  42.             )
  43.           )
  44.           ((= JUST 4)
  45.             (setq P4 (polar INS (+ ANG (* Pi 0.5)) (/ HGHT 2))
  46.                   P3 (polar P4 ANG WDTH)
  47.                   P1 (polar P4 (- ANG (* Pi 0.5)) HGHT)
  48.                   P2 (polar P1 ANG WDTH)
  49.             )
  50.           )
  51.           ((= JUST 5)
  52.             (setq P4 (polar INS (- ANG Pi) (/ WDTH 2))
  53.                   P4 (polar P4 (+ ANG (* Pi 0.5)) (/ HGHT 2))
  54.                   P3 (polar P4 ANG WDTH)
  55.                   P1 (polar P4 (- ANG (* Pi 0.5)) HGHT)
  56.                   P2 (polar P1 ANG WDTH)
  57.             )
  58.           )
  59.           ((= JUST 6)
  60.             (setq P3 (polar INS (+ ANG (* Pi 0.5)) (/ HGHT 2))
  61.                   P4 (polar P3 (+ ANG Pi) WDTH)
  62.                   P1 (polar P4 (- ANG (* Pi 0.5)) HGHT)
  63.                   P2 (polar P1 ANG WDTH)
  64.             )
  65.           )
  66.           ((= JUST 7)
  67.             (setq P1 INS
  68.                   P2 (polar P1 ANG WDTH)
  69.                   P3 (polar P2 (+ ANG (* Pi 0.5)) HGHT)
  70.                   P4 (polar P1 (+ ANG (* Pi 0.5)) HGHT)
  71.             )
  72.           )
  73.           ((= JUST 8)
  74.             (setq P1 (polar INS (+ ANG Pi) (/ WDTH 2))
  75.                   P2 (polar P1 ANG WDTH)
  76.                   P3 (polar P2 (+ ANG (* Pi 0.5)) HGHT)
  77.                   P4 (polar P1 (+ ANG (* Pi 0.5)) HGHT)
  78.             )
  79.           )
  80.           ((= JUST 9)
  81.             (setq P2 INS
  82.                   P1 (polar INS (+ ANG Pi) WDTH)
  83.                   P3 (polar P2 (+ ANG (* Pi 0.5)) HGHT)
  84.                   P4 (polar P1 (+ ANG (* Pi 0.5)) HGHT)
  85.             )
  86.           )
  87.         )
  88.       )
  89.       (prompt "\nEntity Not Mtext!")
  90.     )
  91.     (list P1 P2 P3 P4)
  92.   )

  93. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  94.   (defun drawbox (TXT DIST / TBX PT ORGBND)

  95.     (if (= TXTYP "TEXT")
  96.       (progn
  97.         (setq TBX (textbox TXT))    ; normal text
  98.         (setq dian1 (car TBX))
  99.         (setq dian2 (list (caadr TBX)(cadar TBX)))        
  100.         (setq dian3 (cadr TBX))
  101.         (setq dian4 (list (caar TBX)(cadadr TBX)))
  102.         (command "_.pline" (car TBX) (list (caadr TBX)(cadar TBX))
  103.                  (cadr TBX) (list (caar TBX)(cadadr TBX)) "_close"
  104.         )
  105.       )
  106.       (progn
  107.         (setq TBX (mtextbox TXT))   ; Mtext
  108.         (setq dian1 (car TBX))
  109.         (setq dian2 (cadr TBX))        
  110.         (setq dian3 (caddr TBX))
  111.         (setq dian4 (cadddr TBX))
  112.         (command "_.pline")
  113.         (foreach PT TBX (command PT))
  114.         (command "_c")
  115.       )
  116.     )

  117.     (setq ORGBND (entlast))

  118.     (command "_.offset" DIST (entlast))
  119.     (if (= TXTYP "TEXT")
  120.       (command "-1,-1" "")
  121.        (command (polar
  122.                  (cdr (assoc 10 TXT))
  123.                  (cdr (assoc 50 TXT))
  124.                  (* 2 (cdr (assoc 42 TXT)))
  125.                )
  126.                ""
  127.         )
  128.      )   
  129.     (entdel ORGBND)
  130. (list dian1 dian2 dian3 dian4)
  131.   );end defun


  132. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  133.             (setvar "osmode" 0)
  134.       (setq CNT   0                                   
  135.             EA   "Y"
  136.             FLTR   '( (-4 . "<OR")                     
  137.                           (0 . "MTEXT")
  138.                           (0 . "TEXT")
  139.                       (-4 . "OR>")
  140.                     )
  141.       )
  142.   (SETQ EA (getstring "\n\n删除文字所压实体? (N) :"))

  143. ; ------------------ Set the offset value to use -----------------
  144.    
  145.       (setq OSET (getcfg "AppData/AC_Bonus/Txtmsk_Offset"))

  146.       (if (not (and OSET
  147.                 (= (type (setq OSET (read OSET))) 'REAL)
  148.                )
  149.           )
  150.         (setq OSET 0.35 )                              ; use 0.35 as default.
  151.       )
  152.          

  153.       (initget 4)                                      ; No negative values allowed
  154.       (setq TMP
  155.         (getdist (strcat "\n输入偏移比例:(应大于0) <" (rtos OSET 2 2) ">: "))
  156.       )

  157.       (if TMP (setq OSET TMP))
  158.       (setcfg "AppData/AC_Bonus/Txtmsk_Offset" (rtos OSET 2 2))

  159. ; ---------------------- get text to mask ------------------------

  160.       (Princ "\n选择文字以便进行压线剪切或删除文字所压实体:")
  161.       
  162.       (setq SS (ssget FLTR))                       

  163. ; ----------------- Step through each and mask -------------------

  164.           (While (setq ENT (ssname SS CNT))           

  165.             
  166.             (setq TXT   (entget ENT (list "*"))
  167.                   txt2 (entget ent)
  168.             TXTYP (cdr (assoc 0 TXT))            
  169.             )

  170.             (if (= TXTYP "TEXT")
  171.               (command "_.ucs" "_object" ENT)      
  172.                (ucs_2_mtext ENT)
  173.              )

  174.             (setq  TOS (* (cdr (assoc 40 TXT)) OSET)   
  175.             )

  176.             (drawbox TXT TOS)                          
  177.             (setq box2 (entlast))
  178.   
  179.     (command "trim" "last" "" "f" dian1 dian2 dian3 dian4  dian1 "" "")
  180.     (command "trim" "last" "" "f" dian1 dian2 dian3 dian4  dian1 "" "")
  181.     (IF (OR (= EA "y") (= EA "Y"))
  182.     (command "erase" "wp" dian1 dian2 dian3 dian4 "" ""))
  183.             (entdel box2)
  184.               (command "_.ucs" "_previous")              
  185.   
  186.             (if (= TXTYP "MTEXT")
  187.               (command "_.ucs" "_previous")      
  188.             )
  189.             
  190.             (setq CNT (1+ CNT))                       
  191.           ); while

  192. )

  193. )


偶尔也会出现4楼的情况,谁能看看是什么原因?

本帖子中包含更多资源

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

x
发表于 2004-1-9 20:29:00 | 显示全部楼层
请教2楼
文本屏蔽是否指在文字区域内将其它实体隐蔽掉,但被隐蔽的实体不变,比如一根直线中间被屏蔽,还是一根直线.
R14里有这个功能吗?我在一份图纸里看过,当时没注意.
填充也一样,当我移出填充里的文字,被屏蔽部分的填充自行恢复了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-31 14:53 , Processed in 0.165813 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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