前言
上期我们介绍了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功能。