C#实战之CAD二次开发004:插入尺寸标注

前言
上期我们介绍了CAD中插入文字和插入图块两个功能,这期我们继续介绍一个比较常用的功能——标注尺寸,标注尺寸是我们在绘图的时候经常用到这个功能。

插入标注

CAD中的标注形式有很多种,例如水平标注,垂直标注,半径标注,角度标注等等,我们可以通过建立一个DimensionTools类在专门建立这些标注,代码贴上:

    public static class DimensionTools
    {
        private static Database db = HostApplicationServices.WorkingDatabase;
        //水平標注,主要用於標注頸徑(不用將主尺寸下拉)
        //當標注需要放在標注線外面時,(A1,A2)是將標注放在A1的左边,而(A2,A1)可以將標注放在A2的右边
        public static void addHorizonRotatedDimension(Point3d pt1, Point3d pt2, string text, double length)
        {
            using (Transaction trans = db.TransactionManager.StartOpenCloseTransaction())
            {
                RotatedDimension dimRotated = new RotatedDimension();
                dimRotated.XLine1Point = pt1;
                dimRotated.XLine2Point = pt2;
                dimRotated.DimLinePoint = GeTools.MidPoint(pt1, pt2).PolarPoint(-Math.PI / 2, length);
                dimRotated.DimensionText = text;//<>代表標注的主尺寸,此處在標注線上插入文字
                dimRotated.DimensionStyle = db.Dimstyle;
                db.AddToModelSpace(dimRotated, "Dim");
            }
        }
	}

首先先介绍一个简单的,水平标注功能,参数主要有以下几个,所需要标注的直线的两个端点的坐标,text表示主尺寸的值,一般我们标注的只是一个示意图,然后值是自己输入的。通过调用db.AddToModelSpace(dimRotated, “Dim”)可将我们创建的标注添加的CAD的模型空间中,并设置图层为‘Dim’。

下面在介绍其他几种类型的标注:
1.垂直标注:

 public static void addVerticalRotatedDimension(Point3d pt1, Point3d pt2, string text, double distance)
 {
     using (Transaction trans = db.TransactionManager.StartOpenCloseTransaction())
     {
         RotatedDimension dimRotated = new RotatedDimension();
         dimRotated.Rotation = Math.PI / 2;
         dimRotated.XLine1Point = pt1;
         dimRotated.XLine2Point = pt2;

         dimRotated.DimLinePoint = GeTools.MidPoint(pt1, pt2).PolarPoint(0, distance);

         dimRotated.DimensionText = text;//<>代表標注的主尺寸,此處在標注線上插入文字
         dimRotated.DimensionStyle = db.Dimstyle;
         db.AddToModelSpace(dimRotated, "Dim");
     }
 }

2.对齐标注

 public static void addAlignedDimension(Point3d pt1, Point3d pt2, string text)
  {
      using (Transaction trans = db.TransactionManager.StartOpenCloseTransaction())
      {
          AlignedDimension dimAligned = new AlignedDimension();
          dimAligned.XLine1Point = pt1;
          dimAligned.XLine2Point = pt2;
          dimAligned.DimLinePoint = GeTools.MidPoint(pt1, pt2).PolarPoint(Math.PI / 2, 10);
          dimAligned.DimensionText = text;//<>代表標注的主尺寸,此處在標注線上插入文字
          dimAligned.DimensionStyle = db.Dimstyle;
          db.AddToModelSpace(dimAligned, "Dim");
      }
  }

3.半径标注

 public static void addRadialDimension(Point3d center, string text, double R)
 {
     using (Transaction trans = db.TransactionManager.StartOpenCloseTransaction())
     {
         RadialDimension dimRadial = new RadialDimension();
         dimRadial.Center = center;//圓心
         //用於附著引線的圓或圓弧上的點 
         //30是角度,15是圓弧的半徑
         dimRadial.ChordPoint = center.PolarPoint(GeTools.DegreeToRadian(-145), R);
         dimRadial.DimensionText = text;//<>代表標注的主尺寸,此處在標注線上插入文字
         dimRadial.LeaderLength = 5;//引線長度
         dimRadial.DimensionStyle = db.Dimstyle;
         db.AddToModelSpace(dimRadial, "Dim");
     }
 }

4.角度标注

 public static void addDiametricDimension(Point3d start1, Point3d start2, Point3d end1, Point3d end2, string text, double distance)
  {
      using (Transaction trans = db.TransactionManager.StartOpenCloseTransaction())
      {
          LineAngularDimension2 dimLineAngular = new LineAngularDimension2();
          //圓或圓弧的圓心、或兩個尺寸界線間的共有頂點的座標
          dimLineAngular.XLine1Start = start1;
          dimLineAngular.XLine2Start = start2;
          dimLineAngular.XLine1End = end1;
          dimLineAngular.XLine2End = end2;
          dimLineAngular.ArcPoint = GeTools.MidPoint(start1, start2).PolarPoint(GeTools.DegreeToRadian(90), distance);
          dimLineAngular.DimensionText = text;//<>代表標注的主尺寸,此處在標注線上插入文字
          dimLineAngular.DimensionStyle = db.Dimstyle;
          db.AddToModelSpace(dimLineAngular, "Dim");
      }
  }

5.形位公差:

 public static void CreateTolerance(this FeatureControlFrame frame, string geometricSym, string torlerance, string firstDatum)
 {
     if (frame == null) return;//特徵框對象必須已定義,否則返回
     //設置形位公差值,各組成部份用豎線(%%v)分隔
     frame.Text = geometricSym + "%%v" + torlerance + "%%v" + firstDatum;
 }
 public struct DimFormatCode
 {
     public static readonly string Bounce = @"{\Fgdt;" + "h}";//跳動度
 }
 public static void AddTolerance(Point3d pt1, string gc, double size, string layer)
 {
     Database db = HostApplicationServices.WorkingDatabase;
     using (Transaction trans = db.TransactionManager.StartTransaction())
     {
         //創建一個形位公差特徵控制框
         FeatureControlFrame frame = new FeatureControlFrame();
         //形位公差的幾何特徵為跳動度
         string geometricSym = DimFormatCode.Bounce;
         //形位公差值
         string torlerance = gc;
         //形位公差的第一級基準符號
         string firstDatum = "A";
         //設置形位公差特徵控制框的內容為形位公差
         frame.CreateTolerance(geometricSym, torlerance, firstDatum);
         frame.Location = pt1;//控制框的位置
         frame.Dimscale = size;//控制框的大小
         frame.Layer = layer;
         BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);//以读方式打开块表
         BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
         frame.Layer = layer;
         btr.AppendEntity(frame);//以图形对象的信息添加到块表记录中
         trans.AddNewlyCreatedDBObject(frame, true);//把对象添加到事务处理中
         trans.Commit();//提交事务处理      
     }
 }

测试的话可以通过在之前创建的Command方法中调用这些标注的方法即可,例如:

public class Command
{
    //名字可以自定义,最好不要和CAD快捷键冲突
    [CommandMethod("cad")]
    public static void cad()
    {
        DimensionTool.addHorizonRotatedDimension(new Point3d(0, 0, 0), new Point3d(100, 0, 0), 'cad', 10);
    }
}

F6生成成功后,加上之前介绍了自动打开cad方法,自动调用生成的dll,打开CAD后直接执行‘cad’命令即可。下期我会介绍如何实现CAD中打印pdf功能。

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值