明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4000|回复: 17

求个文字的复制并平行实体的程序

[复制链接]
发表于 2013-4-19 23:04:57 | 显示全部楼层 |阅读模式
本帖最后由 baiyier1112 于 2013-4-20 17:49 编辑

求个lisp程序:如图,将文字连续复制到指定位置,并让文字与实体平行。
注意:复制后原文字要保留
(下面的动画示意是x_s_s_1做的)


拷贝文字随线角度,有高手x_s_s_1帮忙解决了,在此对其表示感谢。
由于这个功能我个人用的比较多,想要实现文字复制并平行实体,
即让这个功能适用于其他图元,包括曲线,块中线条等等。
我从明经找到了一个物体对齐的程序,不知能不能借鉴一下,现将两个程序的源代码附上,希望高手帮实现一下。

补充一下,我实际想要达到的效果:复制指定文字(如果能是实体会更加好),到指定线(包括曲线,块中线条等等)上的一点,并与该线平行,该命令可以连续操作。
实际操作效果类似与上面的第二个图片(第二个程序没有复制的功能,希望能补充上复制的功能。即:将第二个程序增加连续复制的效果。)
期待!!!!(第一个图片是第一个程序的效果。第二个图片是第二个程序的效果)


  1. ;;物体齐线 来自明经高手:yjr111

  2. (defun c:yxpq(/ e1 e2 ee s11 s22 point_e1 vla_e1 vla_e2 dxf_10 p1 jux_ang e1_ang1 e1_ang2 hudu1
  3.   JIAODU1 HUDU2 JIAODU2 JIAODU3)
  4.   (vl-load-com)
  5.   (setvar "cmdecho" 0)
  6.   (setq e1 (car(setq ee(nentsel"\n 请选择要对齐的物体:"))))
  7.   (setq s11 (entget e1))
  8.   (setq point_e1 (cdr(assoc 10 s11)))
  9.   (setq e2 (car(setq eee(entsel"\n 请选择物体要对齐的曲线"))))
  10.   (setq s22 (entget e2))
  11.   
  12.   ;;;;;;;;;;;取得点击点处最近的在实体或曲线的位置;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  13.        (setq vla_e1(vlax-ename->vla-object e1))
  14.          (setq vla_e2(vlax-ename->vla-object e2))
  15.    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      
  16.   (if(WCMATCH(cdr(assoc 0 s11))"*POLYLINE")
  17.       (progn
  18.         (setq p1(vlax-curve-getclosestpointto vla_e1 (cadr ee)));;;;;实体点击点若不在实体上,找到在实体上最近的点
  19.              (SETQ dxf_10 (massoc 10 s11))
  20.              (setq jux_ang(angle (nth 0 dxf_10)(nth 1 dxf_10)))
  21.           (setq e1_ang1(angle (nth 0 dxf_10) p1))
  22.            (setq e1_ang2(angle p1(nth 2 dxf_10) ) )
  23.       (if(= e1_ang1 pi)(setq e1_ang1 0.0))
  24.            (if(= e1_ang2 pi)(setq e1_ang2 0.0))
  25.            (if(= jux_ang pi)(setq jux_ang 0.0))
  26.        )
  27.   )   
  28.   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;取得待对齐的实体的旋转角度;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  29.      (cond
  30.       ((=(cdr(assoc 0 s11))"LINE")
  31.             (setq hudu1
  32.              (ATAN(/(-(cADdr(assoc 10 s11))(cADdr(assoc 11 s11)))(-(cAdr(assoc 10 s11))(cAdr(assoc 11 s11))))
  33.       )
  34.     )
  35.   )
  36.   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
  37.         ((WCMATCH(cdr(assoc 0 s11))"*POLYLINE,ARC")
  38.      (if
  39.       (or(equal jux_ANG e1_ang1 0.001)(equal jux_ANG e1_ang2 0.001))
  40.                   (setq hudu1  jux_ang )
  41.                   (setq hudu1  (+ jux_ang (* 0.5 pi)))
  42.     )
  43.    )
  44.             
  45.         ((WCMATCH(cdr(assoc 0 s11))"CIRCLE,SPLINE,ELLIPSE,XLINE")(setq hudu1  0 ))
  46.   (t (setq hudu1 (cdr(assoc 50 s11))))         
  47. )  
  48. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


  49.   
  50. (SETQ JIAODU1 (* (/ HUDU1 PI)180))
  51. ;;;;;;;;;;;;;;;;;;;;;;;;;;返回关联表中相同组码保存的信息,明经lsp QQ群信息;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  52. (defun massoc (code xlist / x nlist)
  53.   (setq nlist nil)
  54.     (foreach x xlist
  55.         (if (eq code (car x))
  56.             (setq nlist (cons (cdr x) nlist))
  57.         )
  58.   )
  59.     (reverse nlist)
  60. )



  61. ;;;;;;;;;;;;;;;;;;;;;;;;取得对齐直线的旋转角度;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  62. (COND
  63.   ((=(cdr(assoc 0 s22))"LINE")
  64.     (if
  65.       (/=
  66.         (setq chushu1(-(cAdr(assoc 10 s22))(cAdr(assoc 11 s22)))
  67.         )
  68.       0)
  69.                         (setq hudu2 (ATAN(/ (-(cADdr(assoc 10 s22))  (cADdr(assoc 11 s22))) chushu1)))
  70.                         (setq hudu2 (* 0.5 pi))
  71.     )
  72.   )
  73.   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      
  74.        ((WCMATCH(cdr(assoc 0 s22))"*POLYLINE,ARC,SPLINE")
  75.     (setq p2(vlax-curve-getclosestpointto vla_e2 (cadr eee)));;;;;曲线点击点若不在曲线上,找到在曲线上最近的点
  76.                 (setq p3
  77.            (vlax-curve-getclosestpointto vla_e2
  78.         (list
  79.             (+(car p2)0.001)
  80.           (+(cadr p2)0.001)
  81.           (+(caddr p2)0.0)
  82.         )
  83.       )
  84.     )
  85.           (setq hudu2 (angle p2 p3))
  86.    )
  87.   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      
  88. )
  89. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                              


  90. (SETQ JIAODU2 (* (/ HUDU2 PI)180))
  91.   ;;;;;;;;;;;;;;旋转平移;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  92.   (IF (> (LENGTH ee)2)
  93.     (PROGN (SETQ e1 (CAAR (REVERSE ee)))
  94.                   (setq point_e1 (cdr(assoc 10 (ENTGET e1)))
  95.                      jiaodu3 (*(/(cdr(assoc 50 (ENTGET e1)))PI)180)
  96.       )
  97.     )
  98.   )
  99.   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  100.     (cond
  101.     (
  102.       (and
  103.         (and
  104.                (and e1 e2)
  105.                (< (LENGTH ee)3)
  106.         )
  107.              (WCMATCH(cdr(assoc 0 s11))"*POLYLINE")
  108.          )
  109.       (command "_.rotate" e1 "" p1 (- jiaodu2 jiaodu1))  
  110.       (command  "_.MOVE" e1 ""  p1  pause)
  111.     )
  112.     (
  113.       (and
  114.            (and e1 e2)
  115.              (> (LENGTH ee)2)
  116.       )
  117.            (command "_.rotate" e1 "" point_e1 (- jiaodu2 jiaodu1 jiaodu3))  
  118.            (command  "_.MOVE" e1 ""  point_e1  pause)
  119.     )
  120.     (t(command "_.rotate" e1 "" point_e1 (- jiaodu2 jiaodu1 ))  
  121.       (command  "_.MOVE" e1 ""  point_e1  pause)
  122.            )
  123.   
  124.   )
  125.   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  126.   (princ)
  127. )


  1. ;;;拷贝文字随线角度 by x_s_s_1@163.com
  2. (vl-load-com)
  3. (defun c:ctb (/ ent enl pt1 pt2 mid_pt ang)
  4.   ;;;;;;;;;;;;;; ============================================================================
  5. (defun emk_t (layer pt1 pt2 text ang n72 n73 h w sty /)
  6.       (entmake (list '(0 . "text")
  7.          '(100 . "AcDbEntity")
  8.          (cons 8 layer)
  9.          '(100 . "AcDbText")
  10.          (cons 10 pt1)
  11.          (cons 1 text)
  12.          (cons 40 h)
  13.          (cons 41 w)
  14.          (cons 7 sty)
  15.          (cons 72 n72)
  16.         (cons 11 pt2)
  17.          (cons 50 ang)
  18.          (cons 73 n73)
  19.          )
  20.       )
  21.    )
  22.   ;;;;;;;;;;;;;; ============================================================================
  23.    (setq ent (car (entsel "\n选择文字:")))
  24. ;;;;;;;;;;;;;; ============================================================================
  25.      (if (= "TEXT" (cdr (assoc 0 (entget ent))))
  26.       (progn
  27.          (while (setq enl (entsel "\n选择对齐线:"))
  28.      (if (= "LINE" (cdr (assoc 0 (entget (car enl)))))
  29.         (progn
  30.       (setq pt1  (cdr (assoc 10 (entget (car enl))))
  31.            pt2  (cdr (assoc 11 (entget (car enl))))
  32.              mid_pt (vlax-curve-getClosestPointTo
  33.                (vlax-ename->vla-object (car enl))
  34.                (cadr enl)
  35.                   )
  36.         ang  (angle pt1 pt2)
  37.            )
  38.            (if (and (> ang (* 0.5 pi)) (<= ang (* pi 1.5)))
  39.               (setq ang (- ang pi))
  40.            )
  41.            (emk_t (cdr (assoc 8 (entget ent)))
  42.             '(0 0 0)
  43.             (polar mid_pt (+ ang (* 0.5 pi)) 100)
  44.             (cdr (assoc 1 (entget ent)))
  45.             ang
  46.             1
  47.             0
  48.             (cdr (assoc 40 (entget ent)))
  49.             (cdr (assoc 41 (entget ent)))
  50.             (cdr (assoc 7 (entget ent)))
  51.            )
  52.         )
  53.      )
  54.          )
  55.       )
  56. )
  57. ;;;;;;;;;;;;;; ============================================================================            
  58.   (princ)
  59. )

