如何批量偏移的问题
本帖最后由 taocatt 于 2023-11-22 09:16 编辑如何用lisp代码实现框选左边的图型,批量偏移得到右侧的图型。
左边的图形是用LINE命令绘制,田字型的中间线条是也是用‘LINE’命令绘制,一般批量偏移的方法是先用BOUNDARY命令在每个小方格中点击创建边界,然后让程序识别多段线并对每个多段线进行偏移。
这是我原来的方式,需要点击每一个方格。
(defun c:vv()
(setq a (getpoint))
(while (/= a nil)
(command "boundary" a "")
(setq rec (entlast))
(command "offset" 100 rec a "")
(command "erase" rec "")
(setq a (getpoint))
)
(princ)
)
现在的需求是想省去点击每个小方格创建边界的这一步,直接框选所有图形让程序识别这样的方格后创建边界并进行偏移操作。
(DEFUN C:TT (/ SS I LEN E PLST)
(SETQ I 0)
(SETQ LEN 100);;;;;偏移距离设置
(SETQ SS (SSGET '((70 . 1))))
(IF SS
(PROGN
(REPEAT (SSLENGTH SS)
(SETQ E (SSNAME SS I)
PLST (LH:Massoc 10 (ENTGET E))
I (1+ I)
)
(IF (LH:ListClockwise-p PLST)
(vl-catch-all-apply
'VLA-OFFSET
(LIST (vlax-ename->vla-object E) LEN)
)
(vl-catch-all-apply
'VLA-OFFSET
(LIST (vlax-ename->vla-object E) (* -1 LEN))
)
)
)
)
)
(PRINC)
)
;; List Clockwise-p - Lee Mac
;; Returns T if the point list is clockwise oriented
;; 顺时针列出-p-Lee Mac
;; 如果点列表为顺时针方向,则返回T
(defun LH:ListClockwise-p (lst)
(minusp
(apply '+
(mapcar
(function
(lambda (a b)
(- (* (car b) (cadr a)) (* (car a) (cadr b)))
)
)
lst
(cons (last lst) lst)
)
)
)
)
;;46.1 [功能] 多段线各顶点(见99.3)
;;示例 (MJ:Massoc 10 (entget (car (entsel))))
;; Notes:特别适合多段线各顶点
(defun LH:Massoc (key alist)
(apply
'append
(mapcar '(lambda (x)
(if (eq (car x) key)
(list (cdr x))
)
)
alist
)
)
)
内偏移 liuhe 发表于 2023-11-21 16:18
内偏移
使用这段代码需要先将图形的每个小格创建边界,生成多段线后才能识别每个小方格进行向内偏移。有没有方法可以让程序自动识别每一个小方格并进行创建边界。 1 选执行(APPLY 'bpoly (list p ss '(1 0)))产生封闭多段线。
2 向内偏移生成的封闭多段线,生成新的封闭多段线。
3 删除最先生成的封闭多段线 可以通过框选得到每个图形的四个角点,然后通过距离定点的方法,用pline连点成线 求交点,bpoly,offset
mini工具有这个功能 本帖最后由 taocatt 于 2023-11-22 09:22 编辑
xyp1964 发表于 2023-11-21 19:40
求交点,bpoly,offset
求指教,如何识别每个小方格。 请大神完善 这个帖子沉下去了啊
页:
[1]
2