Определение крайних точек и удаление части чертежа

Автор Тема: Определение крайних точек и удаление части чертежа  (Прочитано 9674 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Доброго дня всем.
Прошу помощи форумчане в таком вопросе...
Есть стандартный чертеж.
Необходимо удалить крайний штамп.
Сразу скажу что делаю с interop :-\
Это начальный вариант.


Так должен выглядеть после обрезки.


Пытаюсь решить задачу в следующей последовательности:
1. Начал с перебора всех объектов  и тут возникла проблемка...
                    для определения координат использовал 
Код - C# [Выбрать]
  1. GetBoundingBox
, (для мультитекста и примитивов типа отрезок и полилиния работает) но методом пробИошибок выяснил, что для простого текста не подходит, что можно применить? Для определения координат блока что можно использовать?
3. Нашёл максимальное значение по Х_max (для мультитекста, отрезков и полилиний нашёл);
4. Далее от найденого значения нужно удалить все объекты имеющие координату по X <= Х_max - 80.

Прошу помощи с подходом для определения координат для объектов типа AcadEntity.
Спасибо.







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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В COM/ActiveX ничего другого кроме GetBoundingBox нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Посмотрел первую картинку и возник вопрос, а где Вы применяете данный вариант оформления чертежа? Правая часть она после сворачивания загибается что-ли?

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Посмотрел первую картинку и возник вопрос, а где Вы применяете данный вариант оформления чертежа? Правая часть она после сворачивания загибается что-ли?
Отрывается после сдачи.
В COM/ActiveX ничего другого кроме GetBoundingBox нет.
Спасибо.  Александр, а на Ваш взгляд в чём может быть проблема?

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

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

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Приведённые выше скрины.
Нужно удалить справа часть чертежа.
На той части чертежа помимо примитивов (отрезков, полилиний и т.д.) есть текстовые объекты.
К примеру среди
Код - C# [Выбрать]
  1.                     else if (className == "AcDbLine")
  2.  
  3.                     {
  4.                         (en as AcadEntity).GetBoundingBox(out MinimizeBox, out MaximizeBox);
  5.                         double xMin = (MinimizeBox as double[])[0];
  6.                         double yMin = (MinimizeBox as double[])[1];
  7.                         double zMin = (MinimizeBox as double[])[2];
  8.  
  9.                         double xMax = (MaximizeBox as double[])[0];
  10.                         double yMax = (MaximizeBox as double[])[1];
  11.                         double zMax = (MaximizeBox as double[])[2];
  12.  
  13.                        max_x=mas.Add(xMax);
  14.  
  15.                     }
Тоже самое работает с мультитекстом
Код - C# [Выбрать]
  1.                     if (className == "AcDbMText")
  2.                     {
  3.                         (en as AcadEntity).GetBoundingBox(out MinimizeBox, out MaximizeBox);
  4.                        
  5.                        
  6.                         //yy++;
  7.                        // Console.WriteLine("текстовый объект  " + yy);
  8.  
  9.                     }


С простым текстом стопает програму.
Код - C# [Выбрать]
  1.                    if (className == "AcDbText")
  2.                     {
  3.                         (en as AcadEntity).GetBoundingBox(out MinimizeBox, out MaximizeBox);
  4.  
  5.  
  6.                     }


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

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

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Просто ничего не происходит... Висит програмка.
Хм...сейчас на работе запустил...всё работает... ???
На работе лицензия, дома - крякнутая. Может из-за этого...
Спасибо Александр. Если что в теме буду писать.

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
С простым текстом стопает програму.
Переведи.
Александр, пытаюсь удалить определенные объекты. На чертеже их около 75 штук, часть удаляется, часть - нет.
В консоли вылетает ошибка
Загружено "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_ru_b77a5c561934e089\mscorlib.resources.dll". Сборка модуля выполнена без символов.
Вызвано исключение: "System.Runtime.InteropServices.COMException" в System.Dynamic.dll

Вот так пытаюсь выполнить удаление.
Код - C# [Выбрать]
  1.                     else if (className == "AcDbText")
  2.                     {
  3.                             object MinimizeBox = 0, MaximizeBox = 0;
  4.                             (en as AcadEntity).GetBoundingBox(out MinimizeBox, out MaximizeBox);
  5.  
  6.                             double xMin = (MinimizeBox as double[])[0];
  7.                             double yMin = (MinimizeBox as double[])[1];
  8.                             double zMin = (MinimizeBox as double[])[2];
  9.  
  10.                             double xMax = (MaximizeBox as double[])[0];
  11.                             double yMax = (MaximizeBox as double[])[1];
  12.                             double zMax = (MaximizeBox as double[])[2];
  13.  
  14.                         _text++;
  15.                         Console.WriteLine("текст   " +_text);
  16.                             en.Erase();
  17.                      
  18.                     }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
marsh_one,
Почему Erase, а не Delete?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
На работе лицензия, дома - крякнутая. Может из-за этого...
У нас эти вопросы не обсуждаются!

Понял. Извиняюсь.

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
marsh_one,
Почему Erase, а не Delete?
попробовал. Спасибо. А в чём отличие?
Код - C# [Выбрать]
  1. en.Delete();
Не знал.
Александр, подскажите , а к
Код - C# [Выбрать]
  1. AcadEntity
не относятся блоки? Что ещё не относится к
Код - C# [Выбрать]
  1. AcadEntity
, размер?
Как корректно написать условие, чтобы брать координаты каждого объекта в
Код - C# [Выбрать]
  1. modelSpace
.
Пытаюсь сделать перебор и у каждого взять координаты
Код - C# [Выбрать]
  1.         private bool FindTextsInDrawing(dynamic app, dynamic acDoc, dynamic modelSpace)
  2.         {
  3.             int poly_line=0;
  4.             int _mtext=0;
  5.             int _text=0;
  6.             int _line=1;
  7.             object MinimizeBox = 0, MaximizeBox = 0;
  8.             try
  9.             {
  10.                 dynamic count = CallFunc((object)app, () => modelSpace.Count);
  11.  
  12.                 for (int i = 0; i < (int)count; i++)
  13.                 {
  14.  
  15.  
  16.                     dynamic en = CallFunc((object)app, () => modelSpace.Item(i));
  17.                     dynamic className = CallFunc((object)app, () => en.ObjectName);
  18.  
  19.                        (en as AcadEntity).GetBoundingBox(out MinimizeBox, out MaximizeBox);
  20.  
  21.                         double xMin = (MinimizeBox as double[])[0];
  22.                         double yMin = (MinimizeBox as double[])[1];
  23.                         double zMin = (MinimizeBox as double[])[2];
  24.  
  25.                         double xMax = (MaximizeBox as double[])[0];
  26.                         double yMax = (MaximizeBox as double[])[1];
  27.                         double zMax = (MaximizeBox as double[])[2];
  28.  
  29.                     //en.Delete();
  30.                  
  31.                 }
  32.                 return true;
  33.             }
  34.             catch (System.Exception)
  35.             {
  36.                 // WriteErrorMsg(ex, ConsoleColor.Red);
  37.                 //  if (acDoc != null)
  38.                 //     DoAction((object)app, () => acDoc.Close(false));
  39.                 // if (app != null)
  40.                 //           DoAction((object)app, () => app.Quit());
  41.                 return false;
  42.             };

Всего на чертеже 354 объекта в том числе и блоков, повернутые размеры, штриховки и т.д.
По выполнению вышеприведённого скрипта вижу только 278.





Отмечено как Решение marsh_one 30-03-2022, 10:14:08

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
marsh_one,
Почему Erase, а не Delete?
попробовал. Спасибо. А в чём отличие?
Код - C# [Выбрать]
en.Delete();
Не знал.
Наверное нужно документацию читать, где сказано, что Erase применимо к SelectionSet, а Delete ко всем объектам чертежа (AcadObject, AcadEntity и т.д.)
Александр, подскажите , а к
Код - C# [Выбрать]
AcadEntity
не относятся блоки? Что ещё не относится к
Код - C# [Выбрать]
AcadEntity
, размер?
Если ты про вставки блоков, то конечно же относятся. И вообще всё что есть в modelspace относится к AcadEntity.

В твоём коде ты рубишь сук, на котором сидишь, т.е. в цикле по всем объектам modelspace удаляешь элементы принадлежащие modelspace. Так делать нельзя. Или как минимум ты должен цикл из
Код - C# [Выбрать]
  1. for (int i = 0; i < (int)count; i++)
переписать в 
Код - C# [Выбрать]
  1. for (int i = (int)count-1; i >= 0; i--)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 44
  • Карма: 0
Понял. Спасибо огромное! Буду пробовать.