明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2199|回复: 15

[求助]如何提取比如“"P1-60"”中的60和“P1-”

  [复制链接]
发表于 2009-8-28 09:48:00 | 显示全部楼层 |阅读模式

在CAD中因为要给没个地形图命名,而且还是累加的,比如“"P1-60"”、"P1-61"、"P1-62""P1-63",怎们自动完成这些标注的自动累加。

如果是单个的数字比如60、61、62我可以实现,现在的问题是没法实现提取其中的数字和字母,请问用什么函数可以完成这个功能。

下面是我自动完成数据相加的程序:

(defun c:copm()  ;多重复制加数
 (setq di(getint"输入间距:"))
 (setq ss(entsel"选择要排列的数"));选择物体,提取联合属性列表
 (setq en(car ss))
 (setq endata(entget en))
 
 (setq oldh(cdr(assoc 40 endata)));提取字高
 (setq olda(cdr(assoc 50 endata)));提取角度
 (setq oldtt(atof(angtos olda)));把弧度变为度
 
 (setq oldt(cdr(assoc 1 endata)));提取标注,
 (setq oldti(atoi oldt));标注负值
 (setq newt(+ oldti di))

 (setq pa(getpoint "\n标注位置:"))
 (command "text" pa oldh oldtt newt)
 

   (while
     (setq ens(entlast))
   
     (setq entdata(entget ens))
     (setq oldct(cdr(assoc 10 entdata)))
     (setq oldht(cdr(assoc 40 entdata)))
     (setq oldat(cdr(assoc 50 entdata)))
     (setq oldatt(atof(angtos oldat)))

     (setq oldtt(cdr(assoc 1 entdata)))
     (setq oldtit(atoi oldtt))
     (setq newtt(+ oldtit di))
     (setq pat(getpoint))
     (command "text" pat oldht oldatt newtt)
    
  
   )
 )

发表于 2009-8-28 13:57:00 | 显示全部楼层

这个是我以前做的一个程序,下面我用红色标出的部分,应该你能用到

就是先找到“-”的位置,然后提出"-"前面的前缀和"-"后面的数字

运算之后,把运算完的数跟前缀用strcat连在一起就行了

由于比较忙,不能修改程序了,你参考一下吧

;;;子程序
(defun c:gf()
(setq bc (getint "\n 请输入步长:"))
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;子程序  (中间有横杠,取后面的数字更改)

(defun ddjq()
(setq shuzi (substr wenzi (+ 2 gang)))
(setq shishu (atoi shuzi))   ;把数字改为实数
(setq qianzhui (substr wenzi 1 (+ 1 gang)))
(if (= lll "<")
(progn
(setq b (+ shishu bc nn))                               ;
(setq c (itoa b))                                       ;
(setq d (strcat qianzhui c ">"))                        ;
(setq e (cons 1 d))                                     ;
(setq ddd (subst e wenzizu ddd))                        ;
(entmod ddd)                                            ;
(princ)                                                 ;
)  ;end progn                                           ;
 
(progn
(setq b (+ shishu bc nn))                               ;
(setq c (itoa b))                                       ;
(setq d (strcat qianzhui c))                        ;
(setq e (cons 1 d))                                     ;
(setq ddd (subst e wenzizu ddd))                        ;
(entmod ddd)                                            ;
(princ)                                                 ;
)  ;end progn                                           ;


) ;end if
)  ;end defun

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:gg()
(prompt "\n 设置步长命令为:gf,初始步长为1")
(if (= bc nil)
(setq bc 1)
)
(setq a (ssget))
(setq len (sslength a))   ;取得对象的个数
(setq n 0)
(setq nn 0)
(command "undo" "begin")
(repeat len
(setq ent (ssname a n))    ;取得实体的名称
(setq ddd (entget ent))      ;得到实体的联合列表

(setq djq (cdr (assoc 0 ddd)))

(if (or (= djq "MTEXT") (= djq "TEXT"))

(dkdk)

)        ;end if

(setq n (+ 1 n))

)       ;end repeat

(setq nn (+ nn bc))
(command "undo" "end")
)


;;;子程序

