欢迎来到我的博客
Civil 3D开发与应用,欢迎加入QQ群:484124761
AutoCAD开发,欢迎加入QQ群:193522571

将文本转换为块的属性

同事提出了这样一个需求,

将文本(DBText)转换为块的属性值,

我尝试着使用如下的流程实现了该操作,

使用Civil 3d将文本移动到对应高程,

创建Civil 3d曲面,

提取点(AutoCAD的Point),

转换生成几何空间点(CogoPoint),

之后通过几何空间点生成属性块。

但生成的属性块属性标签无法设置也无法修改,

不能满足要求,

于是就试着写下了如下的代码,

经过测试能够满足要求:

 

public void C_AddATT()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = Application.DocumentManager.MdiActiveDocument.Database;
    var ppr = doc.Editor.GetString("\n输入块名");
    if (ppr.Status != PromptStatus.OK) return;
    using (Transaction tr = doc.TransactionManager.StartTransaction())
    {
        BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;

        BlockTableRecord blockDef = bt[ppr.StringResult].GetObject(OpenMode.ForRead) as BlockTableRecord;
        BlockTableRecord ms = bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord;
        if (blockDef != null)
        {
            TypedValue[] acTypValAr = new TypedValue[1];
            acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "TEXT"), 0);
            SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
            PromptSelectionOptions pso = new PromptSelectionOptions();
            pso.MessageForAdding = "\n选择文本";

            var psr = doc.Editor.GetSelection(pso,acSelFtr);
            if (psr.Status == PromptStatus.OK)
            {
                foreach (ObjectId id in psr.Value.GetObjectIds())
                {
                    DBText text = id.GetObject(OpenMode.ForRead) as DBText;
                    using (BlockReference blockRef = new BlockReference(text.Position, blockDef.ObjectId))
                    {
                        ms.AppendEntity(blockRef);
                        tr.AddNewlyCreatedDBObject(blockRef, true);
                        foreach (ObjectId attid in blockDef)
                        {
                            DBObject obj = attid.GetObject(OpenMode.ForRead);
                            AttributeDefinition attDef = obj as AttributeDefinition;
                            if ((attDef != null) && (!attDef.Constant))
                            {
                                using (AttributeReference attRef = new AttributeReference())
                                {
                                    attRef.SetAttributeFromBlock(attDef, blockRef.BlockTransform);
                                    attRef.TextString = text.TextString;
                                    //Add the AttributeReference to the BlockReference
                                    blockRef.AttributeCollection.AppendAttribute(attRef);
                                    tr.AddNewlyCreatedDBObject(attRef, true);
                                }
                            }
                        }
                    }
                }
            }
        }
        else
        {
            doc.Editor.WriteMessage("\n输入的块名不存在,请重新输入");
        }
        tr.Commit();
    }
}

 

前提:需要提前定义一个属性块,

包含一个属性即可,

属性标签按需设置,

程序将在文本插入点位置插入块,

并将文本值作文块的属性值….

posted @ 2024-01-14 19:32  david96007  阅读(49)  评论(0编辑  收藏  举报