Не создается объект внутри блока.

Автор Тема: Не создается объект внутри блока.  (Прочитано 10780 раз)

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

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Доброго дня всем.
Возник такой вопрос, прошу помощи...
Прохожу по объектам чертежа. В этой теме https://adn-cis.org/forum/index.php?topic=10341.0.
К примеру, найдя объект
Код - C# [Выбрать]
  1. AcDbMText
беру его координаты и пытаюсь вставить в блок текст через метод
Код - C# [Выбрать]
  1.         static public void CrText(dynamic app, dynamic acDoc, dynamic modelSpace, double xMax, double Ymax,  double Zmax)
  2.         {
  3.                        
  4.             AcadText newText = default(AcadText);
  5.                         double[] insertPoint = new double[]
  6.                                              {  xMax,
  7.                                                 Ymax,
  8.                                                 Zmax
  9.                                              };
  10.             string NWText = "Созданный объект";
  11.            double Hei_Text = 250;
  12.           //  newText = CallFunc((object)app, () => acDoc.ModelSpace.AddText(NWText, Hei_Text, insertPoint));
  13.             newText =acDoc.ModelSpace.AddText(NWText, insertPoint, Hei_Text);
  14.             newText.color = ACAD_COLOR.acWhite;
  15.         }
Объекты создаются. Всё вроде бы хорошо....но
Создаются не в блоке.
Буду признателен любой помощи и мыслям.

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Не создается объект внутри блока.
« Ответ #1 : 22-02-2022, 17:22:11 »
Это на питоне чтоли написано  :o
dynamic сплошные. Чем вызвано интересно?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается объект внутри блока.
« Ответ #2 : 22-02-2022, 17:25:22 »
Создаются не в блоке.
Ты и создаешь их не в блоке, а в Modelspace:
Код - C# [Выбрать]
  1. newText =acDoc.ModelSpace.AddText(NWText, insertPoint, Hei_Text);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается объект внутри блока.
« Ответ #3 : 22-02-2022, 17:30:25 »
Это на питоне чтоли написано  :o
dynamic сплошные. Чем вызвано интересно?
Тем что это COM/ActiveX и жуть жуткая...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Re: Не создается объект внутри блока.
« Ответ #4 : 24-02-2022, 09:38:30 »
Да) Есть небольшие проблемы))

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Re: Не создается объект внутри блока.
« Ответ #5 : 24-02-2022, 09:46:45 »
Это на питоне чтоли написано  :o
dynamic сплошные. Чем вызвано интересно?
Тем что это COM/ActiveX и жуть жуткая...
Александр, я думаю лучше создать подобный метод, но для блока по условию? или как-то по другому? А как указать, что применить к блоку?
Код - C# [Выбрать]
  1. AcDbBlockReference
?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается объект внутри блока.
« Ответ #6 : 24-02-2022, 17:16:46 »
А как указать, что применить к блоку?
Код - C# [Выбрать]

    AcDbBlockReference

?
Это вставка блока, а не блок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Re: Не создается объект внутри блока.
« Ответ #7 : 06-04-2022, 12:18:56 »
А как указать, что применить к блоку?
Код - C# [Выбрать]

    AcDbBlockReference

