找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2535|回复: 9

[研讨] 我想加谁,我就左击谁;我想减谁,我就右击谁;我想退出

[复制链接]

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-12-17 16:48:36 | 显示全部楼层 |阅读模式

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

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

×
我想加谁,我就左击谁;我想减谁,我就右击谁;我想退出,我就击改变不了的字符。
密切注视eachy和st788796的帖子,st788796说这个功能可以有,但只见楼梯响,不见人下来,自己搞了一个,又不太理想.
  1. (defun C:SBJJ (/ CHANGESTR+ CHANGESTR- EN H LENLIST PT PTT SCL STY X XLIST Y)
  2.   
  3.   ;;1 击鼠标左右键时执行
  4.   ;;Flag(T,左击;nil右击)
  5.   (defun leftPick (e pt Flag / EN H PT1 SCL STR STY X Y)
  6.     (set 'en (entget e))
  7.     (mapcar '(lambda (x y) (set y (cdr (assoc x en))))
  8.             (list 7 1 40 41)
  9.             (list 'sty 'str 'h 'scl)
  10.     )
  11.     (setq pt (trans pt 1 0))                                    ;wcs
  12.     (cond ((equal (cdr (assoc 0 en)) "TEXT")
  13.            (vl-cmdf "_.ucs" "OB" e)                            ;转到对象坐标系
  14.            (setq pt1 (trans pt 0 1))                            ;当前ucs
  15.            (vl-cmdf "_.ucs" "_p")                            ;恢复ucs
  16.            (TextleftPick e en sty str h scl pt1 T Flag)
  17.           )
  18.           (T (MTextleftPick e en sty h scl pt Flag))
  19.     )
  20.   )
  21.   ;;2 多行文本变化
  22.   (defun MTextleftPick
  23.          (e en sty h scl pt Flag / 4P E1 EN1 I N NEWSTR PT1 SS STR1 STR2 Flag1)
  24.     (vla-copy (vlax-ename->vla-object e))
  25.     (vl-cmdf "_.explode" (entlast))
  26.     (setq ss (ssget "_P"))
  27.     (setq NewStr "")
  28.     (setq i 0)
  29.     (repeat (setq n (sslength ss))
  30.       (setq e1 (ssname ss i))
  31.       (setq en1 (entget e1))
  32.       (setq str1 (cdr (assoc 1 en1)))
  33.       (vl-cmdf "_.ucs" "OB" e1)                                    ;转到对象坐标系
  34.       (setq pt1 (trans pt 0 1))                                    ;当前ucs   
  35.       (setq 4p (HH:Text4p sty str1 h 1))
  36.       (vl-cmdf "_.ucs" "_p")                                    ;恢复ucs   
  37.       (if (HH:PtInPts 4p pt1)
  38.         (if (setq str2 (TextleftPick e1 en1 sty str1 h 1 pt1 nil Flag))
  39.           (setq NewStr (strcat NewStr str2 "\\P"))
  40.           (setq Flag1 T)
  41.         )
  42.         (if (equal (1- n) i)
  43.           (setq NewStr (strcat NewStr str1))
  44.           (setq NewStr (strcat NewStr str1 "\\P"))
  45.         )
  46.       )
  47.       (setq i (1+ i))
  48.     )
  49.     (vl-cmdf "_.erase" ss "")
  50.     (if        Flag1
  51.       nil
  52.       (entmod (subst (cons 1 NewStr) (assoc 1 en) en))
  53.     )
  54.   )
  55.   ;;3 单行文本变化
  56.   ;;Flag1(T,entmod en;nil str更新后的内容)
  57.   ;;Left(T,左击,执行ChangeStr+;nil,右击,执行ChangeStr-)
  58.   (defun TextleftPick (e     en           sty         str   h     scl   pt         Flag1 Left  /           DO
  59.                        FLAG  H           LENLIST     N     NEWSTR         PTX   SCL   SINCHR
  60.                        STR1  STY   X         XLIST
  61.                       )
  62.     (setq SinChr (XD::String:SingleChr str))
  63.     (setq xlist "")
  64.     (mapcar '(lambda (x)
  65.                (setq xlist (strcat xlist x))
  66.                (setq LenList (cons (XD::String:Len sty xlist h scl) LenList))
  67.              )
  68.             SinChr
  69.     )
  70.     (setq ptx (car pt))
  71.     (setq Flag T
  72.           n 0
  73.     )
  74.     (while Flag
  75.       (if (< (car LenList) ptx)
  76.         (setq Flag nil)
  77.         (setq LenList (cdr LenList))
  78.       )
  79.       (setq n (1+ n))
  80.     )
  81.     (setq n (1+ (- (length SinChr) n)))                            ;点取的是n+1
  82.     (setq NewStr "")
  83.     (repeat n
  84.       (setq NewStr (strcat NewStr (car SinChr)))
  85.       (setq SinChr (cdr SinChr))
  86.     )
  87.     (if        Left
  88.       (setq do ChangeStr+)
  89.       (setq do ChangeStr-)
  90.     )
  91.     (if        (setq str1 (do (car SinChr)))
  92.       (progn
  93.         (setq NewStr (strcat NewStr str1))
  94.         (setq SinChr (cdr SinChr))
  95.         (while SinChr
  96.           (setq NewStr (strcat NewStr (car SinChr)))
  97.           (setq SinChr (cdr SinChr))
  98.         )
  99.         (if flag1
  100.           (entmod (subst (cons 1 NewStr) (assoc 1 en) en))
  101.           NewStr
  102.         )
  103.       )
  104.     )
  105.   )
  106.   ;;4 + 左击时
  107.   (defun ChangeStr+ (str / S STR1 STR2 STR3 STR4 STR5)
  108.     (setq str1 (list "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))
  109.     (setq str2 (list "零" "壹" "贰" "叁" "伍" "陆" "柒" "捌" "玖" "拾"))
  110.     (setq str3 (list "0"   "一" "二" "三" "四" "五" "六" "七" "八" "九" "十"))
  111.     (setq str4 (list "㈠" "㈡" "㈢" "㈣" "㈤" "㈥" "㈦" "㈧" "㈨" "㈩"))
  112.     (setq str5 (list "①" "②" "③" "④" "⑤" "⑥" "⑦" "⑧" "⑨" "⑩"))
  113.     (cond ((setq s (member str str1)) (memstr s str1))
  114.           ((and (> (ascii str) 64) (< (ascii str) 91))
  115.            (cond ((equal (ascii str) 90) "A")
  116.                  (T (chr (1+ (ascii str))))
  117.            )
  118.           )
  119.           ((and (> (ascii str) 96) (< (ascii str) 123))
  120.            (cond ((equal (ascii str) 122) "a")
  121.                  (T (chr (1+ (ascii str))))
  122.            )
  123.           )
  124.           ((setq s (member str str2)) (memstr s str2))
  125.           ((setq s (member str str3)) (memstr s str3))
  126.           ((setq s (member str str4)) (memstr s str4))
  127.           ((setq s (member str str5)) (memstr s str5))
  128.     )
  129.   )
  130.   ;;5
  131.   (defun memstr        (s str1)
  132.     (if        (= (length s) 1)
  133.       (car str1)
  134.       (cadr s)
  135.     )
  136.   )  
  137.   ;;6 - 右击时
  138.   (defun ChangeStr- (str / S STR1 STR2 STR3 STR4 STR5)
  139.     (setq str1 (list "9" "8" "7" "6" "5" "4" "3" "2" "1" "0"))
  140.     (setq str2 (list "拾" "玖" "捌" "柒" "陆" "伍" "叁" "贰" "壹" "零"))
  141.     (setq str3 (list "十" "九" "八" "七" "六" "五" "四" "三" "二" "一" "0"))
  142.     (setq str4 (list "㈩" "㈨" "㈧" "㈦" "㈥" "㈤" "㈣" "㈢" "㈡" "㈠"))
  143.     (setq str5 (list "⑩" "⑨" "⑧" "⑦" "⑥" "⑤" "④" "③" "②" "①"))
  144.     (cond ((setq s (member str str1)) (memstr s str1))
  145.           ((and (> (ascii str) 64) (< (ascii str) 91))
  146.            (cond ((equal (ascii str) 65) "Z")
  147.                  (T (chr (1- (ascii str))))
  148.            )
  149.           )
  150.           ((and (> (ascii str) 96) (< (ascii str) 123))
  151.            (cond ((equal (ascii str) 97) "z")
  152.                  (T (chr (1+ (ascii str))))
  153.            )
  154.           )
  155.           ((setq s (member str str2)) (memstr s str2))
  156.           ((setq s (member str str3)) (memstr s str3))
  157.           ((setq s (member str str4)) (memstr s str4))
  158.           ((setq s (member str str5)) (memstr s str5))
  159.     )
  160.   )
  161.   ;;7 本程序主程序  
  162.   (princ "\n请点选要修改的字符:(左键+1右键-1)")
  163.   (while
  164.     (cond ((and        (setq pt (grread t 4 2))                    ;获取grread值
  165.                 (equal (car pt) 5)
  166.            )
  167.            (progn
  168.              (setq ptt (cadr pt)
  169.                    en  (nentselp ptt)
  170.              )
  171.              t
  172.            )
  173.           )
  174.           ((and (equal (car pt) 3) en (ssget (cadr en) '((0 . "*TEXT")))) ;3为左键
  175.            (leftPick (car en) (cadr en) T)
  176.           )
  177.           ((and        (or (equal (car pt) 11) (equal (car pt) 25))
  178.                 en
  179.                 (ssget (cadr en) '((0 . "*TEXT")))
  180.            )                                                    ;右键
  181.            (leftPick (car en) (cadr en) nil)
  182.           )
  183.     )
  184.   )  
  185.   (princ)
  186. )

  187. ;;pt是否在点集内
  188. (defun HH:PtInPts (Pts pt / COUNT PTS1 VA X Y)
  189.   (setq Count 0)
  190.   (setq Pts1 (append (cdr Pts) (list (car Pts))))
  191.   (mapcar '(lambda (x y)
  192.              (setq va (- (angle pt x) (angle pt y)))
  193.              (cond ((> va pi) (setq va (- va pi)))
  194.                    ((< va (* -1 pi)) (setq va (+ va pi)))
  195.              )
  196.              (setq Count (+ Count va))
  197.            )
  198.           Pts
  199.           Pts1
  200.   )
  201.   (< (abs (- (abs Count) pi)) 0.000001)
  202. )
  203. ;;text四角点
  204. ;;(HH:PtInPts (HH:Text4p sty str h scl)  pt);返回pt是否在text内
  205. (defun HH:Text4p (sty str h scl / P1 P2 P3 P4)
  206.   (and (or (not sty)
  207.            (= sty "")
  208.            (not (tblsearch "style" sty))
  209.        )
  210.        (setq sty (getvar "textstyle"))
  211.   )
  212.   (setq p1 (textbox (list (cons 1 str) (cons 7 sty) (cons 40 h) (cons 41 scl))))
  213.   (setq p3 (cadr p1))
  214.   (setq p1 (car p1))
  215.   (setq p2 (list (car p1) (cadr p3)))
  216.   (setq p4 (list (car p3) (cadr p1)))
  217.   (list p1 p2 p3 p4)
  218. )
AddPlusByPick.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-17 17:08:05 来自手机 | 显示全部楼层
涉及到里面的多个相同字符的定位,XD::Text:StringBetween可能要改造一下,返回多个时的position及字串

点评

与相同字符没有关系,我是每个字符都计算长度了的。问题是你的那个预测文本长度,不知是我使用不灵,还是本来对汉字长度测不准?  详情 回复 发表于 2013-12-17 18:20
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-12-17 18:20:04 来自手机 | 显示全部楼层
st788796 发表于 2013-12-17 17:08
涉及到里面的多个相同字符的定位,XD::Text:StringBetween可能要改造一下,返回多个时的position及字串

与相同字符没有关系,我是每个字符都计算长度了的。问题是你的那个预测文本长度,不知是我使用不灵,还是本来对汉字长度测不准?

点评

比如文本中有三个 1 ,点击了中间的 1,这时替换时要给起始位置才能替换中间的  详情 回复 发表于 2013-12-18 07:03
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-18 07:03:42 来自手机 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-12-17 18:20
与相同字符没有关系,我是每个字符都计算长度了的。问题是你的那个预测文本长度,不知是我使用不灵,还是 ...

比如文本中有三个 1 ,点击了中间的 1,这时替换时要给起始位置才能替换中间的

点评

对于三个111,本程序是可以判断的。关键是汉字长度测不准  详情 回复 发表于 2013-12-18 08:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-12-18 08:16:39 | 显示全部楼层
st788796 发表于 2013-12-18 07:03
比如文本中有三个 1 ,点击了中间的 1,这时替换时要给起始位置才能替换中间的

对于三个111,本程序是可以判断的。关键是汉字长度测不准

点评

这个还要考虑进位吧  详情 回复 发表于 2013-12-18 13:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-18 13:31:16 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-12-18 08:16
对于三个111,本程序是可以判断的。关键是汉字长度测不准

这个还要考虑进位吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-12-18 22:05:34 | 显示全部楼层
跟两位大师一起学习。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-1-1 21:39:50 | 显示全部楼层
汉字宽度与字体也有关系,中英混排再加上符号,确实很难测准!不知道版主大大有没有好的方法!?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-3-20 11:08:21 | 显示全部楼层
XD::String:SingleChr
http://bbs.xdcad.net/forum.php?m ... sortid%26sortid%3D1

XD::String:Len
http://bbs.xdcad.net/forum.php?mod=viewthread&tid=671081
命令: ; 错误: 参数太多   这是怎么回事?

点评

我这里也是,黄大师解释一下呀!  详情 回复 发表于 2014-3-20 17:04
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3199个

财富等级: 富可敌国

发表于 2014-3-20 17:04:46 | 显示全部楼层
拉契 发表于 2014-3-20 11:08
XD::String:SingleChr
http://bbs.xdcad.net/forum.php?mod=viewthread&tid=672036&extra=page%3D1%26filt ...

我这里也是,黄大师解释一下呀!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 22:06 , Processed in 0.475199 second(s), 56 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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