BrianTFC 发表于 2022-7-6 08:14:40

将矩形偏移为单独的

大家好,
 
你知道当你偏移一个矩形时,它是如何保持为多段线的吗?我需要一个lisp例程,我可以使用它来偏移矩形,将新线设置为当前层,并从线的两端减去偏移距离。我知道这要求很高,但有人见过这样的例行公事吗?
 
谢谢
布瑞恩

ReMark 发表于 2022-7-6 08:18:46

分解然后偏移。

DANIEL 发表于 2022-7-6 08:23:16

 
他在寻找比那个家伙更重要的东西,哈哈。

ReMark 发表于 2022-7-6 08:24:52

是的,创建这样的宏可能太难了。忘了我的建议吧。

BlackBox 发表于 2022-7-6 08:28:30

我想知道,如果他们花同样的时间学习如何自己做一些这件事,而不是张贴重复的线程,OP可以完成什么。只是说说而已。

rkent 发表于 2022-7-6 08:32:53

 
如果您试图自动绘制钢梁,您可能会看到。。。。
http://www.draftsperson.net/index.php?title=Wisey的s\u Steel\u Shapes\u LISP\u程序
 
如果没有,请告诉我们您正在尝试绘制什么,可能已经存在lisp。

BIGAL 发表于 2022-7-6 08:36:16

基本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.

David Bethel 发表于 2022-7-6 08:37:08

这实际上是一个相当复杂的过程:
 

(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相同,无论偏移侧是在内侧还是外侧。
 
玩得开心-大卫

jsowinski 发表于 2022-7-6 08:41:35

您好-
这是我读了你的帖子后想到的。(见下图)如果我误解了你,请告诉我。
 
 

 
这仅适用于矩形。它们可以水平或旋转。
您需要输入偏移距离并选择矩形。该例程保持打开状态,允许您选择多个矩形。我希望这能有所帮助。
 
 

(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

BrianTFC 发表于 2022-7-6 08:43:29

很好,谢谢你的帮助。
页: [1] 2
查看完整版本: 将矩形偏移为单独的