乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 129|回复: 9

如何剪切穿过文本的线段?

[复制链接]

39

主题

97

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
253
发表于 2004-3-1 20:37:00 | 显示全部楼层 |阅读模式
一个尺寸标注加上公差值后,且这个标注还是斜的,怎么用它来剪切穿过它的线段
具体要求如图所示
这个程序较麻烦,想看看各位有没有更简单的方法来实现这个功能

2stm2lboiyc.jpg

2stm2lboiyc.jpg

回复

使用道具 举报

1

主题

8

帖子

1

银币

初来乍到

Rank: 1

铜币
12
发表于 2004-3-2 00:55:00 | 显示全部楼层
试试这个,写得简单了点:)
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-3-2 09:07:00 | 显示全部楼层
选择时要选择标注的文本。。。
(defun c:test( / ent ent_dim ents pt_lst ang_txt height pt pt1 pt2 ptCenter dist ang pt_w1 pt_w2 pt_w3 pt_w4 os)
         (setq os (getvar "osmode"))
         (setq ent (nentsel))
         (setq ent_dim (car (last ent)))
         (setq ent (car ent))
         (setq ents (entget ent))
         (setq pt_lst (textbox (list (cons 0 "TEXT")
                                                                 (assoc 1 ents)
                                                                 (assoc 40 ents)
                        )
                                                         )
         )
         (setq ang_txt (cdr (assoc 50 ents)))
         (setq height (/ (cdr (assoc 40 ents)) 5.0))
         (setq pt (cdr (assoc 10 ents)))
         (setq pt1 (car pt_lst))
         (setq pt2 (cadr pt_lst))
         (setq ptCenter (list (/ (+ (car pt1) (car pt2)) 2.0) (/ (+ (cadr pt1) (cadr pt2)) 2.0)))
         (setq pt2 (list (+ (car pt2) height) (+ (cadr pt2) (* 2.0 height))))
         (setq dist (distance ptCenter pt2))
         (setq ang (angle pt2 ptCenter))
         (setq pt_w1 (polar pt (- (+ ang_txt pi) ang) dist))
         (setq pt_w2 (polar pt (+         ang_txt ang) dist))
         (setq pt_w3 (polar pt (- ang_txt ang) dist))
         (setq pt_w4 (polar pt (+ ang_txt pi ang) dist))
         (setvar "osmode" 0)
         (setvar "cmdecho" 0)
         (command "_.wipeout" "f" "off")
         (command "_.wipeout" pt_w1 pt_w2 pt_w3 pt_w4 "")
         (entdel ent_dim)
         (entdel ent_dim)
         (setvar "osmode" os)
         (princ)
)
回复

使用道具 举报

39

主题

97

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
253
发表于 2004-3-2 10:08:00 | 显示全部楼层
谢谢各位,程序都不错,不过三楼的程序如果用在倾斜的文本上的时候出现的状况不如人意,能否改善?
我就是拿倾斜的且带有公差的文本没有办法,请大家帮忙。
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-3-2 10:31:00 | 显示全部楼层
你要如何才如人意?
        

4mw5uzqugin.JPG

4mw5uzqugin.JPG


bgnzkkhri3u.JPG

bgnzkkhri3u.JPG

