bingshuier 发表于 2014-8-13 01:30:30

钢筋文字替换的问题!!

主要是两个问题,一是在原文字上面改的话,就没反应,要复制一个出来才能改
                        二是复制出来的已经改了 想改原来的一个,但是却还是改到了复制的一个(defun c:17()
(func1 "1%%13212")
(func2)
)
(defun c:27()
(func1 "2%%13212")
(func2)
)
(defun c:37()
(func1 "3%%13212")
(func2)
)
(defun c:47()
(func1 "4%%13212")
(func2)
)
(defun func1(a / name pt1 list1 pt2 l pt_jd 1_old 1_new)
;;; =========文字的对齐改变 ==============================
(setvar "cmdecho" 0)
(setq name(entsel "\n选择文字:")
        pt1   (cadr name)
      list1 (entget (car name))
        pt2 (textbox list1);pt2是返回的矩形框的左下点和右上点的表
        l (caadr pt2)
        pt_jd (cdr (assoc 10 list1));jd基点
)
(if (> (distance pt_jd pt1) (/ l 2));判断基点到选择点与文字长度二分之一的比值
   (command "justifytext" (entlast) "" "r") ;需要在(entlast)后面加""才行
);endif


;;; =========文字的内容改变==============================
(setq list1 (entget (entlast));这句至关重要,因为前面的list1是左对齐的属性,现在要重新获取了
      1_old (assoc 1 list1)
        1_new (cons 1 a)
      list1 (subst 1_new 1_old list1)
);endsetq
(entmod list1)
(setvar "cmdecho" 1)
(princ)
);endfunc1
(defun func2();还原左对齐方式
(command "justifytext" (entlast) "" "l")
)

ZZXXQQ 发表于 2014-8-13 08:29:28

这样试试:(defun c:17() (func1 "1%%13212") (func2))
(defun c:27() (func1 "2%%13212") (func2))
(defun c:37() (func1 "3%%13212") (func2))
(defun c:47() (func1 "4%%13212") (func2))
(defun func1(a / name pt1 list1 pt2 l pt_jd 1_old 1_new)
;;; =========文字的对齐改变 ==============================
(setvar "cmdecho" 0)
(setq name(entsel "\n选择文字:")
      pt1   (cadr name)
      list1 (entget (car name))
      pt2 (textbox list1);pt2是返回的矩形框的左下点和右上点的表
      l (caadr pt2)
      pt_jd (cdr (assoc 10 list1));jd基点
)
(if (> (distance pt_jd pt1) (/ l 2)) (progn ;判断基点到选择点与文字长度二分之一的比值
   (command "justifytext" (car name) "" "r")
   (setq list1 (entget(entlast)));只有在改基点后才用
));endif

;;; =========文字的内容改变==============================
(entmod (subst (cons 1 a) (assoc 1 list1) list1))
(setvar "cmdecho" 1)
(princ)
);endfunc1
(defun func2();还原左对齐方式
(setvar "cmdecho" 0)
(command "justifytext" (entlast) "" "l")
(setvar "cmdecho" 1)
(princ)
)

朱正伟206 发表于 2014-8-13 20:40:01

本帖最后由 朱正伟206 于 2014-8-13 20:58 编辑

;;;;;;;;;;;替换文字内容修改对齐点;;;;;;;;;;;;;;;;;;;;
(defun tdq~1 (%k / &k1 &k2 @p1 #k1 %k1 @p2 L @p3 dis 1_old 1_new %k)
(setq &k1 (entsel "\n选择文字:"))
(if (/= &k1 nil)
(progn
   (setq @p1 (cadr &k1);选择点
         &k2 (car &k1);图元名
         #k1 (entget &k2);图元属性列表
         %k1 (cdr (assoc 0 #k1));图元属性
   )
   (if (/= (member %k1 (list "TEXT" "MTEXT")) nil);如果是文字或多行文字
    (progn
   (setq @p2 (textbox #k1);取得数值
         L (caadr @p2);取得文字长度
         @p3 (cdr (assoc 10 #k1));文字基点
         dis (distance @p1 @p3);选择点与基点距离
         1_old (assoc 1 #k1);旧文字内容
         1_new (cons 1 %k);新文字内容
         #k1 (subst 1_new 1_old #k1);替换
   )
   (entmod #k1);刷新文字
   (if (> dis (/ L 2))
      (command "justifytext" &k2 "" "r") ;如果符合条件那么右对齐
   )
   (if (<= dis (/ L 2))
      (command "justifytext" &k2 "" "L") ;如果符合条件左对齐
   )
    )
   )
   (if (= (member %k1 (list "TEXT" "MTEXT")) nil);如果选择的不是文字就不动作
    (setq &k1 nil)
   )
)
)
&k1
)
;;;;;;;;;;;;;;;
(defun C:sx9 ( / %k name)
(setvar "cmdecho" 0)
(setvar "blipmode" 0)
(if (null #1bszxmode) (setq #1bszxmode "E") );设置
(initget "E 1 2 3 4")
(setq %k (getkword (strcat "\n请选择方式:<" #1bszxmode ">")));选择一个方式命令多了,会忘记命令,综合一下
(if (= %k nil) (setq %k #1bszxmode));如果没有输入就默认
(if (= %k "e") (setq %k "E"));小写变大写
(setq #1bszxmode %k);修改设置
(if (/= %k "E");如果动作了就决定内容
(progn
   (setq %k (strcat #1bszxmode "%%13212"))
   (setq name t)
   (while name (setq name (tdq~1 %k)) );循环选择到结束
)
)
(princ)
)

朱正伟206 发表于 2014-8-13 20:40:47

本帖最后由 朱正伟206 于 2014-8-14 05:17 编辑

主要(entlast)不对,使用了(princ (entget (entlast)));查看属性列表,结果发现,不是这个字。
页: [1]
查看完整版本: 钢筋文字替换的问题!!