明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3389|回复: 8

[JIG] 圆弧标注程序 源码(JIG)

[复制链接]
发表于 2015-3-26 12:43:20 | 显示全部楼层 |阅读模式
本帖最后由 j15tty 于 2015-3-28 16:48 编辑
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.EditorInput;
  8. using Autodesk.AutoCAD.Colors;
  9. using Autodesk.AutoCAD.Runtime;
  10. using Autodesk.AutoCAD.ApplicationServices;
  11. using System.ComponentModel;
  12. using System.Data;
  13. using System.Data.OleDb;
  14. using System.Text.RegularExpressions;
  15. using System.Collections;
  16. namespace YFBZ
  17. {
  18.     public class Class1
  19.     {
  20.         const int WM_RBUTTONDOWN = 516;
  21.         int flag = 0;
  22.         private void Application_PreTranslateMessage(object sender, PreTranslateMessageEventArgs e)
  23.         {

  24.             if (e.Message.message == WM_RBUTTONDOWN)
  25.             {
  26.                 flag = 1;
  27.             }

  28.         }
  29.         [CommandMethod("yfzj")]
  30.         public void yfbzj()
  31.         {
  32.             Database db = HostApplicationServices.WorkingDatabase;
  33.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  34.             Editor ed = doc.Editor;
  35.         handle01:
  36.             PromptEntityOptions options = new PromptEntityOptions(" \n请选择圆弧");
  37.             options.SetRejectMessage("\n所选择实体不是圆弧,请重新选择");
  38.             options.AddAllowedClass(typeof(Arc), true);
  39.             PromptEntityResult per = ed.GetEntity(options);
  40.             ObjectId arced;
  41.             if (per.Status == PromptStatus.Cancel)
  42.             {
  43.                 return;
  44.             }
  45.             if (per.Status == PromptStatus.OK)
  46.             {
  47.                 arced = per.ObjectId;
  48.             }
  49.             else
  50.             {
  51.                 arced = per.ObjectId;
  52.                 return;
  53.             }
  54.             using (DocumentLock acLock = doc.LockDocument())
  55.             {
  56.                 using (Transaction tran = db.TransactionManager.StartOpenCloseTransaction())
  57.                 {


  58.                     Arc arc = tran.GetObject(arced, OpenMode.ForRead) as Arc;

  59.                     Point3d pt1 = arc.StartPoint;
  60.                     Point3d pt2 = arc.EndPoint;
  61.                     Point3d cen = arc.Center;

  62.                     Line line1 = new Line(cen, pt1);
  63.                     Line line2 = new Line(cen, pt2);
  64.                     line1.ColorIndex = 5;
  65.                     line2.ColorIndex = 5;
  66.                     double R = arc.Radius;
  67.                     double Length = arc.Length;
  68.                     double l = arc.GetDistanceAtParameter(Length / 2);
  69.                     Point3d pt = arc.GetPointAtDist(Length / 2);
  70.                     double cenRo = Math.Abs(arc.StartAngle - arc.EndAngle);
  71.                     double BottomRo = (Math.PI - cenRo) / 2;
  72.                     double xianLength = Math.Sqrt((pt1.X - pt2.X) * (pt1.X - pt2.X) + (pt1.Y - pt2.Y) * (pt1.Y - pt2.Y));
  73.                     double T = xianLength / 2 / Math.Sin(BottomRo);
  74.                     Point3d pt3 = xTextStyleTools.midPoint(cen, pt);
  75.                     db.AddToModelSpace(line1);
  76.                     db.AddToModelSpace(line2);
  77.                     for (; ; )
  78.                     {

  79.                         Point3d point1 = pt3;
  80.                         DBText text1 = new DBText();
  81.                         text1.TextString="R = "+R.ToString("0.000");
  82.                         ObjectId text1Id = db.AddToModelSpace(text1);
  83.                         DBText text2 = new DBText();
  84.                         //text1.Height = 3;
  85.                         text2.TextString="K = "+ Length.ToString("0.000");
  86.                         //text2.Height = 3;
  87.                         ObjectId text2Id = db.AddToModelSpace(text2);
  88.                         DBText text3 = new DBText();
  89.                         text3.TextString = "α = "+ xTextStyleTools.DFM(cenRo);
  90.                         ObjectId text3Id = db.AddToModelSpace(text3);

  91.                         DBText text4 = new DBText();
  92.                         text4.TextString = "T = " + T.ToString("0.000");
  93.                         ObjectId text4Id = db.AddToModelSpace(text4);

  94.                         YFBZ.EntYFJip pointBz = new YFBZ.EntYFJip(text1Id, text2Id, text3Id,text4Id, point1);
  95.                         PromptResult resJip = ed.Drag(pointBz);
  96.                         if (resJip.Status == PromptStatus.Cancel)
  97.                         {
  98.                             using (Transaction tr = db.TransactionManager.StartTransaction())
  99.                             {
  100.                                 text1 = (DBText)tr.GetObject(pointBz.m_text1, OpenMode.ForWrite);
  101.                                 text1.Erase();
  102.                                 text2 = (DBText)tr.GetObject(pointBz.m_text2, OpenMode.ForWrite);
  103.                                 text2.Erase();
  104.                                 text3 = (DBText)tr.GetObject(pointBz.m_text3, OpenMode.ForWrite);
  105.                                 text3.Erase();
  106.                                 text4 = (DBText)tr.GetObject(pointBz.m_text4, OpenMode.ForWrite);
  107.                                 text4.Erase();
  108.                                 tr.Commit();
  109.                             }
  110.                             break;
  111.                         }
  112.                         Autodesk.AutoCAD.ApplicationServices.Application.PreTranslateMessage += new PreTranslateMessageEventHandler(Application_PreTranslateMessage);
  113.                         if (flag == 1)
  114.                         {
  115.                             using (Transaction tr = db.TransactionManager.StartTransaction())
  116.                             {
  117.                                 text1 = (DBText)tr.GetObject(pointBz.m_text1, OpenMode.ForWrite);
  118.                                 text1.Erase();
  119.                                 text2 = (DBText)tr.GetObject(pointBz.m_text2, OpenMode.ForWrite);
  120.                                 text2.Erase();
  121.                                 text3 = (DBText)tr.GetObject(pointBz.m_text3, OpenMode.ForWrite);
  122.                                 text3.Erase();
  123.                                 text4 = (DBText)tr.GetObject(pointBz.m_text4, OpenMode.ForWrite);
  124.                                 text4.Erase();
  125.                                 tr.Commit();
  126.                             }
  127.                             break;
  128.                         }
  129.                         if (resJip.Status == PromptStatus.OK)
  130.                         {
  131.                             db.AddToModelSpace(pointBz.GetEntity());
  132.                             flag = 0;
  133.                             goto  handle01;
  134.                         }
  135.                     }
  136.                     flag = 0;
  137.                     tran.Commit();

  138.                 }
  139.             }
  140.         }
  141.     }
  142. }

  143. using System;
  144. using System.Collections.Generic;
  145. using System.Linq;
  146. using System.Text;
  147. using Autodesk.AutoCAD.EditorInput;
  148. using Autodesk.AutoCAD.Geometry;
  149. using Autodesk.AutoCAD.DatabaseServices;



  150. namespace YFBZ
  151. {
  152.     public class EntYFJip : EntityJig
  153.     {
  154.         private Point2d[] m_pts = new Point2d[3];
  155.         private Point3d m_peakPt;
  156.         private double length1, length2, length,length3,length4;
  157.         private Point3d firstPoint;
  158.         private Point3d m_textPt1;
  159.         private Point3d m_textPt2;
  160.         private Point3d m_textPt3;
  161.         private Point3d m_textPt4;
  162.         private Matrix3d m_mt = Matrix3d.Identity;
  163.         public ObjectId m_text1 = ObjectId.Null;
  164.         public ObjectId m_text2 = ObjectId.Null;
  165.         public ObjectId m_text3 = ObjectId.Null;
  166.         public ObjectId m_text4 = ObjectId.Null;
  167.         public EntYFJip(ObjectId text1, ObjectId text2, ObjectId text3, ObjectId text4, Point3d Point1)
  168.             : base(new Polyline())
  169.         {
  170.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  171.             m_mt = ed.CurrentUserCoordinateSystem;
  172.             //初始化引线
  173.             ((Polyline)Entity).AddVertexAt(0, Point2d.Origin, 0.0, 0.0, 0.0);
  174.             ((Polyline)Entity).AddVertexAt(1, Point2d.Origin, 0.0, 0.4, 0.4);
  175.             ((Polyline)Entity).AddVertexAt(2, Point2d.Origin, 0.0, 0.4, 0.4);
  176.             //参数传递
  177.             firstPoint = Point1;
  178.             m_text1 = text1;
  179.             m_text2 = text2;
  180.             m_text3 = text3;
  181.             m_text4 = text4;
  182.         }
  183.         protected override bool Update()
  184.         {
  185.             //throw new NotImplementedException();
  186.             Database db = HostApplicationServices.WorkingDatabase;
  187.             ((Polyline)Entity).SetPointAt(0, m_pts[0]);
  188.             ((Polyline)Entity).SetPointAt(1, m_pts[1]);
  189.             ((Polyline)Entity).SetPointAt(2, m_pts[2]);
  190.             ((Polyline)Entity).Normal = Vector3d.ZAxis;
  191.             ((Polyline)Entity).Elevation = 0.0;
  192.             //((Polyline)Entity).ConstantWidth = 0.4;
  193.             //((Polyline)Entity).TransformBy(m_mt);
  194.             using (Transaction tr = db.TransactionManager.StartTransaction())
  195.             {

  196.                 DBText dtext1 = (DBText)tr.GetObject(m_text1, OpenMode.ForWrite);
  197.                 dtext1.Position = m_textPt1;
  198.                 dtext1.Height = 3;
  199.                 dtext1.WidthFactor = 0.8;
  200.                 dtext1.ColorIndex = 80;
  201.                 //dtext1.TextString = "X=" + m_pts[0].Y.ToString("0.000");
  202.                 length1 = Autodesk.AutoCAD.Internal.Utils.GetTextExtents(m_text1, dtext1.TextString, 2.4).X;
  203.                 DBText dtext2 = (DBText)tr.GetObject(m_text2, OpenMode.ForWrite);
  204.                 dtext2.Position = m_textPt2;
  205.                 dtext2.Height = 3;
  206.                 dtext2.WidthFactor = 0.8;
  207.                 dtext2.ColorIndex = 80;
  208.                 //dtext2.TextString = "Y=" + m_pts[0].X.ToString("0.000");
  209.                 length2 = Autodesk.AutoCAD.Internal.Utils.GetTextExtents(m_text2, dtext2.TextString, 2.4).X;
  210.                 DBText dtext3 = (DBText)tr.GetObject(m_text3, OpenMode.ForWrite);
  211.                 dtext3.Position = m_textPt3;
  212.                 dtext3.Height = 3;
  213.                 dtext3.ColorIndex = 80;
  214.                 dtext3.WidthFactor = 0.8;
  215.                 length3 = Autodesk.AutoCAD.Internal.Utils.GetTextExtents(m_text3, dtext3.TextString, 2.4).X;
  216.                 DBText dtext4 = (DBText)tr.GetObject(m_text4, OpenMode.ForWrite);
  217.                 dtext4.Position = m_textPt4;
  218.                 dtext4.Height = 3;
  219.                 dtext4.ColorIndex = 80;
  220.                 dtext4.WidthFactor = 0.8;
  221.                 length4 = Autodesk.AutoCAD.Internal.Utils.GetTextExtents(m_text4, dtext4.TextString, 2.4).X;
  222.                 if (length1 >= length2)
  223.                 {
  224.                     length = length1;
  225.                 }
  226.                 else
  227.                 {
  228.                     length = length2;
  229.                 }
  230.                 if (length < length3)
  231.                 {
  232.                     length = length3;
  233.                 }
  234.                 if (length < length4)
  235.                 {
  236.                     length = length4;
  237.                 }
  238.                
  239.                 tr.Commit();
  240.             }
  241.             return true;
  242.         }


  243.         protected override SamplerStatus Sampler(JigPrompts prompts)
  244.         {
  245.             //throw new NotImplementedException();


  246.             // 定义一个点拖动交互类.
  247.             JigPromptPointOptions optJigPoint = new JigPromptPointOptions("\n请指定下一点");
  248.             // 设置拖拽的光标类型.
  249.             optJigPoint.Cursor = CursorType.RubberBand;
  250.             // 设置拖动光标基点.
  251.             optJigPoint.BasePoint = firstPoint.TransformBy(m_mt);
  252.             optJigPoint.UseBasePoint = true;
  253.             // 用AcquirePoint函数得到用户输入的点.
  254.             PromptPointResult resJigPoint = prompts.AcquirePoint(optJigPoint);
  255.             Point3d curPt = resJigPoint.Value;
  256.             if (resJigPoint.Status == PromptStatus.Cancel)
  257.             {
  258.                 return SamplerStatus.Cancel;
  259.             }
  260.             if (m_peakPt != curPt)
  261.             {
  262.                 //保存鼠标拖曳点
  263.                 m_peakPt = curPt;
  264.               
  265.                 //得到多线坐标
  266.                 if ((curPt.X - firstPoint.X >= 0 && curPt.Y - firstPoint.Y >= 0) || (curPt.X - firstPoint.X >= 0 && curPt.Y - firstPoint.Y <= 0))
  267.                 {
  268.                     m_pts[0] = new Point2d(firstPoint.X, firstPoint.Y);
  269.                     m_pts[1] = new Point2d(m_peakPt.X, m_peakPt.Y);
  270.                     m_pts[2] = new Point2d(m_peakPt.X + length, m_peakPt.Y);
  271.                     m_textPt1 = new Point3d(m_peakPt.X + 0.5, m_peakPt.Y + 9, m_peakPt.Z);
  272.                     m_textPt2 = new Point3d(m_peakPt.X + 0.5, m_peakPt.Y + 5, m_peakPt.Z);
  273.                     m_textPt3 = new Point3d(m_peakPt.X + 0.5, m_peakPt.Y + 1, m_peakPt.Z);
  274.                     m_textPt4 = new Point3d(m_peakPt.X + 0.5, m_peakPt.Y + 13, m_peakPt.Z);
  275.                 }
  276.                 else
  277.                 {
  278.                     m_pts[0] = new Point2d(firstPoint.X, firstPoint.Y);
  279.                     m_pts[1] = new Point2d(m_peakPt.X, m_peakPt.Y);
  280.                     m_pts[2] = new Point2d(m_peakPt.X - length, m_peakPt.Y);
  281.                     m_textPt1 = new Point3d(m_peakPt.X - length+0.5, m_peakPt.Y + 9, m_peakPt.Z);
  282.                     m_textPt2 = new Point3d(m_peakPt.X - length+0.5, m_peakPt.Y + 5, m_peakPt.Z);
  283.                     m_textPt3 = new Point3d(m_peakPt.X - length+0.5, m_peakPt.Y + 1, m_peakPt.Z);
  284.                     m_textPt4 = new Point3d(m_peakPt.X -length + 0.5, m_peakPt.Y + 13, m_peakPt.Z);
  285.                 }
  286.                 return SamplerStatus.OK;
  287.             }
  288.             else
  289.             {
  290.                 return SamplerStatus.NoChange;

  291.             }

  292.         }

  293.         public Entity GetEntity()
  294.         {
  295.             return Entity;
  296.         }


  297.     }
  298. }


  299. using System;
  300. using System.Collections.Generic;
  301. using System.Linq;
  302. using System.Text;
  303. using Autodesk.AutoCAD.DatabaseServices;
  304. using Autodesk.AutoCAD.Geometry;

  305. namespace YFBZ
  306. {
  307.     public static class Class2
  308.     {
  309.         public static ObjectId AddToModelSpace(this Database db, Entity ent)
  310.         {
  311.             ObjectId entId;//用于返回添加到模型空间中的实体ObjectId
  312.             //定义一个指向当前数据库的事务处理,以添加直线
  313.             using (Transaction trans = db.TransactionManager.StartTransaction())
  314.             {
  315.                 //以读方式打开块表
  316.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  317.                 //以写方式打开模型空间块表记录.
  318.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  319.                 entId = btr.AppendEntity(ent);//将图形对象的信息添加到块表记录中
  320.                 trans.AddNewlyCreatedDBObject(ent, true);//把对象添加到事务处理中
  321.                 trans.Commit();//提交事务处理
  322.             }
  323.             return entId; //返回实体的ObjectId
  324.         }
  325.         /// <summary>
  326.         /// 获取与定点指定角度与距离的点
  327.         /// </summary>
  328.         /// <param name="pline">多段线对象</param>
  329.         public static Point3d polarPoint(this Point3d point, double angle, double dist)
  330.         {
  331.             return new Point3d(point.X + dist * Math.Cos(angle), point.Y + dist * Math.Sin(angle), point.Z);
  332.         }

  333.         /// <summary>
  334.         /// 弧度转度分秒
  335.         /// </summary>
  336.         /// <param name="Alpha">弧度数组</param>
  337.         public static string DFM(double Alpha)
  338.         {
  339.             string dfm;
  340.             dfm = "0.00";
  341.             double t = 180.0 * Alpha / 3.1415926;
  342.             int d = (int)t;
  343.             int m = (int)((t - d) * 60);
  344.             int s = (int)((t - d - m / 60.0) * 3600);
  345.             dfm = d.ToString() + "o" + m.ToString() + "\'" + s.ToString() + """;
  346.             return dfm;
  347.         }
  348.         /// <summary>
  349.         /// 获取两点直线中点
  350.         /// </summary>
  351.         /// <param name="pline">多段线对象</param>
  352.         public static Point3d midPoint(Point3d point1, Point3d point2)
  353.         {
  354.             return new Point3d((point1.X + point2.X) / 2, (point1.Y + point2.Y) / 2, (point1.Z + point2.Z) / 2);
  355.         }

  356.     }
  357. }

本帖子中包含更多资源

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

x
 楼主| 发表于 2015-3-28 16:56:03 | 显示全部楼层
自己顶一下
发表于 2015-4-28 16:25:16 | 显示全部楼层
学习,谢谢!
发表于 2015-4-28 16:35:47 | 显示全部楼层
编译错误,xTextStyleTools不存在,没有定义吗?能否把整个工程放上来供大家学习呢?谢谢!
 楼主| 发表于 2015-4-29 08:58:40 | 显示全部楼层
mycad 发表于 2015-4-28 16:35
编译错误,xTextStyleTools不存在,没有定义吗?能否把整个工程放上来供大家学习呢?谢谢!

我把度分秒函数给出来了的,你随便放到那个类里面不就可以了。xTextStyleTools.DFM,如果你新建一个类,类名假如为TOOLS ,并把DFM函数放进去,那么他的引用就是TOOLS.DFM;所以这个不影响你的。
发表于 2020-3-4 18:30:00 | 显示全部楼层
这个代码真的很不错啊,参考后可以用于标注程序,实用性非常强,赞一个,顶起来!
发表于 2020-4-11 08:22:35 | 显示全部楼层
很好,谢谢!学习一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-24 07:35 , Processed in 0.190796 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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