明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2509|回复: 5

[结贴]插入外部属性块,无法获得属性的值

[复制链接]
发表于 2012-10-11 11:16:43 | 显示全部楼层 |阅读模式
本帖最后由 沼泽里的鱼 于 2012-10-26 17:35 编辑

开发了个程序,想实现如下功能,但是遇到问题,请各位帮助分析诊断一下,谢谢!

方法:选取外部文件,读取里面的属性块并插入,获取其默认属性值,显示在指定的位置。

问题:块插入正常,但是属性值无法获取,如:一个块中有个属性Tag=“工号”,textString=“0123”,通过程序插入后,能查看和编辑该属性,但是值为"",也即没有将定义好的默认属性值带入插入的图形中去。

代码如下:
  1. private static bool InsertBlock(string strBlockName, string strFilePath)
  2.         {
  3.                       Autodesk.AutoCAD.ApplicationServices.Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;            
  4.                      using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
  5.             {
  6.                 using (Transaction tr = doc.TransactionManager.StartTransaction())
  7.                 {
  8.                     using (Database db = new Database(false, true))
  9.                     {
  10.                         db.ReadDwgFile(strFilePath, System.IO.FileShare.Read, true, null);
  11.                         using (Transaction trm = db.TransactionManager.StartTransaction())
  12.                         {
  13.                             BlockTable sourceBlkTbl = (BlockTable)trm.GetObject(db.BlockTableId, OpenMode.ForRead, false);
  14.                             if (!sourceBlkTbl.Has(strBlockName))
  15.                             {
  16.                                 Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("line 91");
  17.                                 return false;
  18.                             }
  19.                             ObjectIdCollection blockIds = new ObjectIdCollection();
  20.                             blockIds.Add(sourceBlkTbl[strBlockName]);
  21.                             IdMapping IdMap = new IdMapping();
  22.                             db.WblockCloneObjects(blockIds, doc.Database.BlockTableId, IdMap, DuplicateRecordCloning.Replace, false);
  23.                                                      trm.Commit();
  24.                         }
  25.                     }
  26.                     tr.Commit();
  27.                 }
  28.             }
  29.             return true;
  30.         }
  31.         public static ObjectId InsertBlock(string strFilePath, string strBlockName, Point3d insertPt, Double scale)
  32.         {
  33.                      ObjectId objId = new ObjectId();
  34.             Autodesk.AutoCAD.ApplicationServices.Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  35.             if (strBlockName.CompareTo("") == 0 || strFilePath.CompareTo("") == 0)
  36.             {
  37.                 Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("line 118!");
  38.                 return objId;
  39.             }
  40.             if (!System.IO.File.Exists(strFilePath))
  41.             {
  42.                 Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("没有找到外部引用文件!");
  43.                 doc.Editor.WriteMessage(string.Format("\nInput file :{0} no existed !", strFilePath));
  44.                 return objId;
  45.             }
  46.             using (Transaction tr = doc.TransactionManager.StartTransaction())
  47.             {
  48.                 BlockTable bt = (BlockTable)tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
  49.                 if (!bt.Has(strBlockName))
  50.                 {
  51.                     if (!InsertBlock(strBlockName, strFilePath))
  52.                     {
  53.                         Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("line 137");
  54.                         return objId;
  55.                     }
  56.                 }
  57.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  58.                 using (BlockReference newBlkRef = new BlockReference(insertPt, bt[strBlockName]))
  59.                 {
  60.                     newBlkRef.ScaleFactors = new Scale3d(scale);
  61.                     objId = btr.AppendEntity(newBlkRef);
  62.                     #region 加入默认属性
  63.                     BlockTableRecord btrBlock = tr.GetObject(bt[strBlockName], OpenMode.ForRead) as BlockTableRecord;
  64.                     if (btrBlock.HasAttributeDefinitions)
  65.                     {
  66.                         foreach (ObjectId id in btrBlock)
  67.                         {
  68.                             DBObject ent = tr.GetObject(id, OpenMode.ForRead) as DBObject;
  69.                             if (ent is AttributeDefinition)
  70.                             {
  71.                                 
  72.                                 AttributeDefinition attdef = ent as AttributeDefinition;//取得块的属性定义
  73.                               
  74.                                 AttributeReference attref = new AttributeReference();//新建属性参照
  75.                                 attref.SetPropertiesFrom(attdef);
  76.                                 attref.SetAttributeFromBlock(attdef, Matrix3d.Displacement(btrBlock.Origin.GetVectorTo(insertPt)));//复制属性
  77.                                  newBlkRef.AttributeCollection.AppendAttribute(attref);//附着属性参照
  78.                                 tr.AddNewlyCreatedDBObject(attref, true);
  79.                                 attref = null;
  80.                             }
  81.                         }
  82.                     }
  83.                     #endregion
  84.                     tr.AddNewlyCreatedDBObject(newBlkRef, true);
  85.                 }
  86.                 tr.Commit();
  87.                 //tr.Dispose();
  88.             }
  89. return objId;
  90.         }

           
发表于 2012-10-11 13:22:25 | 显示全部楼层
textString=“0123”是存在于块参考中,而从外部文件搬进来的是块记录
 楼主| 发表于 2012-10-11 16:19:29 | 显示全部楼层
感谢回复。怎么才能获得textString=“0123”呢?
发表于 2012-10-11 20:04:48 | 显示全部楼层
textString=“0123”只是其中一个块参考BlockReference的值,若有多个块参考,则或许另有textString=“0000”;

你若是要把块参考搬进来,则把块参考的ObjectId放进blockIds,如blockIds.Add(sourceBlkTbl[strBlockName]);
 楼主| 发表于 2012-10-18 10:01:25 | 显示全部楼层
如你所说,在块定义的时候必须要给默认属性值,这样在其它图形中插入该块的时候就能获取到该属性值。
发表于 2012-12-6 12:30:50 | 显示全部楼层
不错,很好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 16:24 , Processed in 0.174252 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表