明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: edata

[源码] 直线偏移连动~偏移后修改与其相接触的直线

    [复制链接]
 楼主| 发表于 2014-6-1 18:44:27 | 显示全部楼层
zjsru_18_505 发表于 2014-6-1 18:09
程序有BUG,实例如下:
(command "_line" '(10 0) '(10 10) '(10 20) '(20 20) '(10 10) "")

程序设计之初没有考虑同一方向上与之接触的线,所以说这样的图形出现了bug。该程序仅是考虑了偏移对象相接触并与偏移对象有角度的直线。其他不在该程序范围。
发表于 2014-6-1 19:00:38 | 显示全部楼层
对楼上几位的要求,综合修改了一下
  1. (defun
  2.    COLINEARP (P1 P2 P3)
  3. ;;;三点共线
  4.   ((lambda (A B C)
  5.      (or (equal (+ A B) C 1e-8) (equal (+ B C) A 1e-8) (equal (+ C A) B 1e-8))
  6.    )
  7.     (distance P1 P2)
  8.     (distance P2 P3)
  9.     (distance P1 P3)
  10.   )
  11. )

  12. (defun
  13.    SK_HIGHLIGHT        (SS FLAG / I EN)
  14. ;;;高亮图元或选择集
  15.   (if (= (type SS) 'PICKSET)
  16.     (progn
  17.       (setq I -1)
  18.       (repeat (sslength SS)
  19.         (setq EN (ssname SS (setq I (1+ I))))
  20.         (redraw
  21.           EN
  22.           (if FLAG
  23.             3
  24.             4
  25.           )
  26.         )
  27.       )
  28.     )
  29.   )
  30.   (if (= (type SS) 'ENAME)
  31.     (redraw
  32.       SS
  33.       (if FLAG
  34.         3
  35.         4
  36.       )
  37.     )
  38.   )
  39. )

  40. (defun
  41.    SK_ENTMOD (E CODE NEW / EN)
  42. ;;;(sk_entmod 图元名 组码 新值 )
  43.   (setq EN (entget E))
  44.   (entmod (subst (cons CODE NEW) (assoc CODE EN) EN))
  45. )


  46. (defun
  47.    C:TOO (/         ANG1        BUZO   CPT    E             E1            EN           I          IP12         J
  48.           LEN         MODCODE       NEW1   NEW2   NEWP1  NEWP2  OFFSETDI
  49.           OFFSETDI1        PT0    PT1    PT2    PT3    PT4           PT5          SS         SS1
  50.          )
  51. ;;;功能:偏移联动
  52. ;;;作者:修改自=楼主: edata
  53. ;;;时间:2014-6-1
  54.   (if (getenv "OFFSETDI")
  55.     (setq OFFSETDI (atof (getenv "OFFSETDI")))
  56.   )
  57.   (initget 6)
  58.   (if (> OFFSETDI 0)
  59.     (progn
  60.       (if (setq
  61.             OFFSETDI1
  62.              (getdist
  63.                (strcat "\n指定偏移距离" " <" (rtos OFFSETDI) ">:")
  64.              )
  65.           )
  66.         (setq OFFSETDI OFFSETDI1)
  67.       )
  68.     )
  69.     (progn
  70.       (while (not (setq OFFSETDI (getdist "\n指定偏移距离:"))) (initget 6))
  71.     )
  72.   )
  73.   (setenv "OFFSETDI" (rtos OFFSETDI))
  74.   (defun *ERROR* (MSG) (setvar "OSMODE" BUZO) (princ))
  75.   (while (setq SS (ssget '((0 . "line"))))
  76.     (setq
  77.       I        0
  78.       J        0
  79.     )
  80.     (setq BUZO (getvar "OSMODE"))
  81.     (setvar "OSMODE" 0)
  82.     (setq LEN (sslength SS))
  83.     (repeat LEN
  84.       (setq
  85.         E   (ssname SS I)
  86.         EN  (entget E)
  87.         PT1 (cdr (assoc 10 EN))
  88.         PT2 (cdr (assoc 11 EN))
  89.         PT0 (polar PT1 (angle PT1 PT2) (/ (distance PT1 PT2) 2))
  90.       )
  91.       (command "_.zoom" PT1 PT2)
  92.       (setq SS1 (ssget "_f" (list PT1 PT2) '((0 . "line"))))
  93.       (command "_.zoom" "p")
  94.       (SK_HIGHLIGHT SS1 t)
  95.       (if (setq PT3 (getpoint PT0 "\n指定要偏移的那一侧上的点 <退出当前>:"))
  96.         (progn
  97.           (SK_HIGHLIGHT SS1 NIL)
  98.           (setq SS1 (ssdel E SS1))
  99.           (setq
  100.             CPT         (inters
  101.                    PT3
  102.                    (polar PT3 (+ (angle PT1 PT2) (/ pi 2)) 1.0)
  103.                    PT1
  104.                    PT2
  105.                    NIL
  106.                  )
  107.             ANG1 (angle CPT PT3)
  108.             NEW1 (polar PT1 ANG1 OFFSETDI)
  109.             NEW2 (polar PT2 ANG1 OFFSETDI)
  110.           )
  111.           (while (setq E1 (ssname SS1 0))
  112.             (setq
  113.               EN      (entget E1)
  114.               PT4     (cdr (assoc 10 EN))
  115.               PT5     (cdr (assoc 11 EN))
  116.               MODCODE NIL
  117.             )
  118.             (if        (or (equal PT4 PT1 1e-8)
  119.                     (equal PT5 PT1 1e-8)
  120.                     (COLINEARP PT1 PT4 PT5)
  121.                 )
  122.               (if (setq NEWP1 (inters NEW1 NEW2 PT4 PT5 NIL))
  123.                 (setq NEW1 NEWP1)
  124.               )
  125.             )
  126.             (if        (or (equal PT4 PT2 1e-8)
  127.                     (equal PT4 PT2 1e-8)
  128.                     (COLINEARP PT2 PT4 PT5)
  129.                 )
  130.               (if (setq NEWP2 (inters NEW1 NEW2 PT4 PT5 NIL))
  131.                 (setq NEW2 NEWP2)
  132.               )
  133.             )
  134.             (if        (COLINEARP PT4 PT1 PT2)
  135.               (setq MODCODE 10)
  136.             )
  137.             (if        (COLINEARP PT5 PT1 PT2)
  138.               (setq MODCODE 11)
  139.             )
  140.             (if        (and (setq IP12 (inters NEW1 NEW2 PT4 PT5 NIL)) MODCODE)
  141.               (progn (SK_ENTMOD E1 MODCODE IP12))
  142.             )
  143.             (setq SS1 (ssdel E1 SS1))
  144.           )
  145.           (SK_ENTMOD E 10 NEW1)
  146.           (SK_ENTMOD E 11 NEW2)
  147.         )
  148.         (progn (princ "\n未指定方向点!") (SK_HIGHLIGHT SS1 NIL))
  149.       )
  150.       (setq I (1+ I))
  151.     )
  152.     (setvar "OSMODE" BUZO)
  153.   )
  154.   (princ)
  155. )

点评

确实有创意,好用  发表于 2014-11-15 09:29

评分

参与人数 1明经币 +1 收起 理由
edata + 1 赞一个!

查看全部评分

发表于 2014-6-2 12:11:56 | 显示全部楼层
edata 发表于 2014-5-9 18:09
LWPOLYLINE线单边偏移关联(仅多段线)

试了一下,相当给力!但是也发现了个问题,就是当坐标系不是世界坐标的时候出现了混乱情况。建议在前面加一个坐标系还原世界坐标。
发表于 2014-6-6 16:36:31 | 显示全部楼层
很给力顶一下
发表于 2014-6-15 23:48:05 | 显示全部楼层
好程序   经典实用
发表于 2014-11-7 21:36:06 | 显示全部楼层
好程序   经典实用
发表于 2014-11-14 14:23:16 | 显示全部楼层
程序很好用,但不支持UCS,希望改进一下支持UCS,谢谢!!
发表于 2014-11-29 19:30:13 来自手机 | 显示全部楼层
这个好,工作上用到
发表于 2014-11-30 08:39:16 | 显示全部楼层
E大的精品先收藏了
发表于 2014-12-2 17:35:06 | 显示全部楼层
楼主的思路很好,在他的启发下怎么来让我们用交叉多边形选择少选一半的点,另一半对称过来。

;点边界点来拉伸。

(defun c:test()

   (setq plst1'()
         plst2'()
         plst3'()
   )
   ;选择点。
   (while(setq pnt(getpoint))
      (setq plst1(cons (polar pnt 0  0.5) plst1)  ;0.5适合本人的工作图纸。
            plst2(cons (polar pnt pi 0.5) plst2)
      )
   )

   ;现在两表中有一半的点了。;把两个端点再调整一下。
   
   ;1表的两个端点。
   (setq pnt1(car plst1)
         pnt2(cadr plst1)
         an1 (angle pnt2 pnt1)
         pnt1(polar pnt1 an1 0.5)
         plst1(cdr plst1)
         plst1(cons pnt1 plst1)
         pnt3(nth (-(length plst1 )1) plst1)
         pnt4(nth (-(length plst1 )2) plst1)
         an2 (angle pnt4 pnt3)
         pnt5(polar pnt3 an2 0.5)
         plst1(vl-remove pnt3 plst1)
         plst1(append plst1 (list pnt5))
   )

   ;(command "circle" "non"pnt1 1)
   ;(command "circle" "non"pnt5 1)

         ;2表的两个端点。
   (setq pnt6(car plst2)
         pnt7(cadr plst2)
         an3 (angle pnt7 pnt6)
         pnt66(polar pnt6 an3 0.5)
         plst2(cdr plst2)
         plst2(cons pnt66 plst2)
         pnt8(nth (-(length plst1 )1) plst2)
         pnt9(nth (-(length plst1 )2) plst2)
         an4 (angle pnt9 pnt8)
         pnt88(polar pnt8 an4 0.5)
         plst2(vl-remove pnt8 plst2)
         plst2(append  plst2 (list pnt88) )
   )

   ;(command "circle" "non"pnt66 1)
   ;(command "circle" "non"pnt88 1)

   ;得到闭合点,反向2表。
   (setq pt2   (last plst2)
         plst2 (reverse plst2)
   )

   ;合并两个表   
   (setq plst3 (append plst2 plst1 (list pt2)))

   ;拉伸命令有CP选择的点表了
   (command "stretch" (ssget "CP"  plst3)"" pause)

)

(defun c:test1( / )
  
   (setq plst1'()
         plst2'()
         plst3'()
         dist (getdist"输入宽度")
         pntb (getpoint "选择边界点"))

   (if(null dist)(setq dist 0.5))
         
   (while (setq pnta (getpoint pntb"选择边界点"))
         
      (setq ana   (+(angle pntb pnta)(/ pi 2))
            anb   (+ ana pi)
            plst1 (cons (polar pntb  ana  dist) plst1)         
            plst2 (cons (polar pntb  anb  dist) plst2)
            pntb   pnta
      ) )

   (setq plst1 (cons (polar pntb    ana  dist) plst1)         
         plst2 (cons (polar pntb    anb  dist) plst2)
         pnt  (last plst)
         plst2 (reverse plst2)
         plst3 (append plst2 plst1 (list pnt)))

   (setq k 0 )
   (foreach pnts plst3
      (grdraw (nth k plst3) (nth (+ k 1) plst3) 1 0)
      (setq k(1+ k)))

   ;(command "stretch" (ssget "CP"  plst3) "R"pause)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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