创建图元

创建AutoCAD图元

var doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
var db = doc.Database;

using (var docLock = doc.LockDocument())
{
    using (var tr = db.TransactionManager.StartTransaction())
    {

        var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
        var btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

        var txt = new DBText { TextString = "Hello World" };

        btr.AppendEntity(txt);  // 添加图元对象到数据库 + BlockTableRecord

        tr.AddNewlyCreatedDBObject(txt, true); 
        // 如果没有这行,或者 add是false 
        // 如果后面有tr.commit() ,那么图元依然会添加进数据库, 但是有问题,不能选择t


        // // 如果漏了 tr.AddNewlyCreatedDBObject(txt, true);  可以修复
        //foreach (var id in btr)
        //{
        //    var ent = tr.GetObject(id, OpenMode.ForWrite);

        //    tr.AddNewlyCreatedDBObject(ent, true); // make avaiable
        //    //ent.Erase();  // delete
        //    Console.WriteLine($"{ent}");
        //}

        // 如果用 tr.abort 那么数据会丢弃
        tr.Commit();
    }
}

创建Plant3D 图元

public static void CreatePipeInlineAsset()
{
    var doc = Application.DocumentManager.MdiActiveDocument;
    var ed = doc.Editor;
    var db = doc.Database;

    // var dlm = DataLinksManager.GetManager(db); // 不要用这个,会导致模型中的Plant3d属性丢失
    // var dlm = PlantApplication.CurrentProject.ProjectParts["Piping"].DataLinksManager

    using (var docLock = doc.LockDocument())
    {
        // 从等级中找到需要的模型 块
        var specPart = 
            SpecManager.GetSpecManager().SelectParts("CustomParts Metric", "Elbow").ToList()
                .Where(p => p.NominalDiameter.Equals(new NominalDiameter("mm", 50))).FirstOrDefault();

        if (specPart == null) return;

        // 在内存中创建Part,引用等级中找到的模型 块
        var pipeInlineAsset = new PipeInlineAsset
        {
            SymbolId = ContentManager.GetContentManager().GetSymbol(specPart, db, Units.Mm)
        };
        // 进行矩阵变化
        pipeInlineAsset.TransformBy(Matrix3d.Displacement(new Vector3d(1000, 200, 222)));

        // 添加到DWG图元和Plant3D数据库,如果不调用这个方法,DWG中只有一个不可见的块,通过 insert或者 bedit 可以看到
        using (var pipeObjAdder = new PipingObjectAdder(DataLinksManager3d.Get3dManager(PlantApplication.CurrentProject.ProjectParts["Piping"].DataLinksManager), db))
        {
            // pipeObjAdder.LineGroupId = 
            pipeObjAdder.Add(specPart, pipeInlineAsset);
        }

        // 添加到DWG图元
        using (var tr = db.TransactionManager.StartOpenCloseTransaction())
        {
            tr.AddNewlyCreatedDBObject(pipeInlineAsset, true);
            tr.Commit();
        }
    }
}

你可能感兴趣的:(创建图元)