Аналог команды _boundary.

Автор Тема: Аналог команды _boundary.  (Прочитано 4782 раз)

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

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Re: Аналог команды _boundary.
« Ответ #15 : 28-06-2019, 16:01:47 »
Paravozzz, прошёл год с публикации Вашего топика. Как продвинулась работа по созданию метода? Есть ли позитивные подвижки? Какова стабильность в работе? Интересует любая информация...
Debalance, с момента публикации топика работа не двигалась. Это хобби-проект, направленный на облегчение рутины по подсчету объемов. На данный момент приму алгоритм, предложенный Николаем.

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 390
  • Карма: 10
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Аналог команды _boundary.
« Ответ #16 : 28-06-2019, 16:06:26 »
... работа не двигалась.
Всё понял. Спасибо.

Оффлайн Алексей (IdeaSoft)

  • ADN
  • *
  • Сообщений: 1134
  • Карма: 5
    • idea-soft.ru
  • Skype: makar_govorun
Re: Аналог команды _boundary.
« Ответ #17 : 27-07-2020, 13:23:53 »
А как сделать эту команду с помощью NET API?
для моего ограниченного перечня примитивов
Хочу вот типа такой функции (как некий частный случай)

Код - C# [Выбрать]
  1. // RectExt -  объект внешнего прямоугольника
  2. // ents - массив объектов внутри прямоугольника RectExt
  3. // Обязательное условие в том, что перечень ents мне заведомо известен и все
  4. // они находятся внутри этого прямоугольника
  5. public poliline myBound(polyline RectExt, Entity[] ents)
  6. {
  7.    polylie pl;
  8.    // Есть тут какой метод вызвать в API?
  9.   // pl = ......
  10.   return pl;
  11.  
  12. }

Оффлайн Алексей (IdeaSoft)

  • ADN
  • *
  • Сообщений: 1134
  • Карма: 5
    • idea-soft.ru
  • Skype: makar_govorun
Re: Аналог команды _boundary.
« Ответ #18 : 27-07-2020, 13:52:07 »
Я обратил внимание на метод TraceBoundary

Код - C# [Выбрать]
  1. PromptPointResult ptResult = ed.GetPoint(ptOptions);
  2. DBObjectCollection collection =
  3.                    ed.TraceBoundary(ptResult.Value, true);

Но только как мне заставить сканировать
не всю модель, а передать нужный
мне перечень элементов?



Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 230
  • Карма: 32
Re: Аналог команды _boundary.
« Ответ #19 : 27-07-2020, 15:42:51 »
что для TraceBoundary для .NET, что для acedTraceBoundary для ObjectARX... контур создается при условии, что точка и примитивы, участвующие в работе полностью видимы на экране.
не пробовал, то может сработать... попробуй спрятать все примитивы, которые не попали в Entity[] ents. да, нужен полный пробег по базе, с проверкой вхождения текущего объекта в ents (хотя проще с AcDbObjectId) 
если объяснить на пальцах, то в ObjectARX это может выглядеть так:
Код - C++ [Выбрать]
  1. ...
  2. // перебор всех объектов чертежа (ну или листа, если в нем команда будет работать)
  3. if (!entIds.contains(curId))
  4. {
  5.    открыть AcDbEntity по curId для записи
  6.    AcDbEntity::setVisibility(AcDb::kInvisible);
  7.    AcDbEntity::recordGraphicsModified(Adesk::kTrue); // может будет работать и без этого
  8.    AcDbEntity::close();
  9.    сохранить curId в массив
  10. }
  11.  
  12. тут делаем границу
  13.  
  14. for (int i = 0; i < длинна массива спрятанных элементов; i++)
  15. {
  16.     открыть AcDbEntity по ID[i] для записи
  17.     AcDbEntity::setVisibility(AcDb::kVisible);
  18.     AcDbEntity::recordGraphicsModified(Adesk::kTrue); // может будет работать и без этого
  19.     AcDbEntity::close();
  20. }
  21. ...
  22.  

Оффлайн Алексей (IdeaSoft)

  • ADN
  • *
  • Сообщений: 1134
  • Карма: 5
    • idea-soft.ru
  • Skype: makar_govorun
Re: Аналог команды _boundary.
« Ответ #20 : 27-07-2020, 16:05:19 »
спрятать все примитивы
Спрятать не совсем хороший метод. Бывает такие большие чертежи по 800 тысяч элементов.
А мне нужно всего то из этого несколько десятков элементов.
Алгоритм прятать их будет долго. И с точки зрения "юзабилити" это не совсем красиво.

Оффлайн Алексей (IdeaSoft)

  • ADN
  • *
  • Сообщений: 1134
  • Карма: 5
    • idea-soft.ru
  • Skype: makar_govorun
Re: Аналог команды _boundary.
« Ответ #21 : 27-07-2020, 16:07:37 »
Единственное сто пока приходит на ум это в
рантайме сгенерить новый документ. Но генерация нового документа это тоже
не красиво с точки зрения юзабилити (кому нужны эти мелькания на экране)

Оффлайн Алексей (IdeaSoft)

  • ADN
  • *
  • Сообщений: 1134
  • Карма: 5
    • idea-soft.ru
  • Skype: makar_govorun
Re: Аналог команды _boundary.
« Ответ #22 : 27-07-2020, 16:11:25 »
Попробовал сделать через

Код - C# [Выбрать]
  1. Editor ed = doc.Editor;
  2. ObjectI[] ids = ...
  3. ed.SetImpliedSelection(ids);
  4. ed.TraceBoundary(...)

Но все равно TraceBoundary отработал по полному перечню объектов модели.

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 230
  • Карма: 32
Re: Аналог команды _boundary.
« Ответ #23 : 28-07-2020, 10:19:34 »
Ну хорошо, если прятать остальные объекты долго, можно ж клацнуть точку, потом перенести необходимые объекты куда-то за область чертежа (короче, за границы min или мах Extents), пересчитать точку, отзумироваться на объекты, получить свой новый контур, а потом всё это вернуть в исходные координаты (если пользователь моргнет в это время, то он даже не заметит мельтишения на экране :) ) и выставить предыдущую область видимости.