13816600495 发表于 2018-6-13 14:03:15

如何实现文字平滑挪动效果

各位好,我想实现一个文字平滑移动的效果,代码如下,创建文字的组码均为已知,采用循环的方式使文字不断移动位置,但是每次都看不到效果,一会功夫直接跳到最后一个坐标点生成文字,如果非要看到效果除非加上(command "REGEN")一起循环,但是在复杂图纸中会卡顿,请教大神有没解决的办法使文字每步都能刷新看到,从而实现平滑挪动,感谢!
(entmake (list (cons 0 "TEXT") (cons 1 en1) (cons 40 en40)   
(cons 41 en41) (cons 10 pt1) (cons 50 hd) (cons 7 en7) (cons 8 en8)));文字组码创建均为已知
(setq nn (entlast))
(repeat 100
(setq pt2 (polar pt1 hd 100));计算下个坐标点
(command "delay" 10);延时执行
(setq clww1 (assoc 10 (entget en)))
(setq clww2 (cons 10 pt2))
(entmod (subst clww2 clww1 (entget nn)));修改文字坐标点
)

yxp 发表于 2018-6-16 21:42:04

13816600495 发表于 2018-6-16 10:08
非常感谢!

;;entmod 函数文字移动效果
(defun c:test1()
(setq stxt(tblsearch "style"(getvar "TEXTSTYLE")))
(entmod (subst (cons 3 "dim.shx")(assoc 3 stxt) stxt))
(setq h (/ (getvar "VIEWSIZE") 5.0))
(entmake (list '(0 . "TEXT")(cons 1 "text123")(list 10 0 0 0)(cons 40 h)))
(setq en (entlast) dxf (entget en) loop t)
(princ "\n开始循环,右键结束")
(while loop
        (setq mouse (grread t 5 0) Flag (car mouse))
        (cond
                ((= Flag 2)(princ "\n你按下了键盘,键盘编码: ")(princ (cadr mouse)))
                ((= Flag 3)(princ "\n你按下了鼠标左键,当前坐标: ")(princ (cadr mouse)))
                ((= Flag 11)(princ "\n你按下了鼠标右键,程序结束。")(setq loop nil))
                ((= Flag 5) (entmod(setq dxf (subst (cons 10 (cadr mouse))(assoc 10 dxf) dxf))))
                (t (princ "\n未知输入。")(setq loop nil))
        )
)(princ)
)

;;acet-ss-drag-move 函数文字移动效果,CAD2016以上版本无需加载 ACET 函数
(defun c:test2()
(princ "选择需要移动的文字")
(setq p2 (acet-ss-drag-move (setq ss(ssget))(setq p1(getpoint "\n起始点:")) "\n移动到..." 1 0))
(command "_move" ss "" p1 p2)
(princ)
)
还有其他几种方法就不一一列举了。

namezg 发表于 2018-8-9 10:58:45

本帖最后由 namezg 于 2018-8-9 12:17 编辑

(defun c:test (/ nn pt1 hd pt2)
        (setvar "cmdecho" 0)
        (setq pt1 (getpoint "\n请输入文字的第一对齐点: "))
        (setq nn (entmakex (list (cons 0 "TEXT") (cons 1 "文字") (cons 40 3.5)(cons 41 1) (cons 10 pt1) (cons 50 (setq hd (* 0.25 pi))) (cons 7 "standard") (cons 8 "0"))))
        (repeat 100
                (setq pt2 (polar pt1 hd 1.0));计算下个坐标点
                (command "delay" 10);延时执行
                (entmod (subst (cons 10 pt2) (cons 10 pt1) (entget nn)));修改文字坐标点
                ;(command "REGEN")
                (setq pt1 pt2)
        )
        (setvar "cmdecho" 1)
        (princ)
)
写成命令就要加(command "REGEN"),单独执行代码就不用,还没明白为什么。
而且如果加入(command "REGEN"), (command "delay" 10)都可以去掉不用。

namezg 发表于 2018-8-9 11:36:43

本帖最后由 namezg 于 2018-8-9 11:59 编辑

;用move命令可实现
(defun c:test (/ nn pt1 hd pt2)
      (setvar "cmdecho" 0)
      (setq nn (entmakex (list (cons 0 "TEXT") (cons 1 "文字") (cons 40 3.5)(cons 41 1) (cons 10 (setq pt1 (getpoint "\n请输入文字的第一对齐点: "))) (cons 50 (setq hd (* 0.25 pi))) (cons 7 "standard") (cons 8 "0"))))
      (repeat 100
                (setq pt2 (polar pt1 hd 1.0));计算下个坐标点
                (command "delay" 10);延时执行
                (command "move" nn "" "non" pt1 "non" pt2)
                (setq pt1 pt2)
      )
      (setvar "cmdecho" 1)
      (princ)
)

669423907 发表于 2018-6-14 14:47:30

我不会,只能给你一些参考
以p1 p2为方向,每次移动p1 p2的1%

yxp 发表于 2018-6-15 16:54:23

有三种办法,一个是entmod实现,一个grread实现,最简单的是用一个et函数,等我打开电脑的时候给你代码

13816600495 发表于 2018-6-16 10:08:01

yxp 发表于 2018-6-15 16:54
有三种办法,一个是entmod实现,一个grread实现,最简单的是用一个et函数,等我打开电脑的时候给你代码

非常感谢!:handshake

13816600495 发表于 2018-6-16 22:45:34

yxp 发表于 2018-6-16 21:42
还有其他几种方法就不一一列举了。

谢谢你的代码,但这不是我的意思,我的意思是已有一个文字和一个新坐标点,将文字挪到新坐标点,有一个可视化的挪动效果,而不是文字瞬间消失和生成,有个文字挪动的轨迹,纯粹就是想好看点,我用while不断计算轨迹上的下个坐标点,但是图纸就是不显示文字,每次都是卡顿后直接生成在目标坐标点,一定需要加上这个(command "regen")才行,但是每次刷新图纸就很卡了,不知道我的表述是否清晰,不管是否明白,还是感谢你的热心,谢谢。

fcrosstour 发表于 2018-6-17 13:38:19

13816600495 发表于 2018-6-16 22:45
谢谢你的代码,但这不是我的意思,我的意思是已有一个文字和一个新坐标点,将文字挪到新坐标点,有一个可 ...

grread+entmod可以实现

oistre 发表于 2018-8-7 12:48:02

谢谢你的代码

yanshengjiang 发表于 2018-8-8 10:47:22

大哥你的电脑移动复制不显示吗

张大锤 发表于 2018-8-8 11:08:27

我感覺1樓說的 才是你想要的
页: [1] 2
查看完整版本: 如何实现文字平滑挪动效果