明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2169|回复: 6

MTEXT实体的entget返回表中的50组的旋转角怎么使用

[复制链接]
发表于 2003-7-15 21:46:00 | 显示全部楼层 |阅读模式
最近写了个文本处理的lsp程序, 但在处理MTEXT类的实体时发现用entget函数返回的列表中的50旋转角度组中的值随UCS的不同而改变, 而TEXT类的实体就是固定的, 是基于OCS的. 请教各位MTEXT的这个旋转角度是以什么坐标系统为基准的? 该怎么使用? 我的主要目的是想计算TEXT和MTEXT实体的几何中心点, 借由此点来简单地判断两个实体间的顺序关系.     谢谢!
发表于 2003-7-17 08:05:00 | 显示全部楼层
;;By 龙龙仔(LUCAS)
;;在TEXT和MTEXT实体的几何中心点画点
;;希望对你有用
(vl-load-com)
(defun C:TT (/ SS CENTPT N)
  (defun AX:GETBOUNDINGBOX (ENT / LL UR)
    (vla-getboundingbox (vlax-ename->vla-object ENT) 'LL 'UR)
    (MIDPOINT (vlax-safearray->list LL)
              (vlax-safearray->list UR)
    )
  )
  (defun MIDPOINT (PT1 PT2)
    (mapcar
      '(lambda (X Y)
         (* 0.5 (+ X Y))
       )
      PT1
      PT2
    )
  )
  (setq        SS (ssget '((0 . "text,mtext")))
        N  0
  )
  (command "_.ucs" "")
  (repeat (sslength SS)
    (setq CENTPT (trans (AX:GETBOUNDINGBOX (ssname SS N)) 1 0))
    (command "_.point" CENTPT)
    (setq N (1+ N))
  )
  (command "_.ucs" "p")
  (princ)
)
 楼主| 发表于 2003-7-17 08:57:00 | 显示全部楼层
