明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1579|回复: 23

[讨论] 求任意拖动文字程序

[复制链接]
发表于 2022-3-10 20:43 | 显示全部楼层 |阅读模式
各位师兄,如下图,工作中经常要调整注解文字位置,常规做法是M移动,选中文字找基点,然后移动,大批量操作还是很繁琐,偶尔看到一个叫“拉移随心”程序,直接点文字,文字就跟着鼠标走,再点下就到目的地,很是方便,能否帮忙写个程序,谢谢!


本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-3-10 21:19 | 显示全部楼层
(defun c:tt ()
        (if(setq e(entsel))
                (command "move" (car e)""(cadr e) pause)
        )(princ)
)

点评

一个一个移动?不如if改while  发表于 2022-3-15 09:50

评分

参与人数 1明经币 +1 收起 理由
liwen888888 + 1 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2022-3-11 09:33 | 显示全部楼层
本帖最后由 夏生生 于 2022-3-11 22:58 编辑

给您几个函数,拼凑一下
(setq *xty-o2e* vlax-ename->vla-object *xty-e2o* vlax-vla-object->ename)
  1. ;;;      通用函数  动态移动
  2. ;;;参数: ss---------选择集、图元名、或图元名表
  3. ;;;       grmode-----grread参数
  4. ;;;       from-------移动基点UCS
  5. ;;;       vx----------是否平行向量,Vx平行该向量,nil任意
  6. ;;;       vy----------是否垂直向量,1平行,2垂直,3垂直或平行
  7. ;;;返回值:ss
  8. (defun xty-gr-move (ss grmode from vx vy / enlst gr loop pt pts)
  9.   (cond        ((eq (type ss) 'PICKSET) (setq enlst (xty-tr-ss2lst ss t)))
  10.         ((eq (type ss) 'ENAME) (setq enlst (list ss)))
  11.         ((eq (type ss) 'LIST) (setq enlst ss))
  12.         )
  13.   (setq        loop t
  14.         pts  from
  15.         )
  16.   (while loop
  17.     (setq gr (apply 'grread grmode)
  18.           pt (cadr gr)
  19.           gr (car gr)
  20.           )
  21.     (cond ((= gr 5) ;_当鼠标移动
  22.            (if vx
  23.              (progn (setq pt (xty-G-Orthopttov from pt vx))
  24.                     (cond ((= 1 vy) (setq pt (cadr pt))) ;_平行(ucs)
  25.                           ((= 2 vy) (setq pt (caddr pt))) ;_垂直(ucs)
  26.                           ((= 3 vy) (setq pt (car pt))) ;_—垂直或平行wcs)
  27.                           )
  28.                     )
  29.              )
  30.            (foreach n enlst (xty-move n pts pt)) ;_移动一个向量
  31.            (setq pts pt) ;_向量的相对移动
  32.            )
  33.           ((= gr 3) (setq loop nil)) ;_鼠标左键,结束移动
  34.           (t (setq loop nil)) ;_键盘任意键键,结束移动
  35.           )
  36.     )
  37.   ss
  38.   )
  1. ;;;=============================================
  2. ;;;      通用函数  选择集转图元名或obj表
  3. ;;;参数: ss------选择集
  4. ;;;       form----t返回图元名列表nil返回vba对象表
  5. ;;;返回值:图元名或obj表
  6. (defun xty-tr-ss2lst (ss form / n en lst)
  7.   (repeat (setq n (sslength ss))
  8.     (setq en (ssname ss (setq n (1- n))))
  9.     (setq lst (cons en lst))
  10.   )
  11.   (setq lst(reverse lst))
  12.   (if form lst (mapcar(function *xty-e2o*)lst))
  13. )
  1. ;;;=============================================
  2. ;;;      通用函数  移动图元
  3. ;;;参数: obj-------图元名、对象或选择集
  4. ;;;       from------移动自ucs
  5. ;;;       to--------移动至ucs
  6. ;;;返回值:obj
  7. (defun xty-move        (obj from to / a lst)
  8.   (if (= 'ENAME (type obj))
  9.     (setq obj (*xty-e2o* obj)
  10.           a   t
  11.           )
  12.     )
  13.   (cond        ((= 'ENAME (type obj))
  14.          (setq obj (*xty-e2o* obj)
  15.                a   t
  16.                )
  17.          )
  18.         ((= 'PICKSET (type obj)) (setq lst (xty-tr-ss2lst obj nil)))
  19.         )
  20.   (if (= 2 (length from))
  21.     (setq from (xty-G-addz from 0))
  22.     )
  23.   (if (= 2 (length to))
  24.     (setq to (xty-G-addz to 0))
  25.     )
  26.   (setq        from (vlax-3d-point (trans from 1 0))
  27.         to   (vlax-3d-point (trans to 1 0))
  28.         )
  29.   (if lst
  30.     (foreach n lst (vlax-invoke-method n 'move from to))
  31.     (vlax-invoke-method obj 'move from to)
  32.     )
  33.   (if a
  34.     (*xty-o2e* obj)
  35.     obj
  36.     )
  37.   )

  1. ;;;=============================================
  2. ;;;      通用函数  二维点变三维点
  3. ;;;参数: pt------二维点
  4. ;;;返回值:二维点
  5. (defun xty-G-addz (pt z)
  6.   (list (car pt) (cadr pt) z)
  7. )
  1. ;;;      通用函数  求过基点平行或垂直向量点
  2. ;;;参数: base------基点wcs
  3. ;;;       point-----方向点wcs
  4. ;;;       vx---------方向单位向量wcs
  5. ;;;返回值:(过基点平行或垂直向量点 过基点平行向量点 过基点垂直向量点)
  6. (defun xty-G-Orthopttov        (base pt vx / dx dy ptx pty vp vy)
  7.   (setq        vy  (xty-vec-vxv '(0.0 0.0 1.0) vx) ;_目标向量逆时针旋转90度
  8.         vp  (xty-vec-v-v pt base)
  9.         dx  (xty-vec-Dot vx vp) ;_vp向在目标向量上的投影
  10.         dy  (xty-vec-Dot vy vp) ;_vp向在目标向量垂直向量上的投影
  11.         ptx (xty-vec-v+v base (xty-vec-vxs vx dx))
  12.         pty (xty-vec-v+v base (xty-vec-vxs vy dy))
  13.   )
  14.   (if (< (abs dx) (abs dy))
  15.     (list pty ptx pty);_当x投影长度小于y投影长度
  16.     (list ptx ptx pty);_当x投影长度大于等于y投影长度
  17.   )
  18. )
  1. ;;;=============================================
  2. ;;;      通用函数  两向量相加
  3. ;;;参数: v1-------向量
  4. ;;;       V2-------向量
  5. ;;;返回值:向量
  6. ;;;几何意义:三角形法则(唯一的合成);平行四边形法则(力的合成)
  7. (defun xty-vec-v+v (v1 v2)
  8.   (mapcar (function +) v1 v2)
  9. )
  10. ;;;=============================================
  11. ;;;      通用函数  两向量相减
  12. ;;;参数: v1-------向量
  13. ;;;       V2-------向量
  14. ;;;返回值:向量,方向->2终点指向->1终点
  15. (defun xty-vec-v-v (v1 v2)
  16.   (mapcar (function -) v1 v2)
  17. )
  18. ;;;=============================================
  19. ;;;      通用函数  两表相乘
  20. ;;;参数: v1-------表
  21. ;;;       V2-------表
  22. ;;;返回值:表内元素相乘的表
  23. (defun xty-vec-v*v (v1 v2)
  24.   (mapcar (function *) v1 v2)
  25. )
  26. ;;;=============================================
  27. ;;;      通用函数  两向量的点积(内积)
  28. ;;;参数: v1-------向量
  29. ;;;       v2-------向量
  30. ;;;返回值:标量
  31. ;;;几何意义:可以用来表征或计算两个向量之间的夹角
  32. ;;;         以及在->2在->1向量方向上的投影
  33. ;;;>0夹角0~90;=0垂直;<0夹角90~180
  34. (defun xty-vec-Dot (v1 v2)
  35.   (apply (function +) (xty-vec-v*v v1 v2))
  36. )
  37. ;;;=============================================
  38. ;;;      通用函数  两向量的叉积(外积)
  39. ;;;参数: v1-------三维向量
  40. ;;;       v2-------三维向量
  41. ;;;返回值:三维向量
  42. ;;;几何意义:v1和v2组成的面的法向量
  43. ;;;         二维时,平行四边形面积
  44. (defun xty-vec-vxv ( u v )
  45.   (list
  46.     (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  47.     (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  48.     (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  49.   )
  50. )

点评

高手  发表于 2022-3-11 23:27
发表于 2022-3-24 01:40 | 显示全部楼层
cj52000 发表于 2022-3-17 11:13
谢谢,这个可以命令不中断,一直使用,能否加上使用此命令关闭正交,关闭捕捉

;;;;;在使用时会关闭正交与捕捉,完成或中途取消可以恢复到使用前的状态

(defun c:11 (/  *error* oldort osm e)
(defun *error*( msg )
(if oldort(setvar "orthomode" oldort))
(if osm(setvar "orthomode" osm))
(princ))

(setq oldort (getvar "orthomode"))
(setvar "orthomode" 0)
(setq osm (getvar "osmode"))
(setvar "osmode" 0)
(while (setq e (entsel))
  (command "move" (car e)""(cadr e) pause)
  )
(setvar "orthomode" oldort)
(setvar "osmode" osm)
(princ)
)
发表于 2022-3-10 22:48 | 显示全部楼层
我一般是选择文字然后选一个夹点, 按下空格就跟着走了,不用输入m ,同样适用于其他各种图元对象,
发表于 2022-3-11 08:58 | 显示全部楼层
如果没有理解错误的话,不理解那个“拉移随心”程序的意义,鼠标直接拖就是了,什么别的都不需要。
另外如楼上所言,夹点操作也很方便,移动拷贝缩放旋转等都可以。
发表于 2022-3-11 09:16 | 显示全部楼层
拉移随心一款经典的结构插件,在结构界是殿堂级的。随意拖动文字是其附带的功能,其功能主要是能按规则调整一串文字间的格式,除了文字,标注、闭合多段线、块等很多图元都可以使用。
发表于 2022-3-11 11:42 | 显示全部楼层
夏生生 发表于 2022-3-11 09:33
给您几个函数,拼凑一下
(setq *xty-o2e* vlax-ename->vla-object *xty-e2o* vlax-vla-object->ename)

大哥能否给个实例,不太会用
发表于 2022-3-11 14:19 | 显示全部楼层
本帖最后由 夏生生 于 2022-3-11 23:05 编辑
cghdy 发表于 2022-3-11 11:42
大哥能否给个实例,不太会用
  1. (defun c:tt ()
  2.   (setq        en (entsel)
  3.         pt (cadr en)
  4.         en (car en)
  5.         )
  6.   (xty-gr-move en '(t 15 0) pt nil nil)
  7.   )
  1. (defun c:tt ()
  2.   (setq        en (entsel)
  3.         pt (cadr en)
  4.         en (car en)
  5.         )
  6.   (xty-gr-move en '(t 15 0) pt '(0 1 0) 1)
  7.   )

本帖子中包含更多资源

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

x
发表于 2022-3-11 22:41 | 显示全部楼层
  1. (defun c:tt ()
  2.   (defun dxf (code e) (cdr (assoc code (entget e))))
  3.   (if (and (setq s1 (car (entsel "\n选择参照文本: ")))
  4.            (setq tx (dxf 1 s1))
  5.            (setq ss (ssget (list '(0 . "text") (cons 1 tx))))
  6.       )
  7.     (command "move" ss "" (dxf 10 s1) pause)
  8.   )
  9.   (princ)
  10. )

评分

参与人数 1明经币 +1 收起 理由
liwen888888 + 1 很给力!

查看全部评分

发表于 2022-3-11 22:48 | 显示全部楼层

no function definition: XTY-VEC-VXS
差个函数 大神
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 16:17 , Processed in 0.386858 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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