【轉】CAD 二次開發--屬性塊 Block和BlockReference


1、屬性塊的定義

屬性塊是有構成的實體和附加信息(屬性)組成的,屬性塊中塊的定義與簡單塊中塊的定義一樣,而屬性的定義主要是通過屬性的AttributeDefinition類的有關屬性和函數來實現的。具體實現有:

a 、AttributeDefinition類的實例並設置對象的屬性值;

b、由於塊的屬性定義也可以看做是塊中的實體,可以通過塊表記錄類的成員函數AppendEntity將屬性定義附加到塊中。

其中,屬性定義的屬性值主要有:

文字的插入點、高度、旋轉角度、對齊方式和寬度;

屬性的默認值;

屬性的模式,如不可見方式Invisible、常量方式Constant、驗證方式Verify、預置方式Preset;

屬性標簽名。

/// <summary>
         /// 塊添加屬性
         /// </summary>
         /// <param name="blockId"></param>
         /// <param name="atts"></param>
         public static void AddAttsToBlocks(this ObjectId blockId, List<AttributeDefinition> atts)
         {
             Database db = blockId.Database;//獲取數據庫對象
 
             BlockTableRecord btr = blockId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
 
             foreach (AttributeDefinition att in atts)
             {
                 btr.AppendEntity(att);
 
                 db.TransactionManager.AddNewlyCreatedDBObject(att, true);
             }
 
             btr.DowngradeOpen();
         }
 
         public static void AddAttsToBlocks(this ObjectId blockId, params AttributeDefinition[] atts)
         {
             blockId.AddAttsToBlocks(atts.ToList());
         }

屬性塊的定義

2、插入屬性塊

塊參照中的屬性實體由DatabaseServices命名空間中的AttibuteReference類表示,它其實是一個單行文本對象,由DBText類派生。為塊參照添加書體的步驟如下:

1)打開塊參照所屬的塊表記錄對象;

2)對塊表記錄中的實體進行循環遍歷,如果實體是屬性定義的對象,則根據它的標識為塊參照屬性對象設置屬性值;

3)獲取塊參照對象的屬性集合對象來為塊參照添加新創建的屬性參照對象。屬性集合對象由BlockReference的AttributeCollection 屬性標識,調用它的AppendAttribute函數就可以完成塊參照的屬性添加。

插入帶屬性的塊參照

/// <summary>
         /// 插入帶屬性的參照快
         /// </summary>
         /// <param name="spaceId">空間的ID</param>
         /// <param name="layer">塊要加入的圖層名</param>
         /// <param name="blockName">快參照所屬的快名</param>
         /// <param name="postion">插入點</param>
         /// <param name="scale">縮放比例</param>
         /// <param name="rotateAngle">旋轉角度</param>
         /// <param name="attNameValues">屬性名稱與取值</param>
         /// <returns></returns>
         public static ObjectId InsertBlockrefence(this ObjectId spaceId, string layer, string blockName, Point3d postion, Scale3d scale, double rotateAngle, Dictionary<string, string> attNameValues)
         {
             // 獲取數據庫對象
             Database db = spaceId.Database;
             //以讀的方式打開塊表
             BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
             //如果沒有blockName d的塊,則程序返回
             if (!bt.Has(blockName))
 
                 return ObjectId.Null;//如果沒有blockName的塊,程序返回
             //以寫的模式打開空間
             BlockTableRecord space = (BlockTableRecord)spaceId.GetObject(OpenMode.ForWrite);
             //獲取塊表的記錄ID
             ObjectId btrId = bt[blockName];
             //打開塊表記錄
             BlockTableRecord record = btrId.GetObject(OpenMode.ForRead) as BlockTableRecord;
             //創建一個快參照並設置插入點
             BlockReference br = new BlockReference(postion, bt[blockName]);
 
             br.ScaleFactors = scale;
 
             br.Layer = layer;
             br.Rotation = rotateAngle;
 
             space.AppendEntity(br);
             //判斷塊表記錄是否包含屬性定義
             if (record.HasAttributeDefinitions)
             {
                 //若包含,則遍歷屬性定義
                 foreach (ObjectId id in record)
                 {
                     //檢查是否是屬性定義
                     AttributeDefinition attDef = id.GetObject(OpenMode.ForRead) as AttributeDefinition;
 
                     if (attDef != null)
                     {
 
                         //創建一個新的屬性對象
                         AttributeReference attribute = new AttributeReference();
                         //從屬性定義獲取屬性對象的對象特性
                         attribute.SetAttributeFromBlock(attDef, br.BlockTransform);
                         attribute.Rotation = attDef.Rotation;
 
                         attribute.Position = attDef.Position.TransformBy(br.BlockTransform);
 
                         attribute.AdjustAlignment(db);
                         //判斷是否包含指定的屬性名稱
                         if (attNameValues.ContainsKey(attDef.Tag.ToUpper()))
                         {
                             //設置屬性值
                             attribute.TextString = attNameValues[attDef.Tag.ToUpper()].ToString();
 
                         }
                         // 向塊參照添加屬性對象
                         br.AttributeCollection.AppendAttribute(attribute);
                         db.TransactionManager.AddNewlyCreatedDBObject(attribute, true);
 
                     }
                 }
             }
             db.TransactionManager.AddNewlyCreatedDBObject(br, true);
             return br.ObjectId;//返回添加的快參照的ID
         }

更新塊參照

/// <summary>
         /// 更新屬性名稱與取值
         /// </summary>
         /// <param name="blockRefId"></param>
         /// <param name="attNameValues"></param>
         public static void UpdateAttributesInBlock(this ObjectId blockRefId, Dictionary<string, string> attNameValues)
         {
             BlockReference blockRef = blockRefId.GetObject(OpenMode.ForRead) as BlockReference;
             if (blockRef != null)
             {
                 foreach (ObjectId id in blockRef.AttributeCollection)
                 {
                     AttributeReference attref = id.GetObject(OpenMode.ForRead) as AttributeReference;
                     if (attNameValues.ContainsKey(attref.Tag.ToUpper()))
                     {
                         attref.UpgradeOpen();
                         //設置屬性值
                         attref.TextString = attNameValues[attref.Tag.ToUpper()].ToString();
 
                         attref.DowngradeOpen();
                     }
                 }
 
             }
 
         }

 

原文地址:https://www.bbsmax.com/A/Gkz1oZW25R/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM