Команда Hide и Isolate object

Автор Тема: Команда Hide и Isolate object  (Прочитано 15624 раз)

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

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

  • .Net Teapot
  • ADN OPEN
  • Сообщений: 49
  • Карма: 1
Команда Hide и Isolate object
« : 29-10-2016, 12:01:14 »
Коллеги, добрый день!

Курил поиск, но к сожалению так и не нашел как можно скрыть определенные объекты командой hide object или изолировать их isolate objects по handle. Может подскажете где искать?
Смысл такой, что я сканирую блоки и другие примитивы в чертеже и по определенным признакам мне надо их скрыть, как это делается обычной командой hide objects (лампочка такая внизу справа была раньше, а сейчас вроде круг, треугольник и квадрат).

Отмечено как Решение JohnLennin 30-10-2016, 09:32:16

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Команда Hide и Isolate object
« Ответ #1 : 29-10-2016, 13:01:29 »
У всех Entity есть свойство Visible - его и используйте
Код - C# [Выбрать]
  1.         List<ObjectId> hidded = new List<ObjectId>();
  2. ....
  3.           using (Transaction tr = doc.TransactionManager.StartTransaction())
  4.           {
  5.             foreach (ObjectId id in hidded)
  6.             {
  7.               try
  8.               {
  9.                 Entity obj = tr.GetObject(id, OpenMode.ForWrite, false, true) as Entity;
  10.                 if (obj != null) obj.Visible = false;
  11.               }
  12.               catch (Autodesk.AutoCAD.Runtime.Exception)
  13.               { continue; }
  14.             }
  15.             tr.Commit();
  16.           }

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

  • .Net Teapot
  • ADN OPEN
  • Сообщений: 49
  • Карма: 1
Re: Команда Hide и Isolate object
« Ответ #2 : 29-10-2016, 14:41:46 »
Спасибо за совет!
Все работает, можно скрыть и показать объекты программно.
Единственное, что в этой команде, которая справа снизу Изолировать, скрыть, показать объекты, после показать объекты скрытые объекты этим способом не отображаются. Может можно как-то вызвать именно эту команду?
Хотя и так в принципе тоже работает, но хочется сделать это как-то более стандартно, чтобы можно было без плагина затем отобразить эти объекты.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Команда Hide и Isolate object
« Ответ #3 : 29-10-2016, 15:01:55 »
Команды "которые справа внизу" (на самом деле они есть и в контекстном меню и на любую панель выносятся): Isolateobjects, HideObjects и UnIsolateObjects. Из кода можно асинхронно вызвать
Код - C# [Выбрать]
  1. doc.SendStringToExecute("_isolateobjects ", true, false, true);
  2.  
Пробельчик в конце строки не забудте (который в автокаде эквивалентен Enter)

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Команда Hide и Isolate object
« Ответ #4 : 29-10-2016, 15:05:24 »
ну и конечно перед вызовом команды объекты надо выбрать
Код - C# [Выбрать]
  1.         List<ObjectId> objs = new List<ObjectId>();
  2.         .....
  3.         doc.Editor.SetImpliedSelection(objs.ToArray());
  4.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Команда Hide и Isolate object
