具有方形边缘的缓冲区。
你好我试图在多段线周围创建缓冲区。我的问题是,我需要具有方形边缘的缓冲区,map3d只创建具有圆形边缘的缓冲区,这对我来说是无用的。
通过使用多行创建两条平行线,我能够取得进展,但在线的末尾,连接并不是无缝的。我会把我的意思贴出来。
第一张图显示了autocad可以创建的内容与我需要的缓冲区类型之间的差异。白线是我需要的,黄线是autocad生成的缓冲区。
第二张图是我的问题,如果一条线在一个顶点结束,并继续作为一条新线,用多线创建的区域将看起来像这样,这显然是不好的。
第三张图显示了我需要获得的正确版本。
因此,要么我需要一个完整的程序,可以正确创建正方形缓冲区,要么我需要一个解决方案,如何编辑图2中的线,以获得如图3所示的结果。
谢谢
这怎么样?
(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))
如果我理解的话,这只会使线向两边偏移。结果与使用mline没有什么不同。 我以为你说你需要第三张照片?
这就是我的代码实现的。 您可能需要查看TRACE命令。对于闭合路径,您必须做一些额外的工作。扩展轨迹,使其重复前2段。然后擦除最后一个和第一个轨迹段,使关节成角度-大卫
PS:你可以用PEDIT Width做同样的事情,但是没有进入角点的通道,而轨迹告诉你整个故事。 它应该看起来像这样:
(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))))
-大卫
如果它是一条连续的线,但它不是。你的代码可以做到这一点,它并不比我已经拥有的更接近我所需要的。
你应该能够追踪你的线路和外部的“夹克”将产生。 我一个接一个地检查多段线的垂直线,例如,如果两条线在端点处相交,我必须向后追踪,这意味着要进行大量编码。此外,如果不是只有两条线相交,那么我会有一个问题。 李,
只是吹毛求疵,但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