Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: Andant от 24-10-2017, 17:00:46

Название: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Andant от 24-10-2017, 17:00:46
Как в Civil реализована работа с быстрыми ссылками? Искал, но наверное плохо...
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Александр Ривилис от 24-10-2017, 17:04:55
Нету. https://forums.autodesk.com/t5/autocad-civil-3d-customization/data-shortcut-with-api/m-p/5500667#M9954
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Дмитрий Загорулькин от 24-10-2017, 17:27:12
http://adn-cis.org/forum/index.php?topic=7812.0
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Andant от 26-10-2017, 14:42:13
Пока удалось ограничиться чтением XML файлов по задаваемому пользователем пути и созданием отчета о том, что вставлено, а что нет.
Думаю, дальше будет веселее.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Дмитрий Загорулькин от 26-10-2017, 14:53:09
Самое интересное - для функционирования уже созданных и вставленных быстрых ссылок XML совсем необязателен. Это легко проверить, например, удалив папку _Shortcuts. Связь со ссылкой при этом не потеряется. Подозреваю, что информация о местоположении ссылок хранится где-то в чертеже, но в таком месте, куда не залезть из API. Я так предполагаю, что где-то в особом разделе "Root": http://civilizeddevelopment.typepad.com/civilized-development/2011/07/is-my-drawing-a-civil-3d-drawing.html
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Александр Ривилис от 26-10-2017, 19:57:28
Вполне возможно, но сидят они в каких-то экземплярах недокументированного класса, который скорее всего и не имеет обертки на .NET
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Andant от 27-10-2017, 16:27:41
Вполне возможно, но сидят они в каких-то экземплярах недокументированного класса, который скорее всего и не имеет обертки на .NET
У напорной трубы, вставленной как БС, в Referenced By можно найти объект AeccDbRootSettingsNode.
У локальных труб такого нет. Оно?
(https://s1.postimg.org/2z1kstbcnf/shcut.jpg) (https://postimg.org/image/2z1kstbcnf/)
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Дмитрий Загорулькин от 27-10-2017, 16:33:55
Похоже. Но кроме того, что это объект такого типа, никаких других данных из него не получить.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Александр Ривилис от 27-10-2017, 16:37:40
У напорной трубы, вставленной как БС, в Referenced By можно найти объект AeccDbRootSettingsNode.
У локальных труб такого нет. Оно?
Похоже оно. Но без аналога OMF но только для Civil 3D, который Autodesk никому не даёт, к свойствам и методам не добраться.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Александр Ривилис от 27-10-2017, 20:19:43
Впрочем попробуй добраться до AeccDbRootSettingsNode не через MGDDBG, а через ARXDBG и посмотри DXF-коды - возможно там есть что-то интересное.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Дмитрий Загорулькин от 27-10-2017, 22:00:57
Впрочем попробуй добраться до AeccDbRootSettingsNode не через MGDDBG, а через ARXDBG
Я не смог найти в ARXDBG аналог ReferencedBy. Кнопка "References..." показывает только информацию, аналогичную ReferencedTo в MGDDBG.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Александр Ривилис от 28-10-2017, 00:44:29
Впрочем попробуй добраться до AeccDbRootSettingsNode не через MGDDBG, а через ARXDBG
Я не смог найти в ARXDBG аналог ReferencedBy. Кнопка "References..." показывает только информацию, аналогичную ReferencedTo в MGDDBG.
А его там и нет к сожалению. Найди метку (Handle) этого объекта при помощи MGDDBG и используй лисп в командной строке:
Код - Auto/Visual Lisp [Выбрать]
  1. (entget (handent h) '("*"))
где h - метка этого объекта (в двойных кавычках, так как это строка). Если там что-то есть в DXF, то будет видно.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Дмитрий Загорулькин от 28-10-2017, 00:50:56
Не хочет "энтгетиться":
(entget (handent "1D9") '("*"))
nil
Команда: (handent "1D9")
<Имя объекта: 7ffffb68310>
Команда: (entget (handent "1D9"))
nil
А это попытка прочитать COM-данные:
(vlax-dump-Object (vlax-ename->vla-object (handent "1D9")) T)_$

#<VLA-OBJECT IAcadObject 000000005ba13aa8>
_$

; IAcadObject: Стандартный интерфейс для базовых объектов AutoCAD.
; Значения свойств:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 000000013fda3f10>
;   Document (RO) = #<VLA-OBJECT IAcadDocument 0000000009f5e728>
;   Handle (RO) = "1D9"
;   HasExtensionDictionary (RO) = 0
;   ObjectID (RO) = 42
;   ObjectName (RO) = "AeccDbRootSettingsNode"
;   OwnerID (RO) = 43
; Поддерживаемые методы:
;   Delete ()
;   GetExtensionDictionary ()
;   GetXData (3)
;   SetXData (2)

T
_$
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Александр Ривилис от 28-10-2017, 00:53:18
У как всё запущено... Значит dxf-коды вообще не используются для этого объекта. :(
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Andant от 30-10-2017, 15:54:12
Значит dxf-коды вообще не используются для этого объекта.
0
CLASS
  1
AECC_ROOT_SETTINGS_NODE
  2
AeccDbRootSettingsNode
  3
AeccvBase70|Product Desc: AutoCAD Civil 3D |Company: Autodesk,Inc. |WEB Address: www.autodesk.com
 90
      129
 91
        1
280
     0
281
     0
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Александр Ривилис от 30-10-2017, 16:19:38
Похоже это всё-таки не оно. Не говоря уже о том, что в нём в DXF-кодах закодированы только какие-то флаги.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Andant от 31-10-2017, 15:15:48
Похоже это всё-таки не оно.
Похоже, AeccDbRootSettingsNode - тоже не ОНО:

(https://s1.postimg.org/71uc930e4b/root.jpg) (https://postimg.org/image/71uc930e4b/)

"Параметры чертежа". Вряд ли это связано с быстрыми ссылками...
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Andant от 31-10-2017, 15:21:35
Что за XRecord могут храниться в словаре {24DE2741-47F6-4298-B91B-737E814BAE3E}?

(https://s1.postimg.org/75f84mby4b/Xrec1.jpg) (https://postimg.org/image/75f84mby4b/)

(https://s1.postimg.org/3438q8bxd7/Xrec2.jpg) (https://postimg.org/image/3438q8bxd7/)
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Дмитрий Загорулькин от 31-10-2017, 15:42:03
На втором скриншоте - данные о Civil 3D: наименование, версия, код продукта.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Andant от 31-10-2017, 15:46:47
На втором скриншоте - данные о Civil 3D: наименование, версия, код продукта.
Я не нашел, что обозначает код 160. У всех записей разные значения...
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Andant от 11-07-2018, 09:21:39
Мне поставили задачу реализовать пакетную вставку быстрых ссылок. Это, в принципе, реализуемо?
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Вильдар от 31-08-2018, 12:39:10
А свойство IsReferenceObject у Civil.Entity не говорит о том, что это объект из быстрой ссылки?
Код - C# [Выбрать]
  1. namespace Autodesk.Civil.DatabaseServices
  2. {
  3.     [Wrapper("AeccDbEntity")]
  4.     public class Entity : Aec.DatabaseServices.Entity
  5.     {
  6.         protected internal Entity(IntPtr unmanagedPointer, bool autoDelete);
  7.  
  8.         public bool IsReferenceStale { get; }
  9.         public bool IsReferenceValid { get; }
  10.         public bool IsReferenceSubObject { get; }
  11.         public bool IsReferenceObject { get; }
  12.  
  13.         public override AutoCAD.DatabaseServices.ObjectId StyleId { get; set; }
  14.         public virtual string StyleName { get; set; }
  15.         public bool ShowToolTip { get; set; }
  16.         public virtual string DisplayName { get; }
  17.         public virtual string Description { get; set; }
  18.         public virtual string Name { get; set; }
  19.         public virtual object Document { get; }
  20.         public virtual object Application { get; }
  21.     }
  22. }
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Дмитрий Загорулькин от 31-08-2018, 12:57:35
А свойство IsReferenceObject у Civil.Entity не говорит о том, что это объект из быстрой ссылки?
Да, именно так. Но это позволяет определить только, что объект был вставлен быстрой ссылкой. А вот выяснить откуда он был вставлен так просто не получится.
IsReferenceStale - ссылка нуждается в обновлении (исходный файл был изменён).
IsReferenceValid - подозреваю, что показывает, найден ли исходный файл.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Вильдар от 31-08-2018, 13:03:16
Пока, первая задача связанная с быстрыми ссылками, это не изменять объекты из быстрых ссылок   :o
Все плагины написанные без учета быстрых ссылок. Выяснилось, что изменения вносятся и в объекты из быстрых ссылок. Что недопустимо.
Civil, через пользовательский интерфейс, блокирует изменения объектов быстрых ссылок. Только общие свойства примитивов менять можно: слой, цвет и т.п.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Вильдар от 31-08-2018, 13:08:18
Мне поставили задачу реализовать пакетную вставку быстрых ссылок. Это, в принципе, реализуемо?
Везде пишут, что через API это невозможно сделать.
Есть способ использовать штатные возможности с помощью автоматизации окон Windows.
Я пользуюсь библиотекой https://github.com/Roemer/FlaUI
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Дмитрий Загорулькин от 31-08-2018, 13:58:11
Все плагины написанные без учета быстрых ссылок. Выяснилось, что изменения вносятся и в объекты из быстрых ссылок. Что недопустимо.
Да, было дело, на эти грабли тоже наступали :)
Есть способ использовать штатные возможности с помощью автоматизации окон Windows.
Я пользуюсь библиотекой https://github.com/Roemer/FlaUI
И получается добраться до палитры Civil 3D "Область инструментов - Навигатор" и автоматизировать подгрузку ссылок?
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Вильдар от 31-08-2018, 14:02:12
И получается добраться до палитры Civil 3D "Область инструментов - Навигатор" и автоматизировать подгрузку ссылок?
;D нет пока.
Это общий способ, когда нет API. Например, генерацию перекрестков так делал. Запускается команда Civil и через FlaUI нажимаются контролы на окнах.
Задача по подключению быстрых ссылок есть в планах. Надеюсь получиться таким способом сделать.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Вильдар от 06-09-2018, 13:54:48
Протестировал вставку быстрых ссылок через FlaUI.

Минусы:
Попробую довести до пользователей  ::)
Код автоматизации FlaUI:
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Andant от 06-09-2018, 15:11:27
Протестировал вставку быстрых ссылок через FlaUI.
Спасибо, Вильдар!
Я тоже несколько дней бьюсь над этим.
У меня при item.RightClick() происходит исключение, что-то типа NotClickable... Но это я обошел. Главное - не смог добраться до диалога.
Теперь попробую Ваш способ. Наверное, можно еще попробовать отследить событие добавления окна...
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Вильдар от 06-09-2018, 16:57:30
Andant,
я запускаю консольный проект с FlaUI в отдельном процессе и ему передаю файл задания (в примере выше нет файла задания, там код специально для быстрых ссылок. буду переделывать в файл задания).
Думаю, что применение FlaUI из процесса акада приведет к куче ошибок. Модальное окно блокирует поток. Запуск FlaUI из другого потока тоже невозможен.
Свой вариант консольной утилиты с FlaUI могу выложить на github.
Название: Re: Как добраться до быстрых ссылок (ShortCuts)?
Отправлено: Andant от 07-09-2018, 09:42:39
Запуск FlaUI из другого потока тоже невозможен.
Мне удалось запустить процесс из Civil в отдельном потоке. Вставка прошла успешно.