Lispboy 发表于 2016-6-24 01:14:43

最强“拷贝+1”来了

本帖最后由 Lispboy 于 2018-6-6 01:31 编辑

支持曲线阵列的第二版发布,见:http://bbs.xdcad.net/thread-716036-1-1.html

----------------------------------------------
打造最强的“拷贝+1”,如有建议,请跟帖。

更新日志:1、2016.625日第二次更新,谢谢liuyj建议,增强功能,可以根据鼠标位置的数字进行递增操作。
      需要2016.0625+的XDRX API支持。
      新的LISP函数XD::Text:IndexAtCursor见:http://bbs.xdcad.net/thread-704581-1-1.html


(defun c:XDTB_Copy+1 (/ base dis dynpt e e1 i info msg myerr next num olderr
                        p p1 p2 pos posl prev pt tf txt txt1 txt2 typ v x
                     )
(defun myerr (msg)
    (princ (strcat "\n" msg))
    (xdrx_end)
    (xdrx_entity_delete e)
    (setq *error* olderr)
    (princ)
)
(defun _callback (dynpt)
    (xdrx_entity_move e (trans base 1 0) dynpt)
    (setq base (trans dynpt 0 1))
)
(defun _cale ()
    (setq e (xdrx_entity_copy e)
          e (ssname e 0)
          txt2 (strcat prev (itoa (+ (atoi txt1) 1 i)) next)
    )
    (setq typ (car (xdrx_object_classname e)))
    (cond
      ((= typ "INSERT")
      (setq e1 (xdrx_getpropertyvalue e "AttributeEntities"))
      (xdrx_setpropertyvalue (car e1) "textstring" txt2)
      )
      (t
      (xdrx_setpropertyvalue e "textstring" txt2)
      )
    )
    (setq i (1+ i))
)
(defun _check (e p / i next pos posl prev tf txt txt1 x)
      (setq typ (xdrx_object_classname e))
      (if (= (car typ) "INSERT")
      (setq e (car (xdrx_getpropertyvalue e "AttributeEntities")))
      )
    (if (and
          (setq txt (xd::text:indexatPoint e p))
          (setq pos (cadr txt)
                txt (car txt)
          )
          (setq txt1 (xdrx_string_regexps "+" txt))
          (setq posl (xdrx_string_regexpv)
                i -1
          )
          (vl-some '(lambda (x)
                      (setq i (1+ i))
                      (if (setq tf (<= (car x) pos (cadr x)))
                        (setq pos x)
                      )
                  ) posl
          )
      )
      (progn
      (setq prev (xdrx_string_mid txt 0 (car pos))
            next (xdrx_string_mid txt (last pos))
      )
      (list prev (nth i txt1) next)
      )
    )
)
(if (and
      (setq e (xdrx_entsel "\n选取带数字的字符串或属性<退出>" '(
                              (-4 . "<or")
                              (-4 . "<and")
                              (0 . "insert")
                              (66 . 1)
                              (-4 . "and>")
                              (0 . "text")
                              (-4 . "or>")
                           )
                )
      )
      (setq p (trans (cadr e) 1 0)
            e (car e)
      )
      (setq info (_check e p))
      )
    (progn
      (xdrx_begin)
      (xdrx_sysvar_push '("osmode" 33))
      (setq olderr *error*)
      (setq *error* myerr)
      (setq prev (car info)
            txt1 (cadr info)
            next (last info)
      )
      (initget 128 "A")
      (xdrx_initget 128 "A")
      (if (setq base (getpoint "\n基点[阵列(A)]<退出>:"))
      (progn
          (cond
            ((= base "A")
            (if (and
                  (setq p1 (getpoint "\n方向第一点<退出>:"))
                  (setq p2 (getpoint p1 "\n方向第二点<退出>:"))
                  (progn
                      (initget 128 "1 2 3 4 5 6 7 8 9")
                      (xdrx_initget 128 "1 2 3 4 5 6 7 8 9")
                  )
                  (setq num (getint "\n阵列数目<退出>:"))
                  )
                (progn
                  (setq i 0)
                  (_cale)
                  (setq v (mapcar
                            '-
                            p2
                            p1
                        )
                        dis (xdrx_vector_length v)
                        v (trans v 1 0 t)
                  )
                  (repeat num
                  (xdrx_entity_move e (setq base (xd::geom:get9pt e 5))
                                    (mapcar
                                        '+
                                        base
                                        v
                                    )
                  )
                  (_cale)
                  )
                )
            )
            )
            (t
            (setq i 0)
            (_cale)
            (while (setq pt (xd::drag:gmove base "\n下一点<退出>:" -7 nil
                                              t "_callback"
                              )
                     )
                (_cale)
            )
            )
          )
          (xdrx_entity_delete e)
      )
      )
    )
    (progn
      (if e
      (xdrx_prompt "\n没有选中数字.")
      )
    )
)
(xdrx_sysvar_pop)
(xdrx_end)
(setq *error* olderr)
(princ)
)


