明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1785|回复: 9

有关TEXT命令的问题,请帮忙!

[复制链接]
发表于 2003-11-9 22:15:00 | 显示全部楼层 |阅读模式
为线(直线或多段线的一段)加上标注,遍了一段程序,如下:
(defun C:ADDNOTE (/ osvar start end middle rotate insert text)
  (setq osvar (getvar "osmode"))
  (setvar "osmode" 1)
  (setq start (getpoint "\n选取第1个点,"))
  (setq end (getpoint start " 选取第2个点"))
  (setq middle (list (+ (car start) (/ (- (car end) (car start)) 2))
                     (+ (cadr start) (/ (- (cadr end) (cadr start)) 2))
                     0
               )
  )
  (setq rotate (angle start end))
  (setq insert (polar middle (+ rotate (angtof "90")) 5))
  (setvar "osmode" 0)
  (command "text" insert 5 (angtos rotate) "note")
  (setq text (entget (entlast)))
  (setq text (subst (cons 72 1) (assoc 72 text) text))
  (setq text (subst (cons 73 1) (assoc 73 text) text))
  (entmod text)
  (setvar "osmode" osvar)
)
可是,标注“note”字符串跑到坐标系原点去了,是程序出错?还是什么问题?在2000、2004都试过,没辙了,请高手帮忙看看!
发表于 2003-11-10 08:16:00 | 显示全部楼层
我改了但是不知道对不对

(defun C:ADDNOTE (/ osvar start end middle rotate insert text)
  (setq osvar (getvar "osmode"))
  (setvar "osmode" 1)
  (setq start (getpoint "\n选取第1个点,"))
  (setq end (getpoint start " 选取第2个点"))
  (setq middle (list (+ (car start) (/ (- (car end) (car start)) 2))
                     (+ (cadr start) (/ (- (cadr end) (cadr start)) 2))
                     0
               )
  )
  (setq rotate (* (/ (angle start end) pi) 180))
  (setq insert (polar middle (+ (angle start end) pi) 5))
  (setvar "osmode" 0)
  (command "text" insert "5" (* (/ (angle start end) pi) 180) "note")
  (setvar "osmode" osvar)
)
发表于 2003-11-10 08:23:00 | 显示全部楼层
你的程序好象沒有出錯. 但可能在
(setq text (subst (cons 72 1) (assoc 72 text) text))
  (setq text (subst (cons 73 1) (assoc 73 text) text))
  (entmod text)
這三句的問題吧. 請教樓主這三句是用來做什麼作用的?
 楼主| 发表于 2003-11-10 09:34:00 | 显示全部楼层
谢谢各位!
TO BDYCAD:
  (setq text (subst (cons 72 1) (assoc 72 text) text)) ; 水平居中
  (setq text (subst (cons 73 1) (assoc 73 text) text)) ; 垂直居中
  (entmod text)                                                     ; 更新TEXT的DEFINITION TABLE
发表于 2003-11-10 09:41:00 | 显示全部楼层
那這三句不要可以的, 呵呵 : )
 楼主| 发表于 2003-11-10 11:18:00 | 显示全部楼层
要那三句是为了改变标注字符串的对齐方式。
也确实是那三句出了问题,但语法上没问题。
联想起我曾经报告过的用VBA做“OFFSET”会使原多段线跑到坐标系原点,推断可能也是出了BUG。
现在没办法,只好先绕过去,办法如下:
(defun C:ADDNOTE (/ osvar start end middle rotate insert text)
  (setq osvar (getvar "osmode"))
  (setvar "osmode" 1)
  (setq start (getpoint "\n选取第1个点,"))
  (setq end (getpoint start " 选取第2个点"))
  (setq middle (list (+ (car start) (/ (- (car end) (car start)) 2))
                     (+ (cadr start) (/ (- (cadr end) (cadr start)) 2))
                     0
               )
  )
  (setq rotate (angle start end))
  (setq insert (polar middle (+ rotate (angtof "90")) 5))
  (setvar "osmode" 0)
  (command "TEXT" "J" "BC" insert 5 (angtos rotate) "note")
  (setvar "osmode" osvar)
)
发表于 2003-11-10 11:49:00 | 显示全部楼层
你用了对齐方式,却没有设置对二对齐点,这样试试:

  1. (defun C:ADDNOTE (/ osvar start end middle rotate insert text pt pte)
  2.   (setq osvar (getvar "osmode"))
  3.   (setvar "osmode" 1)
  4.   (setq start (getpoint "\n选取第1个点,"))
  5.   (setq end (getpoint start " 选取第2个点"))
  6.   (setq middle (list (+ (car start) (/ (- (car end) (car start)) 2))
  7.                      (+ (cadr start) (/ (- (cadr end) (cadr start)) 2))
  8.                      0
  9.                )
  10.   )
  11.   (setq rotate (angle start end))
  12.   (setq insert (polar middle (+ rotate (angtof "90")) 5))
  13.   (setvar "osmode" 0)
  14.   (command "text" insert 5 (angtos rotate) "note")
  15.   (setq text (entget (entlast)))
  16.   (setq pt (cdr (assoc 10 text)))
  17.   (setq pte (polar pt rotate (cdr (assoc 41 text))))
  18.   (setq text (subst (cons 11 pte) (assoc 11 text) text))
  19.   (setq text (subst (cons 72 1) (assoc 72 text) text))
  20.   (setq text (subst (cons 73 1) (assoc 73 text) text))
  21.   (entmod text)
  22.   (setvar "osmode" osvar)
  23.   (princ)
  24. )

 楼主| 发表于 2003-11-10 11:57:00 | 显示全部楼层
我也怀疑是因为没设置“对齐点”,可是对“对齐点”不了解,也试了,没成功,所以想到绕过去,不过绕过去的办法也很简单哦,至少省了7条语句!
谢谢meflying!
结论是:不出错,学不到基本的东西!不交流,学不到真正的东西!
发表于 2003-11-10 12:10:00 | 显示全部楼层
其实可以用entmake建立TEXT对象,那样比较好些:

  1. (defun C:ADDNOTE (/ start end middle rotate insert)
  2.   (setq start (getpoint "\n选取第1个点,"))
  3.   (setq end (getpoint start " 选取第2个点"))
  4.   (setq middle (list (+ (car start) (/ (- (car end) (car start)) 2))
  5.                      (+ (cadr start) (/ (- (cadr end) (cadr start)) 2))
  6.                      0
  7.                )
  8.   )
  9.   (setq rotate (angle start end))
  10.   (setq insert (polar middle (+ rotate (angtof "90")) 5))

  11.   (entmake (list '(0 . "TEXT") '(100 . "AcDbEntity")
  12.                  '(67 . 0) '(410 . "Model") '(100 . "AcDbText")
  13.                  (cons 10 insert)
  14.                  '(40 . 5.0)
  15.                  '(1 . "note")
  16.                  (cons 50 rotate)
  17.                  '(41 . 1.0) '(51 . 0.0) '(71 . 0) '(72 . 1)
  18.                  (cons 11 (polar Insert rotate 5)) '(210 0.0 0.0 1.0) '(100 . "AcDbText") '(73 . 1))
  19.   )
  20.   (princ)
  21. )
 楼主| 发表于 2003-11-10 17:58:00 | 显示全部楼层
非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-2 12:26 , Processed in 0.182518 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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