设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 566|回复: 9

[每日一码] .net 学习 尺寸连续标注

[复制链接]

已领礼包: 57个

财富等级: 招财进宝

发表于 2020-10-29 10:22:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. //using static LayerAndTextTools.layermanager;
  8. //using static ZgxCommomLib.StaticDataBase;
  9. using System;
  10. using System.Linq;
  11. using System.Collections.Generic;
  12. using Autodesk.AutoCAD.Colors;
  13. using static Test.HelperTools;
  14. //using ZgxCommomLib;

  15. [assembly:CommandClass(typeof(Test.Command))]

  16. namespace Test
  17. {
  18.     public class Command
  19.     {
  20.         [CommandMethod("llll")]

  21.         public void FastDimension()
  22.         {
  23.             #region 初始化变量

  24.             Document doc = Application.DocumentManager.MdiActiveDocument;
  25.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  26.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

  27.             List<AlignedDimension> alignedDimensionsList = new List<AlignedDimension>();//承载新创建尺寸线
  28.             Point3d xLine1 = new Point3d();
  29.             Point3d xLine2 = new Point3d();

  30.             //固定边界投影线
  31.             Point3d xl1Oringinal = new Point3d();
  32.             Point3d xl2Oringinal = new Point3d();

  33.             //标注方向,X & Y
  34.             Vector3d xDirection = new Vector3d();
  35.             Vector3d yDirection = new Vector3d();

  36.             //尺寸边线长度
  37.             Double xlLength = db.Dimtxt * 500.0;
  38.             #endregion

  39.             bool bySelection = false;
  40.             PromptPointOptions ppo = new PromptPointOptions("\n尺寸标注起点,右键选择尺寸线");
  41.             ppo.AllowNone = true;
  42.             PromptPointResult ppr = ed.GetPoint(ppo);
  43.             if (ppr.Status != PromptStatus.OK)
  44.             {
  45.                 bySelection = true;
  46.                 goto userToSelect;//去选择尺寸线
  47.             }

  48.             CreateLayer("_0_tcc_dimension", 191);//标注图层
  49.             xLine1 = ppr.Value;
  50.             Vector3d tmpVector = new Vector3d(1, 0, 0);

  51.             //初始化一个尺寸JIG
  52.             AlignedDimJig alignedDim = new AlignedDimJig(xLine1,
  53.                 xLine1.TransformBy(Matrix3d.Displacement(tmpVector * xlLength * 2)),
  54.                 xlLength);

  55.             //设置Jig参数
  56.             alignedDim.Counter = 1;
  57.             alignedDim.BasePoint = xLine1;//拖动基点
  58.             alignedDim.UserInputControls1 = UserInputControls.Accept3dCoordinates |
  59.             UserInputControls.NoZeroResponseAccepted |
  60.             UserInputControls.NoNegativeResponseAccepted |
  61.             UserInputControls.NullResponseAccepted;//|UserInputControls.GovernedByOrthoMode;   

  62.             using (alignedDim)
  63.             {
  64.                 // 1 创建尺寸线,拖动改变长度
  65.                 PromptResult pr = ed.Drag(alignedDim);
  66.                 if (pr.Status == PromptStatus.OK)
  67.                 {
  68.                     alignedDim.Counter = 2;
  69.                 }
  70.                 else
  71.                 {
  72.                     alignedDim.AlignedDimension.Dispose();
  73.                     ed.WriteMessage("\n disposed !");
  74.                     return;
  75.                 }

  76.                 // 2 改变尺寸线位置
  77.                 alignedDim.UserInputControls1 = UserInputControls.Accept3dCoordinates |
  78.                    UserInputControls.NoZeroResponseAccepted |
  79.                    UserInputControls.NoNegativeResponseAccepted |
  80.                    UserInputControls.NullResponseAccepted;//| UserInputControls.GovernedByOrthoMode;

  81.                 alignedDim.BasePoint = alignedDim.AlignedDimension.XLine2Point;
  82.                 alignedDim.UseBasePoint = false;

  83.                 //拖拽开始
  84.                 pr = ed.Drag(alignedDim);
  85.                 if (pr.Status == PromptStatus.OK)
  86.                 {
  87.                     AlignedDimension alDim = alignedDim.AlignedDimension;
  88.                     db.AddToCurrentSpace(alDim);

  89.                     //添加到list
  90.                     alignedDimensionsList.Add(alDim);

  91.                     //尺寸界线长度
  92.                     xlLength = alDim.XLine2Point.DistanceTo(alDim.DimLinePoint);

  93.                     //标注方向
  94.                     xDirection = (alDim.XLine2Point - alDim.XLine1Point).GetNormal();
  95.                     yDirection = (alDim.DimLinePoint - alDim.XLine2Point).GetNormal();

  96.                     //固定边界投影线
  97.                     xl1Oringinal = alDim.XLine1Point;
  98.                     xl2Oringinal = alDim.XLine2Point;

  99.                     //原终点改为起点,作为新尺寸起点
  100.                     xLine1 = alDim.XLine2Point;
  101.                     xLine2 = alDim.XLine1Point;

  102.                 }
  103.                 else
  104.                 {
  105.                     alignedDim.GetEntity().Dispose();
  106.                     ed.WriteMessage("\n 操作取消 !");
  107.                     alignedDimensionsList = null;
  108.                     return;
  109.                 }
  110.             }//using alignDim

  111.         userToSelect:

  112.             if (bySelection)
  113.             {
  114.                 ed.WriteMessage("\n 用户选择 !");
  115.                 PromptEntityOptions peo = new PromptEntityOptions("\n选择尺寸,右键退出");
  116.                 peo.SetRejectMessage("必须是尺寸标注");
  117.                 peo.AddAllowedClass(typeof(AlignedDimension), false);
  118.                 peo.AllowNone = true;

  119.                 PromptEntityResult al = ed.GetEntity(peo);
  120.                 if (al.Status != PromptStatus.OK)
  121.                     return;

  122.                 using (OpenCloseTransaction tr = db.TransactionManager.StartOpenCloseTransaction())
  123.                 {
  124.                     AlignedDimension e = tr.GetObject(al.ObjectId, OpenMode.ForRead) as AlignedDimension;
  125.                     alignedDimensionsList.Add(e);

  126.                     xl1Oringinal = e.XLine1Point;
  127.                     xl2Oringinal = e.XLine2Point;
  128.                     xlLength = e.DimLinePoint.DistanceTo(e.XLine2Point);

  129.                     xDirection = (xl2Oringinal - xl1Oringinal).GetNormal();
  130.                     yDirection = (e.DimLinePoint - xl2Oringinal).GetNormal();

  131.                     xLine1 = e.XLine2Point;
  132.                     xLine2 = e.XLine1Point;

  133.                     bySelection = false;
  134.                     tr.Commit();
  135.                 }

  136.             }

  137.             // 3 连续标注
  138.             bool loop = true;
  139.             while (loop)
  140.             {
  141.                 AlignedDimJig newAlignedDim = new AlignedDimJig(xLine1, xLine2, xlLength);
  142.                 using (newAlignedDim)
  143.                 {
  144.                     newAlignedDim.Counter = 3;
  145.                     newAlignedDim.Xl1PointOringinal = xl1Oringinal;
  146.                     newAlignedDim.Xl2PointOringinal = xl2Oringinal;
  147.                     newAlignedDim.XlLineLength = xlLength;
  148.                     newAlignedDim.DimXDirectionNormal = xDirection;
  149.                     newAlignedDim.DimYDirectionNormal = yDirection;

  150.                     bool isOutSide = true;
  151.                     PromptResult pr = ed.Drag(newAlignedDim);
  152.                     if (pr.Status == PromptStatus.OK)
  153.                     {
  154.                         AlignedDimension newDim = newAlignedDim.AlignedDimension;
  155.                         loop = true;
  156.                         xLine1 = newDim.XLine2Point;
  157.                         xLine2 = newDim.XLine1Point;

  158.                         //判断是否为零长度尺寸
  159.                         if (xLine1.Equals(xLine2))
  160.                         {
  161.                             newDim.Dispose();
  162.                             newDim = null;
  163.                             ed.WriteMessage("\n零长度尺寸,已删除。");
  164.                         }

  165.                         //非零长度尺寸
  166.                         else
  167.                         {
  168.                             db.AddToCurrentSpace(newDim);//添加到当前空间
  169.                             Point3d start = xLine1;
  170.                             using (OpenCloseTransaction tr1 = db.TransactionManager.StartOpenCloseTransaction())
  171.                             {
  172.                                 foreach (AlignedDimension dim in alignedDimensionsList)
  173.                                 {
  174.                                     if (start.IsBetween(dim.XLine1Point, dim.XLine2Point) == true)
  175.                                     {
  176.                                         isOutSide = false;//在尺寸线内部
  177.                                         tr1.GetObject(newDim.ObjectId, OpenMode.ForWrite);
  178.                                         ed.WriteMessage("\n在尺寸线内部");
  179.                                         //重合,产生零尺寸
  180.                                         newDim.XLine1Point = dim.XLine2Point;
  181.                                         newDim.DimLinePoint = dim.XLine2Point.TransformBy
  182.                                             (Matrix3d.Displacement(yDirection * xlLength));
  183.                                         if (newDim.XLine1Point.Equals(newDim.XLine2Point))
  184.                                         {
  185.                                             newDim.Erase();
  186.                                             newDim = null;
  187.                                             ed.WriteMessage("\n零长度尺寸,已删除。");
  188.                                             break;
  189.                                         }
  190.                                         else
  191.                                         {
  192.                                             tr1.GetObject(dim.ObjectId, OpenMode.ForWrite);
  193.                                             dim.XLine2Point = dim.XLine2Point.TransformBy
  194.                                                 (Matrix3d.Displacement(start - dim.XLine2Point));
  195.                                             dim.DimLinePoint = dim.DimLinePoint.TransformBy
  196.                                                 (Matrix3d.Displacement(start - dim.XLine2Point));
  197.                                             start = xLine2;
  198.                                             break;
  199.                                         }
  200.                                     }
  201.                                 }// foreach

  202.                                 if (isOutSide == true)
  203.                                 {
  204.                                     //查询与curPt最近距离点
  205.                                     var nearestPt =
  206.                                        (from x in
  207.                                            (
  208.                                            from xl1 in alignedDimensionsList
  209.                                            select xl1.XLine1Point
  210.                                            ).Union(from xl2 in alignedDimensionsList
  211.                                                    select xl2.XLine2Point)

  212.                                         orderby x.DistanceTo(newDim.XLine2Point)
  213.                                         select x).Take(1).ToArray()[0];
  214.                                     tr1.GetObject(newDim.ObjectId, OpenMode.ForWrite);
  215.                                     newDim.XLine1Point = nearestPt;

  216.                                     //再次避免零长度尺寸线产生                                    
  217.                                     if (newDim.XLine1Point.Equals(newDim.XLine2Point))
  218.                                     {
  219.                                         newDim.Erase();
  220.                                         newDim = null;
  221.                                         ed.WriteMessage("\n零长度尺寸,已删除。");
  222.                                     }
  223.                                 }
  224.                                 tr1.Commit();
  225.                             }// using tr1

  226.                             if (newDim != null)
  227.                                 alignedDimensionsList.Add(newDim);
  228.                         }
  229.                     }
  230.                     else
  231.                     {
  232.                         newAlignedDim.AlignedDimension.Dispose();
  233.                         ed.WriteMessage("\n 标注完成!");
  234.                         loop = false;
  235.                         alignedDimensionsList = null;
  236.                         return;
  237.                     }
  238.                 }  //end of using (AlignedDim newAlignedDim = new AlignedDim(xl1, xl2, xlLength))                  

  239.             }// end of loop         
  240.         }

  241.     }

  242.     public class AlignedDimJig : EntityJig, IDisposable
  243.     {
  244.         #region // 声明变量字段
  245.         //private DelEntityJigModify _modifyEntity;
  246.         private Vector3d _dimXDirectionNormal, _dimYDirectionNormal;
  247.         private Point3d _xl1PointOringinal, _xl2PointOringinal;
  248.         private Point3d _xl1Point, _xl2Point;
  249.         private Point3d _BasePoint;
  250.         private Point3d _dimLinePoint;
  251.         private Point3d _curPt;
  252.         private double _xlLineLength;
  253.         private double _dimTextHt;
  254.         private AlignedDimension _alignedDimension;
  255.         private int _counter;
  256.         private int _rotate;
  257.         private UserInputControls _userInputControls = UserInputControls.Accept3dCoordinates |
  258.                    UserInputControls.NoZeroResponseAccepted |
  259.                    UserInputControls.NoNegativeResponseAccepted |
  260.                    UserInputControls.NullResponseAccepted;
  261.         private bool _useBasePoint = true;
  262.         public List<AlignedDimension> _alignedDimensionsList = new List<AlignedDimension>();

  263.         //public DelEntityJigModify ModifyEntity { get => _modifyEntity; set => _modifyEntity = value; }
  264.         public Vector3d DimXDirectionNormal { get => _dimXDirectionNormal; set => _dimXDirectionNormal = value; }
  265.         public Vector3d DimYDirectionNormal { get => _dimYDirectionNormal; set => _dimYDirectionNormal = value; }

  266.         public Point3d Xl1PointOringinal { get => _xl1PointOringinal; set => _xl1PointOringinal = value; }
  267.         public Point3d Xl2PointOringinal { get => _xl2PointOringinal; set => _xl2PointOringinal = value; }
  268.         public Point3d DimLinePoint { get => _dimLinePoint; set => _dimLinePoint = value; }
  269.         public Point3d CurPt { get => _curPt; set => _curPt = value; }

  270.         public double XlLineLength { get => _xlLineLength; set => _xlLineLength = value; }
  271.         public double DimTextHt { get => _dimTextHt; set => _dimTextHt = value; }

  272.         public AlignedDimension AlignedDimension { get => _alignedDimension; set => _alignedDimension = value; }
  273.         public Point3d Xl1Point { get => _xl1Point; set => _xl1Point = value; }
  274.         public Point3d Xl2Point { get => _xl2Point; set => _xl2Point = value; }
  275.         public int Counter { get => _counter; set => _counter = value; }
  276.         public Point3d BasePoint { get => _BasePoint; set => _BasePoint = value; }
  277.         public int Rotate { get => _rotate; set => _rotate = value; }
  278.         public UserInputControls UserInputControls1 { get => _userInputControls; set => _userInputControls = value; }
  279.         public bool UseBasePoint { get => _useBasePoint; set => _useBasePoint = value; }
  280.         #endregion


  281.         // 派生类的构造函数.
  282.         public AlignedDimJig(Point3d xl1, Point3d xl2, double xlLinelength)
  283.             : base(new AlignedDimension())
  284.         {

  285.             Document doc = Application.DocumentManager.MdiActiveDocument;
  286.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  287.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;


  288.             _xl1Point = xl1;
  289.             _xl2Point = xl2;
  290.             _xlLineLength = xlLinelength;
  291.             _dimLinePoint = GetDimLinePoint(_xl1Point, _xl2Point, xlLinelength);

  292.             _alignedDimension = (AlignedDimension)(Entity);
  293.             _alignedDimension.XLine1Point = _xl1Point;
  294.             _alignedDimension.XLine2Point = _xl2Point;
  295.             _alignedDimension.DimLinePoint = _dimLinePoint;
  296.             _alignedDimension.SetDatabaseDefaults();
  297.             _alignedDimension.Layer = "_0_tcc_dimension";

  298.             #region MyRegion
  299.             using (OpenCloseTransaction tr = db.TransactionManager.StartOpenCloseTransaction())
  300.             {
  301.                 DimStyleTableRecord btr = tr.GetObject(db.Dimstyle, OpenMode.ForRead) as DimStyleTableRecord;
  302.                 _alignedDimension.Annotative = btr.Annotative;
  303.                 tr.Commit();
  304.             }
  305.             #endregion
  306.             //_alignedDimension.Annotative = AnnotativeStates.True;

  307.         }

  308.         public AlignedDimJig(Entity alDim)
  309.             : base(alDim)
  310.         {

  311.             Document doc = Application.DocumentManager.MdiActiveDocument;
  312.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  313.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

  314.             _alignedDimension = (AlignedDimension)(Entity);

  315.             _xl1Point = _alignedDimension.XLine1Point;
  316.             _xl2Point = _alignedDimension.XLine2Point;
  317.             _dimLinePoint = _alignedDimension.DimLinePoint;
  318.             _xlLineLength = _xl2Point.DistanceTo(_xl2Point);
  319.             _alignedDimension.SetDatabaseDefaults();
  320.             _alignedDimension.Layer = "_0_tcc_dimension";

  321.             #region MyRegion
  322.             //using (OpenCloseTransaction tr = db.TransactionManager.StartOpenCloseTransaction())
  323.             //{
  324.             //    DimStyleTableRecord btr = tr.GetObject(db.Dimstyle, OpenMode.ForRead) as DimStyleTableRecord;
  325.             //    _alignedDimension.Annotative = btr.Annotative;
  326.             //    tr.Commit();
  327.             //}
  328.             #endregion
  329.             //_alignedDimension.Annotative = AnnotativeStates.True;

  330.         }
  331.         //获取尺寸线位置
  332.         public Point3d GetDimLinePoint(Point3d xl1, Point3d xl2, double dimLineLength)
  333.         {
  334.             Matrix3d mat = (Matrix3d.Displacement(dimLineLength * (xl2 - xl1).GetNormal().RotateBy(Math.PI * -0.5, Vector3d.ZAxis)));
  335.             return xl2.TransformBy(mat);
  336.         }

  337.         //获取尺寸线位置
  338.         public Point3d GetDimLinePoint(Point3d xl2, double dimLineLength)
  339.         {
  340.             return xl2.TransformBy(Matrix3d.Displacement(DimYDirectionNormal * dimLineLength));
  341.         }

  342.         protected override bool Update()
  343.         {
  344.             try
  345.             {
  346.                 switch (_counter)
  347.                 {
  348.                     case 1:
  349.                         {
  350.                             _xl2Point = _curPt;
  351.                             _dimLinePoint = GetDimLinePoint(_xl1Point, _xl2Point, _xlLineLength);
  352.                         }
  353.                         break;
  354.                     case 2:
  355.                         {
  356.                             _dimLinePoint = CurPt;
  357.                             _xl1Point = _alignedDimension.XLine1Point;
  358.                             _xl2Point = _alignedDimension.XLine2Point;

  359.                             _xl1PointOringinal = _xl1Point;
  360.                             _xl2PointOringinal = _xl2Point;

  361.                             //_dimXDirectionNormal = (_xl2Point - _xl1Point).GetNormal();
  362.                             //_dimYDirectionNormal = _dimXDirectionNormal.RotateBy(Math.PI * -0.5, Vector3d.ZAxis);

  363.                         }
  364.                         break;
  365.                     case 3:
  366.                         {
  367.                             //Vector3d vTmp = (_alignedDimension.DimLinePoint - _alignedDimension.XLine1Point)-;


  368.                             _xl2Point = _curPt.GetClosePointTo(_xl1PointOringinal, _xl2PointOringinal);
  369.                             //_dimLinePoint = GetDimLinePoint(_xl2Point, _xlLineLength);
  370.                             _dimLinePoint = Xl2Point.TransformBy(Matrix3d.Displacement(_dimYDirectionNormal * _xlLineLength));

  371.                             #region MyRegion
  372.                             //bool isOutsSide = true;
  373.                             //foreach (AlignedDimension dim in _alignedDimensionsList)
  374.                             //{
  375.                             //    if (_xl2Point.IsBetween(dim.XLine1Point, dim.XLine2Point) == true)
  376.                             //    {
  377.                             //        isOutsSide = false;
  378.                             //        break;
  379.                             //    }
  380.                             //}
  381.                             //if (isOutsSide==true)
  382.                             //{
  383.                             //    List<Point3d> pts = new List<Point3d>();
  384.                             //    for (int i = 0; i < _alignedDimensionsList.Count; i++)
  385.                             //    {
  386.                             //        pts.Add(_alignedDimensionsList.XLine1Point);
  387.                             //        pts.Add(_alignedDimensionsList.XLine2Point);
  388.                             //    }
  389.                             //    var nearestPt = (from c in pts
  390.                             //                     orderby c.DistanceTo(_xl2Point)
  391.                             //                     select c).Take(1).ToList()[0];
  392.                             //    _xl1Point = nearestPt;
  393.                             //    _BasePoint = nearestPt;

  394.                             //}
  395.                             #endregion


  396.                         }
  397.                         break;
  398.                 }
  399.                 _alignedDimension.XLine1Point = _xl1Point;
  400.                 _alignedDimension.XLine2Point = _xl2Point;
  401.                 _alignedDimension.DimLinePoint = _dimLinePoint;
  402.             }
  403.             catch
  404.             {
  405.                 // 此处不需要处理.
  406.             }
  407.             return true;
  408.         }

  409.         protected override SamplerStatus Sampler(JigPrompts prompts)
  410.         {

  411.             JigPromptPointOptions jigPPR = new JigPromptPointOptions("\n尺寸终点");

  412.             // 设置拖拽的光标类型.
  413.             jigPPR.UserInputControls = _userInputControls;
  414.             jigPPR.Cursor = CursorType.RubberBand;

  415.             // 设置拖动光标基点.
  416.             jigPPR.BasePoint = _xl1Point;
  417.             jigPPR.UseBasePoint = UseBasePoint;

  418.             // 用AcquireAngle函数得到用户输入的角度值.
  419.             PromptPointResult resJigPPR = prompts.AcquirePoint(jigPPR);

  420.             if (_curPt != resJigPPR.Value)
  421.             {
  422.                 // 保存当前角度值.
  423.                 _curPt = resJigPPR.Value;
  424.             }
  425.             else
  426.             {
  427.                 return SamplerStatus.NoChange;
  428.             }

  429.             if (resJigPPR.Status == PromptStatus.Cancel)
  430.             {
  431.                 return SamplerStatus.Cancel;
  432.             }
  433.             if (resJigPPR.Status == PromptStatus.None)
  434.             {
  435.                 return SamplerStatus.Cancel;
  436.             }
  437.             else
  438.             {
  439.                 return SamplerStatus.OK;
  440.             }
  441.         }

  442.         // GetEntity函数用于得到派生类的实体.
  443.         public Entity GetEntity()
  444.         {
  445.             return Entity;
  446.         }

  447.         #region IDisposable Support
  448.         private bool disposedValue = false; // 要检测冗余调用

  449.         protected virtual void Dispose(bool disposing)
  450.         {
  451.             if (!disposedValue)
  452.             {
  453.                 if (disposing)
  454.                 {
  455.                     // TODO: 释放托管状态(托管对象)。
  456.                 }

  457.                 // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
  458.                 // TODO: 将大型字段设置为 null。

  459.                 disposedValue = true;
  460.             }
  461.         }

  462.         // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
  463.         // ~AlignedDim() {
  464.         //   // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
  465.         //   Dispose(false);
  466.         // }

  467.         // 添加此代码以正确实现可处置模式。
  468.         public void Dispose()
  469.         {
  470.             // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
  471.             Dispose(true);
  472.             // TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
  473.             // GC.SuppressFinalize(this);
  474.         }
  475.         #endregion


  476.         // setPromptCounter过程用于控制不同的拖拽.
  477.     }

  478.     public static class HelperTools
  479.     {

  480.         public static ObjectId AddToCurrentSpace(this Database db, Entity ent)
  481.         {
  482.             ObjectId entId;//用于返回添加到模型空间中的实体ObjectId
  483.                            //定义一个指向当前数据库的事务处理,以添加直线
  484.             using (OpenCloseTransaction trans = db.TransactionManager.StartOpenCloseTransaction())
  485.             {
  486.                 //以写方式打开模型空间块表记录.
  487.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  488.                 entId = btr.AppendEntity(ent);//将图形对象的信息添加到块表记录中
  489.                 trans.AddNewlyCreatedDBObject(ent, true);//把对象添加到事务处理中
  490.                 trans.Commit();//提交事务处理
  491.             }
  492.             return entId; //返回实体的ObjectId
  493.         }

  494.         public static bool IsBetween(this Point3d pt, Point3d p1, Point3d p2)
  495.         {
  496.             if (pt.Equals(1) | pt.Equals(p2))
  497.                 return true;
  498.             else
  499.                 return p1.GetVectorTo(pt).GetNormal().Equals(pt.GetVectorTo(p2).GetNormal());
  500.         }

  501.         public static Point3d GetClosePointTo(this Point3d pt0, Point3d pt1, Point3d pt2)
  502.         {
  503.             using (Line3d line3 = new Line3d(pt1, pt2))
  504.             {
  505.                 return line3.GetClosestPointTo(pt0).Point;
  506.             }

  507.         }

  508.         public static void CreateLayer(string layname, short color)
  509.         {
  510.             // 获取当前文档和数据库
  511.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  512.             Database acCurDb = acDoc.Database;

  513.             // 启动事务
  514.             using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  515.             {
  516.                 // 以读模式打开图层表
  517.                 LayerTable acLyrTbl;
  518.                 acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId,
  519.                                              OpenMode.ForRead) as LayerTable;

  520.                 string sLayerName = layname;

  521.                 if (acLyrTbl.Has(sLayerName) == false)
  522.                 {
  523.                     LayerTableRecord acLyrTblRec = new LayerTableRecord();

  524.                     // 赋予图层颜色和名称,AutoCADColorIndex(ACI)为1表示红色
  525.                     acLyrTblRec.Color = Color.FromColorIndex(ColorMethod.ByAci, color);
  526.                     acLyrTblRec.Name = sLayerName;
  527.                     // 以写模式升级打开图层表
  528.                     acLyrTbl.UpgradeOpen();

  529.                     // 添加新图层到图层表,记录事务
  530.                     acLyrTbl.Add(acLyrTblRec);
  531.                     acTrans.AddNewlyCreatedDBObject(acLyrTblRec, true);
  532.                 }

  533.                 // 保存修改,关闭事务
  534.                 acTrans.Commit();
  535.             }
  536.         }

  537.     }
  538. }