?
Это вставка блока, а не блок.
Александр, в той теме, что ранее указывалась
Код - C# [Выбрать]
  1.    private bool FindTextsInDrawing(dynamic app, dynamic acDoc, dynamic modelSpace)
  2.         {
  3.             try
  4.             {
  5.                 dynamic count = CallFunc((object)app, () => modelSpace.Count);
  6.  
  7.                 for (int i = 0; i < (int)count; i++)
  8.                 {
  9.                     dynamic en = CallFunc((object)app, () => modelSpace.Item(i));
  10.                     dynamic className = CallFunc((object)app, () => en.ObjectName);
  11.                     if (className == "AcDbMText")
  12.                     {
  13.                         dynamic str = CallFunc((object)app, () => en.TextString);
  14.                         ListTextItems.Add(new CFragment(str, DataType.MText));
  15.                     }
  16.                     else if (className == "AcDbText")
  17.                     {
  18.                         dynamic str = CallFunc((object)app, () => en.TextString);
  19.                         ListTextItems.Add(new CFragment(str, DataType.DBText));
  20.                     }
  21.                     else if (className == "AcDbTable")
  22.                     {
  23.                         dynamic rowsCount = CallFunc((object)app, () => en.Rows);
  24.                         dynamic columnsCount = CallFunc((object)app, () => en.Columns);
  25.                         for (int row = 0; row < rowsCount; row++)
  26.                         for (int col = 0; col < columnsCount; col++)
  27.                         {
  28.                             dynamic str = CallFunc((object)app, () => en.GetCellValue(row, col));
  29.                             if (!String.IsNullOrEmpty(str))
  30.                             {
  31.                                ListTextItems.Add(new CFragment(str, DataType.Table));
  32.                             }
  33.                         }
  34.                     }
  35.                     else if (className == "AcDbMLeader")
  36.                     {
  37.                         dynamic str = CallFunc((object)app, () => en.TextString);
  38.                         ListTextItems.Add(new CFragment(str, DataType.MLeader));
  39.                     }
  40.                     else if (className == "AcDbBlockReference")
  41.                     {
  42.                         dynamic blockHasAttributes = CallFunc((object)app, () => en.HasAttributes);
  43.                         if (blockHasAttributes)
  44.                         {
  45.                             // Выборка текстов всех атрибутов текущего блока
  46.                             dynamic attributeCollection = CallFunc((object)app, () => en.GetAttributes());
  47.                             foreach (dynamic att in attributeCollection)
  48.                             {
  49.                                 dynamic bVisible = CallFunc((object)app, () => att.Visible);
  50.                                 if (bVisible)
  51.                                 {
  52.                                     dynamic str = CallFunc((object)app, () => att.TextString);
  53.                                     ListTextItems.Add(new CFragment(str, DataType.AttributeReference));
  54.                                 }
  55.                             }
  56.                         }
  57.                         dynamic blockReferenceName = CallFunc((object)app, () => en.Name);
  58.                         dynamic blocks = CallFunc((object)app, () => acDoc.Blocks);
  59.                         dynamic blocksCount = CallFunc((object)app, () => blocks.Count);
  60.                         for (int i1 = 0; i1 < (int)blocksCount; i1++)
  61.                         {
  62.                             dynamic block = CallFunc((object)app, () => blocks.Item(i1));
  63.                             dynamic blockName = CallFunc((object)app, () => block.Name);
  64.                             if (blockName == blockReferenceName)
  65.                             {
  66.                                 // Поиск текстов всех элементов, входящих в текущий блок
  67.                                 if (!FindTextsInDrawing(app, acDoc, block)) return false;
  68.                                 break;
  69.                             }
  70.                         }

В этой части
Код - C# [Выбрать]
  1.                                 if (!FindTextsInDrawing(app, acDoc, block)) return false;
  2.                                 break;
вызывается рекурсия.

Подскажите как описать метод для вновь создаваемых объектов в блоке на основании ранее координат  существующего объекта в этом блоке?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается объект внутри блока.
« Ответ #8 : 06-04-2022, 23:33:02 »
Подскажите как описать метод для вновь создаваемых объектов в блоке на основании ранее координат  существующего объекта в этом блоке?
В как нибудь доступнее можешь объяснить что нужно?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Re: Не создается объект внутри блока.
« Ответ #9 : 07-04-2022, 17:11:01 »
Подскажите как описать метод для вновь создаваемых объектов в блоке на основании ранее координат  существующего объекта в этом блоке?
В как нибудь доступнее можешь объяснить что нужно?

К примеру:
Код - C# [Выбрать]
  1.                     else if (className == "AcDbText")
  2.                     {
  3.                         dynamic sun_Text = CallFunc((object)app, () => en.TextString);
  4.                         //string sun_Text = en.TextString;
  5.                         string pattern_Text = @"\d+,\d+";
  6.  
  7.                         string lay_object = en.Layer;
  8.  
  9.                             object MinimizeBox_MText = 0, MaximizeBox_MText = 0;
  10.                             (en as AcadEntity).GetBoundingBox(out MinimizeBox, out MaximizeBox);
  11.  
  12.                             double xMin_MText = (MinimizeBox as double[])[0];
  13.                             double yMin_MText = (MinimizeBox as double[])[1];
  14.                             double zMin_MText = (MinimizeBox as double[])[2];
  15.  
  16.                             double xMax_MText = (MaximizeBox as double[])[0];
  17.                             double yMax_MText = (MaximizeBox as double[])[1];
  18.                             double zMax_MText = (MaximizeBox as double[])[2];
  19.  
  20.                             Console.WriteLine("координаты xMin  " + xMin_MText);
  21.                             Console.WriteLine("координаты yMin  " + yMin_MText);
  22.                             Console.WriteLine("координаты zMin  " + zMin_MText);
  23.                             Console.WriteLine("координаты xMax  " + xMax_MText);
  24.                             Console.WriteLine("координаты yMax  " + yMax_MText);
  25.                             Console.WriteLine("координаты zMax  " + zMax_MText);
  26.  
  27.                      
  28.  
  29.      CrText(app, acDoc, modelSpace, xMax_MText, yMax_MText, zMax_MText);
  30.    }


При рекурсии, в блоке нашёл объект текст и значение в нем по паттерну, используя координаты найденного объекта создать объект (неважно по сути: МТекст, Текст, линию...) но уже в блоке...
Вы писали, что я создаю в модели. Я это понял.
Как описать, чтобы учитывать, что рассматриваемый объект находится в блоке?




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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается объект внутри блока.
« Ответ #10 : 07-04-2022, 17:14:04 »
Вместо modelSpace должно быть block.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Re: Не создается объект внутри блока.
« Ответ #11 : 08-04-2022, 14:55:01 »
Тогда должна быть проверка же перед тем как создавать объект или это касаемо блока или моелСпейс?
Подскажите как правильно прописать проверку ?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается объект внутри блока.
« Ответ #12 : 08-04-2022, 17:22:16 »
Тогда должна быть проверка же перед тем как создавать объект или это касаемо блока или моелСпейс?
Какая проверка? Если тебе нужно поместить объект в блок, то block, если в Пространство модели, то modelSpace.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Re: Не создается объект внутри блока.
« Ответ #13 : 11-04-2022, 14:35:53 »
ок. Спасибо.