C#取得多段线中圆弧中点坐标

本文详细介绍了使用C#语言通过AutoCAD API获取多段线中圆弧中点坐标的两种方法,并对比了它们的优劣。包括代码实现和性能分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 C#取得多段线中圆弧中点坐标
搞了好久才弄明白怎么取得多段线中点的坐标值,以下是代码,和大家交流一下!其实还有更好的方法,我也是写出这段代码之后才在高手指导下知道第二种方法的,也一起贴出来。

using System;

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
[assembly: ExtensionApplication(typeof(ClassLibrary.Lab8Class))]
[assembly: CommandClass(typeof(ClassLibrary.Lab8Class))]

namespace ClassLibrary
{
 public class Lab8Class:IExtensionApplication
 {
  public void Initialize()
  {
   Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\n调试程序命令LV");//初始化操作

  }
  public void Terminate()
  {
   //清除操作
  }
  
  public Lab8Class()
  {
   //
   // TODO: Add constructor logic here
   //
  }
  Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
  Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase.TransactionManager;
  // Define Command "AsdkCmd1"
  [CommandMethod("LV")]
  public void getPlPoint() // This method can have any name
  {
   try
   {
    Transaction trans=tm.StartTransaction();
//    BlockTableRecord btr;
//    BlockTable bt;
    using(trans)
    {
                     PromptEntityResult per = ed.GetEntity("请选择多段线");
     if(per.Status == PromptStatus.OK)
     {
      DBObject obj = trans.GetObject(per.ObjectId, OpenMode.ForRead);
      {
       Polyline PL = obj as Polyline;
       int vn = PL.NumberOfVertices;
       for(int i = 0; i<= vn; i++)
       {
        Point3d pt3d = PL.GetPoint3dAt(i-1);

        double vBulge = PL.GetBulgeAt(i);
        if(vBulge != 0)
        {

         //方法一,比较笨的方法。

  double len0 = PL.GetDistAtPoint(PL.GetPoint3dAt(i));
  double len1 = PL.GetDistAtPoint(PL.GetPoint3dAt(i+1));
  double midlen = (len0 + len1)/2;

  ed.WriteMessage("\n第二种方法计算的圆弧中点是:" + midP3d.ToString());

//方法二,但是速度比较慢好像,因为如果加上下面的代码,运行速度明显慢,前面是感觉不出来的,后面的要停顿一下,可能有异常

  Point3d midL = PL.GetPointAtParameter(i+0.5);
  ed.WriteMessage("\n第二种方法计算的圆弧中点是:" + midL.ToString());
   
        }

       }
      }
     }
     trans.Commit();
     trans.Dispose();
    }
   }
   catch{}
   finally
   {
   }
  }

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值