找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 988|回复: 6

[日积月累]:新编的一个小程序,请大家指教

[复制链接]
发表于 2003-6-7 01:12:55 | 显示全部楼层 |阅读模式

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

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

×
;数字替换程序,可以对选中数字进行加、减、乘、除,同时可以自动去除选择集中的非数字文字
(defun invar ()
  (setvar "cmdecho" 0)                        ;屏蔽命令行显示
  (setq os (getvar "osmode"))                ;提取物体捕捉变量
  (setvar "osmode" 0)                        ;设置物体捕捉变量为空
  (setq dimzin_v (getvar "dimzin"))     ;提取dimzin 变值
  (setvar "dimzin" 0)                   ;设置dimzin值为零,以防小数位数对rtos无效
  (command "undo" "g")                        ;设置“U”回的值
)
(defun revar ()
  (setvar "osmode" os)                        ;恢复物体捕捉设置
(setvar "dimzin" dimzin_v)            ;恢复dimzin的值
  (command "undo" "e")                        ;设置“U”的最点
  (setvar "cmdecho" 1)                        ;恢复命令行显示
)
(defun process_txt (txt_ss    kword        value_bp  weishu    begin_v
                    /              i                ii          n            txt_name
                    txt_data  o_txt_d        o_txt_c          o_txt_v   n_txt_v
                    n_txt_c   n_txt_d
                   )
  (setq        n  0
        ii 0
  )
  (repeat (sslength txt_ss)
    (setq txt_name (ssname txt_ss ii))
    (setq txtdata (entget txt_name))
    (setq o_txt_d (assoc 1 txtdata))
    (setq o_txt_c (cdr o_txt_d))
    (setq o_txt_v (distof o_txt_c))
    (if        (and
          (/= o_txt_v nil)
          (>= o_txt_v begin_v)
        )
      (progn
        (cond
          ((= kword "+") (setq n_txt_v (+ o_txt_v value_bp)))
          ((= kword "-") (setq n_txt_v (- o_txt_v value_bp)))
          ((= kword "*") (setq n_txt_v (* o_txt_v value_bp)))
          ((= kword "/") (setq n_txt_v (/ o_txt_v value_bp)))
        )                                ;End of cond
        (setq n_txt_c (rtos n_txt_v 2 weishu))
        (setq n_txt_d (cons 1 n_txt_c))
        (setq txtdata (subst n_txt_d o_txt_d txtdata))
        (entmod txtdata)
        (setq n (1+ n))
      )                                        ;end of progn
    )                                        ;end of if
    (setq ii (1+ ii))
  )                                        ;end of repeat
  (prin1 "成功对")
  (prin1 n)
  (prin1 "个数字进行了操作!")
)                                        ;end of subprogram
(defun c:shuzth        ()
  (invar)
  (prompt "\n请选取数字:")
  (terpri)
  (setq ss_txt (ssget '((0 . "text"))))        ;选取并过滤为文字
  (initget "+ - * /")
  (setq        p_kword
         (getkword "\n 请输入操作码: 加(+)、减(-)、乘(*)、除(/)<+>")
  )
  (if (null p_kword)
    (setq P_kword "+")
  )
  (initget (+ 1 2))
  (setq bp_value (getreal "\n 请输入加、减、乘、除数:"))
  (setq wei_shu (getint "\n 请输入小数位数<2>:"))
  (if (null wei_shu)
    (setq wei_shu 2)
  )
  (setq begin_v (getreal "\n 给定开始数<不给定>:"))
  (process_txt ss_txt p_kword bp_value wei_shu begin_v)
  (prompt "\n山东省水利勘测设计院 杨克坤 2003.6.6编")
  (revar)
)                                        ;end of main program
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-6-9 22:34:36 | 显示全部楼层
"(setvar "dimzin" 0) ;设置dimzin值为零,以防小数位数对rtos无效" 这是什么意思?难道是rots即使强制设定了转换的精确度,dimzin还是会对它有影响?还是仅仅防止"wei_shu"这个变量会偶尔出错?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-10 05:02:07 | 显示全部楼层
DIMZIN also affects real-to-string conversions performed by the AutoLISP rtos and angtos functions.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-12 01:50:57 | 显示全部楼层
rots即使强制设定了转换的精确度,dimzin还是会对转换的精度有影响,不信你可以试试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-12 09:17:22 | 显示全部楼层
<code>
;;;
(defun *error* (msg)
  (if
    (or
      (= msg "Function cancelled")
      (= msg "quit / exit abort")
      (= msg "函数被取消")
    )
     (progn
       (setvar "osmode" 1011)
       (setvar "cmdecho" 1)
       (setvar "blipmode" 1)
     )
     (princ (strcat "\nError: " msg))
  )
)

;;;***
(defun dxf (code elist)
  (cdr (assoc code elist))
)

;;;判断实体是不是数字
(defun itsz (ss n / sz i)
  (setq i 0 sz T)
  (while (and sz (< i n))
    (if (/= (dxf 0 (entget (ssname ss i))) "TEXT")
      (princ "所选的不是文字。")
      (if (numberp (read (dxf 1 (entget (ssname ss i)))))
        (setq sz T)
        (progn
          (princ "所选的不是数字。")
          (setq sz nil)
        )
      )
    )
    (setq i (1+ i))
  )
  (if sz T nil)
)
  
(defun itnsz (sname / sz)
  (if (/= (dxf 0 (entget sname)) "TEXT")
    (princ "所选的不是文字")
    (if (numberp (read (dxf 1 (entget sname))))
      (setq sz T)
      (progn
        (princ "所选的不是数字")
        (setq sz nil)
      )
    )
  )
  (if sz T nil)
)

;;;数字相加
(defun totalPlus (ss / i all j xs x ename dxf0)
  (setq i 0 all 0 j 0)
  (while (< i (sslength ss))
    (setq ename (ssname ss i))
    (setq dxf0 (dxf 0 (entget ename)))
            (if (= i 0)
                (princ "\n")
              )
    (if (= dxf0 "TEXT")
      (progn
        (setq xs (dxf 1 (entget ename)))
        (if (numberp (read xs))
          (progn
            (setq x (atof xs))
            (if (/= all 0)
                  (princ '+)
              )
            (setq all (+ all x))
            (princ (rtos x 2 3))
            (setq j (1+ j))
          )
        )
      )
    )
    (setq i (1+ i))
  )
  (princ (strcat "=" (rtos all 2 3)))
  (princ (strcat "\n共有" (itoa j) "个数字相加,总和是" (rtos all 2 3) "。"))
  all
)

;;;确定数字的精度
(defun jvalue (newdat / j)
  (cond ((< newdat 10) (setq j 3))
        ((and (>= newdat 10) (<= newdat 100)) (setq j 2))
        ((> newdat 100) (setq j 1))
  )
  j
)

;;;改变数字
(defun chtt (newdat en1 / ed j)
  (setq j (jvalue newdat))
  (setq newdat (rtos newdat 2 j))
  (if en1
    (progn
      (setq ed (entget (car en1)))
      (if (= (dxf 0 ed) "TEXT")
        (progn
          (setq j (dxf 1 ed))
          (princ (strcat "你把\"" j "\"变成了\"" newdat "\"!!!"))
          (setq ed (subst (cons 1 newdat) (assoc 1 ed) ed))
          (entmod ed)
        )
        (progn
          (entmake (list (cons 0 "TEXT")
                         (cons 1 newdat)
                         (cons 8 "pn")
                         (cons 10 (car (cdr en1)))
                         (cons 40 (* 3 (getvar "dimscale")))
                         (cons 41 0.67)
                         (cons 50 0.0)
                   )
          )
        )
      )
    )
  )
)

;;;main
(defun c:addall( / ss all en1 dzn)
  (setvar "cmdecho" 0)
  (command "undo" "group")
  (setq dzn (getvar "dimzin"))
  (setvar "dimzin" 0)
  (princ "请选择要计算的数字:")
  (setq ss (ssget '((0 . "TEXT"))))
  (princ (strcat "\n选择了" (itoa (sslength ss)) "个目标。"))
  (if ss
    (setq all (totalPlus ss))
  )
  (setq ss (ssadd))
  (setq en1 (entsel "\n选择要修改的一个数字:"))
  (if en1
    (chtt all en1)
    (princ "你没有选择要修改的文字。")
  )
  (command "undo" "end")
  (setvar "dimzin" dzn)
  (setvar "cmdecho" 1)
  (princ)
)

(defun c:TimesIt ( / ss sz1 sz2 all en1)
  (setvar "cmdecho" 0)
  (command "undo" "group")
  (princ "请选择要计算的数字:")
  (setq ss (ssget '((0 . "TEXT"))))
  (while (/= (sslength ss) 2)
    (princ (strcat "必须是" (rtos 2) "个数相乘。"))
    (setq ss (ssget '((0 . "TEXT"))))
  )
  (while (not (itsz ss 2))
    (setq ss (ssget '((0 . "TEXT"))))
  )
  (setq sz1 (read (dxf 1 (entget (ssname ss 0))))
        sz2 (read (dxf 1 (entget (ssname ss 1))))
  )
  (setq all (* sz1 sz2))
  (setq ss (ssadd))
  (princ (strcat (rtos sz1) "*" (rtos sz2) "=" (rtos all)))
  (setq en1 (entsel "\n选择要修改的一个数字:"))
  (if en1
    (chtt all en1)
    (princ "你没有选择要修改的文字。")
  )
  (command "undo" "end")
  (setvar "cmdecho" 1)
  (princ)
)

(defun c:minsIt ( / ss1 ss2 sz1 sz2 all en1 dzn)
  (setvar "cmdecho" 0)
  (setq dzn (getvar "dimzin"))
  (setvar "dimzin" 0)
  (command "undo" "group")
  (princ "请选择要计算的数字:")
  (setq ss1 (entsel "\n被减数:"))
  (while (not ss1)
    (setq ss1 (entsel "\n被减数:"))
  )
  (while (not (itnsz (car ss1)))
    (setq ss1 (entsel "\n被减数:"))
  )
  (setq ss2 (entsel "\n减数:"))
  (while (not ss2)
    (setq ss2 (entsel "\n减数:"))
  )
  (while (not (itnsz (car ss2)))
    (setq ss2 (entsel "\n减数:"))
  )
  (setq sz1 (read (dxf 1 (entget (car ss1))))
        sz2 (read (dxf 1 (entget (car ss2))))
  )
  (setq all (- sz1 sz2))
  (princ (strcat (rtos sz1) "-" (rtos sz2) "=" (rtos all)))
  (setq en1 (entsel "\n选择要修改的一个数字:"))
  (if en1
    (chtt all en1)
    (princ "你没有选择要修改的文字。")
  )
  (command "undo" "end")
  (setvar "dimzin" dzn)
  (setvar "cmdecho" 1)
  (princ)
)

(defun c:dvidIt ( / ss1 ss2 sz1 sz2 all en1)
  (setvar "cmdecho" 0)
  (command "undo" "group")
  (princ "请选择要计算的数字:")
  (setq ss1 (entsel "\n被除数:"))
  (while (not ss1)
    (setq ss1 (entsel "\n被除数:"))
  )
  (while (not (itnsz (car ss1)))
    (setq ss1 (entsel "\n被除数:"))
  )
  (setq ss2 (entsel "\n除数:"))
  (while (not ss2)
    (setq ss2 (entsel "\n除数:"))
  )
  (while (not (itnsz (car ss2)))
    (setq ss2 (entsel "\n除数:"))
  )
  (while (= (read (dxf 1 (entget (car ss2)))) 0)
    (princ "不能为0")
    (setq ss2 (entsel "\n除数:"))
  )
  (setq sz1 (read (dxf 1 (entget (car ss1))))
        sz2 (read (dxf 1 (entget (car ss2))))
  )
  (setq all (/ sz1 sz2))
  (princ (strcat (rtos sz1) "/" (rtos sz2) "=" (rtos all)))
  (setq en1 (entsel "\n选择要修改的一个数字:"))
  (if en1
    (chtt all en1)
    (princ "你没有选择要修改的文字。")
  )
  (command "undo" "end")
  (setvar "cmdecho" 1)
  (princ)
)
</code>
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-13 09:31:16 | 显示全部楼层
感谢楼上老兄加以指正。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-15 00:56:04 | 显示全部楼层
借用您的帖子,我箱讨论一下电器的图纸问题,却没有找到合适的地方,斑竹青帮忙。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 20:50 , Processed in 0.367435 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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