找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 421|回复: 5

[求助] 如何批量自动延长形成封闭区域

[复制链接]

已领礼包: 22个

财富等级: 恭喜发财

发表于 2017-7-26 12:10:20 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
图上有很多pl线,看着各个线之间形成了多个封闭区域,实际上还差一点才能闭合,怎么样开发能够让他们自动延长一点,达到闭合区域的目的。 111.JPG
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-7-26 14:38:09 | 显示全部楼层
传一个压缩的DWG图上来供测试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6434个

财富等级: 富甲天下

发表于 2017-7-26 17:14:10 | 显示全部楼层
觉得还挺难的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 22个

财富等级: 恭喜发财

 楼主| 发表于 2017-7-27 17:08:49 | 显示全部楼层
今天想了一天,用C# objectarx开发,
能够获取所有的pl线,找到pl线的端点,然后找离端点最近的pl线,都确定好之后,调用autocad的ex命令
只是不会写供C#调用的ex命令
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 22个

财富等级: 恭喜发财

 楼主| 发表于 2017-8-4 08:08:08 | 显示全部楼层
/// <summary>
      /// 计算两条直线的交点
      /// </summary>
      /// <param name="lineFirstStar">L1的点1坐标</param>
      /// <param name="lineFirstEnd">L1的点2坐标</param>
      /// <param name="lineSecondStar">L2的点1坐标</param>
      /// <param name="lineSecondEnd">L2的点2坐标</param>
      /// <returns></returns>
      ///        
      public static Point2d GetIntersection(Point2d lineFirstStar, Point2d lineFirstEnd, Point2d lineSecondStar, Point2d lineSecondEnd)
      {
          /*
           * L1,L2都存在斜率的情况:
           * 直线方程L1: ( y - y1 ) / ( y2 - y1 ) = ( x - x1 ) / ( x2 - x1 )
           * => y = [ ( y2 - y1 ) / ( x2 - x1 ) ]( x - x1 ) + y1
           * 令 a = ( y2 - y1 ) / ( x2 - x1 )
           * 有 y = a * x - a * x1 + y1   .........1
           * 直线方程L2: ( y - y3 ) / ( y4 - y3 ) = ( x - x3 ) / ( x4 - x3 )
           * 令 b = ( y4 - y3 ) / ( x4 - x3 )
           * 有 y = b * x - b * x3 + y3 ..........2
           *
           * 如果 a = b,则两直线平等,否则, 联解方程 1,2,得:
           * x = ( a * x1 - b * x3 - y1 + y3 ) / ( a - b )
           * y = a * x - a * x1 + y1
           *
           * L1存在斜率, L2平行Y轴的情况:
           * x = x3
           * y = a * x3 - a * x1 + y1
           *
           * L1 平行Y轴,L2存在斜率的情况:
           * x = x1
           * y = b * x - b * x3 + y3
           *
           * L1与L2都平行Y轴的情况:
           * 如果 x1 = x3,那么L1与L2重合,否则平等
           *
          */
          double a = 0, b = 0;
          int state = 0;
          if (lineFirstStar.X != lineFirstEnd.X)
          {
              a = (lineFirstEnd.Y - lineFirstStar.Y) / (lineFirstEnd.X - lineFirstStar.X);
              state |= 1;
          }
          if (lineSecondStar.X != lineSecondEnd.X)
          {
              b = (lineSecondEnd.Y - lineSecondStar.Y) / (lineSecondEnd.X - lineSecondStar.X);
              state |= 2;
          }
          switch (state)
          {
              case 0: //L1与L2都平行Y轴
                  {
                      if (lineFirstStar.X == lineSecondStar.X)
                      {
                          //throw new Exception("两条直线互相重合,且平行于Y轴,无法计算交点。");
                          return new Point2d(0, 0);
                      }
                      else
                      {
                          //throw new Exception("两条直线互相平行,且平行于Y轴,无法计算交点。");
                          return new Point2d(0, 0);
                      }
                  }
              case 1: //L1存在斜率, L2平行Y轴
                  {
                      double x = lineSecondStar.X;
                      double y = (lineFirstStar.X - x) * (-a) + lineFirstStar.Y;
                      return new Point2d(x, y);
                  }
              case 2: //L1 平行Y轴,L2存在斜率
                  {
                      double x = lineFirstStar.X;
                      //网上有相似代码的,这一处是错误的。你可以对比case 1 的逻辑 进行分析
                      //源code:lineSecondStar * x + lineSecondStar * lineSecondStar.X + p3.Y;
                      double y = (lineSecondStar.X - x) * (-b) + lineSecondStar.Y;
                      return new Point2d(x, y);
                  }
              case 3: //L1,L2都存在斜率
                  {
                      if (a == b)
                      {
                          // throw new Exception("两条直线平行或重合,无法计算交点。");
                          return new Point2d(0, 0);
                      }
                      double x = (a * lineFirstStar.X - b * lineSecondStar.X - lineFirstStar.Y + lineSecondStar.Y) / (a - b);
                      double y = a * x - a * lineFirstStar.X + lineFirstStar.Y;
                      return new Point2d(x, y);
                  }
          }
          // throw new Exception("不可能发生的情况");
          return new Point2d(0, 0);
      }


      [CommandMethod("MyInter")]
      public static void MyInter()
      {
          Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
          PromptSelectionResult result = ed.GetSelection();
          SelectionSet set = result.Value;
          Database db = HostApplicationServices.WorkingDatabase;
          using (Transaction trans = db.TransactionManager.StartTransaction())
          {
              //以读方式打开块表..  
              BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);

              //以写方式打开模型空间块表记录  
              BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

              if (set != null && set.Count > 0)
              {
                  List<Polyline> textlist = new List<Polyline>();
                  ObjectId[] idlist = set.GetObjectIds();
        

                  foreach (ObjectId id in set.GetObjectIds())
                  {
                      Entity ent = (Entity)id.GetObject(OpenMode.ForRead);
                      //获取所有的Polyline
                      if (ent is Polyline)
                      {
                          Polyline sp = (Polyline)ent;
                          //多边形闭合,则加入到列表
                          if (sp.Closed)
                          {
                              textlist.Add(sp);
                          }
                          else//不闭合,则取两边的端点
                          {
                              {
                                  Point2d p1 = sp.GetPoint2dAt(0);
                                  Point2d p2 = sp.GetPoint2dAt(1);


                                  for (int i = 0; i < idlist.Length; i++)
                                  {
                                      //是自己的线,不用比较
                                      if (idlist[i] == id)
                                      {
                                          continue;
                                      }
                                      Polyline pl = (Polyline)idlist[i].GetObject(OpenMode.ForRead);
                                      List<double> dislist = new List<double>();
                                      List<Point2d> ptlist = new List<Point2d>();
                                      for (int j = 0; j < pl.NumberOfVertices - 1; j++)
                                      {
                                          Point2d p3 = pl.GetPoint2dAt(j);
                                          Point2d p4 = pl.GetPoint2dAt(j + 1);
                                          //获取交点
                                          Point2d pt = GetIntersection(p1, p2, p3, p4);

                                          //交点在线段上,则不用这条pl
                                          if (IsOnLine(p1, p2, pt))
                                          {
                                              break;
                                          }
                                          //交点在比较的多段线上才做记录
                                          if (IsOnLine(p3, p4, pt))
                                          {
                                              //记录交点和最小距离
                                              dislist.Add(GetMinDis(p1, p2, pt));
                                              ptlist.Add(pt);
                                          }


                                      }


                                      //最近的交点的点
                                      if (dislist.Count > 0)
                                      {
                                          Point2d mypt = ptlist[GetMinIndex(dislist)];
                                          Point3d pt1 = new Point3d(p1.X, p1.Y, 0);
                                          Point3d pt2 = new Point3d(mypt.X, mypt.Y, 0);

                                          Line line = new Line(pt1, pt2);
                                          ////将图形对象的信息添加到块表记录中,并返回ObjectId对象.  
                                          btr.AppendEntity(line);

                                          ////把对象添加到事务处理中.  
                                          trans.AddNewlyCreatedDBObject(line, true);
                                      }
                                  }
                              }

                              {
                                  Point2d p1 = sp.GetPoint2dAt(sp.NumberOfVertices-1);
                                  Point2d p2 = sp.GetPoint2dAt(sp.NumberOfVertices -2);


                                  for (int i = 0; i < idlist.Length; i++)
                                  {
                                      //是自己的线,不用比较
                                      if (idlist[i] == id)
                                      {
                                          continue;
                                      }
                                      Polyline pl = (Polyline)idlist[i].GetObject(OpenMode.ForRead);
                                      List<double> dislist = new List<double>();
                                      List<Point2d> ptlist = new List<Point2d>();
                                      for (int j = 0; j < pl.NumberOfVertices - 1; j++)
                                      {
                                          Point2d p3 = pl.GetPoint2dAt(j);
                                          Point2d p4 = pl.GetPoint2dAt(j + 1);
                                          //获取交点
                                          Point2d pt = GetIntersection(p1, p2, p3, p4);

                                          //交点在线段上,则不用这条pl
                                          if (IsOnLine(p1, p2, pt))
                                          {
                                              break;
                                          }
                                          //交点在比较的多段线上才做记录
                                          if (IsOnLine(p3, p4, pt))
                                          {
                                              //记录交点和最小距离
                                              dislist.Add(GetMinDis(p1, p2, pt));
                                              ptlist.Add(pt);
                                          }


                                      }


                                      //最近的交点的点
                                      if (dislist.Count > 0)
                                      {
                                          Point2d mypt = ptlist[GetMinIndex(dislist)];
                                          Point3d pt1 = new Point3d(p1.X, p1.Y, 0);
                                          Point3d pt2 = new Point3d(mypt.X, mypt.Y, 0);

                                          Line line = new Line(pt1, pt2);
                                          ////将图形对象的信息添加到块表记录中,并返回ObjectId对象.  
                                          btr.AppendEntity(line);

                                          ////把对象添加到事务处理中.  
                                          trans.AddNewlyCreatedDBObject(line, true);
                                      }
                                  }
                              }
                          }
                      }

                  }
                  trans.Commit();
              }
          }
      }



      public static int GetMinIndex(List<double> list)
      {
         
          double min = list[0];
          int index = 0;
          for (int i = 0; i < list.Count; i++)
          {
              if (min > list[i])
              {
                  min = list[i];
                  index = i;
              }
          }
          return index;
      }
      //获取最小的距离
      public static double GetMinDis(Point2d p1,Point2d p2,Point2d pt)
      {
          double d1 = pt.GetDistanceTo(p1);
          double d2 = pt.GetDistanceTo(p2);
          if (d1 < d2)
          {
              return d1;
          }
          return d2;

      }
      public static bool IsOnLine(Point2d p1,Point2d p2,Point2d pt)
      {
          if(IsBetween (p1.X,p2.X,pt.X)&& IsBetween (p1.Y,p2.Y,pt.Y))
          {
              return true;
          }
          return false;
      }


        public static bool IsBetween(double x1,double x2,double x)
        {
            if(x>=x1 && x<= x2)
            {
                return true;
            }
            if(x<=x1 && x>=x2)
            {
                return true;
            }
            return false;
        }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2017-8-4 08:48:04 | 显示全部楼层

这是做成了吗?楼主,能做个演示不。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-24 00:56 , Processed in 0.307850 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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