sunqv 发表于 2024-3-12 01:51

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

本帖最后由 sunqv 于 2024-3-12 13:29 编辑

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

修改前:   


修改后:   


dwg图:

ssyfeng 发表于 2024-3-12 10:04

本帖最后由 ssyfeng 于 2024-3-12 10:06 编辑

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



自贡黄明儒 发表于 2024-3-12 07:05

(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
)
)

jkop 发表于 2024-3-12 08:30

可以参考Lee mac 的插件,是我目前用过最实用的。
https://www.lee-mac.com/autoblockbreak.html
https://www.lee-mac.com/lisp/gifs/abb.gif
https://www.lee-mac.com/lisp/gifs/abbe.gif
https://www.lee-mac.com/lisp/gifs/abbs.gif
https://www.lee-mac.com/lisp/gifs/abb2.gif
https://www.lee-mac.com/lisp/AutoBlockBreakV1-9.lsp

sunqv 发表于 2024-3-12 08:42

能不能不让图块旋转呀?

sunqv 发表于 2024-3-12 09:18

自贡黄明儒 发表于 2024-3-12 07:05
(defun list->3pair (old / new)
    (while (setq new (cons (list (car old) (cadr old) (caddr old))...

没看到效果、提示参数太少

d1742647821 发表于 2024-3-12 10:07

本帖最后由 d1742647821 于 2024-3-12 10:12 编辑

C#来凑个热闹

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

attach://133076.flv



    public static void Cs6()
    {
      // 多选直线
      var r1 = Env.Editor.GetSelection(OpFilter.Build(e => e.Dxf(0) == "LINE"));
      if (r1.Status != PromptStatus.OK)
            return;
      using var tr = new DBTrans();
      var lines = r1.Value.GetEntities<Line>().ToList();
      var brfList = tr.CurrentSpace.GetEntities<BlockReference>().ToList();
      foreach (var line in lines)
      {
            var brfIntersectList = brfList.Where(e =>
            {
                var p3dc = new Point3dCollection();
                e.BoundingBoxIntersectWith(line, Intersect.OnBothOperands, new Plane(), p3dc, IntPtr.Zero, IntPtr.Zero);
                return p3dc.Count > 0;
            });
            foreach (var brf in brfIntersectList)
            {
                BreakLineByBlock(line, brf);
            }
      }
    }

    private static void BreakLineByBlock(Line line, BlockReference brf)
    {
      var btr = (BlockTableRecord)brf.BlockTableRecord.GetObject();
      var curves = btr.GetEntities<Curve>().Select(e => e.GetTransformedCopy(brf.BlockTransform)).OfType<Curve>()
            .ToList();
      var ptList = new List<Point3d>();
      ptList.AddRange(curves.SelectMany(e => e.IntersectWith(line, Intersect.OnBothOperands, new Plane())));
      if (ptList.Count == 0)
            return;
      var box = brf.GetBoundingBoxEx()!.Value;
      using (line.ForWrite())
      {
            line.StartPoint = line.StartPoint.Z20();
            line.EndPoint = line.EndPoint.Z20();
            if (box.MidCenter.Distance2dTo(line.StartPoint) < box.MidCenter.Distance2dTo(line.EndPoint))
            {
                line.StartPoint = ptList.FindByMax(line.GetParameterAtPoint);
            }
            else
            {
                line.EndPoint = ptList.FindByMin(line.GetParameterAtPoint);
            }
      }
    }

sunqv 发表于 2024-3-12 13:30

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

不愿意发代码,求你别发图了:'(

zhangrunze 发表于 2024-3-14 08:56

jkop 发表于 2024-3-12 08:30
可以参考Lee mac 的插件,是我目前用过最实用的。
https://www.lee-mac.com/autoblockbreak.html



CAD批量遮罩也不错,不用修剪~

fzlinrong 发表于 2024-3-14 17:45

sunqv 发表于 2024-3-12 08:42
能不能不让图块旋转呀?

可以的,AutoBlockBreakV1-9.lsp的执行命令里有选项。
页: [1]
查看完整版本: 选择线段,批量删掉线段两端与块相交的部分