Атрибут с полем во вложенном блоке

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

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Привет,
Как правильно вставить вложенный блок с атрибутом с полем?
Руками такой блок создается правильно.

поле такое:
%<\AcObjProp Object(%<\_ObjId 3006182857312>%).Parameter(33).lookupString>%
ссылка на значение дин параметра выбора
Код - C# [Выбрать]
  1.         [CommandMethod(nameof(TestCreateBlock))]
  2.         public void TestCreateBlock()
  3.         {
  4.             var doc = Application.DocumentManager.MdiActiveDocument;
  5.             var db = doc.Database;
  6.             using var t = doc.TransactionManager.StartTransaction();
  7.  
  8.             // Создане нового блока
  9.             var btr = new BlockTableRecord
  10.             {
  11.                 Name = Guid.NewGuid().ToString()
  12.             };
  13.  
  14.             var bt = (BlockTable) db.BlockTableId.GetObject(OpenMode.ForWrite);
  15.             bt.Add(btr);
  16.             t.AddNewlyCreatedDBObject(btr, true);
  17.  
  18.             // Добавление окна в блок
  19.             var btrWindowId = bt["Окно"];
  20.             var blRefWindow = new BlockReference(Point3d.Origin, btrWindowId);
  21.             btr.AppendEntity(blRefWindow);
  22.             t.AddNewlyCreatedDBObject(blRefWindow, true);
  23.  
  24.             // Добавление атрибутов в блок окна
  25.             AddAttributes(blRefWindow, btrWindowId, t);
  26.  
  27.             // Добавление полилини котнура в блок
  28.             var pl = new Polyline();
  29.             pl.AddVertexAt(0, new Point2d(-1000, 0), 0, 0, 0);
  30.             pl.AddVertexAt(0, new Point2d(1000, 0), 0, 0, 0);
  31.             pl.AddVertexAt(0, new Point2d(1000, 300), 0, 0, 0);
  32.             pl.AddVertexAt(0, new Point2d(-1000, 300), 0, 0, 0);
  33.             pl.Closed = true;
  34.             btr.AppendEntity(pl);
  35.             t.AddNewlyCreatedDBObject(pl, true);
  36.  
  37.             // Вставка созданного блока
  38.             var pt = doc.Editor.GetPoint("Точка вставки").Value;
  39.             var blRef = new BlockReference(pt, btr.Id);
  40.             var cs = (BlockTableRecord) db.CurrentSpaceId.GetObject(OpenMode.ForWrite);
  41.             cs.AppendEntity(blRef);
  42.             t.AddNewlyCreatedDBObject(blRef, true);
  43.  
  44.             t.Commit();
  45.         }
  46.  
  47.         private void AddAttributes(BlockReference blRef, ObjectId btrId, Transaction t)
  48.         {
  49.             var btr = (BlockTableRecord) btrId.GetObject(OpenMode.ForRead);
  50.             var atrDefs = btr.Cast<ObjectId>()
  51.                 .Select(s => s.GetObject(OpenMode.ForRead, false, true) as AttributeDefinition)
  52.                 .Where(w => w != null).ToList();
  53.  
  54.             foreach (var atrDef in atrDefs)
  55.             {
  56.                 if (atrDef.Constant)
  57.                     continue;
  58.  
  59.                 var atrRef = new AttributeReference();
  60.                 atrRef.SetAttributeFromBlock(atrDef, blRef.BlockTransform);
  61.                 blRef.AttributeCollection.AppendAttribute(atrRef);
  62.                 t.AddNewlyCreatedDBObject(atrRef, true);
  63.             }
  64.         }
https://github.com/vildar82/TestFieldInBlock

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Атрибут с полем во вложенном блоке
« Ответ #1 : 12-08-2020, 15:22:30 »
Вильдар,
А поиском пользовался? Вроде бы мы уже это обсуждали. Только я не понял при чем здесь "вложенный блок".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Вильдар 12-08-2020, 16:30:08

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Атрибут с полем во вложенном блоке
« Ответ #2 : 12-08-2020, 16:21:58 »
Точно, пропустил тему(
https://adn-cis.org/forum/index.php?topic=9353.msg39241#msg39241
Дмитрий Загорулькин молодец  :)
Надо SetAttributeFromBlock вызывать после AppendAttribute:
Код - C# [Выбрать]
  1.       var atrRef = new AttributeReference();
  2.       blRef.AttributeCollection.AppendAttribute(atrRef);
  3.       t.AddNewlyCreatedDBObject(atrRef, true);
  4.       atrRef.SetAttributeFromBlock(atrDef, blRef.BlockTransform);

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Атрибут с полем во вложенном блоке
« Ответ #3 : 12-08-2020, 16:26:14 »
Вильдар,
А минус мне за что?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Атрибут с полем во вложенном блоке
« Ответ #4 : 12-08-2020, 16:29:19 »
На эмоциях  ;D
Не знал что в поиске вбивать вообще.
Вложенный блок - тоже показалось, что имеет значения.
А оказалось все банально.
Как чтолько лет не замечал, удивительно  :-[