« Ответ #5 : 29-10-2016, 16:24:54 »
К сожалению публичного API (ни в ObjectARX, ни AutoCAD .NET API) для HideObjects и IsolateObjects нет - я обращался в ADN DevHelp по этому поводу. Так что или использовать свойство Visible, или командные методы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Команда Hide и Isolate object
« Ответ #6 : 29-10-2016, 16:53:19 »
Тот редкий случай когда я соглашусь с разработчиками API - нет и не надо. Параллельный способ скрытия объектов был бы избыточен и только все запутал. А вот, то что UnIsolateObjects не включает Visible - это уже недоработочка. Зачем эти 3 команды работают как-то по хитрому, в обход публичных свойств? (вопрос чисто риторический, не критично ж)

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Команда Hide и Isolate object
« Ответ #7 : 28-04-2020, 08:46:49 »
Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// Изолируем выбранный объект
  3.     /// </summary>
  4.     [Rtm.CommandMethod("IObj2")]
  5.     public void IObj2()
  6.     {
  7.  
  8.       App.Document mdiActiveDocument = App.Application.DocumentManager.MdiActiveDocument;
  9.       if (mdiActiveDocument == null) return;
  10.  
  11.       Db.Database database = mdiActiveDocument.Database;
  12.       Ed.Editor editor = mdiActiveDocument.Editor;
  13.  
  14.       Ed.PromptEntityOptions opt = new Ed.PromptEntityOptions("\nSelect obj:");
  15.       opt.AllowNone = false;
  16.       Ed.PromptEntityResult res = editor.GetEntity(opt);
  17.       if (res.Status != Ed.PromptStatus.OK) return;
  18.  
  19.       using (Db.Entity ent = res.ObjectId.Open(Db.OpenMode.ForWrite) as Db.Entity)
  20.       {
  21.         ent.Visible = false;
  22.       }
  23.  
  24.  
  25.       string AppName = "AEC_ISOLATED_OBJECTS";
  26.       using (Db.DBDictionary dBDictionary = database.NamedObjectsDictionaryId.Open(Db.OpenMode.ForRead) as Db.DBDictionary)
  27.       {
  28.         if (dBDictionary.Contains(AppName))
  29.         {
  30.           Db.ObjectId IsolateDicId = (Db.ObjectId)dBDictionary[AppName];
  31.  
  32.           using (Db.DBDictionary IsolateDic = IsolateDicId.Open(Db.OpenMode.ForWrite) as Db.DBDictionary)
  33.           {
  34.             foreach (Db.DBDictionaryEntry id in IsolateDic)
  35.             {
  36.               using (Db.Xrecord xrec = id.Value.Open(Db.OpenMode.ForWrite) as Db.Xrecord)
  37.               {
  38.                 Db.ResultBuffer buffNew = new Db.ResultBuffer();
  39.                 Db.TypedValue[] typedValues = xrec.Data.AsArray();
  40.  
  41.                 bool isNotEmpty = true;
  42.  
  43.                 if(typedValues.Length == 1)
  44.                 {
  45.                   if(Convert.ToInt32(typedValues[0].TypeCode) == Convert.ToInt32 (Db.DxfCode.Int16))
  46.                   {
  47.                     if ((short)typedValues[0].Value == (short)-1)
  48.                     {
  49.                       isNotEmpty = false;
  50.                     }
  51.                   }
  52.                 }
  53.  
  54.  
  55.                 if (isNotEmpty)
  56.                 {
  57.                   foreach (Db.TypedValue tv in typedValues)
  58.                     buffNew.Add(tv);
  59.                 }
  60.  
  61.  
  62.                 buffNew.Add(new Db.TypedValue(Convert.ToInt32(Db.DxfCode.HardPointerId), res.ObjectId));
  63.                 xrec.Data = buffNew;
  64.  
  65.               }
  66.             }
  67.           }
  68.         }
  69.       }
  70.     }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Команда Hide и Isolate object
« Ответ #8 : 28-04-2020, 19:15:31 »
Владимир Шу,
Я посмотрел в AutoCAD 2021. Там нет словаря AEC_ISOLATED_OBJECTS.
Есть другой, но в нём не хранится информация о "спрятанных" примитивах:



И всё намного проще. Команды HIDEOBJECTS и ISOLATEOBJECTS просто устанавливают свойство Visible в false, а UNISOLATEOBJECTS возвращает это свойство в true.
В какой версии это изменили - сейчас уже и не скажу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Команда Hide и Isolate object
« Ответ #9 : 29-04-2020, 07:54:49 »
Александр Ривилис, я тестировал на 2017 версии, хотя не на чистом, а AEC в режиме автокада.
И я в каких то файлах у себя видел ACAD_OBJECTISOLATION, но туда ничего не добавлялось, а вот в NOD AEC_ISOLATED_OBJECTS, который был в этом же файле и в него объекты добавлялись.

На картинке видно, что изолировано 3 кружка...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Команда Hide и Isolate object
« Ответ #10 : 29-04-2020, 11:18:30 »
В 2017-ом проверить не могу, а вот в 2018-ом у меня ни один ни другой словарь не создаются. В 2020-ом один раз словарь AEC_ISOLATED_OBJECTS создался, но в нём XRECORD  не содержал Hardpointer's. Так что к сожалению это ненадежный метод.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Команда Hide и Isolate object
« Ответ #11 : 29-04-2020, 11:34:25 »
Так что к сожалению это ненадежный метод.
Видимо что то действительно после 2017 поменяли... вечером попробую еще на 2019 посмотреть... Любопытно еще бы и на 2014-2016 посмотреть... но видимо я попал на какую то переходную модель.