明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: wudechao

[源码] 线动态拉伸(通杀line和pline,arc,ellipse,支持ucs座标系)LC

[复制链接]
发表于 2013-10-29 22:23:58 | 显示全部楼层
wudechao 发表于 2013-10-31 08:52
直线动态延伸这个命令就是个粗略拉长直线的命令,我在结构画图中就是拉伸集中标注线,引线,楼板钢筋的工具,没 ...

代替(command "lengthen" "dy")的命令,还不包括圆弧哦
 楼主| 发表于 2013-11-22 02:44:00 | 显示全部楼层
再次更新,支持圆弧,椭圆弧.
发表于 2014-4-9 22:03:36 | 显示全部楼层
怎样使用?
发表于 2014-5-2 15:36:13 | 显示全部楼层
支持楼主!谢谢
发表于 2014-6-25 08:11:08 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2014-6-25 23:25:44 | 显示全部楼层
看起来挺不错,但好像用处不大啊,平直的先夹点不就行的了,斜向的很少遇到
发表于 2015-12-25 23:04:28 | 显示全部楼层
本帖最后由 xiaolong1487 于 2015-12-25 23:24 编辑

我的 quote会出错 ,拉伸中误按键盘会出错!
改了下
  1. ;线动态拉伸(通杀line和pline,arc,ellipse,支持ucs座标系)
  2. (defun c:ts3 (/ *error* +- a ang ang0 angle0 angle1 angle2 angle3 b cen dis dis1 dis2 dxf e en ent ent2 epar gpt gpt1 grr i ind maj mpar n oor oos p1 p2 par per-pt point pt pt0 pt1 pt2 ptmid ptn ptold r1 r2 rad rat spar times tpar vlapto)
  3.   (vl-load-com)
  4.   (setvar "cmdecho" 0)
  5.   (defun *error* (msg)
  6.     (if oos
  7.       (setvar "osmode" oos)
  8.     )
  9.     (if oor
  10.       (setvar "orthomode" oor)
  11.     )
  12.   )
  13.   (setq oor (getvar "orthomode")
  14.     oos (getvar "osmode")
  15.   )
  16.   (setvar "orthomode" 0)
  17.   (setvar "osmode" 0)
  18.   (while (setq en (entsel "\n选择要修改的对象:"))
  19.     (if (= "LINE" (cdr (assoc 0 (entget (car en)))))
  20.       (progn
  21.         (prompt (strcat "\n指定新端点:"))
  22.         (setq point (osnap (cadr en) "nea"))
  23.         (setq ent (car en))
  24.         (setq dxf (entget ent))
  25.         (setq p1 (cdr (assoc 10 dxf))
  26.           p1 (trans p1 0 1)
  27.           p2 (cdr (assoc 11 dxf))
  28.           p2 (trans p2 0 1)
  29.         )
  30.         (setq dis1 (distance p1 point)
  31.           dis2 (distance p2 point)
  32.         )
  33.         (while (and (setq n (grread t 4 3)) (= (car n) 5))
  34.           (setq pt (cadr n))
  35.           (setq per-pt (trans (vlax-curve-getclosestpointto ent (trans pt 1 0) t) 0 1))
  36.           (setq per-pt (trans per-pt 1 0))
  37.           (if ptold
  38.             (grdraw point ptold 0)
  39.           )
  40.           (grdraw point pt 7)
  41.           (setq ptold pt)
  42.           (if (>= dis1 dis2)
  43.             (progn
  44.               (setq dxf (subst
  45.                           (cons 11 per-pt)
  46.                           (assoc 11 dxf)
  47.                           dxf
  48.                         )
  49.               )
  50.             )
  51.             (progn
  52.               (setq dxf (subst
  53.                           (cons 10 per-pt)
  54.                           (assoc 10 dxf)
  55.                           dxf
  56.                         )
  57.               )
  58.             )
  59.           )
  60.           (entmod dxf)
  61.         )
  62.         (grdraw point ptold 0)
  63.       )
  64.     )
  65.     (if (= "ARC" (cdr (assoc 0 (entget (car en)))))
  66.       (progn
  67.         (prompt (strcat "\n指定新端点:"))
  68.         (setq point (osnap (cadr en) "nea"))
  69.         (setq ent (car en))
  70.         (setq dxf (entget ent))
  71.         (setq cen (cdr (assoc 10 dxf))
  72.           rad (cdr (assoc 40 dxf))
  73.           angle1 (cdr (assoc 50 dxf))
  74.           angle2 (cdr (assoc 51 dxf))
  75.           p1 (polar cen angle1 rad)
  76.           p1 (trans p1 0 1)
  77.           p2 (polar cen angle2 rad)
  78.           p2 (trans p2 0 1)
  79.           dis1 (distance p1 point)
  80.           dis2 (distance p2 point)
  81.         )
  82.         (while (and (setq n (grread t 4 3)) (= (car n) 5))
  83.           (setq pt (cadr n))
  84.           (setq per-pt (trans (vlax-curve-getclosestpointto ent (trans pt 1 0) t) 0 1))
  85.           (setq per-pt (trans per-pt 1 0))
  86.           (setq per-pt (angle cen per-pt))
  87.           (if ptold
  88.             (grdraw point ptold 0)
  89.           )
  90.           (grdraw point pt 7)
  91.           (setq ptold pt)
  92.           (if (>= dis1 dis2)
  93.             (progn
  94.               (setq dxf (subst
  95.                           (cons 51 per-pt)
  96.                           (assoc 51 dxf)
  97.                           dxf
  98.                         )
  99.               )
  100.             )
  101.             (progn
  102.               (setq dxf (subst
  103.                           (cons 50 per-pt)
  104.                           (assoc 50 dxf)
  105.                           dxf
  106.                         )
  107.               )
  108.             )
  109.           )
  110.           (entmod dxf)
  111.         )
  112.         (grdraw point ptold 0)
  113.       )
  114.     )
  115.     (if (= "ELLIPSE" (cdr (assoc 0 (entget (car en)))))
  116.       (progn
  117.         (prompt (strcat "\n指定新端点:"))
  118.         (setq point (osnap (cadr en) "nea"))
  119.         (setq ent (car en))
  120.         (setq dxf (entget ent))
  121.         (setq cen (cdr (assoc 10 dxf))
  122.           maj (cdr (assoc 11 dxf))
  123.           rat (cdr (assoc 40 dxf))
  124.           a (distance '(0 0) maj)
  125.           b (* a rat)
  126.           angle0 (angle '(0 0) maj)
  127.           angle1 (cdr (assoc 41 dxf))
  128.           angle2 (cdr (assoc 42 dxf))
  129.         )
  130.         (setq r1 (/ (* a b) (sqrt (+ (expt (* b (cos angle1)) 2) (expt (* a (sin angle1)) 2)))))
  131.         (setq r2 (/ (* a b) (sqrt (+ (expt (* b (cos angle2)) 2) (expt (* a (sin angle2)) 2)))))
  132.         (setq angle1 (+ angle1 angle0)
  133.           angle2 (+ angle2 angle0)
  134.           point (trans point 1 0)
  135.           dis1 (distance (polar cen angle1 r1) point)
  136.           dis2 (distance (polar cen angle2 r2) point)
  137.           point (trans point 0 1)
  138.         )
  139.         (while (and (setq n (grread t 4 3)) (= (car n) 5))
  140.           (setq pt (cadr n))
  141.           (setq per-pt (trans (vlax-curve-getclosestpointto ent (trans pt 1 0) t) 0 1))
  142.           (setq per-pt (trans per-pt 1 0)
  143.             angle3 (angle cen per-pt)
  144.           )
  145.           (if (< angle3 angle1)
  146.             (setq angle3 (+ angle3 (* 2 pi)))
  147.           )
  148.           (setq per-pt (- angle3 angle0))
  149.           (if ptold
  150.             (grdraw point ptold 0)
  151.           )
  152.           (grdraw point pt 7)
  153.           (setq ptold pt)
  154.           (if (>= dis1 dis2)
  155.             (progn
  156.               (setq dxf (subst
  157.                           (cons 42 per-pt)
  158.                           (assoc 42 dxf)
  159.                           dxf
  160.                         )
  161.               )
  162.             )
  163.             (progn
  164.               (setq dxf (subst
  165.                           (cons 41 per-pt)
  166.                           (assoc 41 dxf)
  167.                           dxf
  168.                         )
  169.               )
  170.             )
  171.           )
  172.           (entmod dxf)
  173.         )
  174.         (grdraw point ptold 0)
  175.       )
  176.     )
  177.     (if (= "LWPOLYLINE" (cdr (assoc 0 (entget (car en)))))
  178.       (progn
  179.         (prompt (strcat "\n指定新端点:"))
  180.         (setq point (osnap (cadr en) "nea"))
  181.         (setq pt en)
  182.         (setq e (car pt)
  183.           pt0 (cadr pt)
  184.           ent2 (vlax-ename->vla-object e)
  185.         )
  186.         (if (and
  187.               (= (vlax-get-property ent2 'objectname) "AcDbPolyline")
  188.               (not (vlax-curve-isclosed ent2))
  189.             )
  190.           (progn
  191.             (setq pt0 (vlax-curve-getclosestpointto ent2 (trans pt0 1 0))
  192.               spar (vlax-curve-getstartparam e)
  193.               epar (vlax-curve-getendparam e)
  194.               tpar (- epar spar)
  195.               par (vlax-curve-getparamatpoint ent2 pt0)
  196.               ang0 (vlax-curve-getfirstderiv ent2 par)
  197.               ang0 (angle '(0 0) (list (car ang0) (cadr ang0)))
  198.               ind (fix par)
  199.               mpar (+ ind 0.5)
  200.             )
  201.             (while (and (setq grr (grread t 4 3)) (= (car grr) 5))
  202.               (setq pt1 (vlax-curve-getpointatparam e ind)
  203.                 pt2 (vlax-curve-getpointatparam e (+ ind 1))
  204.               )
  205.               (if (< par mpar)
  206.                 (setq i 0
  207.                   +- -
  208.                   times (+ ind 1)
  209.                 )
  210.                 (setq i pt1
  211.                   pt1 pt2
  212.                   pt2 i
  213.                   i 1
  214.                   +- +
  215.                   times (fix (- tpar ind))
  216.                 )
  217.               )
  218.               (setq gpt (cadr grr)
  219.                 gpt (trans gpt 1 0)
  220.                 gpt1 (polar gpt (+ (* 0.5 pi) ang0) (car gpt))
  221.                 ptmid (inters
  222.                         pt1
  223.                         pt2
  224.                         gpt
  225.                         gpt1
  226.                         nil
  227.                       )
  228.                 dis (distance pt1 ptmid)
  229.                 ang (angle pt1 ptmid)
  230.               )
  231.               (setq gpt (trans gpt 0 1))
  232.               (if ptold
  233.                 (grdraw point ptold 0)
  234.               )
  235.               (grdraw point gpt 7)
  236.               (setq ptold gpt)
  237.               (repeat times
  238.                 (setq n (+- ind i)
  239.                   i (1+ i)
  240.                   ptn (vlax-safearray->list (vlax-variant-value (vla-get-coordinate ent2 n)))
  241.                   vlapto (vlax-make-safearray vlax-vbdouble '(0 . 1))
  242.                 )
  243.                 (vlax-safearray-fill vlapto (polar ptn ang dis))
  244.                 (vla-put-coordinate ent2 n vlapto)
  245.               )
  246.             )
  247.             (grdraw point ptold 0)
  248.           )
  249.         )
  250.       )
  251.     )
  252.   )
  253.   (setvar "orthomode" oor)
  254.   (setvar "osmode" oos)
  255.   (setvar "cmdecho" 1)
  256.   (princ)
  257. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-15 09:39 , Processed in 0.147624 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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