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

ADN Club => Civil 3D API => Тема начата: Andant от 27-11-2017, 15:22:16

Название: Перенос стилей из внешнего *.DWG файла.
Отправлено: Andant от 27-11-2017, 15:22:16
Решаю задачу переноса стилей объектов Civil (поверхности, трассы, профили, трубы и т.д.). Использую метод CloningHelper.Clone().  Перенос осуществляется, но не удается решить проблему одинаковых имен. Вроде бы CloningHelper.MergeType позволяет выбрать нужный режим - игнорировать, заменить, переименовать.  Но на практике, ни замена, ни переименование не происходят.  Только добавление новых стилей с уникальными именами. Может, кто - нибудь уже сталкивался с данной проблемой?
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 27-11-2017, 15:28:31
Использую метод CloningHelper.Clone()
А что это за метод? Я такой не нашёл в SDK.
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Andant от 27-11-2017, 15:33:49
Autodesk.Aec.ApplicationServices.Utility.CloningHelper
http://adndevblog.typepad.com/aec/2012/08/importexport-styles-fromto-another-drawing-in-net-.html
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 27-11-2017, 15:34:58
Да, поиск рулит, уже нашёл. Вроде как, метод как раз для такой ситуации и должен работать корректно. Если установка режима не работает - то это, скорее всего, баг в его реализации.
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Александр Ривилис от 27-11-2017, 16:20:58
Да, поиск рулит, уже нашёл. Вроде как, метод как раз для такой ситуации и должен работать корректно. Если установка режима не работает - то это, скорее всего, баг в его реализации.
Вообще-то, как указано в статье, этот метод для ACA и MEP. Так что не обязательно, что он работает корректно в Civil 3D.
Кроме того нужно убедиться, что одноименные стили не открыты в этот момент.
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 27-11-2017, 16:36:04
Согласен, но не полностью. Метод же всё-таки работает, но  не так, как ожидается. Разработан он как раз для вертикальных продуктов, так что, по-хорошему, должен и с Civil дружить. Но это если была предусмотрена универсальность. А этого могло и не быть, Вы правы.
Ну и поиском по Civil 3D .NET Reference я не нашёл подходящих инструментов. Возможно, что как раз-таки и подразумевается использование этого метода. Наверное, надо в DevHelp спрашивать.
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Andant от 27-11-2017, 16:45:18
Посмотрел, где хранятся стили в Civil. Древовидная структура. 
Если подниматься вверх от стиля, то на 4 уровне упираемся в NamedObjectDictionary (Dictionary C):
(https://s18.postimg.org/3z9jxm1sl/tree.jpg) (https://postimg.org/image/3z9jxm1sl/)

Странно, что хоть что-то добавляется...
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Andant от 27-11-2017, 16:50:35
Скорее всего, придется сравнивать имена стилей, удалять перезаписываемые, при необходимости переименовывать. И только после этого клонировать... 
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 27-11-2017, 16:53:53
Если подниматься вверх от стиля, то на 4 уровне упираемся NamedObjectDictionary
А что странного? Наоборот, довольно логично. Только жаль, что хранятся эти данные в недоступном для API виде.
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Andant от 27-11-2017, 17:36:35
Только жаль, что хранятся эти данные в недоступном для API виде
Можно через референсы добраться. Handle 242 - это узел Root. У него можно найти AeccDbTreeNode (handle 33C), который уже содержит ссылки на все стили:

(https://s18.postimg.org/qljgo04vp/33_C.jpg) (https://postimg.org/image/qljgo04vp/)
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 27-11-2017, 18:09:50
Так ведь стили можно гораздо проще получить ;) Но тоже интересный вариант.
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Andant от 28-11-2017, 09:20:10
Так ведь стили можно гораздо проще получить
Боюсь, что если дело дойдет до "ручного" контроля имен стилей с удалением и переименованием, то для напорных сетей опять понадобятся "танцы с бубном"...:)
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Andant от 28-11-2017, 15:10:19
Ну и поиском по Civil 3D .NET Reference я не нашёл подходящих инструментов
И все-таки есть такая партия! Статический метод StyleBase.ExportTo() успешно справился с задачей. И даже производит замену стиля для всех уже имеющихся в базе объектов!
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 28-11-2017, 15:14:19
Эвона как! Мои поздравления! Значит, я плохо искал :)
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Александр Ривилис от 28-11-2017, 15:34:57
Эвона как! Мои поздравления! Значит, я плохо искал :)
Не. Это ранний склероз называется. :-) Три года назад ты сам этот метод рекомендовал: http://adn-cis.org/forum/index.php?topic=731.msg2830#msg2830
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 28-11-2017, 15:47:49
Это ранний склероз называется.
Как-то это неожиданно :o. Я надеялся, что это попозже случится...
У меня просто в этот раз помутнение случилось (тоже, кстати, ничуть не лучше склероза) и я стал искать в документации по слову "Import", а надо было "Export". Но! У меня есть оправдание! Очень загружен работой, вот :)

Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Andant от 19-12-2017, 12:46:20
Попробовал экспортировать списки элементов (PartsList). Они тоже наследуются от StyleBase. Для напорных трубопроводов получилось. Для безнапорных списки получаются пустыми.
Как корректно перенести семейства и типоразмеры?
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 19-12-2017, 12:50:10
Может их просто программно создать?
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 19-12-2017, 14:17:23
Списки элементов безнапорной сети даже с помощью стандартных команд экспорта-импорта стилей не переносятся. Приходится делать драг-дропом между параметрами чертежей. Так что, могу допустить, что и в API нет нормального инструмента для их переноса. Вот интересно, какой механизм используется при драг-дропе? Возможно, что получится с помощью клонирования объектов между БД через AutoCAD API.
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Andant от 21-12-2017, 18:02:23
"Не выходит каменный цветок..."
Клонированием удалось кое-что перенести, но не все и не туда...
Если применять WblockClone, то новые списки полностью уничтожают имеющиеся  (через некоторое время Standard самовозрождается, как птица Феникс :) ). 
Наиболее приемлемый вариант - применение CloningHelper. Все работает, пока не встречаются одинаковые имена. При перезаписи получаем гибрид старого и нового. При переименовании - пустой переименованный список и гибрид под старым именем.
Пробовал добавлять семейства в новые списки "вручную", но получил исключение - "It's not a valid part family guid for the current active catalog." В обеих базах прописаны одинаковые пути к каталогу.
Чего еще не хватает?
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 21-12-2017, 18:06:35
Пробовал добавлять семейства в новые списки "вручную", но получил исключение - "It's not a valid part family guid for the current active catalog." В обеих базах прописаны одинаковые пути к каталогу.
Это как? Путь к каталогу задаётся на уровне приложения и не сохраняется в БД чертежа. Вполне может быть так, что списки элементов содержат ссылки на семейства, которых нет в каталоге. Возможно потому и возникает это исключение?
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 21-12-2017, 18:10:15
А семейства колодцев в списке элементов обрабатывается? Если да, то надо не забыть сделать особую обработку нулевых колодцев - возможно, что на них спотыкается программа.
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Andant от 22-12-2017, 17:39:43
А семейства колодцев в списке элементов обрабатывается? Если да, то надо не забыть сделать особую обработку нулевых колодцев - возможно, что на них спотыкается программа.
Спасибо, Дмитрий! Почти получилось. Самым сложным оказалось немного приблизиться к пониманию того, как это все устроено :) . Проверка показала, что в моем случае очень многие семейства в каталоге были отредактированы после вставки списков в исходный чертеж (кстати, при драг-дропе все перетаскивается без проверки валидности).
Осталось "побороть" нулевые колодцы. При копировании списков методом StyleBase.ExportTo() получаем совсем пустые списки, даже без Null Structure. Их можно как-нибудь добавить "вручную"?
Название: Re: Перенос стилей из внешнего *.DWG файла.
Отправлено: Дмитрий Загорулькин от 22-12-2017, 18:09:46
Честно говоря, не знаю. Я программно списки элементов не редактировал, только читал из них данные. Я даже не знал до этого момента, что может существовать список без нулевого колодца. Если вручную создать пустой список, то он в нём уже будет. AUDIT чертежа не ругается на такие списки? Аки феникс нулевой колодец не появляется? :)