明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10242|回复: 22

[已解答] 怎样实现多义线的随意拉伸

  [复制链接]
发表于 2011-11-7 19:55:08 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 menger_8 于 2011-11-7 20:48 编辑

[之前下的一个可以随意拉伸的vlx,点选多边形的任意边然后移动鼠标就可以实现与stretch相同的效果,想了很久,矩形很容易实现,但不规则形状的多边形不知道如何判断选中的是哪个边并实现拉伸,找了很久好像没有这方面的函数,望各位大虾能提供思路,附上网上下载的别人的插件
attach]62228[/attach]

本帖子中包含更多资源

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

x
发表于 2011-11-7 20:02:41 | 显示全部楼层
这个功能好,期待ing
发表于 2011-11-7 21:42:31 | 显示全部楼层
在autocad的教学里就有,每个人都可以自学。
发表于 2011-11-7 21:52:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-11-7 23:16:38 | 显示全部楼层
多谢楼主分享
 楼主| 发表于 2011-11-9 12:25:13 | 显示全部楼层
这个问题没有高手能解决么,期待中……
发表于 2011-11-9 14:26:09 | 显示全部楼层
本帖最后由 xiaxiang 于 2011-11-9 14:26 编辑

  1. (defun c:tt(/ pta3 ptb3 pt2n pt2nb i0)
  2. (setq oldos (getvar "osmode")) ;保存捕捉特性给oldos  
  3.   (setvar "cmdecho" 0)
  4.   (setvar "osmode" 247)
  5.   (command "undo" "be")
  6.   (if(= dis nil)
  7.     (while(not(setq dis (getreal "\n请输入拉伸距离:"))))
  8.     (setq dis (getreal (strcat "\n请输入拉伸距离:<" (rtos dis 2) ">")))
  9.   )
  10.   (if(= dis nil)(setq dis disold)(setq disold dis))
  11.   
  12.   (while(setq s1 (entsel "\n请指定拉伸的边:"))
  13.     (setq pta3 nil ptb3 nil pt2n nil pt2nb nil i0 nil)
  14.   (setq enlst (entget(car s1)))
  15.   (setq pt_lst'())
  16.   (if(= (cdr(assoc 0 enlst)) "LWPOLYLINE")
  17.     (progn
  18.       (setq p1 (cadr s1))
  19.       (command "circle" p1 1)
  20.       (setq p1 (cdr(assoc 10 (entget(entlast)))))
  21.       (entdel (entlast))
  22.       (setvar "osmode" 0)
  23.       (terpri)(while(not(setq ps1 (getpoint "\n请指定拉伸方向:"))))
  24.       (setvar "osmode" 247)
  25.       (foreach i enlst (if(or(= (car i) 10)(= (car i) 42))(setq pt_lst (cons (cdr i) pt_lst))))
  26.       (setq pt_lst (reverse pt_lst))
  27.       (setq i 0)
  28.       (while (setq p0 (nth i pt_lst))
  29. (setq p2 (nth (+ i 2) pt_lst))
  30. (if(= p2 nil)(setq p2 (nth 0 pt_lst) i0 -2)(setq i0 i))
  31. (setq ang1a (angle p0 p1))
  32. (setq ang2a (angle p1 p2))
  33. (if(or(equal ang1a ang2a 0.001)(equal (+ pi pi ang1a) ang2a 0.001)(equal (+ pi pi ang2a) ang1a 0.001))
  34.    (progn
  35.      (setq pta1 p0 ptb1 p2)     
  36.      (command "area" "o" (car s1))
  37.      (setq are1 (getvar "Perimeter"))
  38.      (command "offset" "t" s1 ps1 "")
  39.      (setq ssx1 (entlast))
  40.      (command "area" "o" ssx1)
  41.             (setq are2 (getvar "Perimeter"))
  42.      (entdel ssx1)
  43.      (if(> are2 are1)(setq ffxx "1")(setq ffxx "0"))
  44.      (if(<(- i 1)0)(setq tdza (nth (+(- i 1)(length pt_lst))pt_lst))
  45.        (setq tdza (nth (- i 1) pt_lst)))
  46.       (if(<(- i 2)0)(setq pta2 (nth (+(- i 2)(length pt_lst))pt_lst))
  47.        (setq pta2 (nth (- i 2) pt_lst)))
  48.      (if(or(/= tdza 0)(and(= tdza 0)(<= (distance pta2 pta1) (* 2 (sqrt 2)))))
  49.        (progn
  50.   (if(<(- i 3)0)(setq tdza1 (nth (+(- i 3)(length pt_lst))pt_lst))
  51.     (setq tdza1 (nth (- i 3) pt_lst)))
  52.   (if(= tdza1 0)
  53.     (progn
  54.       (if(<(- i 4)0)(setq pta3 (nth (+(- i 4)(length pt_lst))pt_lst))
  55.         (setq pta3 (nth (- i 4) pt_lst)))
  56.       (setq angla (angle pta3 pta2))
  57.     )
  58.   )
  59.        )
  60.        (setq angla (angle pta2 pta1))
  61.      )
  62.      
  63.      (if(<(+ i0 3)(length pt_lst))
  64.        (setq tdzb (nth (+ i0 3) pt_lst))
  65.        (setq tdzb (nth (-(+ i0 3)(length pt_lst)) pt_lst))
  66.      )
  67.      (if(<(+ i0 4)(length pt_lst))
  68.        (setq ptb2 (nth (+ i0 4) pt_lst))
  69.        (setq ptb2 (nth (-(+ i0 4)(length pt_lst)) pt_lst))
  70.      )
  71.      (if(or(/= tdzb 0)(and(= tdzb 0)(<= (distance ptb2 ptb1) (* 2 (sqrt 2)))))
  72.        (progn
  73.   (if(<(+ i0 5)(length pt_lst))
  74.     (setq tdzb1 (nth (+ i0 5) pt_lst))
  75.     (setq tdzb1 (nth (-(+ i0 5)(length pt_lst)) pt_lst))
  76.   )
  77.   (if(= tdzb1 0)
  78.     (progn     
  79.       (if(<(+ i0 6)(length pt_lst))
  80.         (setq ptb3 (nth (+ i0 6) pt_lst))
  81.         (setq ptb3 (nth (-(+ i0 6)(length pt_lst)) pt_lst))
  82.       )
  83.       (setq anglb (angle ptb3 ptb2))
  84.     )
  85.   )
  86.        )
  87.        (setq anglb (angle ptb2 ptb1))
  88.      )
  89.      (setq anga1 (angle pta1 ptb1))
  90.      (setq angb1 (angle ptb1 pta1))
  91.      (if(equal anga1 (* 2 pi) 0.0001)(setq anga1 0))
  92.      (if(equal angb1 (* 2 pi) 0.0001)(setq angb1 0))
  93.      (setq anga2 (+ pi angla) angb2 (+ pi anglb))
  94.      (if(>= anga2(* 2 pi))(setq anga2(- anga2 pi pi)))
  95.      (if(>= angb2(* 2 pi))(setq angb2(- angb2 pi pi)))
  96.      
  97.      (if(> anga2 anga1)(setq anga3(- anga2 anga1))(setq anga3(- anga1 anga2)))
  98.      (if(> angb2 angb1)(setq angb3(- angb2 angb1))(setq angb3(- angb1 angb2)))
  99.      (setq disna (/ dis (abs(sin anga3))))
  100.      (setq disnb (/ dis (abs(sin angb3))))
  101.      (if(= ffxx "1")(setq pt1n (polar pta1 angla disna))(setq pt1n (polar pta1 (+ pi angla) disna)))
  102.      (if(= ffxx "1")(setq pt1nb(polar ptb1 anglb disnb))(setq pt1nb(polar ptb1 (+ pi anglb) disnb)))
  103.      (if(/= pta3 nil)(if(= ffxx "1")(setq pt2n (polar pta2 angla disna))(setq pt2n (polar pta2 (+ pi angla) disna))))
  104.      (if(/= ptb3 nil)(if(= ffxx "1")(setq pt2nb(polar ptb2 anglb disnb))(setq pt2nb(polar ptb2 (+ pi anglb) disnb))))
  105.      (setq i (length pt_lst))
  106.           )
  107. )
  108. (setq i (+ 2 i))
  109.       )
  110.       (setq e (car s1))
  111.       (setq m (entget e))
  112.       (setq m (subst (cons 10 pt1n)(cons 10 pta1)m))
  113.       (entmod m)
  114.       (setq m (subst (cons 10 pt1nb)(cons 10 ptb1)m))
  115.       (entmod m)
  116.       (entupd e)
  117.       (if(/= pt2n nil)
  118. (progn
  119.    (setq m (subst (cons 10 pt2n)(cons 10 pta2)m))
  120.    (entmod m)
  121.           (entupd e)
  122. )
  123.       )
  124.       (if(/= pt2nb nil)
  125. (progn
  126.    (setq m (subst (cons 10 pt2nb)(cons 10 ptb2)m))
  127.    (entmod m)
  128.           (entupd e)
  129. )
  130.       )
  131.     )
  132.     (prompt "\n<您选择的线不是多义线,请串接成多义线再运行此程序!!!>")
  133.   )
  134.   )
  135.   (command "undo" "e")
  136. (setvar "osmode" oldos)        ;还原捕捉
  137. )

发表于 2011-11-9 15:22:17 | 显示全部楼层
本帖最后由 xshrimp 于 2011-11-9 15:52 编辑

参考



  1. (defun c:ofss (/ E G O P1 P2 V1 V2 V3)
  2.               ;|
  3. *************************************************************************************************
  4. *
  5. *        by ElpanovEvgeniy 26.02.2010
  6. *
  7. *        ----------------
  8. *        27.02.2010 8:30
  9. *        fix bug for acad 2004 (vlax-curve-getFirstDeriv e (vlax-curve-getEndParam e))
  10. *        ----------------
  11. *        27.02.2010 8:55
  12. *        fix bug for first arc segment
  13. *************************************************************************************************

  14. |;
  15. (setq e  (entsel)
  16.        p1 (cadr e)
  17.        e  (car e)
  18.        p1 (fix (vlax-curve-getParamAtPoint e (vlax-curve-getClosestPointTo e p1)))
  19.        o  (vlax-ename->vla-object e)
  20. ) ;_  setq
  21. (if (= 1 (cdr (assoc 70 (entget e))))
  22.   (cond ((zerop p1)
  23.          (setq p2 (1+ p1)
  24.                v1 (list (vlax-curve-getPointAtParam e (vlax-curve-getEndParam e))
  25.                         (vlax-curve-getFirstDeriv e (1- (vlax-curve-getEndParam e)))
  26.                   ) ;_  list
  27.                v2 (list (vlax-curve-getPointAtParam e p1) (vlax-curve-getFirstDeriv e 0.5))
  28.                v3 (list (vlax-curve-getPointAtParam e p2) (vlax-curve-getFirstDeriv e 1.5))
  29.          ) ;_  setq
  30.         )
  31.         ((= p1 (1- (vlax-curve-getEndParam e)))
  32.          (setq p2 0
  33.                v1 (list (vlax-curve-getPointAtParam e (1- p1))
  34.                         (vlax-curve-getFirstDeriv e (+ (1- p1) 0.5))
  35.                   ) ;_  list
  36.                v2 (list (vlax-curve-getPointAtParam e p1) (vlax-curve-getFirstDeriv e (+ p1 0.5)))
  37.                v3 (list (vlax-curve-getPointAtParam e p2) (vlax-curve-getFirstDeriv e (+ p2 0.5)))
  38.          ) ;_  setq
  39.         )
  40.         ((setq p2 (1+ p1)
  41.                v1 (list (vlax-curve-getPointAtParam e (1- p1))
  42.                         (vlax-curve-getFirstDeriv e (+ (1- p1) 0.5))
  43.                   ) ;_  list
  44.                v2 (list (vlax-curve-getPointAtParam e p1) (vlax-curve-getFirstDeriv e (+ p1 0.5)))
  45.                v3 (list (vlax-curve-getPointAtParam e p2) (vlax-curve-getFirstDeriv e (+ p2 0.5)))
  46.          ) ;_  setq
  47.         )
  48.   ) ;_  cond
  49.   (cond ((zerop p1)
  50.          (setq p2 (1+ p1)
  51.                v2 (list (vlax-curve-getPointAtParam e 0) (vlax-curve-getFirstDeriv e 0.5))
  52.                v1 (list (car v2) (list (cadadr v2) (- (caadr v2)) 0.))
  53.                v3 (list (vlax-curve-getPointAtParam e p2) (vlax-curve-getFirstDeriv e 1.5))
  54.          ) ;_  setq
  55.         )
  56.         ((= p1 (1- (vlax-curve-getEndParam e)))
  57.          (setq p2 (vlax-curve-getEndParam e)
  58.                v1 (list (vlax-curve-getPointAtParam e (1- p1))
  59.                         (vlax-curve-getFirstDeriv e (+ (1- p1) 0.5))
  60.                   ) ;_  list
  61.                v2 (list (vlax-curve-getPointAtParam e p1) (vlax-curve-getFirstDeriv e (+ p1 0.5)))
  62.                v3 (list (vlax-curve-getPointAtParam e p2) (list (cadadr v2) (- (caadr v2)) 0.))
  63.          ) ;_  setq
  64.         )
  65.         ((setq p2 (1+ p1)
  66.                v1 (list (vlax-curve-getPointAtParam e (1- p1))
  67.                         (vlax-curve-getFirstDeriv e (+ (1- p1) 0.5))
  68.                   ) ;_  list
  69.                v3 (list (vlax-curve-getPointAtParam e p2) (vlax-curve-getFirstDeriv e (+ p2 0.5)))
  70.                v2 (list (vlax-curve-getPointAtParam e p1) (vlax-curve-getFirstDeriv e (+ p1 0.5)))
  71.          ) ;_  setq
  72.         )
  73.   ) ;_  cond
  74. ) ;_  if
  75. (while (= (car (setq g (grread nil 5 0))) 5)
  76.   (vla-put-coordinate
  77.    o
  78.    p1
  79.    (vlax-make-variant
  80.     (vlax-safearray-fill (vlax-make-safearray 5 '(0 . 1))
  81.                          (reverse (cdr (reverse (inters (car v1)
  82.                                                         (mapcar '+ (car v1) (cadr v1))
  83.                                                         (cadr g)
  84.                                                         (mapcar '+ (cadr g) (cadr v2))
  85.                                                         nil
  86.                                                 ) ;_  inters
  87.                                        ) ;_  reverse
  88.                                   ) ;_  cdr
  89.                          ) ;_  reverse
  90.     ) ;_  vlax-safearray-fill
  91.    ) ;_  vlax-make-variant
  92.   ) ;_  vla-put-coordinate
  93.   (vla-put-coordinate
  94.    o
  95.    p2
  96.    (vlax-make-variant
  97.     (vlax-safearray-fill (vlax-make-safearray 5 '(0 . 1))
  98.                          (reverse (cdr (reverse (inters (car v3)
  99.                                                         (mapcar '+ (car v3) (cadr v3))
  100.                                                         (cadr g)
  101.                                                         (mapcar '+ (cadr g) (cadr v2))
  102.                                                         nil
  103.                                                 ) ;_  inters
  104.                                        ) ;_  reverse
  105.                                   ) ;_  cdr
  106.                          ) ;_  reverse
  107.     ) ;_  vlax-safearray-fill
  108.    ) ;_  vlax-make-variant
  109.   ) ;_  vla-put-coordinate
  110. ) ;_  while
  111. (princ)
  112. )

本帖子中包含更多资源

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

x

点评

不错!  发表于 2012-2-22 14:54
发表于 2011-11-9 15:26:53 | 显示全部楼层
经测试,有时候为何不能延伸?要点两下才又执行
发表于 2011-11-9 15:36:58 | 显示全部楼层
如果能用grread写出每次拉伸的步长,就更棒了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-23 11:35 , Processed in 0.192547 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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