回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-3-2 10:48:00 | 显示全部楼层
(setq pt2 (list (+ (car pt2) height) (+ (cadr pt2) (* 2.0 height))))
此句中后面(* 2.0 ...中的2.0可以适当改大,以达到有公差时的要求(大概要到4—5左右比较合适)
回复

使用道具 举报

29

主题

1152

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1268
发表于 2004-3-2 12:30:00 | 显示全部楼层
;;-----------------------C:MaskDimText------------------------------------
;;Command to place a WIPEOUT behind selected DIMENSION text (one entity)
;;© 2001 Herman Mayfarth
;;Tested with AutoCAD Release 14.01
;;Not tested with R15
;;修改 By 龍龍仔(LUCAS)
;;Only tested with R16
;;Not tested with R14
;;Known limitations:
;; 1. This routine works by asking the user to select a nested MTEXT object,
;; and uses that object's entity data to define the WIPEOUT boundary.
;; If you have dimension text stacked over/under the dimension line,
;; i.e. using the \X code, this routine will _not_ mask all the text,
;; since the over/under text are separate MTEXT entities.
;; (A better & more sophisticated way would be to walk through the
;; DIMENSION block & determine the bounding box of all MTEXT objects in the
;; block, but this is a Q & D 1st attempt)
;; 2. In R14.01, on my system, if the DIMENSION has been moved or copied,
;; the WIPEOUT is incorrectly placed at the *original* location of
;; the MTEXT object.(???) Don't know why, at this point.
;;
;; Feel free to modify to suit your own needs &/or whims.
;;------------------------------------------------------------------------
;;global function
;;test function to see if wipeout.arx is available
(defun WIPEOUTP        ()
         (if (> (atoi (getvar "AcadVer")) 15)
                         (arxload "acwipeout" NIL)
                         (arxload "wipeout" NIL)
         )
)                                        ;wipeoutp
;;
(defun C:MASKDIMTEXT (/ CECHO OLDLYR ENT FLAG OUTER BOXMTEXT LWRECT)
         ;;local functions
;;;--------------------boxmtext-------------------------------------
;;; Purpose: draws a lwpolyline rectangle to enclose an MTEXT entity
;;; Parameter: entity name of MTEXT entity
;;; External function: lwrect to draw the rectangle
;;;-----------------------------------------------------------------
         (defun BOXMTEXT (ENAME         /         MTXTNT        P10                         H                                         ANG1                 DELTA
                                 D1                 BOXANG BOXDIA        ATTACH VEC                         P1                                 P3
                                 HOR                 VERT
                         )
                         (setq MTXTNT (entget ENAME)
                 P10         (cdr (assoc 10 MTXTNT))
                 H         (cdr (assoc 40 MTXTNT))
                 HOR         (cdr (assoc 42 MTXTNT))
                 VERT         (cdr (assoc 43 MTXTNT))
                 ANG1         (cdr (assoc 50 MTXTNT))
                 ATTACH (cdr (assoc 71 MTXTNT))
                 VEC         (getvar "UCSXDIR")
                 ANG1         (+ (atan (cadr VEC) (car VEC)) ANG1)
                 DELTA         (/ H 2)                ;adjust as req'd
                 D1         (+ HOR (* 2 DELTA))
                 BOXANG (atan (+ VERT (* 2 DELTA)) D1)
                 BOXDIA (* (/ 1 (cos BOXANG)) D1)
                         )                                        ;setq
                         (cond ((= ATTACH 1)                        ;top left
                         (setq P1 (polar P10 (+ (/ (* 3 pi) 2) ANG1) (+ VERT DELTA)))
                 )
                 ((= ATTACH 2)                        ;top center
                         (setq P1
                         (polar (polar P10 (+ pi ANG1) (/ HOR 2))
                         (+ (/ (* 3 pi) 2) ANG1)
                         (+ VERT DELTA)
                         )
                         )
                 )
                 ((= ATTACH 3)                        ;top right
                         (setq P1
                         (polar (polar P10 (+ pi ANG1) HOR)
                         (+ (/ (* 3 pi) 2) ANG1)
                         (+ VERT DELTA)
                         )
                         )
                 )
                 ((= ATTACH 4)                        ;middle left
                         (setq
                                         P1        (polar P10 (+ (/ (* 3 pi) 2) ANG1) (+ (/ VERT 2) DELTA))
                         )
                 )
                 ((= ATTACH 5)                        ;middle center
                         (setq P1
                         (polar (polar P10 (+ pi ANG1) (/ HOR 2))
                         (+ (/ (* 3 pi) 2) ANG1)
                         (+ (/ VERT 2) DELTA)
                         )
                         )
                 )
                 ((= ATTACH 6)                        ;middle right
                         (setq P1
                         (polar (polar P10 (+ pi ANG1) HOR)
                         (+ (/ (* 3 pi) 2) ANG1)
                         (+ (/ VERT 2) DELTA)
                         )
                         )
                 )
                 ((= ATTACH 7)                        ;bottom left
                         (setq P1 (polar P10 (+ (/ (* 3 pi) 2) ANG1) DELTA))
                 )
                 ((= ATTACH 8)                        ;bottom center
                         (setq P1
                         (polar (polar P10 (+ pi ANG1) (/ HOR 2))
                         (+ (/ (* 3 pi) 2) ANG1)
                         DELTA
                         )
                         )
                 )
                 ((= ATTACH 9)                        ;bottom right
                         (setq P1
                         (polar (polar P10 (+ pi ANG1) HOR)
                         (+ (/ (* 3 pi) 2) ANG1)
                         DELTA
                         )
                         )
                 )
                         )                                        ;cond
                         (setq
                                         P1 (polar P1 (+ pi ANG1) DELTA)
                                         P3 (polar P1 (+ BOXANG ANG1) BOXDIA)
                         )                                        ;setq
                         (LWRECT P1 P3 ANG1 (getvar "CLAYER") 256 (getvar "CELTYPE"))
         )                                        ;boxmtext
;;;-------------------------lwrect------------------------------------
;;; Purpose: draws a lightweight polyline rectangle
;;; Params: p1,p3 - WCS points at opposite corners
;;; rotate - rotation angle of selected axis in radians
;;; layer, color, ltype what they say
;;; Returns: EAL of entity
         (defun LWRECT        (P1 P3 ROTATE LAYER COLOR LTYPE / D13 ABOX P2 P4 ELIST)
                         (setq D13         (distance P1 P3)
                 ABOX (- (angle P1 P3) ROTATE)
                 P2                 (polar P1 ROTATE (* (cos ABOX) D13))
                 P4                 (polar P1 (+ ROTATE (/ pi 2)) (* (sin ABOX) D13))
                         )
                         (entmake (list '(0 . "LWPOLYLINE")
                                 '(100 . "AcDbEntity")
                                 '(100 . "AcDbPolyline")
                                 (cons 6 LTYPE)
                                 (cons 8 LAYER)
                                 '(43 . 0)
                                 (cons 62 COLOR)
                                 '(90 . 4)
                                 (cons 10 P1)
                                 (cons 10 P2)
                                 (cons 10 P3)
                                 (cons 10 P4)
                                 '(70 . 1)                ;closed pline - must follow G.C. 10s
                                         )
                         )
         )                                        ;lwrect
         ;;Main program
         ;;if wipeout.arx is available
         (if (WIPEOUTP)
                         ;;proceed
                         (progn
                                         ;;save sysvars
                                         (setq CECHO         (getvar "CMDECHO")
                                 OLDLYR (getvar "CLAYER")
                                         )
                                         ;;start UNDO group
                                         (command "_.UNDO" "BEGIN")
                                         ;;setup a layer for WIPEOUTs
                                         (command "_.LAYER" "M" "WIPEOUTS" "")
                                         ;;loop until an MTEXT entity in a DIMENSION is selected
                                         (setq FLAG t)
                                         (while FLAG
        (setq ALIST (nentsel "\nSelect Dimension Text to Mask: ")
                                                 ENT                 (car ALIST)
                                                 OUTER (car (last ALIST))
        )
        (if (= "MTEXT" (cdr (assoc 0 (entget ENT))))
                 (setq FLAG NIL)
        )
                                         )                                        ;while
                                         ;;draw a LWPOLYLINE rectangle enclosing the MTEXT
                                         (BOXMTEXT ENT)
                                         ;;call command to draw the WIPEOUT using the preceding LWPOLYLINE
                                         (command "_.wipeout" "f" "off" "_.wipeout" "p" (entlast) "y")
                                         ;;now call draworder to bring the DIMENSION to the front
                                         ;;it would be nice if there is a better way, that doesn't force a regen
                                         ;;the only sure way I can think of is to delete the DIMENSION and remake it
                                         (command "_.draworder" OUTER "" "front") ;causes a regen
                                         ;;restore sysvars & end UNDO group
                                         (setvar "CLAYER" OLDLYR)
                                         (command "_.UNDO" "END")
                                         (setvar "CMDECHO" CECHO)
                         )                                        ;progn
                         (alert "Wipeouts Not Available.")
         )                                        ;if
         (princ)
)                                        ;C:MaskDimText
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-3-2 14:44:00 | 显示全部楼层
改进了一下,主要是我发现标注中的文本都是居中对齐的,不知道是不是都这样的。。。
  1. (defun c:test( / ent ent_dim ents pt_lst ang_txt height pt width dist ang pt_w1 pt_w2 pt_w3 pt_w4 os)
  2.    (setq os (getvar "osmode"))
  3.    (setq ent (nentsel))
  4.    (setq ent_dim (car (last ent)))
  5.    (setq ent (car ent))
  6.    (setq ents (entget ent))
  7.    (setq pt_lst (textbox (list (cons 0 "TEXT")
  8.                  (assoc 1 ents)
  9.                  (assoc 40 ents)
  10.       )
  11.                )
  12.    )
  13.    (setq ang_txt (cdr (assoc 50 ents)))
  14.    (setq pt (cdr (assoc 10 ents)))
  15.    (setq height (cdr (assoc 43 ents)))
  16.    (setq width (cdr (assoc 42 ents)))
  17.    (setq height (* height 1.2))
  18.    (setq width (* width 1.2))
  19.    (setq ang (atan (/ height width)))
  20.    (setq dist (/ (sqrt (+ (expt height 2) (expt width 2))) 2.0))
  21.    (setq pt_w1 (polar pt (- (+ ang_txt pi) ang) dist))
  22.    (setq pt_w2 (polar pt (+   ang_txt ang) dist))
  23.    (setq pt_w3 (polar pt (- ang_txt ang) dist))
  24.    (setq pt_w4 (polar pt (+ ang_txt pi ang) dist))
  25.    (setvar "osmode" 0)
  26.    (setvar "cmdecho" 0)
  27.    (command "_.wipeout" "f" "off")
  28.    (command "_.wipeout" pt_w1 pt_w2 pt_w3 pt_w4 "")
  29.    (entdel ent_dim)
  30.    (entdel ent_dim)
  31.    (setvar "osmode" os)
  32.    (princ)
  33. )
回复

使用道具 举报

39

主题

97

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
253
发表于 2004-3-2 15:44:00 | 显示全部楼层
谢谢,改进后的程序没有问题了。
回复

使用道具 举报

8

主题

28

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2004-9-28 11:16:00 | 显示全部楼层
其实并不是真正剪切,这个很好,
如果要恢复,要如何做?
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-8-20 08:48 , Processed in 1.469070 second(s), 76 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表