将矩形偏移为单独的
大家好,你知道当你偏移一个矩形时,它是如何保持为多段线的吗?我需要一个lisp例程,我可以使用它来偏移矩形,将新线设置为当前层,并从线的两端减去偏移距离。我知道这要求很高,但有人见过这样的例行公事吗?
谢谢
布瑞恩 分解然后偏移。
他在寻找比那个家伙更重要的东西,哈哈。 是的,创建这样的宏可能太难了。忘了我的建议吧。 我想知道,如果他们花同样的时间学习如何自己做一些这件事,而不是张贴重复的线程,OP可以完成什么。只是说说而已。
如果您试图自动绘制钢梁,您可能会看到。。。。
http://www.draftsperson.net/index.php?title=Wisey的s\u Steel\u Shapes\u LISP\u程序
如果没有,请告诉我们您正在尝试绘制什么,可能已经存在lisp。 基本lisp选取两个点查找关于极轴命令的帮助不是很难
(setq pt1 (getpoint))
(setq pt2 (getpoint))
(setq offs (getreal))
(setq x1 (car pt1))
(setq y1 (cadr pt1))
now look up polar, distance (hint x1-x2, y1-y2)
work out the 8 points.
这实际上是一个相当复杂的过程:
(defun c:offlin (/ fs fe fd el cf le en ed pl fl mp hd l10 l11)
(defun mid_pt (s e)
(mapcar '(lambda (a b) (* (+ a b) 0.5)) s e))
(if (and (princ "\nSelect PLINE To Offset")
(setq fs (ssget '((0 . "LWPOLYLINE"))))
(= (sslength fs) 1)
(setq fe (ssname fs 0)
fd (entget fe)
el (cdr (assoc 38 fd))
cf (if (= (logand (cdr (assoc 70 fd)) 1) 1) T nil)
le (entlast)))
(progn
(while (eq le (entlast))
(command "_.CMDECHO" 1
"_.OFFSET" pause fe pause)
(if (not (eq le (entlast)))
(command))
(command "_.CMDECHO" 0))
(setq en (entlast)
ed (entget en))
(entdel en)
(foreach p ed
(if (= 10 (car p))
(setq pl (cons (cdr p) pl))))
(foreach p fd
(if (= 10 (car p))
(setq fl (cons (cdr p) fl))))
(and cf (setq pl (cons (last pl) pl)
fl (cons (last fl) fl)))
(if (= (length pl) (length fl))
(progn
(while (> (length pl) 1)
(setq mp (mid_pt (car pl) (cadr pl))
hd (* (distance (car fl) (cadr fl)) 0.5)
l10 (polar mp (angle (car pl) (cadr pl)) hd)
l11 (polar mp (angle (cadr pl) (car pl)) hd))
(entmake (list (cons 0 "LINE")
(cons 10 (append l10 (list el)))
(cons 11 (append l11 (list el)))))
(setq pl (cdr pl)
fl (cdr fl)))))))
(prin1))
用偏移类型命令捕捉错误并不总是准确的。
这使得线段的长度与原始PLINE相同,无论偏移侧是在内侧还是外侧。
玩得开心-大卫 您好-
这是我读了你的帖子后想到的。(见下图)如果我误解了你,请告诉我。
这仅适用于矩形。它们可以水平或旋转。
您需要输入偏移距离并选择矩形。该例程保持打开状态,允许您选择多个矩形。我希望这能有所帮助。
(defun c:offsetpline (/ CurLayer OffsetDist VlaObj sset num Ang Ptdist StartPt EndPt)
(vl-load-com)
(defun *error* (msg)
(princ)
); _end defun
(setq CurLayer (getvar "clayer"))
(setq OffsetDist (getreal "\nEnter an offset distance: "))
(while (setq VlaObj (vlax-ename->vla-object (car (entsel "Select a Rectangle: "))))
(setq Startpt (vlax-curve-getPointAtParam VlaObj 1))
(setq Ang (+ (angle (vlax-curve-getStartPoint VlaObj)(vlax-curve-getPointAtParam VlaObj 1))(* (/ pi 180) 90)))
(setq PtDist (distance Startpt (vlax-curve-getPointAtParam VlaObj 2)))
(if (equal (polar Startpt Ang PtDist)(vlax-curve-getPointAtParam VlaObj 2) 1.0)
(vl-catch-all-apply 'vlax-invoke-method (list VlaObj 'Offset OffsetDist))
(vl-catch-all-apply 'vlax-invoke-method (list VlaObj 'Offset (- OffsetDist)))
); _end if
(setq VlaObj (vlax-ename->vla-object (entlast)))
(vl-catch-all-apply 'vlax-put (list VlaObj 'Layer CurLayer))
(vl-cmdf "explode" (entlast) "")
(setq sset (ssget "_P"))
(setq num -1)
(repeat (sslength sset)
(setq VlaObj (vlax-ename->vla-object (ssname sset (setq num (1+ num)))))
(setq StartPt (polar (vlax-get VlaObj 'StartPoint)(vlax-get VlaObj 'Angle) OffsetDist))
(vl-catch-all-apply 'vlax-put (list VlaObj 'StartPoint StartPt))
(setq EndPt (polar (vlax-get VlaObj 'EndPoint)(- (vlax-get VlaObj 'Angle) pi) OffsetDist))
(vl-catch-all-apply 'vlax-put (list VlaObj 'EndPoint EndPt))
); _end repeat
); _end while
(princ)
); _end defun
很好,谢谢你的帮助。
页:
[1]
2