Как добраться до быстрых ссылок (ShortCuts)?

Автор Тема: Как добраться до быстрых ссылок (ShortCuts)?  (Прочитано 10468 раз)

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

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

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Как в Civil реализована работа с быстрыми ссылками? Искал, но наверное плохо...

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

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


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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Пока удалось ограничиться чтением XML файлов по задаваемому пользователем пути и созданием отчета о том, что вставлено, а что нет.
Думаю, дальше будет веселее.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Самое интересное - для функционирования уже созданных и вставленных быстрых ссылок XML совсем необязателен. Это легко проверить, например, удалив папку _Shortcuts. Связь со ссылкой при этом не потеряется. Подозреваю, что информация о местоположении ссылок хранится где-то в чертеже, но в таком месте, куда не залезть из API. Я так предполагаю, что где-то в особом разделе "Root": http://civilizeddevelopment.typepad.com/civilized-development/2011/07/is-my-drawing-a-civil-3d-drawing.html

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

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

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Вполне возможно, но сидят они в каких-то экземплярах недокументированного класса, который скорее всего и не имеет обертки на .NET
У напорной трубы, вставленной как БС, в Referenced By можно найти объект AeccDbRootSettingsNode.
У локальных труб такого нет. Оно?


Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Похоже. Но кроме того, что это объект такого типа, никаких других данных из него не получить.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
У напорной трубы, вставленной как БС, в Referenced By можно найти объект AeccDbRootSettingsNode.
У локальных труб такого нет. Оно?
Похоже оно. Но без аналога OMF но только для Civil 3D, который Autodesk никому не даёт, к свойствам и методам не добраться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Впрочем попробуй добраться до AeccDbRootSettingsNode не через MGDDBG, а через ARXDBG и посмотри DXF-коды - возможно там есть что-то интересное.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Впрочем попробуй добраться до AeccDbRootSettingsNode не через MGDDBG, а через ARXDBG
Я не смог найти в ARXDBG аналог ReferencedBy. Кнопка "References..." показывает только информацию, аналогичную ReferencedTo в MGDDBG.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Впрочем попробуй добраться до AeccDbRootSettingsNode не через MGDDBG, а через ARXDBG
Я не смог найти в ARXDBG аналог ReferencedBy. Кнопка "References..." показывает только информацию, аналогичную ReferencedTo в MGDDBG.
А его там и нет к сожалению. Найди метку (Handle) этого объекта при помощи MGDDBG и используй лисп в командной строке:
Код - Auto/Visual Lisp [Выбрать]
  1. (entget (handent h) '("*"))
где h - метка этого объекта (в двойных кавычках, так как это строка). Если там что-то есть в DXF, то будет видно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Не хочет "энтгетиться":
(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
_$

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
У как всё запущено... Значит dxf-коды вообще не используются для этого объекта. :(
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Значит 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

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

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

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Похоже это всё-таки не оно.
Похоже, AeccDbRootSettingsNode - тоже не ОНО:



"Параметры чертежа". Вряд ли это связано с быстрыми ссылками...

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Что за XRecord могут храниться в словаре {24DE2741-47F6-4298-B91B-737E814BAE3E}?





Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
На втором скриншоте - данные о Civil 3D: наименование, версия, код продукта.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
На втором скриншоте - данные о Civil 3D: наименование, версия, код продукта.
Я не нашел, что обозначает код 160. У всех записей разные значения...

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Мне поставили задачу реализовать пакетную вставку быстрых ссылок. Это, в принципе, реализуемо?
« Последнее редактирование: 11-07-2018, 14:41:21 от Andant »

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

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
А свойство 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. }

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А свойство IsReferenceObject у Civil.Entity не говорит о том, что это объект из быстрой ссылки?
Да, именно так. Но это позволяет определить только, что объект был вставлен быстрой ссылкой. А вот выяснить откуда он был вставлен так просто не получится.
IsReferenceStale - ссылка нуждается в обновлении (исходный файл был изменён).
IsReferenceValid - подозреваю, что показывает, найден ли исходный файл.

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

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Пока, первая задача связанная с быстрыми ссылками, это не изменять объекты из быстрых ссылок   :o
Все плагины написанные без учета быстрых ссылок. Выяснилось, что изменения вносятся и в объекты из быстрых ссылок. Что недопустимо.
Civil, через пользовательский интерфейс, блокирует изменения объектов быстрых ссылок. Только общие свойства примитивов менять можно: слой, цвет и т.п.

Отмечено как Решение Andant 07-09-2018, 17:21:33

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

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Мне поставили задачу реализовать пакетную вставку быстрых ссылок. Это, в принципе, реализуемо?
Везде пишут, что через API это невозможно сделать.
Есть способ использовать штатные возможности с помощью автоматизации окон Windows.
Я пользуюсь библиотекой https://github.com/Roemer/FlaUI

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Все плагины написанные без учета быстрых ссылок. Выяснилось, что изменения вносятся и в объекты из быстрых ссылок. Что недопустимо.
Да, было дело, на эти грабли тоже наступали :)
Есть способ использовать штатные возможности с помощью автоматизации окон Windows.
Я пользуюсь библиотекой https://github.com/Roemer/FlaUI
И получается добраться до палитры Civil 3D "Область инструментов - Навигатор" и автоматизировать подгрузку ссылок?

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

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
И получается добраться до палитры Civil 3D "Область инструментов - Навигатор" и автоматизировать подгрузку ссылок?
;D нет пока.
Это общий способ, когда нет API. Например, генерацию перекрестков так делал. Запускается команда Civil и через FlaUI нажимаются контролы на окнах.
Задача по подключению быстрых ссылок есть в планах. Надеюсь получиться таким способом сделать.

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

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Протестировал вставку быстрых ссылок через FlaUI.

Минусы:
  • Должна быть открыта палитра "Область инструментов" на вкладке "Навигатор". Переключать вкладки, через FlaUI пока не умею.
  • Нельзя трогать мышку
  • Есть задержки после вставки ссылки. Пока непонятно, как их учесть.
Попробую довести до пользователей  ::)
Код автоматизации FlaUI:
Извините, вам запрещён просмотр содержимого спойлеров.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Протестировал вставку быстрых ссылок через FlaUI.
Спасибо, Вильдар!
Я тоже несколько дней бьюсь над этим.
У меня при item.RightClick() происходит исключение, что-то типа NotClickable... Но это я обошел. Главное - не смог добраться до диалога.
Теперь попробую Ваш способ. Наверное, можно еще попробовать отследить событие добавления окна...
« Последнее редактирование: 06-09-2018, 15:47:36 от Andant »

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

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Andant,
я запускаю консольный проект с FlaUI в отдельном процессе и ему передаю файл задания (в примере выше нет файла задания, там код специально для быстрых ссылок. буду переделывать в файл задания).
Думаю, что применение FlaUI из процесса акада приведет к куче ошибок. Модальное окно блокирует поток. Запуск FlaUI из другого потока тоже невозможен.
Свой вариант консольной утилиты с FlaUI могу выложить на github.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Запуск FlaUI из другого потока тоже невозможен.
Мне удалось запустить процесс из Civil в отдельном потоке. Вставка прошла успешно.