首页 > 编程语言 >AutoCAD C# 两不平行直线倒圆弧算法

AutoCAD C# 两不平行直线倒圆弧算法

时间:2024-05-05 14:55:05浏览次数:13  
标签:AutoCAD C# 圆弧 tr return alz l1 var new

参考的博客:https://www.cnblogs.com/JJBox/p/14300098.html

下面是计算示例

主要计算代码:

   var peo = new PromptEntityOptions("选择直线1")
   {
       AllowNone = false,
       AllowObjectOnLockedLayer = false
   };
   peo.SetRejectMessage("请选择直线Line");
   peo.AddAllowedClass(typeof(Line), false);
   var per1 = AcEnv.CurEd.GetEntity(peo);
   peo.Message = "选择直线2";
   var per2 = AcEnv.CurEd.GetEntity(peo);
   var r = AcEnv.CurEd.GetDouble("输入圆弧半径:\n").Value;
   if (per1.Status == PromptStatus.OK && per2.Status == PromptStatus.OK)
   {
       using (var tr = AcEnv.CurDb.TransactionManager.StartTransaction())
       {
           var l1 = (Line)tr.GetObject(per1.ObjectId, OpenMode.ForRead);
           var l2 = (Line)tr.GetObject(per2.ObjectId, OpenMode.ForRead);
           var pts = new Point3dCollection();
           l1.IntersectWith(l2, Intersect.ExtendBoth, l1.GetPlane(), pts, IntPtr.Zero, IntPtr.Zero);
           if (pts.Count == 0)
           {
               AcApp.Application.ShowAlertDialog("2直线无交点无法到圆角!");
               tr.Abort();
               return;
           }
           var p0 = pts[0];
           var p02d = p0.Convert2d(l1.GetPlane());
           var voa = p0.GetVectorTo(l1.EndPoint.GetMidPoint(l1.StartPoint));
           var vob = p0.GetVectorTo(l2.EndPoint.GetMidPoint(l2.StartPoint));
           var angle = voa.GetAngleTo(vob) * 0.5;
           var doc = r / Math.Sin(angle);
           var pa = p0.Add(voa.GetNormal() * (double)(r / Math.Tan(angle)));
           var pb = p0.Add(vob.GetNormal() * (double)(r / Math.Tan(angle)));
           var isCw = Tools.CrossAclockwise(p02d, pa.Convert2d(l1.GetPlane()), pb.Convert2d(l1.GetPlane()));
           var pc = pa.Add((isCw ? voa : voa.Negate()).GetPerpendicularVector().GetNormal() * r);
           var startAngle = pc.GetVectorTo(pb).Convert2d(l1.GetPlane()).GetAngle2XAxis();
           var endAngle = pc.GetVectorTo(pa).Convert2d(l1.GetPlane()).GetAngle2XAxis();
           Arc a = new Arc(pc, Vector3d.ZAxis, r, isCw ? startAngle : endAngle, isCw ? endAngle : startAngle);
           //AcEnv.CurDb.AppendEntities(new DBPoint(p0), new DBPoint(pa), new DBPoint(pb), new DBPoint(pc));
           AcEnv.CurDb.AppendEntities(a);
           tr.Commit();
       }
   }

用到的拓展函数

    public static Point3d GetMidPoint(this Point3d p1, Point3d p2)
    {
        return new Point3d((p1.X + p2.X) * 0.5, (p1.Y + p2.Y) * 0.5, (p1.Z + p2.Z) * 0.5);
    }
    /// <summary>
    /// 叉积,二维叉乘计算
    /// </summary>
    /// <param name="a">传参是向量,表示原点是0,0</param>
    /// <param name="b">传参是向量,表示原点是0,0</param>
    /// <returns>其模为a与b构成的平行四边形面积</returns>
    public static double Cross(Vector2d a, Vector2d b)
    {
        return a.X * b.Y - a.Y * b.X;
    }

    /// <summary>
    /// 叉积,二维叉乘计算 
    /// </summary>
    /// <param name="o">原点</param>
    /// <param name="a">oa向量</param>
    /// <param name="b">ob向量,此为判断点</param>
    /// <returns>返回值有正负,表示绕原点四象限的位置变换,也就是有向面积</returns>
    public static double Cross(Point2d o, Point2d a, Point2d b)
    {
        return Cross(o.GetVectorTo(a), o.GetVectorTo(b));
    }

    /// <summary>
    /// 叉积,逆时针方向为真
    /// </summary>
    /// <param name="o">直线点1</param>
    /// <param name="a">直线点2</param>
    /// <param name="b">判断点</param>
    /// <returns>b点在oa的逆时针<see cref="true"/></returns>
    public static bool CrossAclockwise(Point2d o, Point2d a, Point2d b)
    {
        return Cross(o, a, b) > -1e-6;//浮点数容差考虑
    }

    /// <summary>
    /// X轴到向量的弧度,cad的获取的弧度是1PI,所以转换为2PI(上小,下大)
    /// </summary>
    /// <param name="ve">向量</param>
    /// <returns>弧度</returns>
    public static double GetAngle2XAxis(this Vector2d ve)
    {
        double alz = Vector2d.XAxis.GetAngleTo(ve);//观察方向不要设置 
        alz = ve.Y > 0 ? alz : Math.PI * 2 - alz; //逆时针为正,如果-负值控制正反
        alz = Math.Abs(Math.PI * 2 - alz) < 1e-10 ? 0 : alz;
        return alz;
    }
  public static ObjectIdCollection AppendEntities(this Database acdb, params Entity[] ents)
  {
      ObjectIdCollection oids = [];
      using (var tr = acdb.TransactionManager.StartTransaction())
      {
          var btr = (BlockTableRecord)acdb.CurrentSpaceId.GetObject(OpenMode.ForWrite);
          foreach (var item in ents)
          {
              if (!item.IsNewObject) continue;
              oids.Add(btr.AppendEntity(item));
              tr.AddNewlyCreatedDBObject(item, true);
          }
          tr.Commit();
      }
      return oids;
  }
}

 

