前言
上期我们介绍了如何利用C#在CAD中绘制直线和圆,这期我们介绍一下CAD中两个比较重要的功能,插入文字和插入图块,在CAD中插入文字主要是单行文字和多行文字,插入块主要有内部图块和外部图块。本文主要介绍插入多行文字和插入内部图块两个功能。
一、插入文字
在介绍插入文字前,为了提高代码的重用性,我们专门建立一个工具类Tools,来存放我们经常所需要用到的函数。这个函数主要功能是将我们创建的实体,添加到我们CAD的模型空间中。
public static class Tools
{
public static ObjectId AddToModelSpace(this Database db, Entity ent, string layer)
{
ObjectId entId;//用于返回添加到模型空间中的实体ObiectId
//定义一个指向当前数据库的事务处理
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);//以读方式打开块表
//以写的方式打开模型空间块表记录
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
//指定要添加的實體的圖層
ent.Layer = layer;
entId = btr.AppendEntity(ent);//以图形对象的信息添加到块表记录中
trans.AddNewlyCreatedDBObject(ent, true);//把对象添加到事务处理中
trans.Commit();//提交事务处理
}
return entId;//返回实体的objectid
}
}
话不多说,这里贴上插入文字的代码
public static MText addText(string dimension,Point3d location,double textHeight)
{
MText inserDimension = new MText();
inserDimension.Location = location;
inserDimension.Contents = dimension;
inserDimension.TextHeight = textHeight;
//inserDimension.Width = 0; //设置为0表示不会自动换行
inserDimension.Attachment = AttachmentPoint.MiddleCenter; //设置多行文字为正中对齐
return inserDimension;
}
其中,这里定义三个参数,其中dimension表示你所要插入文字的内容是什么,location表示文字所插入的位置,textHeight表示文字高度。当然还可以设置文字的图层及文字偏转。这里之所以介绍的是多行文字,多行文字比较灵活,可以设置较多的属性。
默认文字的对其方式为正中对齐,还有各种对齐方式,读者可以自行测试。
这里再补充一点,如果要想要插入特殊符号,例如直径Φ,公差±,角度°等,可以参考下方的定义。
public static readonly string Degree = @"\U+00B0";//角度°
public static readonly string Tolerance = @"\U+00B1";//公差±
public static readonly string Diameter = @"\U+2205";//直径Φ
public static readonly string AlmostEqual = @"\U+2248";//几乎相等
public static readonly string Angle = @"\U+2220";//角度
public static readonly string Notequal = @"\U+2260";//不相等
public static readonly string Square = @"\U+00B2";//平方
public static readonly string Cube = @"\U+00B3";//立方
public static readonly string Overline = @"%%o";//单行文字的上画线
public static readonly string Underline = @"%%u";//_
public static readonly string Alpha = @"\U+03B1"; //α
public static readonly string Belta = @"\U+03B2";//β
还有一种情况,如果想要插入公差堆叠的情况,还需要添加一个函数
public static string StackText(string text, string supText, string subText, StackType stackType, double scale)
{
//设置堆叠方式所代表的字符,用于将StackType枚举转换为对应的字符
string[] strs = new string[] { "/", "#", "^" };
//设置堆叠文字
return string.Format(
"\\A1;{0}{1}\\H{2:0.#}x;\\S{3}{4}{5};{6}",
text, "{", scale, supText, strs[(int)stackType],
subText, "}");
}
public enum StackType
{
HorizontalFracton,//水平分数堆叠,对应与"/"
ItalicFraction,//斜分数堆叠,对应与"#"
Tolerance//公差堆叠,对应与"^"
}
这样我们如果想要插入带上下公差的文字时,可以通过下面这个方式来处理。
string D = TextTools.StackText(TextTools.Diameter + "5.1", "+0.5", "-0.3", StackType.Tolerance, 0.70);
我们通过事务来将我们所创建的文字,插入到CAD的模型空间中,代码如下:
public static class InsertTexts
{
static Dictionary<string, string> d = GetData.getData();
static Database db = HostApplicationServices.WorkingDatabase;
public static void Add()
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
string D = TextTools.StackText(TextTools.Diameter + "5.1", "+0.5", "-0.3", StackType.Tolerance, 0.70);
db.AddToModelSpace(addText(D, new Point3d(0, 0, 0), 2.5));
trans.Commit();
}
}
}
把这个Add()方法写入到我们上期所创建的Command命令中执行即可。
public class Command
{
//名字可以自定义,最好不要和CAD快捷键冲突
[CommandMethod("cad")]
public static void cad()
{
InsertTexts.Add();
}
}
打开CAD,输入"cad"命令。在位置(0,0,0)上就会插入刚刚我所写的文字,字体大小为2.5,堆叠公差的形式。
至此,插入文字就介绍到这里了,下面介绍一下插入图块的功能。
二、插入图块
图块的插入有两种方法,一种是内部图块的插入,一种是外部图块的插入,两种方法各有利弊,内部图块就是所有图块集合在一个文件中,外部图块就是每一个图块都是一个dwg文件。采用内部图块插入的方式,cad文件大小会随着图块的增加而增加,不利于文件的传输。个人觉得外部图块的方式比较好,但是我这里介绍的是内部图块的插入。
public static class BlockTools
{
public static ObjectId InsertBlockReference(this ObjectId spaceId, string layer, string blockName, Point3d position, Scale3d scale)
{
ObjectId blockRefId;//存储要插入的块参照的Id
Database db = spaceId.Database;//获取数据库对象
//以读的方式打开块表
BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);
//如果没有blockName表示的块,则程序返回
if (!bt.Has(blockName)) return ObjectId.Null;
//以写的方式打开空间(模型空间)
BlockTableRecord space = (BlockTableRecord)spaceId.GetObject(OpenMode.ForWrite);
//创建一个块参照并设置插入点
BlockReference br = new BlockReference(position, bt[blockName]);
br.ScaleFactors = scale;//设置块参照的缩放比例
br.Layer = layer;//设置块参照的层名
//br.Rotation = rotateAngle;//设置块参照的旋转角度
blockRefId = space.AppendEntity(br);//在空间中加入创建的块参照
//通知事务处理加入创建的块参照
db.TransactionManager.AddNewlyCreatedDBObject(br, true);
space.DowngradeOpen();//为了安全,将块表状态改为读
return blockRefId;//返回添加的块参照的Id
}
}
public static class InsertBlock
{
static Database db = HostApplicationServices.WorkingDatabase;
static ObjectId spaceId = db.CurrentSpaceId;
public static void insert_block()
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
//在逃料圖中插入塊參照
spaceId.InsertBlockReference("0", "cad",Point3d.Origin, new Scale3d(1), 0);
trans.commit();
}
}
}
其中layer表示图块所在的图层,blockName表示你所建立图块的名字,position表示你所要插图图块的位置,scale表示图块的大小缩放比例。在Command类用添加该方法即可插入自己创建好的图块。
public class Command
{
//名字可以自定义,最好不要和CAD快捷键冲突
[CommandMethod("cad")]
public static void cad()
{
InsertBlock.insert_block();
}
}
同样,打开CAD,输入"cad"命令,在位置(0,0,0)处就会插入名字为"cad"的图块了。
好了,插入图块功能就介绍到这里了。下期,我在介绍一下如何在CAD中插入尺寸标注的功能。