Autocad .net API 将块组合成一个

问题描述 投票:0回答:1

我目前已将 dxf 文件导入到 Autocad 中,并且希望使用 C# 的 .net API 将现有块(在原始 dxf 中)合并为一个块,其中原始块和实体全部嵌套在该“外部块”中”.

我目前有以下代码,它将所有实体放入一个外部块中,但原始块和实体颜色不再存在。

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;

namespace CombineBlockTableRecords
{
    public class Commands
    {
        [CommandMethod("CombineBlocks")]
        public void CombineBlocks()
        {
            // Get the current document and database
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;

            // Start a transaction
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                // Open the Block table for read
                BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;

                // Create a new block definition
                BlockTableRecord newBlockDef = new BlockTableRecord();
                newBlockDef.Name = "CombinedBlock";

                // Add the new block definition to the block table
                bt.UpgradeOpen();
                ObjectId newBlockDefId = bt.Add(newBlockDef);
                tr.AddNewlyCreatedDBObject(newBlockDef, true);

                // Iterate through all block table records in the drawing
                foreach (ObjectId btrId in bt)
                {
                    if (btrId != newBlockDefId) // Exclude the new block definition itself
                    {
                        // Open each BlockTableRecord for read
                        BlockTableRecord btr = tr.GetObject(btrId, OpenMode.ForRead) as BlockTableRecord;

                        // Iterate through each entity in the BlockTableRecord and add a copy to the new block definition
                        foreach (ObjectId entityId in btr)
                        {
                            Entity ent = tr.GetObject(entityId, OpenMode.ForRead) as Entity;
                            Entity entCopy = ent.Clone() as Entity;
                            newBlockDef.AppendEntity(entCopy);
                            tr.AddNewlyCreatedDBObject(entCopy, true);
                        }
                    }
                }

                // Commit the transaction
                tr.Commit();
            }
        }
    }
}

任何帮助将不胜感激!

c# .net autocad autocad-plugin autocad-scripts
1个回答
0
投票

在上面的代码中,您似乎只是将现有块中的实体复制到新块中。如果您想更深入并保留原始块,则必须以特殊方式处理 BlockReference 实体。

此外,克隆实体时,颜色不会从原始实体转移到其克隆体。为此,您需要设置克隆实体的 Color 属性以匹配原始实体。这是处理块的方法

// Iterate through each entity in the BlockTableRecord

foreach (ObjectId entityId in btr)
 {
// Open the entity for read
Entity ent = tr.GetObject(entityId, OpenMode.ForRead) as Entity;

// If the entity is a block, add a reference to the block to the new block definition
if (ent is BlockReference blockRef)
{
    // New block reference with the same block table record
    BlockReference newBlockRef = new BlockReference(blockRef.Position, blockRef.BlockTableRecord);

    // Copy properties
    newBlockRef.Color = blockRef.Color;

    // Add block reference to the new block definition
    newBlockDef.AppendEntity(newBlockRef);
    tr.AddNewlyCreatedDBObject(newBlockRef, true);
}
else // Clone the entity if it's not a block
{
    Entity entCopy = ent.Clone() as Entity;

    // Copy properties
    entCopy.Color = ent.Color;

    // Append the copy to the new block definition
    newBlockDef.AppendEntity(entCopy);
    tr.AddNewlyCreatedDBObject(entCopy, true);
   

 }
   }
© www.soinside.com 2019 - 2024. All rights reserved.