Перенос стилей из внешнего *.DWG файла.

Автор Тема: Перенос стилей из внешнего *.DWG файла.  (Прочитано 8056 раз)

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

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

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Решаю задачу переноса стилей объектов Civil (поверхности, трассы, профили, трубы и т.д.). Использую метод CloningHelper.Clone().  Перенос осуществляется, но не удается решить проблему одинаковых имен. Вроде бы CloningHelper.MergeType позволяет выбрать нужный режим - игнорировать, заменить, переименовать.  Но на практике, ни замена, ни переименование не происходят.  Только добавление новых стилей с уникальными именами. Может, кто - нибудь уже сталкивался с данной проблемой?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Использую метод CloningHelper.Clone()
А что это за метод? Я такой не нашёл в SDK.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Да, поиск рулит, уже нашёл. Вроде как, метод как раз для такой ситуации и должен работать корректно. Если установка режима не работает - то это, скорее всего, баг в его реализации.

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Согласен, но не полностью. Метод же всё-таки работает, но  не так, как ожидается. Разработан он как раз для вертикальных продуктов, так что, по-хорошему, должен и с Civil дружить. Но это если была предусмотрена универсальность. А этого могло и не быть, Вы правы.
Ну и поиском по Civil 3D .NET Reference я не нашёл подходящих инструментов. Возможно, что как раз-таки и подразумевается использование этого метода. Наверное, надо в DevHelp спрашивать.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Посмотрел, где хранятся стили в Civil. Древовидная структура. 
Если подниматься вверх от стиля, то на 4 уровне упираемся в NamedObjectDictionary (Dictionary C):


Странно, что хоть что-то добавляется...

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Скорее всего, придется сравнивать имена стилей, удалять перезаписываемые, при необходимости переименовывать. И только после этого клонировать... 

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Если подниматься вверх от стиля, то на 4 уровне упираемся NamedObjectDictionary
А что странного? Наоборот, довольно логично. Только жаль, что хранятся эти данные в недоступном для API виде.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Только жаль, что хранятся эти данные в недоступном для API виде
Можно через референсы добраться. Handle 242 - это узел Root. У него можно найти AeccDbTreeNode (handle 33C), который уже содержит ссылки на все стили:



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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Так ведь стили можно гораздо проще получить ;) Но тоже интересный вариант.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Так ведь стили можно гораздо проще получить
Боюсь, что если дело дойдет до "ручного" контроля имен стилей с удалением и переименованием, то для напорных сетей опять понадобятся "танцы с бубном"...:)

Отмечено как Решение Andant 28-11-2017, 15:10:25

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Ну и поиском по Civil 3D .NET Reference я не нашёл подходящих инструментов
И все-таки есть такая партия! Статический метод StyleBase.ExportTo() успешно справился с задачей. И даже производит замену стиля для всех уже имеющихся в базе объектов!

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Эвона как! Мои поздравления! Значит, я плохо искал :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Эвона как! Мои поздравления! Значит, я плохо искал :)
Не. Это ранний склероз называется. :-) Три года назад ты сам этот метод рекомендовал: http://adn-cis.org/forum/index.php?topic=731.msg2830#msg2830
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Это ранний склероз называется.
Как-то это неожиданно :o. Я надеялся, что это попозже случится...
У меня просто в этот раз помутнение случилось (тоже, кстати, ничуть не лучше склероза) и я стал искать в документации по слову "Import", а надо было "Export". Но! У меня есть оправдание! Очень загружен работой, вот :)


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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Попробовал экспортировать списки элементов (PartsList). Они тоже наследуются от StyleBase. Для напорных трубопроводов получилось. Для безнапорных списки получаются пустыми.
Как корректно перенести семейства и типоразмеры?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Может их просто программно создать?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Списки элементов безнапорной сети даже с помощью стандартных команд экспорта-импорта стилей не переносятся. Приходится делать драг-дропом между параметрами чертежей. Так что, могу допустить, что и в API нет нормального инструмента для их переноса. Вот интересно, какой механизм используется при драг-дропе? Возможно, что получится с помощью клонирования объектов между БД через AutoCAD API.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
"Не выходит каменный цветок..."
Клонированием удалось кое-что перенести, но не все и не туда...
Если применять WblockClone, то новые списки полностью уничтожают имеющиеся  (через некоторое время Standard самовозрождается, как птица Феникс :) ). 
Наиболее приемлемый вариант - применение CloningHelper. Все работает, пока не встречаются одинаковые имена. При перезаписи получаем гибрид старого и нового. При переименовании - пустой переименованный список и гибрид под старым именем.
Пробовал добавлять семейства в новые списки "вручную", но получил исключение - "It's not a valid part family guid for the current active catalog." В обеих базах прописаны одинаковые пути к каталогу.
Чего еще не хватает?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Пробовал добавлять семейства в новые списки "вручную", но получил исключение - "It's not a valid part family guid for the current active catalog." В обеих базах прописаны одинаковые пути к каталогу.
Это как? Путь к каталогу задаётся на уровне приложения и не сохраняется в БД чертежа. Вполне может быть так, что списки элементов содержат ссылки на семейства, которых нет в каталоге. Возможно потому и возникает это исключение?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А семейства колодцев в списке элементов обрабатывается? Если да, то надо не забыть сделать особую обработку нулевых колодцев - возможно, что на них спотыкается программа.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
А семейства колодцев в списке элементов обрабатывается? Если да, то надо не забыть сделать особую обработку нулевых колодцев - возможно, что на них спотыкается программа.
Спасибо, Дмитрий! Почти получилось. Самым сложным оказалось немного приблизиться к пониманию того, как это все устроено :) . Проверка показала, что в моем случае очень многие семейства в каталоге были отредактированы после вставки списков в исходный чертеж (кстати, при драг-дропе все перетаскивается без проверки валидности).
Осталось "побороть" нулевые колодцы. При копировании списков методом StyleBase.ExportTo() получаем совсем пустые списки, даже без Null Structure. Их можно как-нибудь добавить "вручную"?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Честно говоря, не знаю. Я программно списки элементов не редактировал, только читал из них данные. Я даже не знал до этого момента, что может существовать список без нулевого колодца. Если вручную создать пустой список, то он в нём уже будет. AUDIT чертежа не ругается на такие списки? Аки феникс нулевой колодец не появляется? :)