谢谢 龙龙仔(LUCAS)  的回复!
不过可否不通过vlax类的函数来实现? 因为我们这里常用的是R14, 它缺省是没有这个东东的. 另外, Entity.GetBoundingBox 返回的点就是基于 WCS 的吧? 在你的代码中, 是不是可以不需要通过 trans 进行转换了? 因为已经将 UCS 置为 WCS 了.
还请多多指教, 再次表示谢意!
发表于 2003-7-18 08:06:00 | 显示全部楼层
;;说实在的不通过vlax类的函数,是很麻烦的
;;下列是一个在R14时期写的程序(文字加删除线)
;;光处理MTEXT在WCS中就快疯掉!
(defun C:MT (/            HOLDOSMODE          HOLDCLAYER        SS     TEXTM  TEXTM1
             M10    M40           M42          M43         M50        M71    PT1    PT2
             PT3    PT4           PT5          PT6         PT7        PT8    PT9    RT
             TB            DIST   DIST1  D         ANG
            )
  (command "_.UNDO" "BE")
  (setq HOLDOSMODE (getvar "OSMODE"))
  (setq HOLDCLAYER (getvar "CLAYER"))
  (setvar "OSMODE" 0)
  (if (= (tblsearch "LAYER" "DIM") NIL)
    (command "_.layer" "m"         "dim"           "c"             "cyan"
             ""               "lt"         "continuous"             ""
             ""
            )
  )
  (setvar "CLAYER" HOLDCLAYER)
  (while (= TEXTM1 NIL)
    (setq TEXTM1 (car (nentsel "\n请点选文字加删除线: ")))
    (if        (/= TEXTM1 NIL)
      (progn
        (setq TEXTM (entget TEXTM1))
        (if (and (/= "MTEXT" (cdr (assoc 0 TEXTM)))
                 (/= "TEXT" (cdr (assoc 0 TEXTM)))
            )
          (progn
            (setq TEXTM1 NIL)
            (prompt (strcat "\n点选物件为" (cdr (assoc 0 TEXTM))))
          )
        )
      )
    )
  )
  (cond
    ((= "MTEXT" (cdr (assoc 0 TEXTM)))
     (command "_.ucs" "W")
     (setq M10 (cdr (assoc 10 TEXTM)))
     (setq M40 (cdr (assoc 40 TEXTM)))
     (setq M42 (cdr (assoc 42 TEXTM)))
     (setq M43 (cdr (assoc 43 TEXTM)))
     (setq M50 (cdr (assoc 50 TEXTM)))
     (setq M71 (cdr (assoc 71 TEXTM)))
     (setq PT9 (list (+ (car M10) M42) (cadr M10) (caddr M10)))
     (setq PT3 (list (car PT9) (+ (cadr PT9) M43) (caddr PT9)))
     (setq PT1 (list (car M10) (+ (cadr M10) M43) (caddr M10)))
     (setq PT8 (list (+ (car M10) (/ M42 2)) (cadr M10) (caddr M10)))
     (setq PT4 (list (car M10) (+ (cadr M10) (/ M43 2)) (caddr M10)))
     (setq PT2 (list (+ (car M10) (/ M42 2))
                     (+ (cadr M10) M43)
                     (caddr M10)
               )
     )
     (setq PT6 (list (+ (car M10) M42)
                     (+ (cadr M10) (/ M43 2))
                     (caddr M10)
               )
     )
     (setq SS (ssadd))
     (setq ANG (angle M10 PT1))
     (setq M101 (polar M10 ANG (/ M40 3.0)))
     (setq PT91 (polar PT9 ANG (/ M40 3.0)))
     (command "_.LINE" M101 PT91 "")
     (ssadd (entlast) SS)
     (command "_.OFFSET" (/ M40 3.0) (entlast) M101 "")
     (ssadd (entlast) SS)
     (setq PT5 (inters M10 PT3 PT9 PT1))
     (cond
       ((= 1 M71) (command "._move" SS "" PT1 M10)) ;1 = Top left
       ((= 2 M71) (command "._move" SS "" PT2 M10)) ;2 = Top center
       ((= 3 M71) (command "._move" SS "" PT3 M10)) ;3 = Top right
       ((= 4 M71) (command "._move" SS "" PT4 M10)) ;4 = Middle left
       ((= 5 M71) (command "._move" SS "" PT5 M10)) ;5 = Middle center
       ((= 6 M71) (command "._move" SS "" PT6 M10)) ;6 = Middle right
;;;    ((= 7 M71) (command "._move" SS "" M10 M10)) ;7 = Bottom left
       ((= 8 M71) (command "._move" SS "" PT8 M10)) ;8 = Bottom center
       ((= 9 M71) (command "._move" SS "" PT9 M10)) ;9 = Bottom right
     )
     (command "_.ROTATE" SS "" M10 (/ (* 180 M50) pi))
     (command "_.CHANGE" SS "" "" "LA" "DIM" "C" 6 "")
     (setq DIST (* M40 1.66))
     (setq DIST1 (fix (/ M43 DIST)))
     (setq D 1)
     (repeat DIST1
       (command        "_.COPY"
                SS
                ""
                M10
                (polar M10 (+ M50 (/ pi 2)) (* DIST D))
       )
       (setq D (+ 1 D))
     )
     (command "_.ucs" "p")
    )
    ((= "TEXT" (cdr (assoc 0 TEXTM)))
     (command "_.ucs" "Object" TEXTM1)
     (setq TB (textbox (list (cons -1 TEXTM1))))
     (setq PT1 (car TB)
           PT2 (cadr TB)
           PT3 (list (car PT1) (cadr PT2))
           PT4 (list (car PT2) (cadr PT1))
     )
     (setq DIST (/ (distance PT1 PT3) 3.0))
     (setq ANG (angle PT1 PT3))
     (setq SS (ssadd))
     (command "_.LINE" PT1 PT4 "")
     (ssadd (entlast) SS)
     (command "_.MOVE"
              (entlast)
              ""
              "0,0"
              (polar '(0 0) ANG DIST)
     )
     (command "_.OFFSET" DIST (entlast) PT3 "")
     (ssadd (entlast) SS)
     (command "_.CHANGE" SS "" "" "LA" "DIM" "C" 6 "")
     (command "_.ucs" "p")
    )
  )
  (setvar "OSMODE" HOLDOSMODE)
  (command "_.UNDO" "END")
  (princ)
)


;;By 龙龙仔(LUCAS)
;;在TEXT和MTEXT实体的几何中心点画点
;;R14中BOUNS不知有否"ACETUTIL.ARX"(记不得了!)
;;如果没有则程序无效
(vl-load-com)
(arxload "ACETUTIL.ARX" NIL)
(defun C:TT (/ SS CENTPT N SS1)
  (defun AX:GETBOUNDINGBOX (ENT / BOUND)
    (setq BOUND (ACET-GEOM-SS-EXTENTS ENT t))
    (MIDPOINT (car BOUND)
              (cadr BOUND)
    )
  )
  (defun MIDPOINT (PT1 PT2)
    (mapcar
      '(lambda (X Y)
         (* 0.5 (+ X Y))
       )
      PT1
      PT2
    )
  )
  (setq        SS (ssget '((0 . "text,mtext")))
        N  0
  )
  (command "_.ucs" "")
  (repeat (sslength SS)
    (setq SS1 (ssadd))
    (ssadd (ssname SS N) SS1)
    (setq CENTPT (trans (AX:GETBOUNDINGBOX SS1) 1 0))
    (command "_.point" CENTPT)
    (setq N (1+ N))
  )
  (command "_.ucs" "p")
  (princ)
)
 楼主| 发表于 2003-7-18 09:09:00 | 显示全部楼层
不会意思给 龙龙仔(LUCAS) 添了这么多的麻烦!
不过我在R14中来看, 50组旋转角度在MTEXT实体平面平行于UCS时, 是基于UCS的, 不是基于WCS的; 但如果MTEXT实体面不平行于UCS的话, 就不明白它的含义了. 在实际使用中, 一般很少出现MTEXT不平行于UCS的情况, 作这样的考虑也仅仅是代码严谨性上的考虑.  所以, 看来还是对制图人员提出UCS上要求比较简单.

谢谢 龙龙仔(LUCAS) !
发表于 2012-11-20 23:04:53 | 显示全部楼层
ocs怎么用呀?
发表于 2012-11-21 09:56:50 | 显示全部楼层
学习学习  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-26 05:12 , Processed in 0.194763 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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