Сообщество программистов Autodesk в СНГ
ADN Club => Civil 3D API => Тема начата: Andant от 27-11-2017, 15:22:16
-
Решаю задачу переноса стилей объектов Civil (поверхности, трассы, профили, трубы и т.д.). Использую метод CloningHelper.Clone(). Перенос осуществляется, но не удается решить проблему одинаковых имен. Вроде бы CloningHelper.MergeType позволяет выбрать нужный режим - игнорировать, заменить, переименовать. Но на практике, ни замена, ни переименование не происходят. Только добавление новых стилей с уникальными именами. Может, кто - нибудь уже сталкивался с данной проблемой?
-
Использую метод CloningHelper.Clone()
А что это за метод? Я такой не нашёл в SDK.
-
Autodesk.Aec.ApplicationServices.Utility.CloningHelper
http://adndevblog.typepad.com/aec/2012/08/importexport-styles-fromto-another-drawing-in-net-.html
-
Да, поиск рулит, уже нашёл. Вроде как, метод как раз для такой ситуации и должен работать корректно. Если установка режима не работает - то это, скорее всего, баг в его реализации.
-
Да, поиск рулит, уже нашёл. Вроде как, метод как раз для такой ситуации и должен работать корректно. Если установка режима не работает - то это, скорее всего, баг в его реализации.
Вообще-то, как указано в статье, этот метод для ACA и MEP. Так что не обязательно, что он работает корректно в Civil 3D.
Кроме того нужно убедиться, что одноименные стили не открыты в этот момент.
-
Согласен, но не полностью. Метод же всё-таки работает, но не так, как ожидается. Разработан он как раз для вертикальных продуктов, так что, по-хорошему, должен и с Civil дружить. Но это если была предусмотрена универсальность. А этого могло и не быть, Вы правы.
Ну и поиском по Civil 3D .NET Reference я не нашёл подходящих инструментов. Возможно, что как раз-таки и подразумевается использование этого метода. Наверное, надо в DevHelp спрашивать.
-
Посмотрел, где хранятся стили в Civil. Древовидная структура.
Если подниматься вверх от стиля, то на 4 уровне упираемся в NamedObjectDictionary (Dictionary C):
(https://s18.postimg.org/3z9jxm1sl/tree.jpg) (https://postimg.org/image/3z9jxm1sl/)
Странно, что хоть что-то добавляется...
-
Скорее всего, придется сравнивать имена стилей, удалять перезаписываемые, при необходимости переименовывать. И только после этого клонировать...
-
Если подниматься вверх от стиля, то на 4 уровне упираемся NamedObjectDictionary
А что странного? Наоборот, довольно логично. Только жаль, что хранятся эти данные в недоступном для API виде.
-
Только жаль, что хранятся эти данные в недоступном для API виде
Можно через референсы добраться. Handle 242 - это узел Root. У него можно найти AeccDbTreeNode (handle 33C), который уже содержит ссылки на все стили:
(https://s18.postimg.org/qljgo04vp/33_C.jpg) (https://postimg.org/image/qljgo04vp/)
-
Так ведь стили можно гораздо проще получить ;) Но тоже интересный вариант.
-
Так ведь стили можно гораздо проще получить
Боюсь, что если дело дойдет до "ручного" контроля имен стилей с удалением и переименованием, то для напорных сетей опять понадобятся "танцы с бубном"...:)
-
Ну и поиском по Civil 3D .NET Reference я не нашёл подходящих инструментов
И все-таки есть такая партия! Статический метод StyleBase.ExportTo() успешно справился с задачей. И даже производит замену стиля для всех уже имеющихся в базе объектов!
-
Эвона как! Мои поздравления! Значит, я плохо искал :)
-
Эвона как! Мои поздравления! Значит, я плохо искал :)
Не. Это ранний склероз называется. :-) Три года назад ты сам этот метод рекомендовал: http://adn-cis.org/forum/index.php?topic=731.msg2830#msg2830
-
Это ранний склероз называется.
Как-то это неожиданно :o. Я надеялся, что это попозже случится...
У меня просто в этот раз помутнение случилось (тоже, кстати, ничуть не лучше склероза) и я стал искать в документации по слову "Import", а надо было "Export". Но! У меня есть оправдание! Очень загружен работой, вот :)
-
Попробовал экспортировать списки элементов (PartsList). Они тоже наследуются от StyleBase. Для напорных трубопроводов получилось. Для безнапорных списки получаются пустыми.
Как корректно перенести семейства и типоразмеры?
-
Может их просто программно создать?
-
Списки элементов безнапорной сети даже с помощью стандартных команд экспорта-импорта стилей не переносятся. Приходится делать драг-дропом между параметрами чертежей. Так что, могу допустить, что и в API нет нормального инструмента для их переноса. Вот интересно, какой механизм используется при драг-дропе? Возможно, что получится с помощью клонирования объектов между БД через AutoCAD API.
-
"Не выходит каменный цветок..."
Клонированием удалось кое-что перенести, но не все и не туда...
Если применять WblockClone, то новые списки полностью уничтожают имеющиеся (через некоторое время Standard самовозрождается, как птица Феникс :) ).
Наиболее приемлемый вариант - применение CloningHelper. Все работает, пока не встречаются одинаковые имена. При перезаписи получаем гибрид старого и нового. При переименовании - пустой переименованный список и гибрид под старым именем.
Пробовал добавлять семейства в новые списки "вручную", но получил исключение - "It's not a valid part family guid for the current active catalog." В обеих базах прописаны одинаковые пути к каталогу.
Чего еще не хватает?
-
Пробовал добавлять семейства в новые списки "вручную", но получил исключение - "It's not a valid part family guid for the current active catalog." В обеих базах прописаны одинаковые пути к каталогу.
Это как? Путь к каталогу задаётся на уровне приложения и не сохраняется в БД чертежа. Вполне может быть так, что списки элементов содержат ссылки на семейства, которых нет в каталоге. Возможно потому и возникает это исключение?
-
А семейства колодцев в списке элементов обрабатывается? Если да, то надо не забыть сделать особую обработку нулевых колодцев - возможно, что на них спотыкается программа.
-
А семейства колодцев в списке элементов обрабатывается? Если да, то надо не забыть сделать особую обработку нулевых колодцев - возможно, что на них спотыкается программа.
Спасибо, Дмитрий! Почти получилось. Самым сложным оказалось немного приблизиться к пониманию того, как это все устроено :) . Проверка показала, что в моем случае очень многие семейства в каталоге были отредактированы после вставки списков в исходный чертеж (кстати, при драг-дропе все перетаскивается без проверки валидности).
Осталось "побороть" нулевые колодцы. При копировании списков методом StyleBase.ExportTo() получаем совсем пустые списки, даже без Null Structure. Их можно как-нибудь добавить "вручную"?
-
Честно говоря, не знаю. Я программно списки элементов не редактировал, только читал из них данные. Я даже не знал до этого момента, что может существовать список без нулевого колодца. Если вручную создать пустой список, то он в нём уже будет. AUDIT чертежа не ругается на такие списки? Аки феникс нулевой колодец не появляется? :)