Блок повторно не записывает атрибут

Автор Тема: Блок повторно не записывает атрибут  (Прочитано 5490 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!

Ищу ошибку в коде. Команда на второй и последующий вызовы не записывает в атрибут вновь введенные данные, а оставляет первоначальные с первого вызова. Посмотрел под отладчиком - данные считываются и записываются в нужные переменные, но далее где-то происходит сбой и блок вставляется с данными, введенными в момент первого вызова. Где искать ошибку?
Код - C# [Выбрать]
  1. namespace MarksUtilities
  2. {
  3.  
  4.      public abstract class Mark
  5.      {
  6.           internal virtual Point3d GetInsertionPoint()
  7.           {
  8.                Point3d point = SelectionUtilities.GetPointFromUser();
  9.                return point;
  10.           }
  11.  
  12.  
  13.           internal abstract string GetMarkContent();
  14.  
  15.  
  16.           internal abstract void DrawMark(string content, Transaction tr, BlockTable bt, BlockTableRecord btr);
  17.  
  18.  
  19.  
  20.           internal abstract void CreateBlockDescription(string blockName);
  21.  
  22.  
  23.           internal virtual void CreateBlockReference(RegMark markInstance, string blockName)
  24.           {
  25.                Document doc = Application.DocumentManager.MdiActiveDocument;
  26.                Database db = doc.Database;
  27.                Transaction tr = db.TransactionManager.StartTransaction();
  28.                using (tr)
  29.                {
  30.                     BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);
  31.                     BlockTableRecord btr = (BlockTableRecord)bt[blockName].GetObject(OpenMode.ForRead);
  32.                     BlockTableRecord curSpace_btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  33.                     BlockReference bRef = new BlockReference(markInstance.blockRefPosition, btr.ObjectId);
  34.                     bRef.SetDatabaseDefaults();
  35.                     bRef.Layer = markInstance.markLayer;
  36.                     curSpace_btr.AppendEntity(bRef);
  37.                     tr.AddNewlyCreatedDBObject(bRef, true);
  38.                     if (btr.HasAttributeDefinitions)
  39.                     {
  40.                          foreach (ObjectId objID in btr)
  41.                          {
  42.                               DBObject dbObject = tr.GetObject(objID, OpenMode.ForRead);
  43.                               if (dbObject is AttributeDefinition)
  44.                               {
  45.                                    AttributeDefinition attDef = dbObject as AttributeDefinition;
  46.                                    if (attDef.Constant == false)
  47.                                    {
  48.                                         AttributeReference attRef = new AttributeReference();
  49.                                         attRef.SetAttributeFromBlock(attDef, bRef.BlockTransform);
  50.                                         attRef.Position = attDef.Position.TransformBy(bRef.BlockTransform);
  51.                                         attRef.TextString = attDef.TextString;
  52.                                         bRef.AttributeCollection.AppendAttribute(attRef);
  53.                                         tr.AddNewlyCreatedDBObject(attRef, true);
  54.                                    }
  55.                               }
  56.                          }
  57.                     }
  58.  
  59.                     tr.Commit();
  60.                }
  61.           }
  62.           internal virtual void CreateBlockReference(WTMark markInstance, string blockName)
  63.           {
  64.                Document doc = Application.DocumentManager.MdiActiveDocument;
  65.                Database db = doc.Database;
  66.                Transaction tr = db.TransactionManager.StartTransaction();
  67.                using (tr)
  68.                {
  69.                     BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);
  70.                     BlockTableRecord btr = (BlockTableRecord)bt[blockName].GetObject(OpenMode.ForRead);
  71.                     BlockTableRecord curSpace_btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  72.                     BlockReference bRef = new BlockReference(markInstance.blockRefPosition, btr.ObjectId);
  73.                     bRef.SetDatabaseDefaults();
  74.                     bRef.Layer = markInstance.markLayer;
  75.                     curSpace_btr.AppendEntity(bRef);
  76.                     tr.AddNewlyCreatedDBObject(bRef, true);
  77.                     if (btr.HasAttributeDefinitions)
  78.                     {
  79.                          foreach (ObjectId objID in btr)
  80.                          {
  81.                               DBObject dbObject = tr.GetObject(objID, OpenMode.ForRead);
  82.                               if (dbObject is AttributeDefinition)
  83.                               {
  84.                                    AttributeDefinition attDef = dbObject as AttributeDefinition;
  85.                                    if (attDef.Constant == false)
  86.                                    {
  87.                                         AttributeReference attRef = new AttributeReference();
  88.                                         attRef.SetAttributeFromBlock(attDef, bRef.BlockTransform);
  89.                                         attRef.Position = attDef.Position.TransformBy(bRef.BlockTransform);
  90.                                         attRef.TextString = attDef.TextString;
  91.                                         bRef.AttributeCollection.AppendAttribute(attRef);
  92.                                         tr.AddNewlyCreatedDBObject(attRef, true);
  93.                                    }
  94.                               }
  95.                          }
  96.                     }
  97.  
  98.                     tr.Commit();
  99.                }
  100.           }
  101.      }
  102.  
  103.  
  104.      public class Initiator
  105.      {
  106.           [CommandMethod("insRegMark")]
  107.           public static void InsertItem()
  108.           {
  109.  
  110.                RegMark regMark = new RegMark();
  111.  
  112.  
  113.                LayerCreator.CreateLayerSet();
  114.                regMark.CreateBlockDescription(regMark.blockName);
  115.                regMark.CreateBlockReference(regMark, regMark.blockName);
  116.           }
  117.          
  118.      }
  119.      public class RegMark : Mark
  120.      {
  121.           public readonly string markContent;
  122.           public readonly string markLayer;
  123.           public readonly Point3d blockRefPosition;
  124.           public string blockName;
  125.  
  126.           public RegMark()
  127.           {
  128.                markContent = GetMarkContent();
  129.                markLayer = "-10-ItemMarks";
  130.                blockRefPosition = base.GetInsertionPoint();
  131.                blockName = "ItemMark";
  132.           }
  133.  
  134.  
  135.           internal override Point3d GetInsertionPoint()
  136.           {
  137.                return base.GetInsertionPoint();
  138.           }
  139.  
  140.  
  141.           internal override string GetMarkContent()
  142.           {
  143.                Document doc = Application.DocumentManager.MdiActiveDocument;
  144.                PromptStringOptions pso1 = new PromptStringOptions("\nSet item number: ");
  145.                PromptResult itemNumber = doc.Editor.GetString(pso1);
  146.                string content = itemNumber.StringResult;
  147.  
  148.                return content;
  149.           }
  150.  
  151.  
  152.           internal override void DrawMark(string itemNumber, Transaction tr, BlockTable bt, BlockTableRecord btr)
  153.           {
  154.                Circle circle = new Circle();
  155.                circle.Radius = 8;
  156.                circle.LineWeight = LineWeight.LineWeight060;
  157.                circle.Layer = "-10-ItemMarks";
  158.                btr.AppendEntity(circle);
  159.                tr.AddNewlyCreatedDBObject(circle, true);
  160.                using (AttributeDefinition itemNo = new AttributeDefinition())
  161.                {
  162.                     itemNo.SetDatabaseDefaults(bt.Database);
  163.                     itemNo.Verifiable = true;
  164.                     itemNo.Prompt = "Item Number";
  165.                     itemNo.Tag = "ItemNumber";
  166.                     itemNo.TextString = itemNumber;
  167.                     itemNo.WidthFactor = 0.8;
  168.                     itemNo.Height = 0.75 * circle.Radius;
  169.                     itemNo.Justify = AttachmentPoint.BaseFit;
  170.                     itemNo.Position = new Point3d(-0.75 * circle.Radius, -0.375*circle.Radius, 0);
  171.                     itemNo.AlignmentPoint = new Point3d(0.75 * circle.Radius, -0.375 * circle.Radius, 0);
  172.                     itemNo.AdjustAlignment(bt.Database);
  173.                     itemNo.Layer = "0";
  174.                     btr.AppendEntity(itemNo);
  175.                }
  176.           }
  177.  
  178.  
  179.           internal override void CreateBlockDescription(string blockName)
  180.           {
  181.                Document doc = Application.DocumentManager.MdiActiveDocument;
  182.                Database db = doc.Database;
  183.                Transaction tr = db.TransactionManager.StartTransaction();
  184.                using (tr)
  185.                {
  186.                     BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  187.                     if (bt.Has(blockName) == false)
  188.                     {
  189.                          BlockTableRecord btr = new BlockTableRecord();
  190.                          btr.Name = blockName;
  191.                          btr.Explodable = false;
  192.                          btr.Origin = new Point3d(0, 0, 0);
  193.                          bt.UpgradeOpen();
  194.                          bt.Add(btr);
  195.                          tr.AddNewlyCreatedDBObject(btr, true);
  196.                          DrawMark(markContent, tr, bt, btr);
  197.                     }
  198.  
  199.                     tr.Commit();
  200.                }
  201.           }
  202.  
  203.  
  204.           internal override void CreateBlockReference(RegMark regMark, string blockName)
  205.           {
  206.                Document doc = Application.DocumentManager.MdiActiveDocument;
  207.                Database db = doc.Database;
  208.                Transaction tr = db.TransactionManager.StartTransaction();
  209.                using (tr)
  210.                {
  211.                     BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);
  212.                     BlockTableRecord btr = (BlockTableRecord)bt[blockName].GetObject(OpenMode.ForRead);
  213.                     BlockTableRecord curSpace_btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  214.                     BlockReference bRef = new BlockReference(regMark.blockRefPosition, btr.ObjectId);
  215.                     bRef.SetDatabaseDefaults();
  216.                     bRef.Layer = regMark.markLayer;
  217.                     curSpace_btr.AppendEntity(bRef);
  218.                     tr.AddNewlyCreatedDBObject(bRef, true);
  219.                     if (btr.HasAttributeDefinitions)
  220.                     {
  221.                          foreach (ObjectId objID in btr)
  222.                          {
  223.                               DBObject dbObject = tr.GetObject(objID, OpenMode.ForRead);
  224.                               if (dbObject is AttributeDefinition)
  225.                               {
  226.                                    AttributeDefinition attDef = dbObject as AttributeDefinition;
  227.                                    if (attDef.Constant == false)
  228.                                    {
  229.                                         AttributeReference attRef = new AttributeReference();
  230.                                         attRef.SetAttributeFromBlock(attDef, bRef.BlockTransform);
  231.                                         attRef.Position = attDef.Position.TransformBy(bRef.BlockTransform);
  232.                                         attRef.TextString = attDef.TextString;
  233.                                         bRef.AttributeCollection.AppendAttribute(attRef);
  234.                                         tr.AddNewlyCreatedDBObject(attRef, true);
  235.                                    }
  236.                               }
  237.                          }
  238.                     }
  239.  
  240.                     tr.Commit();
  241.                }
  242.           }
  243.      }

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Атрибуты как и блоки имеют определение и экземпляр. Вы меняете определение атрибута, а нужно менять экземпляр атрибута в экземпляре блока

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Посмотрел под отладчиком - данные считываются и записываются в нужные переменные, но далее где-то происходит сбой и блок вставляется с данными, введенными в момент первого вызова.
Значит плохо смотрел.
Где искать ошибку?
Понятно, что в твоём коде. А как тебе можно помочь, если ты какой-то огрызок кода дал, который не компилируется, в коде нет никаких комментариев?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Atomohod,
Вот где у тебя ерунда записана:
Код - C# [Выбрать]
  1. attRef.TextString = attDef.TextString;
