最强“拷贝+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
这个程序是很实用的,你早一点写嘛。我花了大量时间来写这个程序
黄大,也开始用晓东工具箱呢? 你的版本呢? 能把指定位置的数字+指定数值,就真的是最强了。比方说:AAxBBy格式的,xy都是数字,不仅可以y+1(n),还可以对x+1(n),再扩展xAAyBBz等。再加强点,对J-A1F2-1这样的,指定A和F之间的数字+1。 怎么这么贵的呢,不过还是得谢谢分享 liuyj 发表于 2016-6-24 09:24
能把指定位置的数字+指定数值,就真的是最强了。比方说:AAxBBy格式的,xy都是数字,不仅可以y+1(n),还可 ...
指定位置什么的,加上都很容易,因为用了正则表达式,代码也不会增加多少,但是实际中需要这样的很多吗? 什么情况需要把前面的数字加1? 加上你说的功能,要牺牲多几次和CAD交互的时间,值得吗?
值得,比我复制过去再改文字还是快。比方说,我要把一层的编号为1的风机P-F1-1复制到各层,编号也为1,即P-F2-1,这时就用得到 另外,还可以增加一个点击目标文字增加指定数值的功能,这个比修改文字快多了 :)牛辦!很好,不过看不了啊 zhoufen564555 发表于 2016-6-24 22:12
牛辦!很好,不过看不了啊
你购买就看到了。
liuyj 发表于 2016-6-24 13:14
另外,还可以增加一个点击目标文字增加指定数值的功能,这个比修改文字快多了
更新了,试试新功能。 非常好,多谢多谢。阵列能否改为动态显示效果? liuyj 发表于 2016-6-25 15:11
非常好,多谢多谢。阵列能否改为动态显示效果?
阵列是一瞬间的事, 动态有用吗? 从实用角度说确实没什么意义,之前qjchen写过一个阵列递增的程序,做成动态显示的,我觉得挺不错,所以建议一下。 看起来很牛的样子啊,谢谢了