本帖子中包含更多资源

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

x

点评

此程序需要完善,最后拷贝的文字要沾在鼠标定位为好。  发表于 2016-4-15 17:06
发表于 2020-12-3 22:25:56 | 显示全部楼层
不错,刚找到这个lisp,那个老大能改改:能批量对齐于线中点更好
发表于 2024-7-1 21:04:43 | 显示全部楼层
十年前的程序,插眼
发表于 2013-4-20 08:53:29 | 显示全部楼层
  1. (defun c:ctb ()
  2. (setvar "CMDECHO" 0)
  3. (setq oldos (getvar "OSMODE"))
  4. (setvar "OSMODE" 0)
  5. (if (setq s1 (entsel "\n选择文字: ")) (progn
  6.   (setq en (car s1)
  7.         txth (cdr(assoc 40 (entget en)))
  8.         ptt (cdr(assoc 10 (entget en))))
  9.   (while (and (setq pt (getpoint "\n靠近线条一点: "))
  10.               (setq p1 (osnap pt "near")))
  11.    (setq ang (- (angle p1 pt) (/ pi 2)))
  12.    (if (<= (* pi 0.67) ang (* pi 1.6667)) (setq ang (- ang pi)))
  13.    (setq pt1 (polar p1 (+ ang (/ pi 2)) (/ txth 2)))
  14.    (command "copy" en "" ptt pt1)
  15.    (setq ent (entget (entlast)))
  16.    (entmod (subst (cons 50 ang) (assoc 50 ent) ent))
  17.   )
  18. ))
  19. (setvar "OSMODE" oldos)
  20. (setvar "CMDECHO" 1)
  21. (princ)
  22. )

