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

12/03/2014

Создание блока с многострочным определением атрибута

Это пример кода, который создает определение блока с многострочным определением атрибута, а затем создает вставку блока из определения блока.

Код - C#: [Выделить]
  1. internal static void CreateMyBlock()
  2. {
  3.     Database db
  4.         = Application.DocumentManager.MdiActiveDocument.Database;
  5.  
  6.     using (Transaction tr = db.TransactionManager.StartTransaction())
  7.     {
  8.         BlockTable bt = tr.GetObject(
  9.                                         db.BlockTableId,
  10.                                         OpenMode.ForRead
  11.                                     ) as BlockTable;
  12.  
  13.         if (bt.Has("МойБлок") == false)
  14.         {
  15.             bt.UpgradeOpen();
  16.             BlockTableRecord btr = new BlockTableRecord();
  17.             btr.Name = "МойБлок";
  18.             btr.Origin = Point3d.Origin;
  19.             bt.Add(btr);
  20.             tr.AddNewlyCreatedDBObject(btr, true);
  21.  
  22.             // Определение атрибута
  23.             AttributeDefinition attdef
  24.                 = new AttributeDefinition
  25.                         (
  26.                             Point3d.Origin,
  27.                             @"Миллисекунды\PСекунды\PМинуты",
  28.                             "Time",
  29.                             "Время ?",
  30.                             db.Textstyle
  31.                         );
  32.             attdef.IsMTextAttributeDefinition = true;
  33.             btr.AppendEntity(attdef);
  34.             tr.AddNewlyCreatedDBObject(attdef, true);
  35.         }
  36.         tr.Commit();
  37.     }
  38. }
  39.  
  40. internal static void CreateMyBlockRef()
  41. {
  42.     Document doc = Application.DocumentManager.MdiActiveDocument;
  43.     Database db = doc.Database;
  44.     Editor ed = doc.Editor;
  45.  
  46.     PromptPointOptions ppo
  47.         = new PromptPointOptions("\nУкажите точку вставки :");
  48.  
  49.     PromptPointResult ppr = ed.GetPoint(ppo);
  50.     if (ppr.Status != PromptStatus.OK)
  51.         return;
  52.  
  53.     Point3d insertionPoint = ppr.Value;
  54.  
  55.     using (Transaction tr = db.TransactionManager.StartTransaction())
  56.     {
  57.         BlockTable bt
  58.             = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
  59.         BlockTableRecord blockDef
  60.             = bt["МойБлок"].GetObject(OpenMode.ForRead) as BlockTableRecord;
  61.  
  62.         BlockTableRecord ms
  63.             = bt[BlockTableRecord.ModelSpace].GetObject
  64.                         (OpenMode.ForWrite) as BlockTableRecord;
  65.  
  66.         BlockReference blockRef
  67.             = new BlockReference(insertionPoint, blockDef.ObjectId);
  68.  
  69.         ms.AppendEntity(blockRef);
  70.         tr.AddNewlyCreatedDBObject(blockRef, true);
  71.  
  72.         foreach (ObjectId id in blockDef)
  73.         {
  74.             DBObject obj = id.GetObject(OpenMode.ForRead);
  75.             AttributeDefinition attDef = obj as AttributeDefinition;
  76.             if ((attDef != null) && (!attDef.Constant))
  77.             {
  78.                 AttributeReference attRef = new AttributeReference();
  79.                 attRef.SetAttributeFromBlock
  80.                                 (
  81.                                     attDef,
  82.                                     blockRef.BlockTransform
  83.                                 );
  84.                 attRef.TextString = String.Format
  85.                     (
  86.                     @"Миллисекунды : {0}\PСекунды : {1}\PМинуты : {2}",
  87.                     DateTime.Now.Millisecond.ToString(),
  88.                     DateTime.Now.Second.ToString(),
  89.                     DateTime.Now.Minute.ToString()
  90.                     );
  91.  
  92.                 blockRef.AttributeCollection.AppendAttribute(attRef);
  93.                 tr.AddNewlyCreatedDBObject(attRef, true);
  94.             }
  95.         }
  96.  
  97.         tr.Commit();
  98.     }
  99. }
  100.  
  101. [CommandMethod("Test")]
  102. static public void TestMethod()
  103. {
  104.     CreateMyBlock();
  105.  
  106.     CreateMyBlockRef();
  107. }

 

Источник: http://adndevblog.typepad.com/autocad/2013/06/creating-a-block-with-multi-line-attribute-definition.html

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

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