天天看點

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功能。