edata 发表于 2014-6-1 18:44:27

zjsru_18_505 发表于 2014-6-1 18:09 static/image/common/back.gif
程序有BUG,实例如下:
(command "_line" '(10 0) '(10 10) '(10 20) '(20 20) '(10 10) "")



程序设计之初没有考虑同一方向上与之接触的线,所以说这样的图形出现了bug。该程序仅是考虑了偏移对象相接触并与偏移对象有角度的直线。其他不在该程序范围。

zjsru_18_505 发表于 2014-6-1 19:00:38

对楼上几位的要求,综合修改了一下

(defun
   COLINEARP (P1 P2 P3)
;;;三点共线
((lambda (A B C)
   (or (equal (+ A B) C 1e-8) (equal (+ B C) A 1e-8) (equal (+ C A) B 1e-8))
   )
    (distance P1 P2)
    (distance P2 P3)
    (distance P1 P3)
)
)

(defun
   SK_HIGHLIGHT        (SS FLAG / I EN)
;;;高亮图元或选择集
(if (= (type SS) 'PICKSET)
    (progn
      (setq I -1)
      (repeat (sslength SS)
        (setq EN (ssname SS (setq I (1+ I))))
        (redraw
          EN
          (if FLAG
          3
          4
          )
        )
      )
    )
)
(if (= (type SS) 'ENAME)
    (redraw
      SS
      (if FLAG
        3
        4
      )
    )
)
)

(defun
   SK_ENTMOD (E CODE NEW / EN)
;;;(sk_entmod 图元名 组码 新值 )
(setq EN (entget E))
(entmod (subst (cons CODE NEW) (assoc CODE EN) EN))
)


(defun
   C:TOO (/       ANG1        BUZO   CPT    E             E1          EN           I          IP12       J
          LEN       MODCODE       NEW1   NEW2   NEWP1NEWP2OFFSETDI
          OFFSETDI1        PT0    PT1    PT2    PT3    PT4           PT5          SS       SS1
       )
;;;功能:偏移联动
;;;作者:修改自=楼主: edata
;;;时间:2014-6-1
(if (getenv "OFFSETDI")
    (setq OFFSETDI (atof (getenv "OFFSETDI")))
)
(initget 6)
(if (> OFFSETDI 0)
    (progn
      (if (setq
          OFFSETDI1
             (getdist
             (strcat "\n指定偏移距离" " <" (rtos OFFSETDI) ">:")
             )
          )
        (setq OFFSETDI OFFSETDI1)
      )
    )
    (progn
      (while (not (setq OFFSETDI (getdist "\n指定偏移距离:"))) (initget 6))
    )
)
(setenv "OFFSETDI" (rtos OFFSETDI))
(defun *ERROR* (MSG) (setvar "OSMODE" BUZO) (princ))
(while (setq SS (ssget '((0 . "line"))))
    (setq
      I        0
      J        0
    )
    (setq BUZO (getvar "OSMODE"))
    (setvar "OSMODE" 0)
    (setq LEN (sslength SS))
    (repeat LEN
      (setq
        E   (ssname SS I)
        EN(entget E)
        PT1 (cdr (assoc 10 EN))
        PT2 (cdr (assoc 11 EN))
        PT0 (polar PT1 (angle PT1 PT2) (/ (distance PT1 PT2) 2))
      )
      (command "_.zoom" PT1 PT2)
      (setq SS1 (ssget "_f" (list PT1 PT2) '((0 . "line"))))
      (command "_.zoom" "p")
      (SK_HIGHLIGHT SS1 t)
      (if (setq PT3 (getpoint PT0 "\n指定要偏移的那一侧上的点 <退出当前>:"))
        (progn
          (SK_HIGHLIGHT SS1 NIL)
          (setq SS1 (ssdel E SS1))
          (setq
          CPT       (inters
                   PT3
                   (polar PT3 (+ (angle PT1 PT2) (/ pi 2)) 1.0)
                   PT1
                   PT2
                   NIL
               )
          ANG1 (angle CPT PT3)
          NEW1 (polar PT1 ANG1 OFFSETDI)
          NEW2 (polar PT2 ANG1 OFFSETDI)
          )
          (while (setq E1 (ssname SS1 0))
          (setq
              EN      (entget E1)
              PT4   (cdr (assoc 10 EN))
              PT5   (cdr (assoc 11 EN))
              MODCODE NIL
          )
          (if        (or (equal PT4 PT1 1e-8)
                  (equal PT5 PT1 1e-8)
                  (COLINEARP PT1 PT4 PT5)
                )
              (if (setq NEWP1 (inters NEW1 NEW2 PT4 PT5 NIL))
                (setq NEW1 NEWP1)
              )
          )
          (if        (or (equal PT4 PT2 1e-8)
                  (equal PT4 PT2 1e-8)
                  (COLINEARP PT2 PT4 PT5)
                )
              (if (setq NEWP2 (inters NEW1 NEW2 PT4 PT5 NIL))
                (setq NEW2 NEWP2)
              )
          )
          (if        (COLINEARP PT4 PT1 PT2)
              (setq MODCODE 10)
          )
          (if        (COLINEARP PT5 PT1 PT2)
              (setq MODCODE 11)
          )
          (if        (and (setq IP12 (inters NEW1 NEW2 PT4 PT5 NIL)) MODCODE)
              (progn (SK_ENTMOD E1 MODCODE IP12))
          )
          (setq SS1 (ssdel E1 SS1))
          )
          (SK_ENTMOD E 10 NEW1)
          (SK_ENTMOD E 11 NEW2)
        )
        (progn (princ "\n未指定方向点!") (SK_HIGHLIGHT SS1 NIL))
      )
      (setq I (1+ I))
    )
    (setvar "OSMODE" BUZO)
)
(princ)
)

qinleilei 发表于 2014-6-2 12:11:56

edata 发表于 2014-5-9 18:09 static/image/common/back.gif
LWPOLYLINE线单边偏移关联(仅多段线)

试了一下,相当给力!但是也发现了个问题,就是当坐标系不是世界坐标的时候出现了混乱情况。建议在前面加一个坐标系还原世界坐标。

技术工作室 发表于 2014-6-6 16:36:31

很给力顶一下

wangxf888 发表于 2014-6-15 23:48:05

好程序   经典实用

goldwheat 发表于 2014-11-7 21:36:06

好程序   经典实用

xieyanghui 发表于 2014-11-14 14:23:16

程序很好用,但不支持UCS,希望改进一下支持UCS,谢谢!!

8稻草人8 发表于 2014-11-29 19:30:13

这个好,工作上用到

伪书虫86 发表于 2014-11-30 08:39:16

E大的精品先收藏了

crazylsp 发表于 2014-12-2 17:35:06

楼主的思路很好,在他的启发下怎么来让我们用交叉多边形选择少选一半的点,另一半对称过来。

;点边界点来拉伸。

(defun c:test()

   (setq plst1'()
         plst2'()
         plst3'()
   )
   ;选择点。
   (while(setq pnt(getpoint))
      (setq plst1(cons (polar pnt 00.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(appendplst2 (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 pntbanadist) plst1)         
            plst2 (cons (polar pntbanbdist) plst2)
            pntb   pnta
      ) )

   (setq plst1 (cons (polar pntb    anadist) plst1)         
         plst2 (cons (polar pntb    anbdist) 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)
)
页: 1 2 [3] 4 5 6
查看完整版本: 直线偏移连动~偏移后修改与其相接触的直线