明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1113|回复: 1

[讨论]文字裁切双位元函数

[复制链接]
发表于 2007-10-12 20:32:00 | 显示全部楼层 |阅读模式

[讨论]文字裁切双位元函数
或许已有高手编写过了,但因为没有找到过
所以编写了这支可以切断文字左边或右边的函数,
想请各位高手多多指导精简一下,
并看看是否还有其他要改进的地方.
谢谢~
  1. (SETQ STR "一二三四五") ;字串
  2. (SETQ STR_ST 3)  ;字串起始值 1...
  3. (SETQ STR_LH 3)  ;字串切割位数 1...N / NIL
  4. (SETQ DB_Byte T) ;双位元计算保留 T/NIL
  5. (SETQ CP_LF T)   ;反转左切 T/NIL
  6. (JTHWA-TRIM-STR STR STR_ST STR_LH DB_Byte CP_LF)
  7. exp1:
  8. (SETQ STR "1234567890")
  9. (JTHWA-TRIM-STR STR 3 1 t t)
  10. _$ "3"
  11. (JTHWA-TRIM-STR STR 3 2 n t)
  12. _$ "23"
  13. (JTHWA-TRIM-STR STR 3 1 n n)
  14. _$ "3"
  15. (JTHWA-TRIM-STR STR 3 2 n n)
  16. _$ "34"
  17. exp2:
  18. (SETQ STR "一二三四五")
  19. (JTHWA-TRIM-STR STR 3 2 n n)
  20. _$ "二"
  21. (JTHWA-TRIM-STR STR 3 3 n n)
  22. _$ "二?
  23. (JTHWA-TRIM-STR STR 3 3 t n)
  24. _$ "二三"
  25. (JTHWA-TRIM-STR STR 4 3 t n)
  26. _$ "二三"
  27. (JTHWA-TRIM-STR STR 4 4 t n)
  28. _$ "二三四"
  29. (JTHWA-TRIM-STR STR 4 4 n t)
  30. _$ "一二"
  31. (JTHWA-TRIM-STR STR 4 3 n t)
  32. _$ "@二"
  33. (JTHWA-TRIM-STR STR 5 2 t t)
  34. _$ "二三"  
  35. (JTHWA-TRIM-STR STR 7 3 t t)
  36. _$ "三四"
  37. (DEFUN JTHWA-TRIM-STR (STR STR_ST STR_LH DB_Byte CP_LF / ANS I ST01
  38.       ST02 STAL STNNB STR_LH-BK STR_LH-FT STR_LH-K
  39.       STR_LH-ME STR_ST-BK STR_ST-FT STR_ST-ME
  40.       STR_STLH SUBNB-K TSTNB )      
  41.   (SETQ STNNB NIL)
  42.   (SETQ STAL (tc:getstrwid STR))
  43.   (SETQ ST01 (CAR (tc:getstrwid STR)))
  44.   (SETQ ST02 (CDR (tc:getstrwid STR)))
  45.   (SETQ I -1)
  46.   (REPEAT ST01
  47.     (SETQ I (1+ I))
  48.     (SETQ TSTNB (strlen (NTH I ST02)))
  49.     (REPEAT TSTNB
  50.       (SETQ STNNB (CONS I STNNB))
  51.     )
  52.   )
  53.   (SETQ STNNB (reverse STNNB))
  54.   (IF CP_LF
  55.     ;; ======================处理左切字串
  56.     (PROGN
  57.       (SETQ STR_STLH (strlen STR))
  58.       (SETQ SUBNB-K (1- STR_ST))
  59.       (SETQ STR_ST-FT (IF (minusp (1+ SUBNB-K))
  60.    NIL
  61.    (NTH (1+ SUBNB-K) STNNB)
  62.         )
  63.       )
  64.       (SETQ STR_ST-ME (IF (minusp (NTH SUBNB-K STNNB))
  65.    NIL
  66.    (NTH SUBNB-K STNNB)
  67.         )
  68.       )
  69.       (SETQ STR_ST-BK (IF (minusp (1- SUBNB-K))
  70.    NIL
  71.    (NTH (1- SUBNB-K) STNNB)
  72.         )
  73.       )
  74.       (COND
  75. ((OR
  76.     (= SUBNB-K 0)
  77.     (minusp STR_ST)
  78.     (< STR_ST STR_LH)
  79.   )
  80.    (PRINT "Runner Error")
  81.    (SETQ ANS "")
  82. )
  83. (T
  84.    (IF DB_Byte
  85.      (PROGN
  86.        (IF (= STR_LH NIL)
  87.   (SETQ STR_LH (1- STR_ST))
  88.        )
  89.        (COND
  90.   ((= STR_ST-ME STR_ST-FT)
  91.     (SETQ STR_ST (1+ STR_ST))
  92.     (SETQ STR_LH (1+ STR_LH))
  93.   )
  94.   ((= STR_ST-ME STR_ST-BK)
  95.     (SETQ STR_ST STR_ST)
  96.   )
  97.        )
  98.        (IF STR_LH
  99.   (PROGN
  100.     (SETQ STR_LH-K (- STR_ST STR_LH))
  101.     (SETQ STR_LH-FT (IF (minusp (1+ STR_LH-K))
  102.         NIL
  103.         (NTH (1+ STR_LH-K) STNNB)
  104.       )
  105.     )
  106.     (SETQ STR_LH-ME (IF (minusp (NTH STR_LH-K STNNB))
  107.         NIL
  108.         (NTH STR_LH-K STNNB)
  109.       )
  110.     )
  111.     (SETQ STR_LH-BK (IF (minusp (1- STR_LH-K))
  112.         NIL
  113.         (NTH (1- STR_LH-K) STNNB)
  114.       )
  115.     )
  116.   )
  117.        )
  118.        (IF STR_LH
  119.   (PROGN
  120.     (COND
  121.       ((= STR_LH-ME STR_LH-FT)
  122.         (SETQ STR_LH STR_LH)
  123.       )
  124.       ((= STR_LH-ME STR_LH-BK)
  125.         (SETQ STR_LH (1+ STR_LH))
  126.       )
  127.     )
  128.     (SETQ ANS (SUBSTR STR (1+ (- STR_ST STR_LH)) STR_LH))
  129.   )
  130.   (SETQ ANS (SUBSTR STR 1 STR_ST))
  131.        )
  132.      )
  133.      (PROGN
  134.        (IF STR_LH
  135.   (SETQ ANS (substr STR (SETQ STR_ST (- (1+ STR_ST)
  136.             STR_LH
  137.          )
  138.           )
  139.       (SETQ STR_LH STR_LH)
  140.      )
  141.   )
  142.   (SETQ ANS (substr STR 1 STR_ST))
  143.        )
  144.      )
  145.    )
  146. )
  147.       )
  148.     )
  149.     ;; ======================处理右切字串
  150.     (PROGN
  151.       (SETQ STR_STLH (strlen STR))
  152.       (SETQ SUBNB-K (1- STR_ST))
  153.       (SETQ STR_ST-FT (IF (minusp STR_ST)
  154.    NIL
  155.    (NTH STR_ST STNNB)
  156.         )
  157.       )
  158.       (SETQ STR_ST-ME (IF (minusp (NTH SUBNB-K STNNB))
  159.    NIL
  160.    (NTH SUBNB-K STNNB)
  161.         )
  162.       )
  163.       (SETQ STR_ST-BK (IF (minusp (1- SUBNB-K))
  164.    NIL
  165.    (NTH (1- SUBNB-K) STNNB)
  166.         )
  167.       )
  168.       (COND
  169. ((OR
  170.     (= SUBNB-K 0)
  171.     (minusp STR_ST)
  172.     (> SUBNB-K STR_STLH)
  173.   )
  174.    (PRINT "Runner Error")
  175.    (SETQ ANS "")
  176. )
  177. (T
  178.    (IF DB_Byte
  179.      (PROGN
  180.        (COND
  181.   ((= STR_ST-ME STR_ST-FT)
  182.     (SETQ STR_ST STR_ST)
  183.   )
  184.   ((= STR_ST-ME STR_ST-BK)
  185.     (SETQ STR_ST (1- STR_ST))
  186.     (SETQ STR_LH (IF (= STR_LH NIL)
  187.      (SETQ STR_LH NIL)
  188.      (1+ STR_LH)
  189.           )
  190.     )
  191.   )
  192.        )
  193.        (IF (= STR_LH NIL)
  194.   (SETQ STR_LH NIL)
  195.   (IF STR_LH
  196.     (PROGN
  197.       (SETQ STR_LH-K (- (+ STR_ST STR_LH) 2))
  198.       (SETQ STR_LH-FT (IF (minusp (1+ STR_LH-K))
  199.           NIL
  200.           (NTH (1+ STR_LH-K) STNNB)
  201.         )
  202.       )
  203.       (SETQ STR_LH-ME (IF (minusp (NTH STR_LH-K STNNB))
  204.           NIL
  205.           (NTH STR_LH-K STNNB)
  206.         )
  207.       )
  208.       (SETQ STR_LH-BK (IF (minusp (1- STR_LH-K))
  209.           NIL
  210.           (NTH (1- STR_LH-K) STNNB)
  211.         )
  212.       )
  213.     )
  214.   )
  215.        )
  216.        (IF STR_LH
  217.   (PROGN
  218.     (COND
  219.       ((= STR_LH-ME STR_LH-FT)
  220.         (SETQ STR_LH (1+ STR_LH))
  221.       )
  222.       ((= STR_LH-ME STR_LH-BK)
  223.         (SETQ STR_LH STR_LH)
  224.       )
  225.     )
  226.     (SETQ ANS (SUBSTR STR STR_ST STR_LH))
  227.   )
  228.   (SETQ ANS (SUBSTR STR STR_ST))
  229.        )
  230.      )
  231.      (PROGN
  232.        (IF STR_LH
  233.   (SETQ ANS (substr STR STR_ST STR_LH))
  234.   (SETQ ANS (substr STR STR_ST))
  235.        )
  236.      )
  237.    )
  238. )
  239.       )
  240.     )
  241.   )
  242.   (PRINT ANS)
  243.   (prin1)
  244. )
  245. tc:getstrwid 函数
  246. 引用来源: http://bbs.mjtd.com/forum.php?mod=viewthread&tid=50326
  247. BY xxsheng
  248. (defun tc:getstrwid(str / m n a c)
  249.   (setq m 0)
  250.   (setq n 0)
  251.   (while (< m (strlen str))
  252.     (if (> (vl-string-elt str m) 128)
  253.       (progn
  254.         (setq n(1+ n))
  255.     (setq a (substr str (1+ m) 2))
  256.     (setq m(+ 2 m))
  257.       )
  258.       (progn
  259.     (setq n(1+ n))
  260.     (setq a (substr str (1+ m) 1))
  261.     (setq m(1+ m))
  262.       )
  263.     )
  264.     (setq c(cons a c))
  265.   )
  266.   (setq c(reverse c))
  267.   (cons n c)
  268. )
发表于 2023-4-5 23:24:08 | 显示全部楼层
国外有类似功能源码,我自己改进了一些,用于统计管线工程量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 14:48 , Processed in 0.159031 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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