点评

此程序完美!  发表于 2016-4-15 17:09
 楼主| 发表于 2013-4-20 17:29:16 | 显示全部楼层
本帖最后由 baiyier1112 于 2013-4-20 17:55 编辑
ZZXXQQ 发表于 2013-4-20 08:53


万分感谢,现在版主的这个程序,可以支持块中图元及PL线了,希望版主继续出手改进。我在1楼补充了下希望达到的效果,期待版主的无私奉献

补充一下,我实际想要达到的效果:复制指定文字(如果能是实体会更加好),到指定线(包括曲线,块中线条等等)上的一点,并与该线平行,该命令可以连续操作。
实际操作效果类似与上面的第二个图片(第二个程序没有复制的功能,希望能补充上复制的功能。即:将第二个程序增加连续复制的效果。)
期待!!!!(第一个图片是第一个程序的效果。第二个图片是第二个程序的效果)


我对自己语言上的表达不清像版主表示歉意!
另外请教下:复制后的文字距离直线的距离是哪个语句设定的?
有没有办法使用本程序后不改变cad的捕捉设置?


点评

程序正常退出时不改变捕捉设置。  发表于 2013-4-20 21:41
 楼主| 发表于 2013-4-21 09:13:34 | 显示全部楼层
baiyier1112 发表于 2013-4-20 17:29
万分感谢,现在版主的这个程序,可以支持块中图元及PL线了,希望版主继续出手改进。我在1楼补充了 ...

多谢~~~~~~~~~~~~~~~~~~~~~
发表于 2013-4-21 10:54:50 | 显示全部楼层
挺不错的,多谢分享
发表于 2013-5-16 12:56:06 | 显示全部楼层
做个记号,以备用
发表于 2013-5-16 15:54:44 | 显示全部楼层
做个记号,以备用
发表于 2013-5-17 00:40:43 | 显示全部楼层
很好用的程序 已备用
发表于 2013-5-23 07:13:21 | 显示全部楼层
很好用的程序
发表于 2013-7-21 15:37:37 | 显示全部楼层
做个记号 哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 14:25 , Processed in 0.237017 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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