(defun dkdk()
(setq wenzizu (assoc 1 ddd))         ;取出字的内容(群码为1)
(setq wenzi (cdr wenzizu))         ;文字
(setq gang (vl-string-search "-" wenzi))

(setq wenzilen (strlen wenzi))
(setq fanyihou (vl-string-translate "1234567890" "##########" wenzi))  ;翻译字符

(setq weizhi (vl-string-search "#" fanyihou))  ;找出#的位置

(setq qianzhui (substr wenzi 1 weizhi))   ;取出前缀
(setq shuzi (substr wenzi (+ weizhi 1)))   ;取出字符串形式的数字
(setq shishu (atoi shuzi))   ;把数字改为实数

(setq lll (substr wenzi 1 1))  ;判断第一个字符是什么

(if (= gang nil)
(progn


(cond

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
((= lll "<")                                            ;                                 
(progn                                                  ;
(setq b (+ shishu bc nn))                               ;
(setq c (itoa b))                                       ;
(setq d (strcat qianzhui c ">"))                        ;
(setq e (cons 1 d))                                     ;
(setq ddd (subst e wenzizu ddd))                        ;
(entmod ddd)                                            ;
(princ)                                                 ;
)  ;end progn                                           ;
)  ;end first                                           ;
                                                        ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


                                                             ;如果要加判断的话,请选择这里

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(t                                                      ;
(progn                                                  ;
(setq b (+ shishu bc nn))                               ;
(setq c (itoa b))                                       ;
(setq d (strcat qianzhui c))                            ;
(setq e (cons 1 d))                                     ;
(setq ddd (subst e wenzizu ddd))                        ;
(entmod ddd)                                            ;
(princ)                                                 ;
)    ;end progn                                         ;
)                                                       ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


)  ;end cond
)   ;end progn
(ddjq)
)   ;end if

)    ;end defun

发表于 2009-8-28 14:04:00 | 显示全部楼层
又上了一课,嘿嘿!
发表于 2009-8-28 14:56:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2009-8-28 15:23:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2009-8-29 13:36:00 | 显示全部楼层

这是我曾经在程序中写的一个函数,满足你的要求应该是绰绰有余。

例:(GetNums "-12.34m A-1-23-45.6-b")
返回:((1 6 T) (11 1 nil) (13 2 nil) (16 4 T))

说明:返回一个二维表,子表个数为字符串中数字串的个数,每个子表有三个元素,分别代表数字串在参数中开始位置、长度和有无小数点。

;获取字符串中的多个数字的位置、长度和有无小数点
  (defun GetNums (str / i p n di iLen tList iCode)
    (setq i 1
   p 0
   n 0
   di 0 ;计录有无小数点
   iLen (strlen str)
   tList '()
    )
    (repeat iLen
      (setq iCode (ascii (substr str i 1)))
      (cond ((and (= i 1) (or (= iCode 43) (= iCode 45)))
  ;首部的正(负)号+/-
      (setq iCode (ascii (substr str 2 1)))
      (if (and (>= iCode 48) (<= iCode 57))
        (setq p 1
       n 1
        )
      )
     )
     ((and (>= iCode 48) (<= iCode 57)) ;数字0-9
      (if (= p 0)
        (setq p i)
      )
      (setq n (1+ n))
     )
     ((and (> p 0) (= iCode 46) (= di 0)) ;数字后的小数点
      (setq iCode (ascii (substr str (1+ i) 1)))
      (if (and (>= iCode 48) (<= iCode 57))
        (setq n (1+ n)
       di 1
        )
        (setq tList (cons (list p n (= di 1)) tList)
       p    0
       n    0
       di    0
        )
      )
     )
     ((> p 0)
      (setq tList (cons (list p n (= di 1)) tList)
     p  0
     n  0
     di  0
      )
     )
     (T nil)
      )
      (setq i (1+ i))
    )
    (if (> p 0)
      (setq tList (cons (list p n (= di 1)) tList))
    )
    (reverse tList)
  )

发表于 2009-8-29 17:26:00 | 显示全部楼层
12.34只有5位。你的程序为什么是6呢
发表于 2009-8-29 19:26:00 | 显示全部楼层

前面有个负号

首位的+或-会被当成正负号。

发表于 2009-8-29 21:11:00 | 显示全部楼层

tengte

:(GetNums "-12.34m A-1-23-45.6-b")
返回:((1 6 T) (11 1 nil) (13 2 nil) (16 4 T))

你的程序有问题吧,第一个考虑负号了,为啥第二个和第三个不考虑?

发表于 2009-8-29 21:18:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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