明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1143|回复: 6

[源码] 矩形内剪切

[复制链接]
发表于 2024-5-10 23:23:32 | 显示全部楼层 |阅读模式
按照偏移思路写的一个矩形内剪切,有需要的可以试用一下,也可以帮忙优化一下
  1. ;;;;;;;;;矩形内剪切;;;;;;;;
  2. (defun c:itr (/ data en ens i lst lupt maxx maxy minx miny os p1 p2 p3 p4 pt_zx pts rdpt rect ss)
  3.   (command "undo" "be")
  4.   (setq os (getvar "osmode"))
  5.   (setvar "osmode" 0)
  6.   (setq ss (ssget '((0 . "LWPOLYLINE") (70 . 1))))
  7.   (setq i 0 ens nil)
  8.   (repeat (sslength ss)
  9.     (setq ens (cons (ssname ss i) ens))
  10.     (setq i (1+ i))
  11.   )
  12.   ;;以下代码获取选取所有矩形的范围坐标
  13.   (setq pts nil)
  14.   (foreach rect ens
  15.     (setq data (entget rect))
  16.     (foreach lst data
  17.       (if (= (car lst) 10)
  18.         (setq pts (append pts (list (cdr lst))))
  19.       )
  20.     )
  21.   )
  22.   (setq pts (vl-sort pts (function (lambda (e1 e2) (< (car e1) (car e2))))))
  23.   (setq minx (caar pts) maxx (caar (reverse pts)))
  24.   (setq pts (vl-sort pts (function (lambda (e1 e2) (< (cadr e1) (cadr e2))))))
  25.   (setq miny (cadar pts) maxy (cadar (reverse pts)))
  26.   (setq lupt (list (- minx 100) (+ maxy 100))  rdpt (list (+ maxx 100) (- miny 100)))
  27.   (command "_.zoom" lupt rdpt)
  28.   (foreach rect ens
  29.     ;;以下代码获取矩形的四点坐标
  30.     (setq data (entget rect) pts  nil)
  31.     (foreach lst data
  32.       (if (= (car lst) 10)
  33.         (setq pts (append pts (list (cdr lst))))
  34.       )
  35.     )
  36.     (setq pt_zx (mapcar '(lambda (x y) (* (+ x y) 0.5)) (nth 0 pts) (nth 2 pts))) ;求矩形中心坐标
  37.     (command "offset" 0.1 rect pt_zx "");偏移0.1可以调整,作为精度
  38.     (setq en (entlast))
  39.     ;;以下代码获取偏移矩形的四点坐标
  40.     (setq data (entget en) pts  nil)
  41.     (foreach lst data
  42.       (if (= (car lst) 10)
  43.         (setq pts (append pts (list (cdr lst))))
  44.       )
  45.     )
  46.     (command "erase" en "")
  47.     (setq p1 (nth 0 pts) p2 (nth 1 pts) p3 (nth 2 pts) p4 (nth 3 pts))
  48.     ;;四点坐标相互剪切
  49.     (progn
  50.       (command "trim" rect "" "f" p1 p2 "" "")
  51.       (command "trim" rect "" "f" p1 p4 "" "")
  52.       (command "trim" rect "" "f" p3 p2 "" "")
  53.       (command "trim" rect "" "f" p3 p4 "" "")
  54.     )
  55.   )
  56.   (command "_.zoom" "p")
  57.   (setvar "osmode" os)
  58.   (command "undo" "e")
  59.   (princ)
  60. )


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +1 金钱 +10 收起 理由
love1030312 + 1 赞一个!
tigcat + 10 很给力!

查看全部评分

发表于 2024-5-11 19:14:24 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

发表于 2024-5-11 06:51:13 | 显示全部楼层
没有和框相交的图元未被修剪,应该加个删除框内的图元的功能
发表于 2024-5-11 08:13:33 | 显示全部楼层
值得学习借鉴!
发表于 2024-5-11 08:56:15 | 显示全部楼层
;---删除封闭多段线内的图元
(defun del-in-en(en / obj obj2 plst pts s)
        (setq obj(vlax-ename->vla-object en))
        (setq obj2(car(vlax-safearray->list(vlax-variant-value(vla-Offset obj -0.01)))))
        (setq pts(vlax-safearray->list(vlax-variant-value(vla-get-coordinates obj2))))
        (setq plst nil)
        (while(>=(length pts)2);---两个一组分割成点表
                (setq plst(cons(list(car pts)(cadr pts))plst))
                (setq pts(cddr pts))
        )
        (entdel(vlax-vla-object->ename obj2))
        (vl-cmdf "TRIM" en "" "f")(mapcar 'vl-cmdf plst)(vl-cmdf "" "")
        (if(setq s(ssget "cp" plst))(vl-cmdf "ERASE" s ""))
)


刚好,我前两天也写了一个,献丑
 楼主| 发表于 2024-5-11 10:16:56 | 显示全部楼层
bai2000 发表于 2024-5-11 06:51
没有和框相交的图元未被修剪,应该加个删除框内的图元的功能

因为我工作中需要的只有剪切,不需要删除矩形内图元,所以只写了剪切的功能
 楼主| 发表于 2024-5-11 10:20:00 | 显示全部楼层
aws 发表于 2024-5-11 08:56
;---删除封闭多段线内的图元
(defun del-in-en(en / obj obj2 plst pts s)
        (setq obj(vlax-ename->vla-o ...

感谢分享,学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 17:28 , Processed in 0.186505 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表