Ты каждому атрибуту присваиваешь значение по-умолчанию для определения атрибута (AttributeDefinition) из блока (BlockTableRecord). Каким образом при повторном запуске у тебя может изменится это значение?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Atomohod 11-10-2018, 21:54:52

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Кусочек из моего старого кода. Не претендует на звание "идеального кода", но смысл, думаю, понятен сразу:
Код - C# [Выбрать]
  1. public static void AddAttributesForSpecification(Transaction tr, BlockReference blkRef, DwgBaseItem dwgBaseItem)
  2. {
  3.     if (HasAttributesForSpecification(tr, blkRef.ObjectId))
  4.     {
  5.         // update attributes
  6.         foreach (ObjectId id in blkRef.AttributeCollection)
  7.         {
  8.             var attr = tr.GetObject(id, OpenMode.ForWrite) as AttributeReference;
  9.             if (attr != null)
  10.             {
  11.                 if (attr.Tag.ToLower().Equals("mp:позиция") ||
  12.                     attr.Tag.ToLower().Equals("mp:position"))
  13.                     attr.TextString = dwgBaseItem.PositionValue;
  14.                 if (attr.Tag.ToLower().Equals("mp:обозначение") ||
  15.                     attr.Tag.ToLower().Equals("mp:designation"))
  16.                     attr.TextString = dwgBaseItem.DesignationValue;
  17.                 if (attr.Tag.ToLower().Equals("mp:наименование") ||
  18.                     attr.Tag.ToLower().Equals("mp:name"))
  19.                     attr.TextString = dwgBaseItem.NominationValue;
  20.                 if (attr.Tag.ToLower().Equals("mp:масса") ||
  21.                     attr.Tag.ToLower().Equals("mp:mass"))
  22.                     attr.TextString = dwgBaseItem.MassValue;
  23.                 if (attr.Tag.ToLower().Equals("mp:примечание") ||
  24.                     attr.Tag.ToLower().Equals("mp:note"))
  25.                     attr.TextString = dwgBaseItem.NoteValue;
  26.             }
  27.         }
  28. // ..........................