Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
beer
Зарегистрирован: 01.02.2006 Сообщения: 215 Откуда: Москва
|
Добавлено: Чт Ноя 28, 2013 9:35 am Заголовок сообщения: Копирование асс. файлов из другого файла |
|
|
Собственно суть задачи состоит в том что бы выбрать какой-нибудь dgn файл и подключить его асс. файлы к открытому файлу со всеми-всеми настройками начиная от видимости и заканчивая масштабами стилей линий слоев символики и обрезкой.
Казалось бы что тут сложного? открывай файлик с помощью mdlWorkDgn_openFile читай референсы да подключай. Ан нет, очень критично ВРЕМЯ подключения. На 250 файлах это становится до безобразия долго. Мне во всяком случае это не нравится.
И тут пришла мне в голову забавная мысль а что если попробовать скопировать элементы type 100 Reference Attach Element из одного файла в другой. И чудо свершилось!!! Скорость подключения полутысячи файлов доли секунды!!!!! Но как всегда без проблем не обходится Видны эти файлы в окне референсов становятся только если файл заново открыть и даже mdlRefFile_getRefCount их не видит даже после mdlModelRef_loadReferenceModels
Я так понимаю что тупо копируя элементы стейшен не разбирает это что за элементы. И разбор их происходит только после открытия файла.
И теперь вопрос. Как бы заставить стейшен увидеть эти референсы без переоткрытия файла? При чем желательно что бы он их не прогружал целиком в кеш (а то эфект от скорости подключения теряется), мне их видеть на чертеже поначалу совсем не обязательно, потом можно будет прогрузить |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Чт Ноя 28, 2013 1:34 pm Заголовок сообщения: |
|
|
Тебе нужно чтобы они просто оказались в списке референсов?
попутно тупой вопрос... на всякий случай...
зачем подключать референсы референса, если есть параметр Nesting Depth? |
|
Вернуться к началу |
|
|
beer
Зарегистрирован: 01.02.2006 Сообщения: 215 Откуда: Москва
|
Добавлено: Чт Ноя 28, 2013 1:41 pm Заголовок сообщения: |
|
|
Leonid писал(а): | Тебе нужно чтобы они просто оказались в списке референсов?
|
ага
Leonid писал(а): | попутно тупой вопрос... на всякий случай...
зачем подключать референсы референса, если есть параметр Nesting Depth? |
это будут не референсы референса, а референсы произвольного файла. Сам файл с референсами я подключать не буду. |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Чт Ноя 28, 2013 4:06 pm Заголовок сообщения: |
|
|
а через ModelRefIteratorP эти элементы тоже не видны? |
|
Вернуться к началу |
|
|
beer
Зарегистрирован: 01.02.2006 Сообщения: 215 Откуда: Москва
|
Добавлено: Пт Ноя 29, 2013 8:03 am Заголовок сообщения: |
|
|
Цитата: | а через ModelRefIteratorP эти элементы тоже не видны? |
неа!
Я тут в справке наткнулся
Цитата: | When MicroStation loads a Model, it searches for its Reference Attachment elements, and creates a corresponding data object in memory to hold the information about the attachment. These objects are called DgnModelRef's and their lifetimes are controlled by the model from which they loaded |
Я делаю вывод что при копировании элемента не создается DgnModelRef
кстати mdlRefFile_getFromAttachmentID тоже не помогает |
|
Вернуться к началу |
|
|
beer
Зарегистрирован: 01.02.2006 Сообщения: 215 Откуда: Москва
|
Добавлено: Вт Dec 03, 2013 2:41 pm Заголовок сообщения: |
|
|
Копая библиотеку ustation.dll нашел функцию mdlRefFile_rebuildModelRefTree
методом тыка она заработала в следующем варианте
Код: |
int mdlRefFile_rebuildModelRefTree(ModelRefP rootModel);
|
теперь после копирования элементов дерево асс. файлов перестраивается и они появляются в списке. Правда если в файле-источнике их отображение включено то, то они все равно грузятся в память, но это гораздо лучше чем переоткрывать файл |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Ср Dec 04, 2013 7:19 am Заголовок сообщения: |
|
|
Недокументированные функции - это сила |
|
Вернуться к началу |
|
|
beer
Зарегистрирован: 01.02.2006 Сообщения: 215 Откуда: Москва
|
Добавлено: Ср Dec 04, 2013 7:48 am Заголовок сообщения: |
|
|
Это вообще убийственная вещь! Только вот не знаю как объяснить их существование, потому что если посмотреть сколько их на самом деле и когда по названиям догадываешься что они делают, то скулы сводит от вожделения и почему их не документируют не понятно. Толи по раздолбайству, толи не уверены что они в дальнейшем останутся в том же виде |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Ср Dec 04, 2013 1:15 pm Заголовок сообщения: |
|
|
я думаю, скорее всего, из-за нежелания брать на себя ответственность за их неправильное использование... |
|
Вернуться к началу |
|
|
beer
Зарегистрирован: 01.02.2006 Сообщения: 215 Откуда: Москва
|
Добавлено: Пт Dec 06, 2013 9:17 am Заголовок сообщения: |
|
|
Ну собственно чего я добился.
Поскольку я извращенец и пишу на C# а не как все белые люди на c++, то пришлось несколько поизвращаться. Повторил описание структуры элемента type 100; Из дескриптора получил указатель на элемент, в unsafe режиме привел его к указателю на повторенную структуру у брал флаг отображения и только потом скопировал этот элемент. Результат получился выше всяких похвал, время подключения 250 файлов составило чуть больше секунды. Ура товарищи!!!! |
|
Вернуться к началу |
|
|
vikk
Зарегистрирован: 13.09.2006 Сообщения: 88
|
Добавлено: Ср Апр 29, 2015 11:07 am Заголовок сообщения: |
|
|
Добрый день
beer, все очень интересно и позновательно.
А rootModel - это MASTERFILE, или какой-то начальный корень существует в иерархии REF файлов. Как тогда его получить |
|
Вернуться к началу |
|
|
beer
Зарегистрирован: 01.02.2006 Сообщения: 215 Откуда: Москва
|
Добавлено: Вт Май 19, 2015 2:40 pm Заголовок сообщения: |
|
|
rootModel - это модель, дерево асс. файлов которой мы строим. MASTERFILE - это все же из области семерки, но на сколько я помню для восьмерки где-то прописано что MASTERFILE=ACTIVEMODEL |
|
Вернуться к началу |
|
|
vikk
Зарегистрирован: 13.09.2006 Сообщения: 88
|
Добавлено: Пт Май 22, 2015 3:20 pm Заголовок сообщения: |
|
|
В восьмерке MASTER и ACTIV выглядят так, да, это одно и то же
Код: |
#define MASTERFILE (mdlModelRef_getActive ())
#define ACTIVEMODEL (mdlModelRef_getActive ())
|
|
|
Вернуться к началу |
|
|
|