- UID
- 28463
- 积分
- 778
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-2-9
- 最后登录
- 1970-1-1
|
发表于 2005-1-27 12:54:13
|
显示全部楼层
本来是想修改它山之石的程序作为己用,研究了很久但没看懂,自己试着编了一个。
1、支持UCS。
2、可修改TEXT和ATTRIB。
3、支持%%*。
4、支持上下标,但要固定,本例中%%151上标开始,%%152上标结束,
%%153下标开始,%%154下标结束,不同的字体修改相应源程序即可。
5、支持汉字及双字节字符。
6、不支持加圈字符。
7、不支持TEXTSTYLE中的upside down,backwards,vertical,oblique angles。
8、使用了vl-remove函数,R14不能用。
9、以亮显方式显示修改字符。
10、有一个很多程序都有的问题,如果程序被强行中断,不能去处新生成的实体。
11、原本是想可以支持框选,但是如果框选的起末点是空格的话,还没想好怎样处理。
wkai版主的程序不知道是怎样考虑这个问题的,希望赐教。
(defun c:ppp (/ obj obj-name pt-select dxfdata text-value-old dxfdata-2 obj-2 dxfdata-3
list-whichchar-charlen-xy-supersubscript which-char-main char-len-main
xy-mian super-sub-script-main newstr text-value-new
layer iflock dxflayer dxflayer2)
(command "undo" "be")
(if (setq obj (nentsel "\npick a char to modify / <exit>:")) ;if0
(progn;0
(setq obj-name (car obj) pt-select (cadr obj))
(setq pt-select (trans pt-select 1 0))
(setq dxfdata (entget obj-name))
(setq text-value-old (cdr (assoc 1 dxfdata)))
(if (wcmatch (cdr (assoc 0 dxfdata)) "TEXT,ATTRIB");if1
(progn;1
(setq dxfdata-2 dxfdata)
(if (= "TEXT" (cdr (assoc 0 dxfdata-2)))
(progn
(if (= 4 (cdr (assoc 70 (tblsearch "layer" (cdr (assoc 8 dxfdata))))))
(progn (alert "object is on a locked layer !")(exit)))
(entmake dxfdata-2)
);progn
);if
(if (= "ATTRIB" (cdr (assoc 0 dxfdata-2)))
(progn
(if (= 4 (cdr (assoc 70 (tblsearch "layer" (cdr (assoc 8 (entget (cdr (assoc 330 dxfdata)))))))))
(progn (alert "object is on a locked layer !")(exit)))
(setq dxfdata-2 (subst (cons 0 "TEXT") (assoc 0 dxfdata-2) dxfdata-2))
(setq dxfdata-2 (vl-remove (assoc 2 dxfdata-2) dxfdata-2))
(setq dxfdata-2 (vl-remove (assoc 70 dxfdata-2) dxfdata-2))
(setq dxfdata-2 (vl-remove (assoc 74 dxfdata-2) dxfdata-2))
(entmake dxfdata-2)
)
);if
(setq obj-2 (entlast))
(setq dxfdata-3 (entget obj-2))
(setq dxfdata-3 (subst (cons 72 2) (assoc 72 dxfdata-3) dxfdata-3))
(setq dxfdata-3 (subst (cons 73 0) (assoc 73 dxfdata-3) dxfdata-3))
(setq list-whichchar-charlen-xy-supersubscript (get-whichchar-charlen-xy-supersubscript pt-select dxfdata-3))
(setq which-char-main (car list-whichchar-charlen-xy-supersubscript))
(setq char-len-main (cadr list-whichchar-charlen-xy-supersubscript))
(setq xy-main (caddr list-whichchar-charlen-xy-supersubscript))
(setq super-sub-script-main (cadddr list-whichchar-charlen-xy-supersubscript))
(setq dxfdata-3 (subst (cons 11 xy-main) (assoc 11 dxfdata-3) dxfdata-3))
(setq dxfdata-3 (subst (cons 1 (strcat super-sub-script-main
(substr text-value-old (+ 1 (- which-char-main char-len-main)) char-len-main)))
(assoc 1 dxfdata-3) dxfdata-3))
(entmod dxfdata-3)
(redraw (cdr (assoc -1 dxfdata-3)) 3)
(setq newstr (getstring (strcat "\nenter to remove / ["
(substr (cdr (assoc 1 dxfdata))
(+ 1 (- which-char-main char-len-main))
char-len-main)
"]:"))
);setq k
(setq text-value-new (strcat (substr text-value-old 1 (- which-char-main char-len-main))
newstr
(substr text-value-old (+ 1 which-char-main))
));setq text-value
(setq dxfdata (subst (cons 1 text-value-new) (assoc 1 dxfdata) dxfdata))
(if (= "TEXT" (cdr (assoc 0 dxfdata)))
(entmake dxfdata)
);if
(if (= "ATTRIB" (cdr (assoc 0 dxfdata)))
(progn
(setq layer (cdr (assoc 8 dxfdata)))
(setq iflock 0)
(if (= 4 (cdr (assoc 70 (tblsearch "layer" layer))))
(progn
(setq iflock 1)
(setq dxflayer (entget (tblobjname "layer" layer)))
(setq dxflayer2 dxflayer)
(setq dxflayer (subst (cons 70 0) (assoc 70 dxflayer) dxflayer))
(entmod dxflayer)
)
)
(entmod dxfdata)
(entupd (cdr (assoc 330 dxfdata)))
);progn
);if
(entdel (cdr (assoc -1 dxfdata-2)))
(entdel (cdr (assoc -1 dxfdata-3)))
(if (= 1 iflock)(entmod dxflayer2))
);progn1
(alert "\nselected object is not a TEXT or a ATTRIB !")
);if1
);progn0
(princ "\nno object is selected !")
);if0
(command "undo" "end")
(princ)
);defun
(defun get-whichchar-charlen-xy-supersubscript (pt-select-sub dxfdata-sub
/ pt-left text-angle text-value loop which-char char-len box-1 box-2 str-wid
pt-dummy-1 pt-dummy-2 pt-dummy dist wid-from-left-to-right box super-sub-script)
(setq pt-left (cdr (assoc 10 dxfdata-sub)))
(setq text-angle (cdr (assoc 50 dxfdata-sub)))
(setq text-value (cdr (assoc 1 dxfdata-sub)))
(setq which-char 0)
(setq loop t)
(setq super-sub-script "")
(setq pt-dummy-1 (polar pt-left text-angle 100.0))
(setq pt-dummy-2 (polar pt-select-sub (+ (/ pi 2.0) text-angle) 100.0))
(setq pt-dummy (inters pt-left pt-dummy-1 pt-select-sub pt-dummy-2 nil))
(setq dist (distance pt-left pt-dummy))
(while loop
(setq char-len 1)
(if (wcmatch (substr text-value (+ 1 which-char) 5) "%%*");if1
(if (wcmatch (substr text-value (+ 1 which-char) 5) "%%[0-9][0-9][0-9]")
(setq char-len 5)
(if (wcmatch (substr text-value (+ 1 which-char) 5) "%%[0-9][0-9][~0-9]")
(setq char-len 4)
(if (and (wcmatch (substr text-value (+ 1 which-char) 5) "%%[0-9][0-9]")
(= 4 (strlen (substr text-value (+ 1 which-char) 5))))
(setq char-len 4)
(setq char-len 3)
)
)
)
);if1
;%%151--start of superscript
;%%152--end of superscript
;%%153--start of subscript
;%%154--end of subscript
;%%155--start of subscript
;%%156--end of subscript
(if (wcmatch (substr text-value (+ 1 which-char) 5) "%%151,%%152,%%153,%%154,%%155,%%156")
(setq super-sub-script (strcat super-sub-script (substr text-value (+ 1 which-char) 5))))
(if (> (ascii (substr text-value (+ 1 which-char) 1)) 159);if2
(setq char-len 2)
);if2
(setq which-char (+ which-char char-len))
(setq box-1 (textbox (subst (cons 1 (strcat "A" (substr text-value 1 which-char)))
(assoc 1 dxfdata-sub) dxfdata-sub)))
(setq box-2 (textbox (subst (cons 1 "A") (assoc 1 dxfdata-sub) dxfdata-sub)))
(setq str-wid (abs (- (- (car (car box-1)) (car (cadr box-1)))
(- (car (car box-2)) (car (cadr box-2))))))
(setq box (textbox (subst (cons 1 (substr text-value 1 which-char))
(assoc 1 dxfdata-sub) dxfdata-sub)))
(setq wid-from-left-to-right (car (cadr box)))
(if (> str-wid dist)(setq loop nil))
);while
(list which-char char-len (polar pt-left text-angle wid-from-left-to-right) super-sub-script)
);defun-sub |
|