M76 发表于 2022-7-6 11:48:53

具有方形边缘的缓冲区。

你好
 
我试图在多段线周围创建缓冲区。我的问题是,我需要具有方形边缘的缓冲区,map3d只创建具有圆形边缘的缓冲区,这对我来说是无用的。
 
通过使用多行创建两条平行线,我能够取得进展,但在线的末尾,连接并不是无缝的。我会把我的意思贴出来。
 
第一张图显示了autocad可以创建的内容与我需要的缓冲区类型之间的差异。白线是我需要的,黄线是autocad生成的缓冲区。
 
第二张图是我的问题,如果一条线在一个顶点结束,并继续作为一条新线,用多线创建的区域将看起来像这样,这显然是不好的。
 
第三张图显示了我需要获得的正确版本。
 
因此,要么我需要一个完整的程序,可以正确创建正方形缓冲区,要么我需要一个解决方案,如何编辑图2中的线,以获得如图3所示的结果。
 
谢谢


Lee Mac 发表于 2022-7-6 11:55:43

这怎么样?
 

(defun c:buffer (/ eLast ent obj wid)
(vl-load-com)
; Lee Mac~25.01.10

(or *def_wid* (setq *def_wid* 10.))

(setq *def_wid* (cond ((getdist (strcat "\nSpecify Width <" (rtos *def_wid*) "> : ")))
                     (*def_wid*)))

(setq eLast (entlast))
(command "_.pline")
(while (eq 1 (logand 1 (getvar 'CMDACTIVE))) (command pause))

(if (not (eq eLast (setq ent (entlast))))
   (progn
   (setq obj (vlax-ename->vla-object ent) wid (/ *def_wid* 2.))
   
   (mapcar
       (function
         (lambda (x)
         (vla-offset x (setq wid (- wid))))) (list obj obj))

   (entdel ent)))

(princ))

M76 发表于 2022-7-6 12:01:00

 
如果我理解的话,这只会使线向两边偏移。结果与使用mline没有什么不同。

Lee Mac 发表于 2022-7-6 12:07:08

我以为你说你需要第三张照片?
 
这就是我的代码实现的。

David Bethel 发表于 2022-7-6 12:14:38

您可能需要查看TRACE命令。对于闭合路径,您必须做一些额外的工作。扩展轨迹,使其重复前2段。然后擦除最后一个和第一个轨迹段,使关节成角度-大卫
 
PS:你可以用PEDIT Width做同样的事情,但是没有进入角点的通道,而轨迹告诉你整个故事。

David Bethel 发表于 2022-7-6 12:21:30

它应该看起来像这样:
 

(defun c:trpath (/ ss en ed pl closed fe tw)

(while (or (not ss)
            (/= (sslength ss) 1))
      (princ "\nSelect Polyline Path")
      (setq ss (ssget '((0 . "*POLYLINE")))))

(setq en (ssname ss 0)
       ed (entget en)
       pl (findpath en))

(if (= (logand (cdr (assoc 70 ed)) 1) 1)
   (setq pl (append pl (list (cadr pl)))
         pl (append pl (list (caddr pl)))
         closed T))

(entmake (list (cons 0 "POINT")(cons 10 (car pl))))
(setq fe (entlast))

(initget 7)
(setq tw (getdist "\nTRACE Width:   "))
(setvar "TRACEWID" tw)

(command "_.TRACE" "")
(foreach p pl
   (command p))
(command "")

(and closed
      (entdel fe)
      (entdel (entnext fe))
      (entdel (entlast)))

(redraw)
(prin1))

;++++++++++++ FINDPATH +++++++++++++++++++++++++++++++++++++++++++
;;;Returns ECS Point Values Of PLINE
(defun findpath (en / pl ed sp_flg cl_flg bf nl i vp bf vf pl_flg)
(if (= "LWPOLYLINE" (cdr (assoc 0 (entget en))))
   (command "_.CONVERTPOLY" "_Heavy" en ""))
(setq ed (entget en))
(setq pl_flg (cdr (assoc 70 ed)))
(and (= (logand pl_flg 1) 1)
      (setq cl_flg T))
(and (= (logand pl_flg 4) 4)
      (setq sp_flg T))
(and (or (= (logand pl_flg 16) 16)
          (= (logand pl_flg 64) 64))
      (princ "\nInvalid POLYLINE Mesh")
      (exit))
(while (/= "SEQEND" (cdr (assoc 0 (entget (entnext en)))))
      (setq en (entnext en)
            ed (entget en)
            vp (cdr (assoc 10 ed))
            bf (cdr (assoc 42 ed))
            vf (cdr (assoc 70 ed)))
      (cond ((and (not cl_flg)
                  (= "SEQEND" (cdr (assoc 0 (entget (entnext en))))))
               (setq pl (cons vp pl)))
            ((and (/= bf 0.0)
                  (/= "SEQEND" (cdr (assoc 0 (entget (entnext en))))))
               (add_arc vp (cdr (assoc 10 (entget (entnext en)))) bf))
            ((and (/= bf 0.0)
                  cl_flg
                  (= "SEQEND" (cdr (assoc 0 (entget (entnext en))))))
               (add_arc vp (last pl) bf))
            ((and (= bf 1.0)
                  (not cl_flg)
                  (= "SEQEND" (cdr (assoc 0 (entget (entnext en))))))
               (princ))
            ((and sp_flg
                  (= bf 0.0)
                  (= (logand vf8))
               (setq pl (cons vp pl)))
            ((and (not sp_flg)
                  (= bf 0.0)
                  (/= (logand vf8))
               (setq pl (cons vp pl)))))
(if (and cl_flg
          (not (equal (car pl) (last pl))))
   (setq pl (cons (last pl) pl)))
(setq i 0)
(while (< i (length pl))
      (while (equal (nth i pl) (nth (1+ i) pl) 0.0001)
               (setq i (1+ i)))
      (and (nth i pl)
             (setq nl (cons (nth i pl) nl)))
      (setq i (1+ i)))
nl)

(defun add_arc (sp ep bulge / alist x1 x2 y1 y2 cotbce
               ce ra sa ea ia inc qty na temp)
(setq x1 (car sp);;Modified Bulge
       x2 (car ep);;Conversion By
       y1 (cadr sp);;Duff Kurland
       y2 (cadr ep);;Autodesk, Inc.
   cotbce (/ (- (/ 1.0 bulge) bulge) 2.0)
       ce (list (/ (+ x1 x2 (- (* (- y2 y1) cotbce))) 2.0)
                (/ (+ y1 y2    (* (- x2 x1) cotbce) ) 2.0)
                (caddr sp))
       ra (distance ce sp)
       sa (atan (- y1 (cadr ce)) (- x1 (car ce)))
       ea (atan (- y2 (cadr ce)) (- x2 (car ce))))
(if (minusp sa)
   (setq sa (+ sa (* 2.0 pi))))
(if (minusp ea)
   (setq ea (+ ea (* 2.0 pi))))
(if (minusp bulge)
   (setq temp sa sa ea ea temp))
(if (> sa ea)
   (setq ia (+ (- (* pi 2.0) sa) ea))
   (setq ia (- ea sa)))
(setq qty (abs (fix (/ ia (/ pi 16)))));;;ADJUST 16 FOR SMOOTHNESS
(if (< qty 2)
   (setq qty 2))
(setq na sa
      inc (/ (abs ia) qty))
(repeat (1+ qty)
   (setq alist (cons (polar ce na ra) alist)
            na (+ sa inc)
            sa na))
(if (not (equal sp (car alist) 0.0001))
   (setq alist (reverse alist)))
(foreach a alist
   (setq pl (cons a pl))))


 
-大卫

M76 发表于 2022-7-6 12:26:06

 
如果它是一条连续的线,但它不是。你的代码可以做到这一点,它并不比我已经拥有的更接近我所需要的。

Lee Mac 发表于 2022-7-6 12:30:38

 
你应该能够追踪你的线路和外部的“夹克”将产生。

M76 发表于 2022-7-6 12:34:20

我一个接一个地检查多段线的垂直线,例如,如果两条线在端点处相交,我必须向后追踪,这意味着要进行大量编码。此外,如果不是只有两条线相交,那么我会有一个问题。

David Bethel 发表于 2022-7-6 12:39:46

李,
只是吹毛求疵,但CMDACTIVE具有整数位代码值
 
发件人:
 
http://academics.triton.edu/faculty/fheitzman/variable.html
 

CMDACTIVE       

Bit-code indicates what type of command is active:

1=ordinary command

2=ordinary and transparent command

4=script active

8=dialogue box active

 
我通常使用:

(while (> (getvar "CMDACTIVE") 0) ....

 
-大卫
页: [1] 2
查看完整版本: 具有方形边缘的缓冲区。