明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1038|回复: 1

[提问] 程序改后不稳定,求助

[复制链接]
发表于 2014-4-28 10:16:36 | 显示全部楼层 |阅读模式
下面是一个对齐表格的程序,我想在左对齐的时候,在文字全面加一空格,目的是让文字离开左边线一点。多数都可以,但有时侯会有某几处的没有加上空格,然后把他重新对中再对左,又可以了。请大师们帮看看哪里出问题了?或者要怎么改进一下?

;对象左中/正中对齐于容器框格 yrgui QQ:1420428782 http://bbs.mjtd.com/thread-85506-1-1.html
(defun c:xaa(/ sSet key ola n ename e box)
(setvar"clayer" "0")
  (vl-load-com)
  (setvar "cmdecho" 0)
  (princ "\n选择要对齐的对象:")
  (setq sset (ssget ":S" '((0 . "*TEXT"))) i  0 )

(princ"\n左键 左中,右键 正中")
(setq gouzaoxian (grread))
(cond
((=(car gouzaoxian)3)  (setq key "A") (c:sc_kg) (c:tj_kg)) ;左键3
((=(car gouzaoxian)25) (setq key "X") (c:sc_kg))          ;右键25
)

;  (initget "X A")
;  (setq key (getkword "\n文本对齐于 [正中(X)/左中(A)]:<X>"))
;  (if (not key) (setq key "X"))

  (setq n 0)
  (setq ola (getvar "clayer"))
  ;生成临时图层,
  ;因为boundary会产生不可预料的对象,
  ;放在临时图层最后一起删掉
(command "undo" "be")
(vl-cmdf "layer" "M" "居中" "c" "1" "" "lw" "1" "" "l" "Continuous" "" "p" "n" "" "")
(setq la (getvar"clayer"))

  (repeat (setq m (sslength sSet))
    (princ (strcat "\n已完成" (itoa (1+ n)) "/" (itoa m) ",请稍候……"))
    (setq ename (ssname sSet n))
    (setq e (vlax-ename->vla-object ename))
    (vl-cmdf "boundary" "a" "o" "p" "" (getmcp e) "")
    (setq box (entlast))
    (if (= "TEXT" (cdr (assoc 0 (entget ename)))) ;单行文字
      (progn                           
        (if (= key "A")
          (progn
            (vlax-put-property e 'Alignment acAlignmentMiddleLeft)
            (vla-move e (vlax-3d-point (getmlp e)) (vlax-3d-point (getmlp box)))
          )
        )

        (if (= key "X")
          (progn                     
            (vlax-put-property e 'Alignment acAlignmentMiddleCenter)
            (vla-move e (vlax-3d-point (getmcp e)) (vlax-3d-point (getmcp box)))
          )
        )                           
      )
    );(if (= "TEXT"
    (if (= "MTEXT" (cdr (assoc 0 (entget ename))))  ;多行文字
      (progn                           
        (vlax-put-property e 'Width 0)
        (if (= key "A")
          (progn                     
            (vlax-put-property e 'AttachmentPoint acAttachmentPointMiddleLeft)
            (vla-move e (vlax-3d-point (getmlp e)) (vlax-3d-point (getmlp box)))
          )
        )
        (if (= key "X")
          (progn                     
            (vlax-put-property e 'AttachmentPoint acAttachmentPointMiddleCenter)
            (vla-move e (vlax-3d-point (getmcp e)) (vlax-3d-point (getmcp box)))
          )
        )                           
      )                             
    );(if (= "MTEXT"                             
    (entdel box)
    (setq n (1+ n))
  ) ;(repeat (setq m                                
  (setvar "clayer" ola)
  (vl-cmdf "laydel" "N" "居中" "" "Y")
  (princ "\n\n操作完成,谢谢使用")
  (princ "\n问题反馈:yrgui@yahoo.cn")
  (setvar "cmdecho" 1)
(command "undo" "e")
  (princ)
);(defun c:TextAlign         

;;功能:通获取对象左中点
(defun getmlp (e / p1 p2 x1 y1 z1 x2 y2 z2 plist)
  (if (= (type e) 'ename)
    (setq e (vlax-ename->vla-object e))
  )
  (vla-getboundingbox e 'p1 'p2)
  (setq p1 (vlax-safearray->list p1))
  (setq p2 (vlax-safearray->list p2))
  (setq x1 (car p1)
        y1 (cadr p1)
        z1 (caddr p1)
  )
  (setq x2 (car p2)
        y2 (cadr p2)
        z2 (caddr p2)
  )
  (setq plist (list x1 (/ (+ y1 y2) 2.0) (/ (+ z1 z2) 2.0)))
)

;;功能:获取对象正中点
(defun getmcp (e / p1 p2 x1 y1 z1 x2 y2 z2 plist)
  (if (= (type e) 'ename)
    (setq e (vlax-ename->vla-object e))
  )
  (vla-getboundingbox e 'p1 'p2)
  (setq p1 (vlax-safearray->list p1))
  (setq p2 (vlax-safearray->list p2))
  (setq x1 (car p1)
        y1 (cadr p1)
        z1 (caddr p1)
  )
  (setq x2 (car p2)
        y2 (cadr p2)
        z2 (caddr p2)
  )
  (setq plist (list (/ (+ x1 x2) 2.0) (/ (+ y1 y2) 2.0) (/ (+ z1 z2) 2.0)))
)
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2014-4-28 11:17:34 | 显示全部楼层
补上

(defun c:sc_kg();删除空格 ZZXXQQ http://bbs.mjtd.com/forum.php?mod=viewthread&tid=99165
;(PRINC "\Select Text(s) 选择文字 :")
(IF (SETQ SS (SSGET "p"'((1 . "* *")))) (PROGN
  (SETQ I -1)
  (REPEAT (SSLENGTH SS)
   (SETQ ENT (ENTGET (SSNAME SS (SETQ I (1+ I))))
  AA (CDR (ASSOC 1 ENT))
  CC ""
  J 0)
   (REPEAT (STRLEN AA)
    (IF (/= (SETQ TMP (SUBSTR AA (SETQ J (1+ J)) 1)) " ")
     (SETQ CC (STRCAT CC TMP))
    )
   )
   (SETQ ENT (SUBST (CONS 1 CC) (ASSOC 1 ENT) ENT))
   (ENTMOD ENT)
  )
))
(PRINC))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:tj_kg();添加空格 Andyhon 2012-6-28 http://bbs.mjtd.com/forum.php?mod=viewthread&tid=95041
  (setq ss (ssget "p") ;;;;;;;;;;;;;;;;;;;;;;;; (setq ss (ssget "X" '((0 . "*TEXT") (1 . "*yz")))
        i  0
  )
  (while (setq ee (ssname ss i))
    (setq obj (vlax-ename->vla-object ee)
          txt (vla-get-textstring obj)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; txt (vl-string-subst "" " " txt)删后缀
          i   (1+ i)
    )
    (vla-put-textstring obj (strcat " " txt))加前缀
  )
(PRINC))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-24 22:14 , Processed in 0.178380 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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