首页 > 编程知识 正文

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

时间:2023-05-05 00:08:03 阅读:281524 作者:3582

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。