百度空间 | 百度首页 
 
查看文章
 
一个指定文字替换的lsp及注释
2009-06-24 14:38

(defun C:33(/ p l n e os as ns st s nsl osl sl si chf chm olderr)
(prompt "新文字替换旧文字\n");prompt将显示""内字符串内容在绘图屏幕的命令提示区上,同时返回nil.

(setq olderr *error* ;初始化变量,setq为赋值函数
*error* aaa)
(setq chm 0);设置chm初始值为0
(setq p (ssget)) ;选择对象,ssget为建立一个选择集

(if p (progn ;if函数的作用:如果有对象被选中,就是说p的值不为nil而为T则进入progn函数下的表达式
(while (= 0 (setq osl (strlen (setq os "旧文字" ))));此行为while语句的判断式,os是字符串,strlen函数的作用是返回字符串的长度(整数型),故osl是一个整数.然后while进行判断,就是判断osl是否等于0.
(princ "Null input inalid");如果osl等于0,就执行该函数,就是给出输入有误的提示.
);往上至(while为while函数的一个完整句子,整体是上述progn的第一个表达式.由于要求替换内容内定,故此表达式实为多次一举,毫无意义.可以去除.
(setq nsl (strlen (setq ns "新文字" )));该行是progn的第二个表达式.ns为字符串,nsl为整数.
(setq l 0 n (sslength p));该行是progn的第三个表达式.将l的初始值设为0,将选择集p中图元数目的整型数赋值给n.

(while (< l n);开始第四个表达式,又是一个while语句.先对l和n的大小进行判断,如果l小于n,则开始下一句.

(if (= "TEXT" (cdr (assoc 0 (setq e (entget (ssname p l))))));ssname函数的作用是将选择集p中第l(不是阿拉伯数字1,而是英文字母l)个图元的名字.由于选择集中第一个图元的索引是0,故前面定义l的时候,初始值是0.entget将包含定义第l个图元的数据列表,然后通过setq指定给e.所以e的内容是一个数据表.assoc函数是提取e表中群码0所对应的值,注意群码0所对应的是图元类别,比如是"circle",或者是"line",或者是"text"等等,但是其内容为(0 . "circle")、(0 . "line")、(0 . "Text")等.cdr的作用就是提取出"line"或"text".所以此行if后的内容就是一个判断式,判断第l个图元是否是文字.如果是的话执行后面的表达式.不要忘了,这些内容都是前面一个progn第四个表达式的组成部分.

(progn;又开始用progn执行一系列表达式.

(setq chf nil si 1);设定chf初始值为空,si初始值为1.第四个表达式里面的第一个表达式.

(setq s (cdr (setq as (assoc 1 e))));第四个表达式里面的第二个表达式.调出文字内容串.群码1对应的是文字内容.进行赋值后,s的值就是纯粹的文字内容字符串.

(while (= osl (setq sl (strlen(setq st (substr s si osl)))));第四个表达式里面的第三个表达式.si是1,osl是需要替换的文本内容的长度,例如"旧文字"三个字的长度为3,此处osl的值就是3,是一个整数.substr就是在s字符串里获取某一个字或某几个字,此处是三个字,从si处开始,当si为1时,就是从第一个字符开始.st就是选出来的子字符串,sl就是这个子字符串的长度.当sl和osl相同时,就执行下一个语句.(如果sl和osl不同,只能是到了字符串末了.)
(if (= st os);对st和os进行判断,如果相等的话,进行下一句.os是我们需要替换的文字内容"旧文字",而st是我们在一大堆文字里提取出来的三个字长的字符串"XXX".
(progn;又开始用progn执行一系列表达式.
(setq s (strcat (substr s 1 (1- si)) ns (substr s (+ si osl))));第四个表达式里面的第三个表达式里面的第一个表达式.
;(+ si osl)的值就是si和osl相加.
;(substr s (+ si osl))的作用是从s中提取子字符串,此处提取的是从第"si+osl"个开始往后的所有字符.(就是"旧文字"三字往后的所有字符).
;(substr s 1 (1- si))的作用是从s中提取第1个开始往后"si-1"个字符.(就是"旧文字"三字往前的所有字符).ns是"新文字".substr的作用是将几个字符串合成,合成后的字符串依然命名为s.该行是整个函数的核心语句.
(setq chf t) ;chf为真,说明实现了替换.第四个表达式里面的第三个表达式里面的第二个表达式.
(setq si (+ si nsl));si的值加上nsl.因为进行了一次替换之后,下次就得从替换后文字的后一个字符开始提取子字符串.第四个表达式里面的第三个表达式里面的第三个表达式.
);第三层表达式结束.
(setq si (1+ si));(= st os)判断式为否时执行的语句.
);(= st os)判断式完全结束.
);第四个表达式里面的第三个表达式完全结束.

(if chf (progn ;第四个表达式里面的第四个表达式开始.如果chf为真,则执行下面的表达式.
(setq e (subst (cons 1 s) as e)) ;第四个表达式里面的第四个表达式里面的第一个表达式.此行里的1是群码1,s是一个字符串就是替换过一次后的文本内容.利用cons将其构成新表,cons函数的功能和前面assoc函数的功能刚好相反.该行的作用是重新定义形成包含替换后文本所有信息的数据表e.
(entmod e) ; 更新数据库.第四个表达式里面的第四个表达式里面的第二个表达式.
(setq chm (1+ chm)) ;第四个表达式里面的第四个表达式里面的第三个表达式.
));第四个表达式里面的第四个表达式结束.
));if(= "TEXT")判断式结束.
(setq l (1+ l))
);while(< l n)判断式结束.
));(if p的判断式结束.

(princ "替换了 ")
(princ chm)
(princ " 处文字.")
(terpri)
(setq *error* olderr)
(
princ)
)

ps

显得很啰嗦。不过作为入门教程还不错。


类别:·结构设计相关· | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu