乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 67|回复: 3

求一个c#.net合并直线、多段线、圆弧。。。。的方法,类似CAD内置命令“J”,

[复制链接]

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
6
发表于 2021-1-21 11:14:00 | 显示全部楼层 |阅读模式
求一个c#.net合并直线、多段线、圆弧。。。。的方法,类似CAD内置命令“J”,线段的合并想法就是取出所有点,然后排序生成新的多段线。
但是圆弧怎么搞?哪位大神可以指导指导
如果是一个点集合的话,怎么记录哪一段需要转换圆弧,转换的角度怎么记录、一头雾水。
回复

使用道具 举报

0

主题

21

帖子

6

银币

初来乍到

Rank: 1

铜币
21
发表于 2021-1-25 14:17:00 | 显示全部楼层
生成多段线的方式是点集+凸度,自己先写一次生成多段线,了解其中的函数.....
凸度换算的方式参考
http://www.lee-mac.com/bulgeconv ... cetag=s_pcqq_aiomsg
回复

使用道具 举报

3

主题

14

帖子

7

银币

初来乍到

Rank: 1

铜币
26
发表于 2021-1-29 10:35:00 | 显示全部楼层
通过使用.NET分解复杂区域来创建一系列AutoCAD多段线
https://through-the-interface.ty ... reating-a-seri.html
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2021-1-29 14:30:00 | 显示全部楼层
///
    /// 将Line Arc LWPolyline 编辑成LWPolyline,能连接在一起的连接起来
    /// 要求端点相接
    /// Version : 2007.09.19 Sieben
    /// 2007.11.01有改动,未做详细测试
    /// 2008.02.14 修改封闭曲线时导致出现零节点的问题
    ///
    /// 第一曲线,若两条曲线连接成一条,则新曲线使用第一曲线一般属性(有例外),不应该为null
    /// 第二曲线,可以为null,这时是编辑单个实体
    /// 一个距离数值,用于作为判断两点重合的标准
    /// 成功返回aPolyline,否则返回null
    public static aPolyline JoinPolyline(Curve cur1, Curve cur2, double dTol)
    {
      try
      {
        //ae.WriteMessage("\nadb.JoinPolyline start ");
        aPolyline pline = null;
        if (cur1 == null || cur1.Closed) return null;
        if (!cur1.GetType().Equals(typeof(aPolyline)))
        {
          #region !aPolylineine Arc aPolyline
          if (cur2 != null && cur2.GetType().Equals(typeof(aPolyline)))
          {//第一曲线为非aPolyline,而第二曲线为aPolyline,这时以第二曲线作为第一曲线重新调用函数,此举只为减少代码
            return aCur.JoinPolyline(cur2, cur1, dTol);
          }
          pline = new aPolyline();
          if (cur1.GetType().Equals(typeof(Line)))//Line:?
          {//曲线为  Line,使用其数据生成一个aPolyline
            Line line = (Line)cur1;
            pline.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
            pline.AddVertexAt(1, new Point2d(line.EndPoint.X, line.EndPoint.Y), 0, 0, 0);
            pline.SetPropertiesFrom(line);//使用原来实体属性
            if (cur2 != null)//若第二曲线不为空,则试图连接两者
              pline = aCur.JoinPolyline(pline, cur2, dTol);
            return pline;//将新生成的多段线提交到数据库
          }
          else if (cur1.GetType().Equals(typeof(Arc)))//Arc:?
          {//曲线为  Line,使用其数据生成一个aPolyline   
            Arc arc = (Arc)cur1;
            Point3d p1 = arc.GetPointAtParameter(arc.EndParam * 0.5 + arc.StartParam * 0.5);
            double dltAng = arc.EndAngle - arc.StartAngle;
            if (dltAng = 0; i--)
              {
                pline.AddVertexAt(pline.NumberOfVertices, pline2.GetPoint2dAt(i), 0, 0, 0);
                pline.SetBulgeAt(pline.NumberOfVertices - 2, -pline2.GetBulgeAt(i));
              }
            }
            else if (pline.StartPoint.DistanceTo(pline2.StartPoint) = 0; i--)
              {
                pline.AddVertexAt(0, pline2.GetPoint2dAt(i), 0, 0, 0);
                pline.SetBulgeAt(0, pline2.GetBulgeAt(i));
              }
            }
            #endregion aPolyline:aPolyline
          }
          else
          {
            return null;
          }
          if (pline.StartPoint.DistanceTo(pline.EndPoint) < dTol) //如果曲线起点和终点重合,将Closed = true
          {
            pline.Closed = true;
            //2008.02.14注意:即使起点和终点已重合,pline.Closed = true还是会增加一个节点,导致多段线出现零节点
            pline.RemoveVertexAt(pline.NumberOfVertices - 1);
          }
          return pline;
          #endregion aPolylineine Arc aPolyline
        }
        return pline;
      }
      catch (System.Exception ex)
      {
        ae.WriteMessage(ex);
        return null;
      }
    }
非不想分享全部,但涉及的代码太多了,没有时间。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 02:10 , Processed in 0.144568 second(s), 60 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表