ADN Open CIS
Сообщество программистов Autodesk в СНГ

22/07/2016

Добавление полей к атрибутам блока, вставленными в пространство модели

Вот статья, которая объясняет, как вставить блок с атрибутами.

Ниже C#-код, вставляющий поле (field) в атрибут блока. Создайте чертеж с блоком с именем "test" содержащий окружность (Circle) и определение атрибута с произвольным именем для тестирования кода.

Код - C#: [Выделить]
  1. [CommandMethod("addFieldToAttribute")]
  2. public void addFieldToAttribute()
  3. {
  4.   Database db = Application.DocumentManager.MdiActiveDocument.Database;
  5.   Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  6.   string blkName = "test";
  7.   using (Transaction acTrans = db.TransactionManager.StartTransaction())
  8.   {
  9.     BlockTable blkTbl = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
  10.     if (blkTbl.Has(blkName))
  11.     {
  12.       BlockTableRecord blkTblRec = blkTbl[blkName].GetObject(OpenMode.ForRead)
  13.           as BlockTableRecord;
  14.       using (BlockReference blkRef = new BlockReference(Point3d.Origin, blkTblRec.ObjectId))
  15.       {
  16.         BlockTableRecord ms = blkTbl[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite)
  17.             as BlockTableRecord;
  18.         ms.AppendEntity(blkRef);
  19.         acTrans.AddNewlyCreatedDBObject(blkRef, true);
  20.         if (blkTblRec.HasAttributeDefinitions)
  21.         {
  22.           Point3d cp = new Point3d(0, 0, 0);
  23.           Circle circ = new Circle();
  24.           ObjectId objID = new ObjectId();
  25.           foreach (ObjectId id in blkTblRec)
  26.           {
  27.             DBObject obj = id.GetObject(OpenMode.ForRead);
  28.             if ((obj) is Circle)
  29.             {
  30.               circ = (Circle)obj; // Получаем объект окружности
  31.               cp = circ.Center;
  32.               objID = circ.ObjectId;
  33.             }
  34.             if (obj is AttributeDefinition)
  35.             {
  36.               AttributeDefinition acAttDef = (AttributeDefinition)obj;
  37.               // Создаём новый AttributeReference
  38.               using (AttributeReference acAttRef = new AttributeReference())
  39.               {
  40.                 acAttRef.SetAttributeFromBlock(acAttDef, blkRef.BlockTransform);
  41.                 acAttRef.Position = acAttDef.Position.TransformBy(blkRef.BlockTransform);
  42.                 acAttRef.TextString = acAttDef.TextString;
  43.                 acAttRef.Tag = acAttDef.Tag;
  44.                 // Добавляем AttributeReference к BlockReference
  45.                 blkRef.AttributeCollection.AppendAttribute(acAttRef);
  46.                 // Назначаем точку центра в качестве кода поля
  47.                 string str1 = "%<\\AcObjProp.16.2 Object(%<\\_ObjId ";
  48.                 string strID = objID.OldIdPtr.ToString();
  49.                 string str2 = ">%,1).Center \\f \"%lu2\">%";
  50.                 string str = str1 + strID + str2;
  51.                 string fldstr = string.Format(str, cp.ToString());
  52.                 // Создаём новое поле
  53.                 Field field = new Field(fldstr);
  54.                 field.Evaluate();
  55.                 FieldEvaluationStatusResult fieldEval = field.EvaluationStatus;
  56.                 if (fieldEval.Status != FieldEvaluationStatus.Success)
  57.                 {
  58.                   acTrans.Abort();
  59.                   ed.WriteMessage(string.Format("FieldEvaluationStatus сообщение: {0} - {1}",
  60.                       fieldEval.Status, fieldEval.ErrorMessage));
  61.                   return;
  62.                 }
  63.                 else
  64.                 {
  65.                   try
  66.                   {   // Устанавливаем вставке атрибута значение поля
  67.                     acAttRef.SetField(field);
  68.                     acTrans.AddNewlyCreatedDBObject(field, true);
  69.                     ed.WriteMessage(string.Format("Поле ({1}) вставлено в атрибут '{0}' блока '{2}' ",
  70.                         acAttRef.Tag, field.Value, blkRef.Name));
  71.                   }
  72.                   catch
  73.                   {
  74.                     field.Dispose();
  75.                     ed.WriteMessage(string.Format("Ошибка при установке поля атрибуту '{0}' - {1}",
  76.                         acAttRef.Tag, acAttRef.Handle));
  77.                   }
  78.                 }
  79.                 acTrans.AddNewlyCreatedDBObject(acAttRef, true);
  80.               }
  81.             }
  82.           }
  83.         }
  84.       }
  85.     }
  86.     acTrans.Commit();
  87.   }
  88. }
  89.  

 

Источник: http://adndevblog.typepad.com/autocad/2016/07/adding-field-to-attribute-value-of-a-block-inserted-to-modelspace.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=7233

Опубликовано 22.07.2016