C#实战之CAD二次开发003:插入文字和插入图块

前言
上期我们介绍了如何利用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中插入尺寸标注的功能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值