找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1942|回复: 1

[LISP程序]:编了个特定文字计算的程序,有个错误,我检查不出来

[复制链接]
发表于 2010-2-5 11:42:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
;编了个特定文字计算的程序,有个错误,我检查不出来
;编程的目的是,比如我图中有无数个包含了“花岗岩 5  平米”“花岗岩 12  平米”“花岗岩 20  平米”的单行文字(注意文字与数字间有空格隔开)。现在只要对着清单表,点下“花岗岩”三个字,就可以自动提取所有包含了“花岗岩”3个字中的数值,并计算出结果,并写单行文本。
;初学LISP,还请各位斑竹,大人,帮忙指点迷津。

;问题应该是出在WHILE 循环那里,ENTGET这个函数的用法,我的想法是先取得选择集 C 的第 i 个元素的实体名称,然后通过这个名称提取这个实体的“文字内容”的第二个元素(即数字部分),然后进行累加。

(DEFUN C:js ()

(setq a (entsel "\n选择文字:"))   ;比如选择“花岗岩”,创建选择集;

  (setq b (cdr (assoc '1 (entget (car a)))))   ;提取“花岗岩”三个字;


   (setq c (ssget "x" (list (cons 0 "*TEXT") (cons 1 (strcat "*" b "*")) ) ))   ;选择所有包含“花岗岩”3个字的单行文本;  


(setq d (sslength c))  ;计算选择集中的个数;

(setq i 0)  
(setq g 0)
  (
   while (< i d)
    (setq f (nth 2 (cdr (assoc '1 (entget (ssname c i))))))   ;(出错的地方,请高人指教);
    (
      while f (/= nil)
      (setq g (+ g f))
    )
      (setq i (+ i 1))
   )
(setq pt1 (getpoint "\n请指定文字插入中心点:"))
(command "text" "j" "mc" pt1 0 g)       ;文字高度事先已定义;
)


虽然可以通过 论坛中已有的 文本求和去实现,但要多一步选择过程。而且,我的工作,流程比较简单,那个程式的功能过于强大,用着不方便。
恳请指教
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2010-2-27 10:56:35 | 显示全部楼层
[php];; 特定文字中的数值之和
(DEFUN C:tt ()
  (defun Str2Lst (str / i str1 s)
    (setq i 0
          str1 ""
    )
    (while (vl-string-search "  " str)
      (setq str (vl-string-subst " " "  " str))
    )
    (while (/= "" (setq s (substr str (setq i (1+ i)) 1)))
      (setq str1 (strcat str1
                         (if (= " " s)
                           "\" \""
                           s
                         )
                 )
      )
    )
    (read (strcat "(\"" str1 "\")"))
  )
  (if (setq a (car (entsel "\n选择文字:")))
    (progn
      (setq b        (cdr (assoc 1 (entget a)))
            ss        (ssget "x" (list (cons 0 "TEXT") (cons 1 (strcat "*" b "*"))))
            i        -1
            num        0
      )
      (while (setq s1 (ssname ss (setq i (1+ i))))
        (setq lst (Str2Lst (cdr (assoc 1 (entget s1)))))
        (if (and (>= (length lst) 2) (setq n1 (distof (cadr lst))))
          (setq num (+ num n1))
        )
      )
      (if (and (setq pt1 (getpoint "\n请指定文字插入中心点:")) num)
        (command "text" "j" "mc" pt1 300 0 (rtos num 2 0))
      )
    )
  )
  (princ)
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-27 22:38 , Processed in 0.299168 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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