标签:AutoCAD,C#,圆弧,tr,return,alz,l1,var,new
From: https://www.cnblogs.com/NanShengBlogs/p/18173500

相关文章

  • 事件处理函数中, e.stopPropagation()能放在 onChangeColor()后边执行吗?
    在JavaScript事件处理中,e.stopPropagation()的作用是阻止事件向上冒泡到父元素,也就是说,它防止当前元素的事件继续传播到DOM树上的其他事件监听器。因此,它的位置对于事件流的行为至关重要。将e.stopPropagation()放在onChangeColor()后面执行,在大多数情况下不会改变onChange......
  • C#配置程序引用的dll的位置
    在C#程序的App.config配置第三方dll的位置,使得C#程序可以自动加载子目录下的dll。参考博客:https://blog.csdn.net/qq_43307934/article/details/117805106<runtime><assemblyBindingxmlns="urn:schemas-microsoft-com:asm.v1"><probingprivatePath="bin;bin......
  • Cleanmgr,也称为磁盘清理器(Disk Cleanup),是Windows操作系统中的实用工具,用于删除计算机
    cleanmgr|MicrosoftLearnCleanmgr,也称为磁盘清理器(DiskCleanup),是Windows操作系统中的实用工具,用于删除计算机上不需要的临时文件、回收站文件、下载文件以及其他可以安全删除的文件,以释放磁盘空间。功能特点:释放磁盘空间:Cleanmgr可以帮助用户识别并删除不再需要的......
  • docker离线安装
    步骤一:官网下载Docker安装包wgethttps://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz步骤二:解压安装包tar-zxvfdocker-24.0.6.tgz步骤三:将解压后的Docker文件移到/usr/bin目录下sudocpdocker/*/usr/bin/步骤四:将Docker注册为系......
  • TypeError 'tuple' object does not support item assignment
    左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。公众号:一点sir,关注领取编程资料TypeError:'tuple'objectdoesnotsupportitemassignment是一个在Python编程语言中常见的错误,意味着你试图修改一个不可变的元组(tuple)对象中的元素。在Python中,元组是一种不......
  • C++模板
    C++模板C++是一个面向对象编程的语言,提供了类的继承和组合机制,虽然在层次结构上很简单,但使用起来非常糟糕。C++使用关键字template,告诉编译器声明的类或者对象是一个模板。模板不是像继承和组合那样重用目标代码,而是重用源代码。容器不再包含名为Object的泛型基类,而是包含未指......
  • CF-522-D-线段树
    522-D题目大意给定一个长为\(n\)的序列\(a\),现有\(q\)个查询,每个查询\(q_i\)给定\(l_i,r_i(1\lel_i,r_i\len)\),要你找出所有相等元素对\(a_x\)和\(a_y(l_i\lex,y\ler_i)\)中,绝对值\(|x-y|\)的最小值。Solution考虑三个相等的元素\(a_x,a_y,a_z(x<y<z)\),对于一个......
  • Qt/C++音视频开发72-倍速推流/音视频同步倍速推流/不改变帧率和采样率/低倍速和高倍速
    一、前言最近多了个新需求,需要倍速推流,推流界的扛把子obs也有倍速推流功能,最高支持到两倍速。这里所说的倍速,当然只限定在文件,只有文件才可能有倍速功能,因为也只有文件才能倍速解码播放。实时视频流是不可能倍速的,因为没有时长,有时长的才可以按照播放进度来。是否是文件也不能通......
  • Excel求解器使用教程
    添加规则求解加载项创建excel文件,点击文件点击选项选择加载项->规则求解加载项->转到选择规则求解加载项->确定求解器所在位置---数据->规划求解在excel文档中填写相关的计算公式,用来求解点击规则求解,填写对应的目标,可变单元和约束,选择求解方法来求......
  • TypeError: Cannot read properties of undefined (reading 'trim')
     运行时提示:TypeError:Cannotreadpropertiesofundefined(reading'trim')问题排查:1、确认trim()属性是否存在,这个是js去除字符串左右空格,属性是存在的2、确认this.form.proxy_url是否存在3、确认确认this.form.proxy_url的值是否为undefined和null通过排查和打印,con......