j15tty 发表于 2015-3-26 12:43:00

圆弧标注程序 源码(JIG)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk..DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Text.RegularExpressions;
using System.Collections;
namespace YFBZ
{
    public class Class1
    {
      const int WM_RBUTTONDOWN = 516;
      int flag = 0;
      private void Application_PreTranslateMessage(object sender, PreTranslateMessageEventArgs e)
      {
            if (e.Message.message == WM_RBUTTONDOWN)
            {
                flag = 1;
            }
      }
      
      public void yfbzj()
      {
            Database db = HostApplicationServices.WorkingDatabase;
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
      handle01:
            PromptEntityOptions options = new PromptEntityOptions(" \n请选择圆弧");
            options.SetRejectMessage("\n所选择实体不是圆弧,请重新选择");
            options.AddAllowedClass(typeof(Arc), true);
            PromptEntityResult per = ed.GetEntity(options);
            ObjectId arced;
            if (per.Status == PromptStatus.Cancel)
            {
                return;
            }
            if (per.Status == PromptStatus.OK)
            {
                arced = per.ObjectId;
            }
            else
            {
                arced = per.ObjectId;
                return;
            }
            using (DocumentLock acLock = doc.LockDocument())
            {
                using (Transaction tran = db.TransactionManager.StartOpenCloseTransaction())
                {
                  Arc arc = tran.GetObject(arced, OpenMode.ForRead) as Arc;
                  Point3d pt1 = arc.StartPoint;
                  Point3d pt2 = arc.EndPoint;
                  Point3d cen = arc.Center;
                  Line line1 = new Line(cen, pt1);
                  Line line2 = new Line(cen, pt2);
                  line1.ColorIndex = 5;
                  line2.ColorIndex = 5;
                  double R = arc.Radius;
                  double Length = arc.Length;
                  double l = arc.GetDistanceAtParameter(Length / 2);
                  Point3d pt = arc.GetPointAtDist(Length / 2);
                  double cenRo = Math.Abs(arc.StartAngle - arc.EndAngle);
                  double BottomRo = (Math.PI - cenRo) / 2;
                  double xianLength = Math.Sqrt((pt1.X - pt2.X) * (pt1.X - pt2.X) + (pt1.Y - pt2.Y) * (pt1.Y - pt2.Y));
                  double T = xianLength / 2 / Math.Sin(BottomRo);
                  Point3d pt3 = xTextStyleTools.midPoint(cen, pt);
                  db.AddToModelSpace(line1);
                  db.AddToModelSpace(line2);
                  for (; ; )
                  {
                        Point3d point1 = pt3;
                        DBText text1 = new DBText();
                        text1.TextString="R = "+R.ToString("0.000");
                        ObjectId text1Id = db.AddToModelSpace(text1);
                        DBText text2 = new DBText();
                        //text1.Height = 3;
                        text2.TextString="K = "+ Length.ToString("0.000");
                        //text2.Height = 3;
                        ObjectId text2Id = db.AddToModelSpace(text2);
                        DBText text3 = new DBText();
                        text3.TextString = "α = "+ xTextStyleTools.DFM(cenRo);
                        ObjectId text3Id = db.AddToModelSpace(text3);
                        DBText text4 = new DBText();
                        text4.TextString = "T = " + T.ToString("0.000");
                        ObjectId text4Id = db.AddToModelSpace(text4);
                        YFBZ.EntYFJip pointBz = new YFBZ.EntYFJip(text1Id, text2Id, text3Id,text4Id, point1);
                        PromptResult resJip = ed.Drag(pointBz);
                        if (resJip.Status == PromptStatus.Cancel)
                        {
                            using (Transaction tr = db.TransactionManager.StartTransaction())
                            {
                              text1 = (DBText)tr.GetObject(pointBz.m_text1, OpenMode.ForWrite);
                              text1.Erase();
                              text2 = (DBText)tr.GetObject(pointBz.m_text2, OpenMode.ForWrite);
                              text2.Erase();
                              text3 = (DBText)tr.GetObject(pointBz.m_text3, OpenMode.ForWrite);
                              text3.Erase();
                              text4 = (DBText)tr.GetObject(pointBz.m_text4, OpenMode.ForWrite);
                              text4.Erase();
                              tr.Commit();
                            }
                            break;
                        }
                        Autodesk.AutoCAD.ApplicationServices.Application.PreTranslateMessage += new PreTranslateMessageEventHandler(Application_PreTranslateMessage);
                        if (flag == 1)
                        {
                            using (Transaction tr = db.TransactionManager.StartTransaction())
                            {
                              text1 = (DBText)tr.GetObject(pointBz.m_text1, OpenMode.ForWrite);
                              text1.Erase();
                              text2 = (DBText)tr.GetObject(pointBz.m_text2, OpenMode.ForWrite);
                              text2.Erase();
                              text3 = (DBText)tr.GetObject(pointBz.m_text3, OpenMode.ForWrite);
                              text3.Erase();
                              text4 = (DBText)tr.GetObject(pointBz.m_text4, OpenMode.ForWrite);
                              text4.Erase();
                              tr.Commit();
                            }
                            break;
                        }
                        if (resJip.Status == PromptStatus.OK)
                        {
                            db.AddToModelSpace(pointBz.GetEntity());
                            flag = 0;
                            gotohandle01;
                        }
                  }
                  flag = 0;
                  tran.Commit();
                }
            }
      }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.DatabaseServices;namespace YFBZ
{
    public class EntYFJip : EntityJig
    {
      private Point2d[] m_pts = new Point2d;
      private Point3d m_peakPt;
      private double length1, length2, length,length3,length4;
      private Point3d firstPoint;
      private Point3d m_textPt1;
      private Point3d m_textPt2;
      private Point3d m_textPt3;
      private Point3d m_textPt4;
      private Matrix3d m_mt = Matrix3d.Identity;
      public ObjectId m_text1 = ObjectId.Null;
      public ObjectId m_text2 = ObjectId.Null;
      public ObjectId m_text3 = ObjectId.Null;
      public ObjectId m_text4 = ObjectId.Null;
      public EntYFJip(ObjectId text1, ObjectId text2, ObjectId text3, ObjectId text4, Point3d Point1)
            : base(new Polyline())
      {
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            m_mt = ed.CurrentUserCoordinateSystem;
            //初始化引线
            ((Polyline)Entity).AddVertexAt(0, Point2d.Origin, 0.0, 0.0, 0.0);
            ((Polyline)Entity).AddVertexAt(1, Point2d.Origin, 0.0, 0.4, 0.4);
            ((Polyline)Entity).AddVertexAt(2, Point2d.Origin, 0.0, 0.4, 0.4);
            //参数传递
            firstPoint = Point1;
            m_text1 = text1;
            m_text2 = text2;
            m_text3 = text3;
            m_text4 = text4;
      }
      protected override bool Update()
      {
            //throw new NotImplementedException();
            Database db = HostApplicationServices.WorkingDatabase;
            ((Polyline)Entity).SetPointAt(0, m_pts);
            ((Polyline)Entity).SetPointAt(1, m_pts);
            ((Polyline)Entity).SetPointAt(2, m_pts);
            ((Polyline)Entity).Normal = Vector3d.ZAxis;
            ((Polyline)Entity).Elevation = 0.0;
            //((Polyline)Entity).ConstantWidth = 0.4;
            //((Polyline)Entity).TransformBy(m_mt);
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                DBText dtext1 = (DBText)tr.GetObject(m_text1, OpenMode.ForWrite);
                dtext1.Position = m_textPt1;
                dtext1.Height = 3;
                dtext1.WidthFactor = 0.8;
                dtext1.ColorIndex = 80;
                //dtext1.TextString = "X=" + m_pts.Y.ToString("0.000");
                length1 = Autodesk.AutoCAD.Internal.Utils.GetTextExtents(m_text1, dtext1.TextString, 2.4).X;
                DBText dtext2 = (DBText)tr.GetObject(m_text2, OpenMode.ForWrite);
                dtext2.Position = m_textPt2;
                dtext2.Height = 3;
                dtext2.WidthFactor = 0.8;
                dtext2.ColorIndex = 80;
                //dtext2.TextString = "Y=" + m_pts.X.ToString("0.000");
                length2 = Autodesk.AutoCAD.Internal.Utils.GetTextExtents(m_text2, dtext2.TextString, 2.4).X;
                DBText dtext3 = (DBText)tr.GetObject(m_text3, OpenMode.ForWrite);
                dtext3.Position = m_textPt3;
                dtext3.Height = 3;
                dtext3.ColorIndex = 80;
                dtext3.WidthFactor = 0.8;
                length3 = Autodesk.AutoCAD.Internal.Utils.GetTextExtents(m_text3, dtext3.TextString, 2.4).X;
                DBText dtext4 = (DBText)tr.GetObject(m_text4, OpenMode.ForWrite);
                dtext4.Position = m_textPt4;
                dtext4.Height = 3;
                dtext4.ColorIndex = 80;
                dtext4.WidthFactor = 0.8;
                length4 = Autodesk.AutoCAD.Internal.Utils.GetTextExtents(m_text4, dtext4.TextString, 2.4).X;
                if (length1 >= length2)
                {
                  length = length1;
                }
                else
                {
                  length = length2;
                }
                if (length = 0 && curPt.Y - firstPoint.Y >= 0) || (curPt.X - firstPoint.X >= 0 && curPt.Y - firstPoint.Y
      /// 获取与定点指定角度与距离的点
      ///
      /// 多段线对象
      public static Point3d polarPoint(this Point3d point, double angle, double dist)
      {
            return new Point3d(point.X + dist * Math.Cos(angle), point.Y + dist * Math.Sin(angle), point.Z);
      }
      ///
      /// 弧度转度分秒
      ///
      /// 弧度数组
      public static string DFM(double Alpha)
      {
            string dfm;
            dfm = "0.00";
            double t = 180.0 * Alpha / 3.1415926;
            int d = (int)t;
            int m = (int)((t - d) * 60);
            int s = (int)((t - d - m / 60.0) * 3600);
            dfm = d.ToString() + "o" + m.ToString() + "\'" + s.ToString() + """;
            return dfm;
      }
      ///
      /// 获取两点直线中点
      ///
      /// 多段线对象
      public static Point3d midPoint(Point3d point1, Point3d point2)
      {
            return new Point3d((point1.X + point2.X) / 2, (point1.Y + point2.Y) / 2, (point1.Z + point2.Z) / 2);
      }
    }
}

j15tty 发表于 2015-3-28 16:56:00

自己顶一下

mycad 发表于 2015-4-28 16:25:00

学习,谢谢!

mycad 发表于 2015-4-28 16:35:00

编译错误,xTextStyleTools不存在,没有定义吗?能否把整个工程放上来供大家学习呢?谢谢!

j15tty 发表于 2015-4-29 08:58:00


我把度分秒函数给出来了的,你随便放到那个类里面不就可以了。xTextStyleTools.DFM,如果你新建一个类,类名假如为TOOLS ,并把DFM函数放进去,那么他的引用就是TOOLS.DFM;所以这个不影响你的。

bluefires 发表于 2020-3-4 18:30:00

这个代码真的很不错啊,参考后可以用于标注程序,实用性非常强,赞一个,顶起来!

xiongdi6k 发表于 2020-4-2 10:02:00

学习了

mycad 发表于 2020-4-11 08:22:00

很好,谢谢!学习一下!
页: [1]
查看完整版本: 圆弧标注程序 源码(JIG)