明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4018|回复: 9

[函数] 老代码,字符串分解列表等

[复制链接]
发表于 2011-5-11 00:06 | 显示全部楼层 |阅读模式
注:此为老代码,老手稿。自从后来用了正则表达式,我再也不写字符串处理函数了,因为基本上所有的字符串问题,用一个正则表达式函数就解决了,......  无聊吧?

  1. ;;(x-txt2lst e) = text文本以单个文字列表输出.
  2. ;;(x-str2lst str) = 字符串分解列表.
  3. ;|
  4. (x-txt2lst e) = text文本以单个文字列表输出-------------------lxx.2004.8
  5. (x-txt2lst (ssname (ssget ":s" '((0 . "TEXT"))) 0))
  6. "cad总平面-规划图" -> ("c" "a" "d" "总" "平" "面" "-" "规" "划" "图")
  7. |;
  8. (defun x-txt2lst (e / txt st stl)
  9.   (setq txt (cdr(assoc 1 (entget e))) stl T);(x-getdxf e 1);;
  10.   (mapcar 'vl-list->string
  11.     (vl-remove-if 'null
  12.       (mapcar '(lambda(x)
  13.     (cond
  14.       ((< x 160) (list x)) ;; 一般 汉字编码 > 160. 英文符号<128.!!!
  15.       (T (if stl (setq st x stl nil)(setq stl (list st x))));;写法:确保返回值并设开关.
  16.      )
  17.   ) (vl-string->list txt)
  18.       )
  19.     )
  20.   )
  21. )

  22. ;(x-str2lst str) = 字符串分解列表.------ok!--------------------lxx.2004.7
  23. ;测试: (x-str2lst "1asd,+测试1e99") -> ("1" "a" "s" "d" "," "+" "测" "试" "1" "e" "9" "9")
  24. (defun x-str2lst (str / i k s lst)
  25.   (setq i 0 k (chr 160))
  26.   (while (/= "" (setq s (substr str (setq i (1+ i)) 1)))
  27.     (if (< s k)
  28.       (setq lst (cons s lst))
  29.       (setq lst (cons (substr str i 2) lst)
  30.      i (1+ i))
  31.     )
  32.   )(reverse lst)
  33. )
  34. ;| by lzh
  35. 偶也来发个Lisp处理汉字的,:)
  36. ;转换字符串为字符表,相当与VB.Net的ToChar -by 雪山飞狐.
  37. ;;(str2chrs "1asd,+测试1e99") -> ("1asd,+测试1e" "99") ????
  38. (defun Str2Chrs (strA / pAsc)
  39.   (setq pAsc (if (< (ascii strA) 128)12))
  40.   (cond ((> (strlen strA) pAsc)
  41.   (cons (substr strA 1 pAsc)
  42.         (str2Chrs (substr strA (1+ pAsc)))  ;;递归!
  43.   )
  44. )
  45. ((list (substr strA 1 pAsc)))
  46.   )
  47. )

  48. ;合并字符表,并加入分隔符,相当与VB的同名函数 -by 雪山飞狐.
  49. ;;(join '("并字符" "dd1" "分隔" "1" ",") ";") -> "并字符;dd1;分隔;1;,"
  50. (defun Join (Chrs fchr / pStr)
  51.   (setq pStr "")
  52.   (foreach i Chrs (setq pStr (strcat pStr i fchr)))
  53.   (substr pStr 1 (- (strlen pStr) (strlen fchr)))
  54. )
  55. |;
  56. ;| ********************************************* text字符串分解-垂直排列 vba ok!! *****************************************************
  57. ;; ********************************************* text字符串分解-水平排列 vba ok!! *****************************************************
  58. 'text字符串分解-垂直排列   修改by陌生人.
  59. '修改 from lzh
  60. Public Sub Textexv()
  61. Dim pText As AcadEntity
  62. Dim pnt
  63. ThisDrawing.Utility.GetEntity pText, pnt
  64. Dim str As String
  65. str = pText.TextString
  66. Dim pStr As String
  67. Dim Txth As Double
  68. Txth = pText.Height
  69. Dim inspt As ACAD_POINT
  70. inspt = pText.InsertionPoint
  71. Dim polarPnt As ACAD_POINT
  72. polarPnt = ThisDrawing.Utility.PolarPoint(inspt, (pText.Rotation + 1.57079), Txth)
  73. Do While Len(str) <> 0
  74. pStr = pStr & Left(str, 1) & "\P"
  75. str = Right(str, Len(str) - 1)
  76. Loop
  77. Set mT = ThisDrawing.ModelSpace.AddMText(polarPnt, 0, pStr)
  78. mT.Height = Txth
  79. mT.Rotation = pText.Rotation
  80. mT.StyleName = pText.StyleName
  81. ThisDrawing.SendCommand "Explode" & vbCr & "l" & vbCr & vbCr
  82. pText.Delete
  83. End Sub

  84. 'text字符串分解-水平排列  by陌生人.
  85. '位置有偏差!???
  86. '还不能真实还原,只能对宽度比例1:1的文本.
  87. Public Sub Textexh()
  88. Dim pText As AcadEntity
  89. Dim pnt
  90. ThisDrawing.Utility.GetEntity pText, pnt
  91. Dim str As String
  92. str = pText.TextString
  93. Dim pStr As String
  94. Dim Txth As Double
  95. Txth = pText.Height
  96. Dim inspt As ACAD_POINT
  97. inspt = pText.InsertionPoint
  98. Dim polarPnt As ACAD_POINT
  99. polarPnt = ThisDrawing.Utility.PolarPoint(inspt, (pText.Rotation + 1.57079), Txth)
  100. Do While Len(str) <> 0
  101. pStr = pStr & Left(str, 1) & "\H1X"
  102. str = Right(str, Len(str) - 1)
  103. Loop
  104. Set mT = ThisDrawing.ModelSpace.AddMText(polarPnt, 0, pStr)
  105. mT.Height = Txth
  106. mT.Rotation = pText.Rotation
  107. mT.StyleName = pText.StyleName
  108. ThisDrawing.SendCommand "Explode" & vbCr & "l" & vbCr & vbCr
  109. pText.Delete
  110. End Sub
  111. |;
  112. ;;(mapcar '(lambda(x)(set x nil))(list 'ent 'lst 'st 'p0 'h 'w 'ang 'sty 'st2 'mtxt))

  113. ;| (x-txt2m e) = text转换为可炸散的mtext 文本.--------ok!!!----------------------------lxx.2004.8.28
  114. 测试: (x-txt2m (car(entsel))) -> ok!!! 错位?!!
  115. 需要调用: dxf系列,x-begin 函数.
  116. |;
  117. (defun x-txt2m (e / ent lst st p0 h w ang sty st2 mtxt)
  118.   (setq ent (entget e)
  119. lst (x-getdxfs ent '(1 10 40 41 50 7 ))) ;; (文本内容 第一对齐点 字高 高宽比 倾角)  ;;dxf 系列函数.
  120.   ;; -> ("saa12到奥斯丁偶发.,3" (15124.4 9862.36 0.0) 1501.02 0.573312 0.207712)
  121.   (mapcar 'set (list 'st 'p0 'h 'w 'ang 'sty ) lst)
  122.   (setq ;h  (abs (- (caar (textbox ent)) (caadr (textbox ent))))
  123.         p1 (polar p0 (+ (/ PI 2) ang) h)
  124. st2 (apply 'strcat (cons (strcat "[url=file://\\W]\\W[/url]" (rtos w 2 4) ";")(mapcar '(lambda(x)(strcat x "[url=file://\\H1X]\\H1X[/url];")) (x-str2lst st)))));;加[url=file://\\H1X]\\H1X[/url]用于以后炸开!!
  125.   (setq mtxt (vla-addmtext *ms (vlax-3d-point p1) 0 st2)) ;; *ms = modelspace 全局.
  126.   (mapcar '(lambda(x y)(vlax-put mtxt x y)) (list 'height 'rotation 'stylename 'color)(list h ang sty (x-get e 'color)))
  127.   (entlast)
  128. )
  129. ;; 炸开text文本为单个字符,支持汉字.---ok!!!------------lxx.2004.8
  130. ;; 支持ucs.
  131. (defun c:xttx ( / ucsfl e)
  132.   (setq ucsfl (getvar "ucsfollow"))
  133.   (setvar "ucsfollow" 0)
  134.   (vl-cmdf ".undo" "be" ".ucs" "")
  135.   (vl-cmdf ".explode" (x-txt2m (setq e (ssname (ssget ":s" '((0 . "TEXT"))) 0)))  "")
  136.   (entdel e)
  137.   (vl-cmdf ".ucs" "p" ".undo" "e")
  138.   (setvar "ucsfollow" ucsfl)
  139.   (princ)
  140. )
  141. ;; >>>>>>>>>>> 配合 txt2m 使用!!!  可以得,求并编辑点击所在文字的程序.!!!!!!>>>>>>>
  142. ;(vl-cmdf ".explode" (entlast) "")
  143. ;;求文本总宽度: (list(cons 41 (abs (- (caar (textbox ent)) (caadr (textbox ent))))))
  144. ;|
  145. ;; 利用menucmd 调用 DIESEL 字符宏命令.
  146. (menucmd "M=$(+,10.2,33.004,55,34.02)") ;->"132.224" -》!!!特性:返回文本并保持小数位数(去0尾).
  147. (menucmd "M=$(+,10 2)") ;;-> "10"
  148. |;
  149. ;;;-----------------------------------------------------------------------------------;
  150. ;| (x$-cal do st1 st2 fuzz) = 两个数字字符的数学运算------------lxx.2004.8
  151. do = 支持的diesel运算.
  152. st1 st2 = 参与运算的字符.
  153. fuzz = 精度。为nil时候去尾0.
  154. 支持diesel表达式中:+ - * / < > >= <= != or xor and .
  155. 返回:计算结果的数字字符串.
  156. 测试:(x$-cal '+ "3" "4.25" nil) -> "7.25"
  157.      (x$-cal '+ "3" "4.25" 1)  -> "7.3" ;;四舍五入!!!
  158.      (x$-cal '+ "3" "4.24" 1)  -> "7.2"
  159.      (x$-cal '+ "3" "4.26" 1)  -> "7.3"
  160.      (x$-cal '* "-2" "4.25" nil) -> "-8.5"
  161.      (x$-cal '* "-2" "4.25" 2) -> "-8.50"
  162.      (x$-cal '* "4e18" "4.25" nil) -> "1.70000000E+19"
  163.      (x$-cal '* "555555" "555" nil) -> "308333025" !!!!!ok!!!!
  164.      对比: (cal CAL "555555*555") ->错误: 无效的数据类型或数据溢出: #<SUBR @0348244c <EXRXSUBR>>
  165.      命令行下: cal
  166.      >> 表达式: 555555*555
  167.      >> 错误: 整数必须介于 -32768 和 32767 之间.)
  168.      (x$-cal '> "22" "0.3" nil) -> "1" (为真)
  169.      (x$-cal '= "22" "0.3" nil) -> "0" (为假)
  170. 参: menucmd调用DIESEL方法取得系统中文日期时间.lsp
  171. |;
  172. (defun x$-cal (do st1 st2 fuzz)
  173.   (setq str (menucmd (strcat "M=$(" (vl-symbol-name do) "," st1 "," st2 ")")))
  174.   (if fuzz (rtos (distof str) 2 fuzz) str)
  175. )
  176. ;| 附录:
  177. DIESEL 函数目录  
  178. 状态的检索、计算和显示均由 DIESEL 函数执行。所有的函数最多只能包含 10 个参数,
  179. 包括函数名本身。如果超出此限制,将得到一条 DIESEL 错误信息.!!!!(限制!!!!)
  180. +(加)
  181. -(减)
  182. *(乘)
  183. /(除)
  184. =(等于)
  185. <(小于)
  186. >(大于)
  187. !=(不等于)
  188. <=(小于或等于)
  189. >=(大于或等于)
  190. and
  191. angtos
  192. edtime
  193. eq
  194. eval
  195. fix
  196. getenv
  197. getvar
  198. if
  199. index
  200. nth
  201. or
  202. rtos
  203. strlen
  204. substr
  205. upper
  206. xor
  207. |;
  208. ;;;-----------------------------------------------------------------------------------;

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-5-11 08:13 | 显示全部楼层
谢谢楼主的分享
先收藏了,慢慢看学习学习
谢谢
发表于 2011-5-13 09:12 | 显示全部楼层
樓主好樣的~~~支持源碼分享
頂一下
发表于 2011-5-13 10:15 | 显示全部楼层
还是觉得老的就是好。
发表于 2011-6-15 18:16 | 显示全部楼层
呵呵,厉害,我也写过,正则表达式用的不多
发表于 2011-10-7 21:46 | 显示全部楼层
本帖最后由 yjr111 于 2011-10-7 22:00 编辑

玩的就是心跳,我才不看正则表达式呢,不然lsp都不要玩了忘了说了:谢谢楼主的代码,正用得上!
发表于 2015-4-30 10:48 | 显示全部楼层
yjr111 发表于 2011-10-7 21:46
玩的就是心跳,我才不看正则表达式呢,不然lsp都不要玩了忘了说了:谢谢楼主的代码,正用得上!

x-getdxfs函数没有定义
发表于 2020-8-24 10:43 | 显示全部楼层
刀刀厉害啊
发表于 2022-3-1 15:12 | 显示全部楼层
qq973569511 发表于 2015-4-30 10:48
x-getdxfs函数没有定义

(defun x-getdxfs (ent lst / aa x)
  (setq aa (vl-remove-if-not '(lambda (x) (member (car x) lst)) ent)
        aa (vl-sort aa'(lambda (x y)(< (vl-position (car x) lst) (vl-position (car y) lst))))
  )
  (mapcar 'cdr aa)
)
发表于 2022-11-19 02:13 来自手机 | 显示全部楼层
感谢大佬分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-16 09:51 , Processed in 0.214521 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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