找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 544|回复: 1

[LISP函数]:数字运算

[复制链接]
发表于 2003-1-11 11:44:15 | 显示全部楼层 |阅读模式

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

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

×
  1. ;;;
  2. ;;; ------------
  3. ;;; * 数字运算 *
  4. ;;; ------------
  5. ;;; ADD、SUB、MUL、DIV 保留原有数字,而且ADD与MUL可多选。
  6. ;;; AD1、SU1、MU1、DI1 改变原有数字
  7. ;;; ADM、MUM 将所选文字增加(乘以)相同的量
  8. ;;; INC 按给定增量(缺剩值为1)递增。
  9. ;;; AVE 算平均值
  10. ;;; 注意:若为MTEXT,需将其打散。
  11. ;;; 有效位数取统缺省值,结果字高为第一个所选数字的字高。
  12. ;;;

  13. ;;;
  14. ;;; ADDITION CALCULATION
  15. ;;;
  16. (defun C:ADD (/ ns s n i e eb ds i ss pt bool th blio cmdo)
  17.   (setq blio (getvar "blipmode"))
  18.   (setq cmdo (getvar "cmdecho"))
  19.   (setvar "blipmode" 0)
  20.   (setvar "cmdecho" 0)
  21.   (setq bool "T")
  22.   (princ "\nPlease choose numbers:")
  23.   (setq ns (ssget))
  24.   (if ns
  25.     (progn
  26.       (setq s 0.0
  27.             i 0
  28.       )
  29.       (setq n (sslength ns))
  30.       (while (< i n)
  31.         (setq e (ssname ns i))
  32.         (setq eb (entget e))
  33.         (if (= "TEXT" (cdr (assoc 0 eb)))
  34.           (progn
  35.             (if        bool
  36.               (progn
  37.                 (setq th (cdr (assoc 40 eb)))
  38.                 (setq bool nil)
  39.               )
  40.             )
  41.             (setq ds (atof (cdr (assoc 1 eb))))
  42.             (setq s (+ s ds))
  43.           )
  44.         )
  45.         (setq i (1+ i))
  46.       )
  47.       (setq ss (rtos s 2))
  48.       (setq pt (getpoint "\nInsert point of result:"))
  49.       (command "text" pt th 0 ss)
  50.     )
  51.   )
  52.   (setvar "blipmode" blio)
  53.   (setvar "cmdecho" cmdo)
  54.   (princ)
  55. )


  56. ;;;
  57. ;;; SUBTRACTION CALCULATION
  58. ;;;
  59. (defun C:SUB (/ ae be a b c ss pt th blio cmdo)
  60.   (setq blio (getvar "blipmode"))
  61.   (setq cmdo (getvar "cmdecho"))
  62.   (setvar "blipmode" 0)
  63.   (setvar "cmdecho" 0)
  64.   (setq ae (car (entsel "\nPick number from which being subtracted:")))
  65.   (setq be (car (entsel "\nPick subtract number:")))
  66.   (if (and ae be)
  67.     (if        (and (= "TEXT" (cdr (assoc 0 (entget ae))))
  68.              (= "TEXT" (cdr (assoc 0 (entget be))))
  69.         )
  70.       (progn
  71.         (setq th (cdr (assoc 40 (entget ae))))
  72.         (setq a (atof (cdr (assoc 1 (entget ae)))))
  73.         (setq b (atof (cdr (assoc 1 (entget be)))))
  74.         (setq c (- a b))
  75.         (setq ss (rtos c 2))
  76.         (setq pt (getpoint "\nInsert point of result:"))
  77.         (command "text" pt th 0 ss)
  78.       )
  79.     )
  80.   )
  81.   (setvar "blipmode" blio)
  82.   (setvar "cmdecho" cmdo)
  83.   (princ)
  84. )


  85. ;;;
  86. ;;; MULTIPLICATION CALCULATION
  87. ;;;
  88. (defun C:MUL (/ ns s i n e eb ds i ss pt th bool blio cmdo)
  89.   (setq blio (getvar "blipmode"))
  90.   (setq cmdo (getvar "cmdecho"))
  91.   (setvar "blipmode" 0)
  92.   (setvar "cmdecho" 0)
  93.   (setq bool "T")
  94.   (princ "\nPlease choose numbers:")
  95.   (setq ns (ssget))
  96.   (if ns
  97.     (progn
  98.       (setq i 0
  99.             s 1.0
  100.       )                                        ;s--result,orign value is 1.0
  101.       (setq n (sslength ns))
  102.       (while (< i n)
  103.         (setq e (ssname ns i))
  104.         (setq eb (entget e))
  105.         (if (= "TEXT" (cdr (assoc 0 eb)))
  106.           (progn
  107.             (if        bool
  108.               (progn
  109.                 (setq th (cdr (assoc 40 eb)))
  110.                 (setq bool nil)
  111.               )
  112.             )
  113.             (setq ds (atof (cdr (assoc 1 eb))))
  114.             (setq s (* s ds))
  115.           )
  116.         )
  117.         (setq i (1+ i))
  118.       )
  119.       (setq ss (rtos s 2))
  120.       (setq pt (getpoint "\nInsert point of result:"))
  121.       (command "text" pt th 0 ss)
  122.     )
  123.   )
  124.   (setvar "blipmode" blio)
  125.   (setvar "cmdecho" cmdo)
  126.   (princ)
  127. )


  128. ;;;
  129. ;;; DIVIDING CALCULATION
  130. ;;;

  131. (defun C:DIV (/ ae be a b ss th pt)
  132.   (setq blio (getvar "blipmode"))
  133.   (setq cmdo (getvar "cmdecho"))
  134.   (setvar "blipmode" 0)
  135.   (setvar "cmdecho" 0)
  136.   (setq ae (car (entsel "\nPick being divided number:")))
  137.   (setq be (car (entsel "\nPick divide number:")))
  138.   (if (and ae be)
  139.     (if        (and (= "TEXT" (cdr (assoc 0 (entget ae))))
  140.              (= "TEXT" (cdr (assoc 0 (entget be))))
  141.         )
  142.       (progn
  143.         (setq th (cdr (assoc 40 (entget ae))))
  144.         (setq a (atof (cdr (assoc 1 (entget ae)))))
  145.         (setq b (atof (cdr (assoc 1 (entget be)))))
  146.         (if (> (abs b) 0.0000001)
  147.           (setq ss (rtos (/ a b) 2))
  148.           (setq ss "ERROR")
  149.         )
  150.         (setq pt (getpoint "\nInsert point of result:"))
  151.         (command "text" pt th 0 ss)
  152.       )
  153.     )
  154.   )
  155.   (setvar "blipmode" blio)
  156.   (setvar "cmdecho" cmdo)
  157.   (princ)
  158. )



  159. ;;;
  160. ;;; ADDITION CALCULATION (changed)
  161. ;;;
  162. (defun C:AD1 (/ ae be a b c ss al)
  163.   (setq blio (getvar "blipmode"))
  164.   (setq cmdo (getvar "cmdecho"))
  165.   (setvar "blipmode" 0)
  166.   (setvar "cmdecho" 0)
  167.   (command "redraw")
  168.   (setq ae (car (entsel "\nPick number which being added:")))
  169.   (setq be (car (entsel "\nPick adding number:")))
  170.   (if (and ae be)
  171.     (if        (and (= "TEXT" (cdr (assoc 0 (entget ae))))
  172.              (= "TEXT" (cdr (assoc 0 (entget be))))
  173.         )
  174.       (progn
  175.         (setq a (atof (cdr (assoc 1 (entget ae)))))
  176.         (setq b (atof (cdr (assoc 1 (entget be)))))
  177.         (setq c (+ a b))
  178.         (setq ss (rtos c 2))
  179.         (setq al (entget ae))
  180.         (setq al (subst (cons 1 ss) (assoc 1 al) al))
  181.         (entmod al)
  182.       )
  183.     )
  184.   )
  185.   (setvar "blipmode" blio)
  186.   (setvar "cmdecho" cmdo)
  187.   (princ)
  188. )


  189. ;;;
  190. ;;; SUBTRACTION CALCULATION (changed)
  191. ;;;

  192. (defun C:SU1 (/ ae be a b c ss al)
  193.   (setq blio (getvar "blipmode"))
  194.   (setq cmdo (getvar "cmdecho"))
  195.   (setvar "blipmode" 0)
  196.   (setvar "cmdecho" 0)
  197.   (command "redraw")
  198.   (setq ae (car (entsel "\nPick number from which being subtracted:")))
  199.   (setq be (car (entsel "\nPick subtract number:")))
  200.   (if (and ae be)
  201.     (if        (and (= "TEXT" (cdr (assoc 0 (entget ae))))
  202.              (= "TEXT" (cdr (assoc 0 (entget be))))
  203.         )
  204.       (progn
  205.         (setq a (atof (cdr (assoc 1 (entget ae)))))
  206.         (setq b (atof (cdr (assoc 1 (entget be)))))
  207.         (setq c (- a b))
  208.         (setq ss (rtos c 2))
  209.         (setq al (entget ae))
  210.         (setq al (subst (cons 1 ss) (assoc 1 al) al))
  211.         (entmod al)
  212.       )
  213.     )
  214.   )
  215.   (setvar "blipmode" blio)
  216.   (setvar "cmdecho" cmdo)
  217.   (princ)
  218. )



  219. ;;;
  220. ;;; MULTIPLICATION CALCULATION (changed)
  221. ;;;

  222. (defun C:MU1 (/ ae be a b c ss al)
  223.   (setq blio (getvar "blipmode"))
  224.   (setq cmdo (getvar "cmdecho"))
  225.   (setvar "blipmode" 0)
  226.   (setvar "cmdecho" 0)
  227.   (command "redraw")
  228.   (setq ae (car (entsel "\nPick being multiplied number:")))
  229.   (setq be (car (entsel "\nPick multiply number:")))
  230.   (if (and ae be)
  231.     (if        (and (= "TEXT" (cdr (assoc 0 (entget ae))))
  232.              (= "TEXT" (cdr (assoc 0 (entget be))))
  233.         )
  234.       (progn
  235.         (setq a (atof (cdr (assoc 1 (entget ae)))))
  236.         (setq b (atof (cdr (assoc 1 (entget be)))))
  237.         (setq c (* a b))
  238.         (setq ss (rtos c 2))
  239.         (setq al (entget ae))
  240.         (setq al (subst (cons 1 ss) (assoc 1 al) al))
  241.         (entmod al)
  242.       )
  243.     )
  244.   )
  245.   (setvar "blipmode" blio)
  246.   (setvar "cmdecho" cmdo)
  247.   (princ)
  248. )


  249. ;;;
  250. ;;; DIVIDING CALCULATION (changed)
  251. ;;;
  252. (defun C:DI1 (/ ae bd a b c ss al)
  253.   (setq blio (getvar "blipmode"))
  254.   (setq cmdo (getvar "cmdecho"))
  255.   (setvar "blipmode" 0)
  256.   (setvar "cmdecho" 0)
  257.   (command "redraw")
  258.   (setq ae (car (entsel "\nPick being divided number:")))
  259.   (setq be (car (entsel "\nPick divide number:")))
  260.   (if (and ae be)
  261.     (if        (and (= "TEXT" (cdr (assoc 0 (entget ae))))
  262.              (= "TEXT" (cdr (assoc 0 (entget be))))
  263.         )
  264.       (progn
  265.         (setq a (atof (cdr (assoc 1 (entget ae)))))
  266.         (setq b (atof (cdr (assoc 1 (entget be)))))
  267.         (if (> (abs b) 0.0000001)
  268.           (progn
  269.             (setq ss (rtos (/ a b) 2))
  270.             (setq al (entget ae))
  271.             (setq al (subst (cons 1 ss) (assoc 1 al) al))
  272.             (entmod al)
  273.           )
  274.           (alert "ERROR")
  275.         )
  276.       )
  277.     )
  278.   )
  279.   (setvar "blipmode" blio)
  280.   (setvar "cmdecho" cmdo)
  281.   (princ)
  282. )

  283. ;;;------------------------------------------------
  284. ;;;
  285. ;;; subroutine for ADM and MUM
  286. ;;;
  287. (defun MUL_CHANGE (cal / s b1 ns s ss n i ae a b c al blio cmdo)
  288.   ;;cal is "+" or "*"
  289.   (setq blio (getvar "blipmode"))
  290.   (setq cmdo (getvar "cmdecho"))
  291.   (setvar "blipmode" 0)
  292.   (setvar "cmdecho" 0)
  293.   (command "undo" "begin")
  294.   (if (= cal "+")
  295.     (setq s "Increase" b1 0.0)
  296.     (setq s "Multiply" b1 1.0)
  297.   )
  298.   (princ "\nPlease choose numbers:")
  299.   (setq ns (ssget))
  300.   (if ns
  301.     (progn
  302.       (setq b (getreal (strcat "\n" s " valve <" (rtos b1 2 1) ">:")))
  303.       (if (/= (type b) 'REAL)
  304.         (setq b b1)
  305.       )
  306.       (setq i 0)
  307.       (setq n (sslength ns))
  308.       (while (< i n)
  309.         (setq ae (ssname ns i))
  310.         (if (= "TEXT" (cdr (assoc 0 (entget ae))))
  311.           (progn
  312.             (setq a (atof (cdr (assoc 1 (entget ae)))))
  313.                 (if (= cal "+")
  314.               (setq c (+ a b))
  315.               (setq c (* a b))
  316.             )
  317.             (setq ss (rtos c 2))
  318.             (setq al (entget ae))
  319.             (setq al (subst (cons 1 ss) (assoc 1 al) al))
  320.             (entmod al)
  321.           )
  322.         )
  323.         (setq i (1+ i))
  324.       )
  325.     )
  326.   )
  327.   (command "undo" "end")
  328.   (setvar "blipmode" blio)
  329.   (setvar "cmdecho" cmdo)
  330. ) ;end defun

  331. ;;;
  332. ;;; ADD MULTI-NUMBER and CHANGE THEM
  333. ;;;
  334. (defun C:ADM ()
  335.   (mul_change "+")
  336.   (princ)
  337. )

  338. ;;;
  339. ;;; MULTIPLY MULTI-NUMBER and CHANGE THEM
  340. ;;;
  341. (defun C:MUM ()
  342.   (mul_change "*")
  343.   (princ)
  344. )

  345. ;;;------------------------------------------------

  346. ;;;------------------------------------------------
  347. ;;;
  348. ;;; INCREASE CALCULATION
  349. ;;;
  350. (defun C:INC (/ blio cmdo d ae a i ab al)
  351.   (setq blio (getvar "blipmode"))
  352.   (setq cmdo (getvar "cmdecho"))
  353.   (setvar "blipmode" 0)
  354.   (setvar "cmdecho" 0)
  355.   (setq d (getreal "\nInput increase quantum <1>:"))
  356.   (if (/= (type d) 'REAL)
  357.     (setq d 1)
  358.   )
  359.   (setq ae (car (entsel "\nPick number to change:")))
  360.   (setq a (atof (cdr (assoc 1 (entget ae)))))
  361.   (setq i 1)
  362.   (while ae
  363.     (if        (= "TEXT" (cdr (assoc 0 (entget ae))))
  364.       (progn
  365.         (if (= i 1)
  366.           (setq a (- a d))
  367.         )
  368.         (setq ab (rtos (setq a (+ a d)) 2))
  369.         (setq al (entget ae))
  370.         (setq al (subst (cons 1 ab) (assoc 1 al) al))
  371.         (entmod al)
  372.       )
  373.     )
  374.     (setq ae (car (entsel "\nPick number to change:")))
  375.     (setq i (1+ i))
  376.   )
  377.   (setvar "blipmode" blio)
  378.   (setvar "cmdecho" cmdo)
  379.   (princ)
  380. )

  381. (princ "\n\tc:INC loaded. start command with INC.")
  382. (princ)


  383. ;;;
  384. ;;; AVERAGE CALCULATION
  385. ;;;
  386. (defun C:AVE (/ ns s n i e eb ds i ss pt bool th blio cmdo)
  387.   (setq blio (getvar "blipmode"))
  388.   (setq cmdo (getvar "cmdecho"))
  389.   (setvar "blipmode" 0)
  390.   (setvar "cmdecho" 0)
  391.   (setq bool "T")
  392.   (princ "\nPlease choose numbers:")
  393.   (setq ns (ssget))
  394.   (if ns
  395.     (progn
  396.       (setq s 0.0
  397.             i 0
  398.             num 0
  399.       )
  400.       (setq n (sslength ns))
  401.       (while (< i n)
  402.         (setq e (ssname ns i))
  403.         (setq eb (entget e))
  404.         (if (= "TEXT" (cdr (assoc 0 eb)))
  405.           (progn
  406.             (if        bool
  407.               (progn
  408.                 (setq th (cdr (assoc 40 eb)))
  409.                 (setq bool nil)
  410.               )
  411.             )
  412.             (setq ds (atof (cdr (assoc 1 eb))))
  413.             (setq s (+ s ds))
  414.             (setq num (1+ num))
  415.           )
  416.         )
  417.         (setq i (1+ i))
  418.       )
  419.       (setq ave (/ s num))
  420.       (setq ave (rtos ave 2))
  421.       (setq pt (getpoint "\nInsert point of result:"))
  422.       (command "text" pt th 0 ave)
  423.     )
  424.   )
  425.   (setvar "blipmode" blio)
  426.   (setvar "cmdecho" cmdo)
  427.   (princ)
  428. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-1-15 18:11:33 | 显示全部楼层
标高统一加减主要是对正负零和小数位的保留。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 14:59 , Processed in 0.378203 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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