明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1099|回复: 9

选择线段,批量删掉线段两端与块相交的部分

[复制链接]
发表于 2024-3-12 01:51:02 | 显示全部楼层 |阅读模式
本帖最后由 sunqv 于 2024-3-12 13:29 编辑

如题,如何实现用lisp批量删除线段两端与块相交部分线段

修改前:   


修改后:   


dwg图:

本帖子中包含更多资源

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

x
发表于 2024-3-12 10:04:25 | 显示全部楼层
本帖最后由 ssyfeng 于 2024-3-12 10:06 编辑

跟我以前写的一个程序有点类似
不过物探资料最好别去修改,有可能会影响后面提取数据入库



本帖子中包含更多资源

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

x
回复 支持 0 反对 1

使用道具 举报

发表于 2024-3-12 07:05:34 | 显示全部楼层
(defun list->3pair (old / new)
    (while (setq new (cons (list (car old) (cadr old) (caddr old)) new)
                 old (cdddr old))
    )
    (reverse new)
  )
  

(defun get_interpts (obj1 obj2 / iplist)
  (if (not (vl-catch-all-error-p
             (setq iplist (vl-catch-all-apply
                            'vlax-safearray->list
                            (list
                              (vlax-variant-value
                                (vla-intersectwith obj1 obj2 acextendnone)
                              ))))))
    iplist
  )
)
发表于 2024-3-12 08:30:59 | 显示全部楼层
可以参考Lee mac 的插件,是我目前用过最实用的。
https://www.lee-mac.com/autoblockbreak.html




https://www.lee-mac.com/lisp/AutoBlockBreakV1-9.lsp

本帖子中包含更多资源

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

x
 楼主| 发表于 2024-3-12 08:42:54 | 显示全部楼层
能不能不让图块旋转呀?
 楼主| 发表于 2024-3-12 09:18:57 | 显示全部楼层
自贡黄明儒 发表于 2024-3-12 07:05
(defun list->3pair (old / new)
    (while (setq new (cons (list (car old) (cadr old) (caddr old))  ...

没看到效果、提示参数太少
发表于 2024-3-12 10:07:44 | 显示全部楼层
本帖最后由 d1742647821 于 2024-3-12 10:12 编辑

C#来凑个热闹

powered by IFoxCAD
https://gitee.com/inspirefunction/ifoxcad
https://www.kdocs.cn/l/cc6ZXSa0vMgD





  1. [CommandMethod(nameof(Cs6))]
  2.     public static void Cs6()
  3.     {
  4.         // 多选直线
  5.         var r1 = Env.Editor.GetSelection(OpFilter.Build(e => e.Dxf(0) == "LINE"));
  6.         if (r1.Status != PromptStatus.OK)
  7.             return;
  8.         using var tr = new DBTrans();
  9.         var lines = r1.Value.GetEntities<Line>().ToList();
  10.         var brfList = tr.CurrentSpace.GetEntities<BlockReference>().ToList();
  11.         foreach (var line in lines)
  12.         {
  13.             var brfIntersectList = brfList.Where(e =>
  14.             {
  15.                 var p3dc = new Point3dCollection();
  16.                 e.BoundingBoxIntersectWith(line, Intersect.OnBothOperands, new Plane(), p3dc, IntPtr.Zero, IntPtr.Zero);
  17.                 return p3dc.Count > 0;
  18.             });
  19.             foreach (var brf in brfIntersectList)
  20.             {
  21.                 BreakLineByBlock(line, brf);
  22.             }
  23.         }
  24.     }

  25.     private static void BreakLineByBlock(Line line, BlockReference brf)
  26.     {
  27.         var btr = (BlockTableRecord)brf.BlockTableRecord.GetObject();
  28.         var curves = btr.GetEntities<Curve>().Select(e => e.GetTransformedCopy(brf.BlockTransform)).OfType<Curve>()
  29.             .ToList();
  30.         var ptList = new List<Point3d>();
  31.         ptList.AddRange(curves.SelectMany(e => e.IntersectWith(line, Intersect.OnBothOperands, new Plane())));
  32.         if (ptList.Count == 0)
  33.             return;
  34.         var box = brf.GetBoundingBoxEx()!.Value;
  35.         using (line.ForWrite())
  36.         {
  37.             line.StartPoint = line.StartPoint.Z20();
  38.             line.EndPoint = line.EndPoint.Z20();
  39.             if (box.MidCenter.Distance2dTo(line.StartPoint) < box.MidCenter.Distance2dTo(line.EndPoint))
  40.             {
  41.                 line.StartPoint = ptList.FindByMax(line.GetParameterAtPoint);
  42.             }
  43.             else
  44.             {
  45.                 line.EndPoint = ptList.FindByMin(line.GetParameterAtPoint);
  46.             }
  47.         }
  48.     }


本帖子中包含更多资源

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

x
 楼主| 发表于 2024-3-12 13:30:53 | 显示全部楼层
ssyfeng 发表于 2024-3-12 10:04
跟我以前写的一个程序有点类似
不过物探资料最好别去修改,有可能会影响后面提取数据入库

不愿意发代码,求你别发图了
发表于 2024-3-14 08:56:21 | 显示全部楼层
jkop 发表于 2024-3-12 08:30
可以参考Lee mac 的插件,是我目前用过最实用的。
https://www.lee-mac.com/autoblockbreak.html

CAD批量遮罩也不错,不用修剪~
发表于 2024-3-14 17:45:50 | 显示全部楼层
sunqv 发表于 2024-3-12 08:42
能不能不让图块旋转呀?

可以的,AutoBlockBreakV1-9.lsp的执行命令里有选项。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-18 08:49 , Processed in 0.298622 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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