/db_自贡黄明儒_ 发表于 2016-6-24 08:15:21

这个程序是很实用的,你早一点写嘛。我花了大量时间来写这个程序

lucas3 发表于 2016-6-24 08:19:34

/db_自贡黄明儒_ 发表于 2016-6-24 08:15
这个程序是很实用的,你早一点写嘛。我花了大量时间来写这个程序

黄大,也开始用晓东工具箱呢? 你的版本呢?

liuyj 发表于 2016-6-24 09:24:39

能把指定位置的数字+指定数值,就真的是最强了。比方说:AAxBBy格式的,xy都是数字,不仅可以y+1(n),还可以对x+1(n),再扩展xAAyBBz等。再加强点,对J-A1F2-1这样的,指定A和F之间的数字+1。

453055586 发表于 2016-6-24 11:29:45

怎么这么贵的呢,不过还是得谢谢分享

Lispboy 发表于 2016-6-24 12:46:15

liuyj 发表于 2016-6-24 09:24
能把指定位置的数字+指定数值,就真的是最强了。比方说:AAxBBy格式的,xy都是数字,不仅可以y+1(n),还可 ...

指定位置什么的,加上都很容易,因为用了正则表达式,代码也不会增加多少,但是实际中需要这样的很多吗? 什么情况需要把前面的数字加1? 加上你说的功能,要牺牲多几次和CAD交互的时间,值得吗?

liuyj 发表于 2016-6-24 13:12:40

值得,比我复制过去再改文字还是快。比方说,我要把一层的编号为1的风机P-F1-1复制到各层,编号也为1,即P-F2-1,这时就用得到

liuyj 发表于 2016-6-24 13:14:34

另外,还可以增加一个点击目标文字增加指定数值的功能,这个比修改文字快多了

zhoufen564555 发表于 2016-6-24 22:12:17

:)牛辦!很好,不过看不了啊

XDSoft 发表于 2016-6-24 22:16:42

zhoufen564555 发表于 2016-6-24 22:12
牛辦!很好,不过看不了啊

你购买就看到了。

Lispboy 发表于 2016-6-25 14:41:12

liuyj 发表于 2016-6-24 13:14
另外,还可以增加一个点击目标文字增加指定数值的功能,这个比修改文字快多了

更新了,试试新功能。

liuyj 发表于 2016-6-25 15:11:37

非常好,多谢多谢。阵列能否改为动态显示效果?

Lispboy 发表于 2016-6-25 15:13:25

liuyj 发表于 2016-6-25 15:11
非常好,多谢多谢。阵列能否改为动态显示效果?

阵列是一瞬间的事, 动态有用吗?

liuyj 发表于 2016-6-25 15:24:30

从实用角度说确实没什么意义,之前qjchen写过一个阵列递增的程序,做成动态显示的,我觉得挺不错,所以建议一下。

turtles 发表于 2016-6-27 11:20:03

看起来很牛的样子啊,谢谢了
页: [1] 2 3 4 5 6
查看完整版本: 最强“拷贝+1”来了