[求助]如何提取比如“"P1-60"”中的60和“P1-”
<p>在CAD中因为要给没个地形图命名,而且还是累加的,比如“"P1-60"”、"P1-61"、"P1-62""P1-63",怎们自动完成这些标注的自动累加。</p><p>如果是单个的数字比如60、61、62我可以实现,现在的问题是没法实现提取其中的数字和字母,请问用什么函数可以完成这个功能。</p><p>下面是我自动完成数据相加的程序:</p><p>(defun c:copm() ;多重复制加数<br/> (setq di(getint"输入间距:"))<br/> (setq ss(entsel"选择要排列的数"));选择物体,提取联合属性列表<br/> (setq en(car ss))<br/> (setq endata(entget en))<br/> <br/> (setq oldh(cdr(assoc 40 endata)));提取字高<br/> (setq olda(cdr(assoc 50 endata)));提取角度<br/> (setq oldtt(atof(angtos olda)));把弧度变为度<br/> <br/> (setq oldt(cdr(assoc 1 endata)));提取标注,<br/> (setq oldti(atoi oldt));标注负值<br/> (setq newt(+ oldti di)) </p><p> (setq pa(getpoint "\n标注位置:"))<br/> (command "text" pa oldh oldtt newt)<br/> </p><p> (while<br/> (setq ens(entlast))<br/> <br/> (setq entdata(entget ens))<br/> (setq oldct(cdr(assoc 10 entdata)))<br/> (setq oldht(cdr(assoc 40 entdata)))<br/> (setq oldat(cdr(assoc 50 entdata)))<br/> (setq oldatt(atof(angtos oldat)))</p><p> (setq oldtt(cdr(assoc 1 entdata)))<br/> (setq oldtit(atoi oldtt))<br/> (setq newtt(+ oldtit di))<br/> (setq pat(getpoint))<br/> (command "text" pat oldht oldatt newtt)<br/> <br/> <br/> )<br/> )</p><p></p><p></p> <p>这个是我以前做的一个程序,下面我用红色标出的部分,应该你能用到</p><p>就是先找到“-”的位置,然后提出"-"前面的前缀和"-"后面的数字</p><p>运算之后,把运算完的数跟前缀用strcat连在一起就行了</p><p>由于比较忙,不能修改程序了,你参考一下吧</p><p></p><p></p><p>;;;子程序<br/>(defun c:gf()<br/>(setq bc (getint "\n 请输入步长:"))<br/>)</p><p></p><p>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br/>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br/>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br/>;;;子程序 (中间有横杠,取后面的数字更改)</p><p>(defun ddjq()<br/>(setq shuzi (substr wenzi (+ 2 gang)))<br/>(setq shishu (atoi shuzi)) ;把数字改为实数<br/>(setq qianzhui (substr wenzi 1 (+ 1 gang)))<br/>(if (= lll "<")<br/>(progn<br/>(setq b (+ shishu bc nn)) ;<br/>(setq c (itoa b)) ;<br/>(setq d (strcat qianzhui c ">")) ;<br/>(setq e (cons 1 d)) ;<br/>(setq ddd (subst e wenzizu ddd)) ;<br/>(entmod ddd) ;<br/>(princ) ;<br/>) ;end progn ;<br/> <br/>(progn<br/>(setq b (+ shishu bc nn)) ;<br/>(setq c (itoa b)) ;<br/>(setq d (strcat qianzhui c)) ;<br/>(setq e (cons 1 d)) ;<br/>(setq ddd (subst e wenzizu ddd)) ;<br/>(entmod ddd) ;<br/>(princ) ;<br/>) ;end progn ;</p><p><br/>) ;end if<br/>) ;end defun</p><p>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br/>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br/>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br/>(defun c:gg()<br/>(prompt "\n 设置步长命令为:gf,初始步长为1")<br/>(if (= bc nil)<br/>(setq bc 1)<br/>)<br/>(setq a (ssget))<br/>(setq len (sslength a)) ;取得对象的个数<br/>(setq n 0)<br/>(setq nn 0)<br/>(command "undo" "begin")<br/>(repeat len<br/>(setq ent (ssname a n)) ;取得实体的名称<br/>(setq ddd (entget ent)) ;得到实体的联合列表</p><p>(setq djq (cdr (assoc 0 ddd)))</p><p>(if (or (= djq "MTEXT") (= djq "TEXT"))</p><p>(dkdk)</p><p>) ;end if</p><p>(setq n (+ 1 n))</p><p>) ;end repeat</p><p>(setq nn (+ nn bc)) <br/>(command "undo" "end")<br/>)</p><p></p><p><br/>;;;子程序</p><p>(defun dkdk()<br/>(setq wenzizu (assoc 1 ddd)) ;取出字的内容(群码为1)<br/>(setq wenzi (cdr wenzizu)) ;文字<br/><font color="#ff0000">(setq gang (vl-string-search "-" wenzi))</font></p><p><font color="#ff0000">(setq wenzilen (strlen wenzi))<br/>(setq fanyihou (vl-string-translate "1234567890" "##########" wenzi)) ;翻译字符</font></p><p><font color="#ff0000">(setq weizhi (vl-string-search "#" fanyihou)) ;找出#的位置</font></p><p><font color="#ff0000">(setq qianzhui (substr wenzi 1 weizhi)) ;取出前缀<br/>(setq shuzi (substr wenzi (+ weizhi 1))) ;取出字符串形式的数字<br/>(setq shishu (atoi shuzi)) ;把数字改为实数</font><br/>(setq lll (substr wenzi 1 1)) ;判断第一个字符是什么</p><p>(if (= gang nil)<br/>(progn</p><p><br/>(cond </p><p></p><p>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br/>((= lll "<") ; <br/>(progn ;<br/>(setq b (+ shishu bc nn)) ;<br/>(setq c (itoa b)) ;<br/>(setq d (strcat qianzhui c ">")) ;<br/>(setq e (cons 1 d)) ;<br/>(setq ddd (subst e wenzizu ddd)) ;<br/>(entmod ddd) ;<br/>(princ) ;<br/>) ;end progn ;<br/>) ;end first ;<br/> ;<br/>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</p><p><br/> ;如果要加判断的话,请选择这里</p><p></p><p>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br/>(t ;<br/>(progn ;<br/>(setq b (+ shishu bc nn)) ;<br/>(setq c (itoa b)) ;<br/>(setq d (strcat qianzhui c)) ;<br/>(setq e (cons 1 d)) ;<br/>(setq ddd (subst e wenzizu ddd)) ;<br/>(entmod ddd) ;<br/>(princ) ;<br/>) ;end progn ;<br/>) ;<br/>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</p><p><br/>) ;end cond<br/>) ;end progn<br/>(ddjq)<br/>) ;end if</p><p>) ;end defun</p><p></p><p></p><p></p> 又上了一课,嘿嘿! <p>这是我曾经在程序中写的一个函数,满足你的要求应该是绰绰有余。</p><p>例:(GetNums "-12.34m A-1-23-45.6-b")<br/>返回:((1 6 T) (11 1 nil) (13 2 nil) (16 4 T))</p><p>说明:返回一个二维表,子表个数为字符串中数字串的个数,每个子表有三个元素,分别代表数字串在参数中开始位置、长度和有无小数点。<br/></p><p>;获取字符串中的多个数字的位置、长度和有无小数点<br/> (defun GetNums (str / i p n di iLen tList iCode)<br/> (setq i 1<br/> p 0<br/> n 0<br/> di 0 ;计录有无小数点<br/> iLen (strlen str)<br/> tList '()<br/> )<br/> (repeat iLen<br/> (setq iCode (ascii (substr str i 1)))<br/> (cond ((and (= i 1) (or (= iCode 43) (= iCode 45)))<br/> ;首部的正(负)号+/-<br/> (setq iCode (ascii (substr str 2 1)))<br/> (if (and (>= iCode 48) (<= iCode 57))<br/> (setq p 1<br/> n 1<br/> )<br/> )<br/> )<br/> ((and (>= iCode 48) (<= iCode 57)) ;数字0-9<br/> (if (= p 0)<br/> (setq p i)<br/> )<br/> (setq n (1+ n))<br/> )<br/> ((and (> p 0) (= iCode 46) (= di 0)) ;数字后的小数点<br/> (setq iCode (ascii (substr str (1+ i) 1)))<br/> (if (and (>= iCode 48) (<= iCode 57))<br/> (setq n (1+ n)<br/> di 1<br/> )<br/> (setq tList (cons (list p n (= di 1)) tList)<br/> p 0<br/> n 0<br/> di 0<br/> )<br/> )<br/> )<br/> ((> p 0)<br/> (setq tList (cons (list p n (= di 1)) tList)<br/> p 0<br/> n 0<br/> di 0<br/> )<br/> )<br/> (T nil)<br/> )<br/> (setq i (1+ i))<br/> )<br/> (if (> p 0)<br/> (setq tList (cons (list p n (= di 1)) tList))<br/> )<br/> (reverse tList)<br/> )</p> 12.34只有5位。你的程序为什么是6呢 <p>前面有个负号</p><p>首位的+或-会被当成正负号。</p> <p><font face="Verdana" color="#61b713"><strong>tengte</strong></font></p><p><font face="Verdana" color="#61b713"><font color="#000000">例</font></font><font face="Verdana" color="#61b713"><font color="#000000">:(GetNums "-12.34m A-1-23-45.6-b")<br/>返回:((1 6 T) (11 1 nil) (13 2 nil) (16 4 T))</font></font></p><p><font face="Verdana">你的程序有问题吧,第一个考虑负号了,为啥第二个和第三个不考虑?</font></p>
页:
[1]
2