demension.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 104个

财富等级: 日进斗金

发表于 2020-10-29 17:59:55 | 显示全部楼层
好东西值得收藏!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2020-10-29 18:03:47 | 显示全部楼层
谢谢楼主,分享代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 26个

财富等级: 恭喜发财

发表于 2020-11-1 23:28:40 | 显示全部楼层
请教下,能否修改下,使其也能用于RotatedDimension类型的标注呢?

                               
登录/注册后可看大图
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 57个

财富等级: 招财进宝

 楼主| 发表于 2020-11-2 23:10:09 | 显示全部楼层
修改中,RotatedDimension更好用一些

点评

我自己改改好像可以用了,根据你的AlignedDimJig我改了个rotateDimJig,然后能使用以对齐标注和转角标注  详情 回复 发表于 2020-11-3 10:22
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 26个

财富等级: 恭喜发财

发表于 2020-11-3 10:22:31 | 显示全部楼层
brainstorm 发表于 2020-11-2 23:10
修改中,RotatedDimension更好用一些

我自己改改好像可以用了,根据你的AlignedDimJig我改了个rotateDimJig,然后能使用以对齐标注和转角标注

                               
登录/注册后可看大图
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 57个

财富等级: 招财进宝

 楼主| 发表于 2020-11-4 09:33:15 | 显示全部楼层
用委托重新写了一个,完整工程文件见附件

delEntityJig.rar

401.66 KB, 下载次数: 23, 下载积分: D豆 -1 , 活跃度 1

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2020-12-10 16:57:51 | 显示全部楼层
牛!!!学习一下,谢谢!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 375个

财富等级: 日进斗金

发表于 2020-12-12 10:33:43 | 显示全部楼层
感谢楼主分享,先贴用代码了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2021-11-3 09:10:36 | 显示全部楼层
雾草流弊啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )  

GMT+8, 2022-8-18 15:31 , Processed in 0.227434 second(s), 36 queries , Gzip On, WinCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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