明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2018|回复: 8

学习文本运算遇到的问题:多行文本运算缺陷

[复制链接]
发表于 2010-7-19 01:30:00 | 显示全部楼层 |阅读模式
程序为网上朋友源码,学习文本运算遇到的问题:添加了能对多行文本类型数字运算,但修改后(修改在文中已注释)多行文本运算缺陷--如果第一个选的为多行文本数字,插入时结果数字旋转了一定的角度,怎么修改,请大虾指教,看了好久没看透谢谢
  1. ;;;说明
  2. (alert "提醒:
  3.        \n请首先设置好输精度<小数点位数>,在绘图的过程中可随时用命令JD设置精度。
  4.        \n命令"+ - * /"分别代表对所选择的数字求和差积商。
  5.        \n其中"- /" 则是以你第一个选到的数字文本为被减数和被除数。
  6.        \n命令".."(点点)代表对所选择的数字文本统一加减乘除某个数,默认为1。
  7.        \n命令"TJ"代表对所选择的数字文本进行数学统计。
  8.        \n所有生成的新文本均与第一个选到的数字文本的样式相同(除角度外)。"
  9. )
  10. ;;;定义了一个全局变量为精度
  11. (defun C:JD (/ )
  12.   (prompt "\n请输入精度,直接回车则为系统精度:")
  13.   (initget 4)
  14.   (if (setq PRECISION (getint))
  15.     (princ)
  16.     (setq PRECISION (getvar "LUPREC"))
  17.   )
  18. )
  19. (C:JD)  
  20. ;;;加
  21. (defun C:+ (/ key sel ins first numlst result)
  22.   (while (common1)
  23.     (setq result (apply '+ (cadr numlst)))
  24.     (common2)         
  25.   )
  26.   (princ)
  27. )
  28. ;;;减
  29. (defun C:- (/ key sel ins first numlst result)
  30.   (while (common1)
  31.     (setq result (apply '- (cadr numlst)))
  32.     (common2)         
  33.   )
  34.   (princ)
  35. )
  36. ;;;乘
  37. (defun C:* (/ key sel ins first numlst result)
  38.   (while (common1)
  39.     (setq result (apply '* (cadr numlst)))
  40.     (common2)         
  41.   )
  42.   (princ)
  43. )
  44. ;;;除
  45. (defun C:/ (/ key sel ins first numlst result)
  46.   (while (common1)
  47.     (setq result (apply '/ (cadr numlst)))
  48.     (common2)         
  49.   )
  50.   (princ)
  51. )
  52. ;;;所有数字都加减乘除某个数
  53. (defun C:.. (/ key op sel ins first numlst result)
  54.   (while (setq sel (ssget '((0 . "TEXT")))) ;;修改为 (while (setq sel (ssget '((0 . "TEXT,MTEXT"))))
  55.     (setq first  (ssname sel 0))
  56.     (setq Numlst (sel->list sel))
  57.     (initget 1 "+ - * /")
  58.     (setq key (getkword "\n请输入加减乘除符号<+ - * />:"))
  59.     (initget 2)
  60.     (if (null (setq op (getreal "\n请输入操作数<默认为1>:")))
  61.       (setq op 1.0)
  62.     )        
  63.     (all-cal numlst key op)         
  64.   )
  65.   (princ)
  66. )
  67. ;;;
  68. (defun all-cal (result sym op / lst old new)
  69.   (foreach n (car numlst)
  70.     (setq lst (entget n))
  71.     (setq old (atof (cdr (assoc 1 lst))))
  72.     (setq new (eval (cons (read sym) (list old op))))
  73.     (setq new (cons 1 (rtos new (getvar "LUNITS") PRECISION)))
  74.     (setq lst (subst new (assoc 1 lst) lst))
  75.     (entmod lst)
  76.   )
  77. )
  78. ;;;选择和插入点
  79. (defun common1 ()
  80.   (and
  81.     (setq sel (ssget '((0 . "TEXT"))));;修改为 (while (setq sel (ssget '((0 . "TEXT,MTEXT"))))
  82.     (null (initget 0 "Yes No"))
  83.     (if (setq key (getkword "\n是否保留原数字Yes,No?<默认不保留>:"))
  84.       (setq key "Yes")
  85.       (setq key "No")
  86.     )  
  87.     (setq first  (ssname sel 0))
  88.     (setq Numlst (sel->list sel))
  89.   )
  90. )
  91. ;;;做文字或者更新文字
  92. (defun common2 ()
  93.   (setq        result (rtos result (getvar "LUNITS") PRECISION))  
  94.   (if (= key "No")
  95.     (if (setq ins (getpoint "\n请输入插入点:"))
  96.       (make-text first result ins)
  97.     )
  98.     (update-text first result)
  99.   )
  100. )
  101. ;;;选择集合转化成数字列表
  102. (defun sel->list (sel / i ent lst num Els nls)
  103.   (setq i 0)
  104.   (repeat (sslength sel)
  105.     (setq ent (ssname sel i))
  106.     (setq lst (entget ent))
  107.     (setq num (atof (cdr (assoc 1 lst))))
  108.     (setq Els (cons ent Els))
  109.     (setq Nls (cons num Nls))
  110.     (setq i (1+ i))
  111.   )
  112.   (list
  113.     (reverse Els)
  114.     (reverse Nls)
  115.   )
  116. )  
  117. ;;;创建新文字,在指定点插入
  118. (defun make-text (first string inspt / remove txtlst lst)
  119.   (setq remove (list -1 330 5 1 10 11 50))
  120.   (setq txtlst (entget first))
  121.   (foreach n txtlst
  122.     (if (not (member (car n) remove))
  123.       (setq lst (cons n lst))
  124.     )
  125.   )  
  126.   (setq lst (cons (cons 1 string) lst))
  127.   (setq lst (cons (cons 10 inspt) lst))
  128.   (setq lst (cons (cons 11 inspt) lst))
  129.   (setq lst (reverse lst))
  130.   (cdr (assoc 40 (entmake lst)))
  131. )
  132. ;;;保留文字,仅更新内容
  133. (defun update-text (ent string / txtlst)
  134.   (setq txtlst (entget ent))
  135.   (setq txtlst (subst (cons 1 string) (assoc 1 txtlst) txtlst))
  136.   (entmod txtlst)
  137. )
  138. ;;;统计数字文本
  139. (defun C:tj (/ un sel ins tollst numlst first data len ang HIG j n m)
  140.   (setq un (getvar "LUNITS"))
  141.   (while (and (setq sel (ssget '((0 . "TEXT"))));;修改为 (while (setq sel (ssget '((0 . "TEXT,MTEXT"))))
  142.               (setq ins (getpoint "\n请输入插入点:")))
  143.     (princ "\n统计正在进行......")
  144.     (setq tollst (sel->list sel))
  145.     (setq numlst (cadr tollst))
  146.     (setq first  (caar tollst))
  147.     (setq data   (STAT numlst))
  148.     (setq len (strcat (caar data) (itoa (cdar data))))
  149.     (setq HIG (* (make-text first len ins) 1.5))
  150.     (setq ang (* Pi -0.5))
  151.     (setq j 1)
  152.     (repeat 4
  153.       (setq n (nth j data))
  154.       (setq m (strcat (car n) (rtos (cdr n) un PRECISION)))
  155.       (make-text first m (polar ins ang (* j HIG)))
  156.       (setq j (1+ j))
  157.     )
  158.     (princ "\n统计已经完成!")
  159.   )
  160.   (princ)
  161. )
  162. ;;;统计函数
  163. (defun STAT (numlst / len sum ave var sqr std)
  164.   (setq len (length numlst))                        ;样本数目
  165.   (setq sum (apply '+ numlst))                      ;和
  166.   (setq ave (/ sum len))                            ;均值
  167.   (setq var (mapcar '(lambda (x) (* (- x ave) (- x ave))) numlst))
  168.                                                     ;差平方
  169.   (setq sqr (/ (apply '+ var) len))                 ;方差  variance
  170.   (setq std (sqrt sqr))                             ;标准差
  171.   (list
  172.     (cons "样本数......" len)
  173.     (cons "总和........" sum)
  174.     (cons "平均值......" ave)
  175.     (cons "方差........" sqr)
  176.     (cons "标准差......" std)
  177.   )
  178. )

修改后程序见附件,加载后+-×/启动运算

本帖子中包含更多资源

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

x
发表于 2010-7-19 01:42:00 | 显示全部楼层
嘿嘿!我不会。但是给你关注一下。帮你推一把
 楼主| 发表于 2010-7-19 13:23:00 | 显示全部楼层

希望有大虾解答

发表于 2010-7-19 17:28:00 | 显示全部楼层

注意看一下Mtext的组码 11

11

X 轴方向矢量(在 WCS 中)
DXF:X 值;APP:三维矢量
将作为 DXF 输入传递的组码 50(以弧度为单位的旋转角)转换为相等的方向矢量(如果同时传递代码 50 和代码 11、21、31,则对最后一个代码进行转换)。这是从文字对象转换的一种简便方法。

Text的组码 11

11

第二对齐点(在 OCS 中)(可选)
DXF:X 值;APP:三维点
只有当 72 或 73 组的值非零时,该值才有意义(如果对正不是基线对正/左对正)

程序中 make-text 函数始终传递inspt到10 与11 组码段 当是Mtext的时候就与Text有变化
 楼主| 发表于 2010-7-19 20:48:00 | 显示全部楼层

那问下大虾有没有好的修改方法,入门不久,琢磨不出来!

 楼主| 发表于 2010-7-20 21:09:00 | 显示全部楼层

怎么没人来帮助啊?

发表于 2010-7-21 09:26:00 | 显示全部楼层
修改 make-text 函数 就可以了
  1. (defun make-text (first string inspt / remove txtlst lst)
  2.   (setq remove (list -1 330 5 1 10 11 50))
  3.   (setq txtlst (entget first))
  4.   (foreach n txtlst
  5.     (if (not (member (car n) remove))
  6.       (setq lst (cons n lst))
  7.     )
  8.   )
  9.   (if (= (cdr (assoc 0 lst)) "MTEXT")
  10.     (setq lst (subst (cons 41 (* (strlen string) 3)) (assoc 41 lst) lst))
  11.     );_重新计算多行文本的宽度
  12.   (setq lst (cons (cons 1 string) lst))
  13.   (setq lst (cons (cons 10 inspt) lst))
  14. ;;;  (setq lst (cons (cons 11 inspt) lst))
  15.   (setq lst (reverse lst))
  16.   (cdr (assoc 40 (entmake lst)))
  17. )
 楼主| 发表于 2010-7-21 17:36:00 | 显示全部楼层

谢谢帅哥,在线噢!

gufeng
终于可以用了,我也终于搞懂了,开始不了解组码,顺便传一个“查看取得图元对象的DXF组码数据值“小工具,此程序来自网络!答谢大家!见附件!

本帖子中包含更多资源

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

x
 楼主| 发表于 2010-7-29 08:45:00 | 显示全部楼层
麻烦大侠看看,这个程序问题,还是有问题加载后有时候正常,有时候又出现这种错误!见附件(运行时没有加载其他LISP)
  1. ;;;说明
  2. ;(alert "提醒:
  3. ;      \n请首先设置好输精度<小数点位数>,在绘图的过程中可随时用命令JD设置精度。
  4. ;       \n命令"+ - * /"分别代表对所选择的数字求和差积商。
  5. ;       \n其中"- /" 则是以你第一个选到的数字文本为被减数和被除数。
  6. ;       \n命令".."(点点)代表对所选择的数字文本统一加减乘除某个数,默认为1。
  7. ;       \n命令"TJ"代表对所选择的数字文本进行数学统计。
  8. ;       \n所有生成的新文本均与第一个选到的数字文本的样式相同(除角度外)。"
  9. ;)
  10. ;;;定义了一个全局变量为精度
  11. (defun C:JD (/ )
  12. ;;(prompt "\n请输入精度,直接回车则为系统精度:")
  13.   (initget 4)
  14.   (if (setq PRECISION (getint))
  15.      (princ)
  16.      (setq PRECISION (getvar "LUPREC"))
  17.   )
  18. )
  19. ;;(C:JD)  
  20. ;;;加
  21. (defun C:AW (/ key sel ins first numlst result)
  22.   (while (common1)
  23.     (setq result (apply '+ (cadr numlst)))
  24.     (common2)         
  25.   )
  26.   (princ)
  27. )
  28. ;;;减
  29. (defun C:AD (/ key sel ins first numlst result)
  30.   (while (common1)
  31.     (setq result (apply '- (cadr numlst)))
  32.     (common2)         
  33.   )
  34.   (princ)
  35. )
  36. ;;;乘
  37. (defun C:AE (/ key sel ins first numlst result)
  38.   (while (common1)
  39.     (setq result (apply '* (cadr numlst)))
  40.     (common2)         
  41.   )
  42.   (princ)
  43. )
  44. ;;;除
  45. (defun C:AR (/ key sel ins first numlst result)
  46.   (while (common1)
  47.     (setq result (apply '/ (cadr numlst)))
  48.     (common2)         
  49.   )
  50.   (princ)
  51. )
  52. ;;;所有数字都加减乘除某个数
  53. (defun C:AF (/ key op sel ins first numlst result)
  54.   (while (setq sel (ssget '((0 . "TEXT,MTEXT"))))
  55.     (setq first  (ssname sel 0))
  56.     (setq Numlst (sel->list sel))
  57.     (initget 1 "+ - * /")
  58.     (setq key (getkword "\n请输入加减乘除符号<+ - * />:"))
  59.     (initget 2)
  60.     (if (null (setq op (getreal "\n请输入操作数<默认为1>:")))
  61.       (setq op 1.0)
  62.     )        
  63.     (all-cal numlst key op)         
  64.   )
  65.   (princ)
  66. )
  67. ;;;
  68. (defun all-cal (result sym op / lst old new)
  69.   (foreach n (car numlst)
  70.     (setq lst (entget n))
  71.     (setq old (atof (cdr (assoc 1 lst))))
  72.     (setq new (eval (cons (read sym) (list old op))))
  73.     (setq new (cons 1 (rtos new (getvar "LUNITS") PRECISION)))
  74.     (setq lst (subst new (assoc 1 lst) lst))
  75.     (entmod lst)
  76.   )
  77. )
  78. ;;;选择和插入点
  79. (defun common1 ()
  80.   (and
  81.     (setq sel (ssget '((0 . "TEXT,MTEXT"))))
  82.     (null (initget 0 "Yes No"))
  83.     (if (setq key (getkword "\n是否保留原数字Yes,No?<默认不保留>:"))
  84.       (setq key "Yes")
  85.       (setq key "No")
  86.     )  
  87.     (setq first  (ssname sel 0))
  88.     (setq Numlst (sel->list sel))
  89.   )
  90. )
  91. ;;;做文字或者更新文字
  92. (defun common2 ()
  93.   (setq        result (rtos result (getvar "LUNITS") PRECISION))  
  94.   (if (= key "No")
  95.     (if (setq ins (getpoint "\n请输入插入点:"))
  96.       (make-text first result ins)
  97.     )
  98.     (update-text first result)
  99.   )
  100. )
  101. ;;;选择集合转化成数字列表
  102. (defun sel->list (sel / i ent lst num Els nls)
  103.   (setq i 0)
  104.   (repeat (sslength sel)
  105.     (setq ent (ssname sel i))
  106.     (setq lst (entget ent))
  107.     (setq num (atof (cdr (assoc 1 lst))))
  108.     (setq Els (cons ent Els))
  109.     (setq Nls (cons num Nls))
  110.     (setq i (1+ i))
  111.   )
  112.   (list
  113.     (reverse Els)
  114.     (reverse Nls)
  115.   )
  116. )  
  117. ;;;创建新文字,在指定点插入(源程序)
  118. ;(defun make-text (first string inspt / remove txtlst lst)
  119. ;  (setq remove (list -1 330 5 1 10 11 50))
  120. ;  (setq txtlst (entget first))
  121. ;  (foreach n txtlst
  122. ;    (if (not (member (car n) remove))
  123. ;      (setq lst (cons n lst))
  124. ;    )
  125. ;  )  
  126. ;  (setq lst (cons (cons 1 string) lst))
  127. ;  (setq lst (cons (cons 10 inspt) lst))
  128. ;  (setq lst (cons (cons 11 inspt) lst))
  129. ;  (setq lst (reverse lst))
  130. ;  (cdr (assoc 40 (entmake lst)))
  131. ;)
  132. ;注意看一下Mtext的组码 11
  133. ;11
  134. ;X 轴方向矢量(在 WCS 中)
  135. ;DXF:X 值;APP:三维矢量
  136. ;将作为 DXF 输入传递的组码 50(以弧度为单位的旋转角)转换为相等的方向矢量(如果同时传递代码 50 和代码 11、21、31,则;对最后一个代码进行转换)。这是从文字对象转换的一种简便方法。
  137. ;Text的组码 11
  138. ;11
  139. ;第二对齐点(在 OCS 中)(可选)
  140. ;DXF:X 值;APP:三维点
  141. ;只有当 72 或 73 组的值非零时,该值才有意义(如果对正不是基线对正/左对正)
  142. ;程序中 make-text 函数始终传递inspt到10 与11 组码段 当是Mtext的时候就与Text有变化
  143. (defun make-text (first string inspt / remove txtlst lst)
  144.   (setq remove (list -1 330 5 1 10 11 50))
  145.   (setq txtlst (entget first))
  146.   (foreach n txtlst
  147.     (if (not (member (car n) remove))
  148.       (setq lst (cons n lst))
  149.     )
  150.   )
  151.   (if (= (cdr (assoc 0 lst)) "MTEXT")
  152.     (setq lst (subst (cons 41 (* (strlen string) 3)) (assoc 41 lst) lst))
  153.     );_重新计算多行文本的宽度
  154.   (setq lst (cons (cons 1 string) lst))
  155.   (setq lst (cons (cons 10 inspt) lst))
  156. ; (setq lst (cons (cons 11 inspt) lst))
  157.   (setq lst (reverse lst))
  158.   (cdr (assoc 40 (entmake lst)))
  159. )
  160. ;;;保留文字,仅更新内容
  161. (defun update-text (ent string / txtlst)
  162.   (setq txtlst (entget ent))
  163.   (setq txtlst (subst (cons 1 string) (assoc 1 txtlst) txtlst))
  164.   (entmod txtlst)
  165. )
  166. ;;;统计数字文本
  167. (defun C:tj (/ un sel ins tollst numlst first data len ang HIG j n m)
  168.   (setq un (getvar "LUNITS"))
  169.   (while (and (setq sel (ssget '((0 . "TEXT,MTEXT"))))
  170.               (setq ins (getpoint "\n请输入插入点:")))
  171.     (princ "\n统计正在进行......")
  172.     (setq tollst (sel->list sel))
  173.     (setq numlst (cadr tollst))
  174.     (setq first  (caar tollst))
  175.     (setq data   (STAT numlst))
  176.     (setq len (strcat (caar data) (itoa (cdar data))))
  177.     (setq HIG (* (make-text first len ins) 1.5))
  178.     (setq ang (* Pi -0.5))
  179.     (setq j 1)
  180.     (repeat 4
  181.       (setq n (nth j data))
  182.       (setq m (strcat (car n) (rtos (cdr n) un PRECISION)))
  183.       (make-text first m (polar ins ang (* j HIG)))
  184.       (setq j (1+ j))
  185.     )
  186.     (princ "\n统计已经完成!")
  187.   )
  188.   (princ)
  189. )
  190. ;;;统计函数
  191. (defun STAT (numlst / len sum ave var sqr std)
  192.   (setq len (length numlst))                        ;样本数目
  193.   (setq sum (apply '+ numlst))                      ;和
  194.   (setq ave (/ sum len))                            ;均值
  195.   (setq var (mapcar '(lambda (x) (* (- x ave) (- x ave))) numlst))
  196.                                                     ;差平方
  197.   (setq sqr (/ (apply '+ var) len))                 ;方差  variance
  198.   (setq std (sqrt sqr))                             ;标准差
  199.   (list
  200.     (cons "样本数......" len)
  201.     (cons "总和........" sum)
  202.     (cons "平均值......" ave)
  203.     (cons "方差........" sqr)
  204.     (cons "标准差......" std)
  205.   )
  206. )

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-10-2 08:38 , Processed in 0.188508 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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