Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
iriska
Зарегистрирован: 01.11.2006 Сообщения: 3
|
Добавлено: Ср Ноя 01, 2006 5:49 pm Заголовок сообщения: Управление порядком отображения референсов |
|
|
Нужно управлять порядком отображения референсных файлов из VBA
в MicroStation 8.01.01.09. В VBA MS 2004 есть UpdateOrder,
а в MS 8.01.01.09 еще нет. Перейти на MS 2004 нет возможности.
Я думаю, что нужно использовать MDL напрямую из кода VBA,
вроде и функцию нашел: SystemFunc_UpdateSequenceChanged, а
как ее прикрутить к VBA не знаю. Помогите, кто может. |
|
Вернуться к началу |
|
|
vikk
Зарегистрирован: 13.09.2006 Сообщения: 88
|
Добавлено: Чт Ноя 02, 2006 11:30 am Заголовок сообщения: |
|
|
Номер слота менять не проще? |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Чт Ноя 02, 2006 2:18 pm Заголовок сообщения: |
|
|
SystemFunc_UpdateSequenceChanged - это функция обратного вызова (system hook), она здесь не поможет, да и в VBA ее нельзя использовать, там события по другому огранизованы.
Я бы попробовал повозиться с mdlRefFile_setParameters(...)
Код: |
Declare Function mdlRefFile_setParameters Lib "stdmdlbltin.dll" ( ByVal param As Long , ByVal paramName As Long , ByVal modelRef As Long ) As Long
|
|
|
Вернуться к началу |
|
|
iriska
Зарегистрирован: 01.11.2006 Сообщения: 3
|
Добавлено: Вт Ноя 07, 2006 11:33 am Заголовок сообщения: |
|
|
Я поменял номер слота у нескольких референсов, но файлы отображаются в том же порядке, как и раньше. Чего не хватает? Менял с помощью функции ChgSlotNumberAtt из набора,
http://home.wanadoo.nl/h-stegeman/microstation/ |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Чт Ноя 09, 2006 9:41 pm Заголовок сообщения: |
|
|
vikk
Разве номера слотов и порядок отображения референсов как-то связаны? |
|
Вернуться к началу |
|
|
iriska
Зарегистрирован: 01.11.2006 Сообщения: 3
|
Добавлено: Чт Ноя 16, 2006 1:08 pm Заголовок сообщения: |
|
|
На форуме Bentley обнаружил ссылку на незадокументированную mdl функцию,
которая присутствует во всех восьмых версиях MicroStation.
Код: | void mdlModelRef_setUpdateSequence
(
DgnModelRefP modelRef,
DgnModelRefListP updateSequence
); |
Как ее вызвать из VBA?
если я делаю так:
Код: | Declare Function mdlModelRef_setUpdateSequence Lib "stdmdlbltin.dll" (ByVal modelRef As Long, _
ByVal updateSequence As Long) As Long |
MS пишет, что в stdmdlbltin.dll нет точки входа.
Я обнаружил эту функцию в ustation.dll,
но если ее указать в качестве библиотеки MS вылетает.
Код: | Declare Function mdlModelRef_setUpdateSequence Lib "ustation.dll" (ByVal modelRef As Long, _
ByVal updateSequence As Long) As Long |
|
|
Вернуться к началу |
|
|
vikk
Зарегистрирован: 13.09.2006 Сообщения: 88
|
Добавлено: Чт Ноя 16, 2006 1:17 pm Заголовок сообщения: |
|
|
Порядок референсов храниться в RefList модели (V8).
(в старых версиях tcb->updateorder)
Но если список не создан, порядок реф.файлов определяет
номер слота. Изменив номер слота - меняем порядок.
Создать список просто Reference->Settings->Update sequence... и OK
Даже если нет реф.файлов, создается пустой список.
И теперь при присоединении реф.файлов порядком управляет RefList.
Изменить порядок можно двумя способами, создать и присоединить
новый список, или модифицировать существующий. В новый список
обязательно надо включить Active Disign File. Любая ошибка
здесь рушит Ustation. Для этих целей существуют
две хорошо известные в узких кругах недокументированные функции
Код: |
DgnModelRefListP mdlModelRef_getUpdateSequence
(
DgnModelRefP modelRef
);
void mdlModelRef_setUpdateSequence
(
DgnModelRefP modelRef,
DgnModelRefListP updateSequence
);
|
Вот что говорит Bentley
The first argument is the modelRef for which the update sequence is to be set (usually mdlModelRef_getActive()).
The second argument is a DgnModelRefListP that contains the update sequence.
The update sequence is stored in the modelRef in V8.
Do not free the modelRefList that you get back, it s a pointer to
the one that is stored, not a copy. If you want to get the update sequence
of the master file, call it with mdlModelRef_getActive() for the modelRef.
Код: |
//
// Небольшой пример, создаем RefList референсов,
// упорядочиваем по номеру слота в обратном порядке
//
void RefBack(void)
{
DgnModelRefListP refListP = NULL;
DgnModelRefListP refListP_old = NULL;
ModelRefIteratorP MRefIteratorP = NULL;
DgnModelRefP ModelRefP;
int ind=0;
// int slot;
mdlModelRefList_create (&refListP);
mdlModelRefIterator_create (&MRefIteratorP, MASTERFILE,
MRITERATE_Root|MRITERATE_PrimaryChildRefs, 0);
while(TRUE)
{
ModelRefP = mdlModelRefIterator_getNext (MRefIteratorP);
if(ModelRefP == NULL) break;
// так можно получить номер слота
// mdlRefFile_getParameters(&slot,REFERENCE_REFNUM,ModelRefP);
ind++;
if(ind == 1)
mdlModelRefList_add (refListP,ModelRefP);
else
mdlModelRefList_insert(refListP,0,ModelRefP);
} // while()
mdlModelRefIterator_free (&MRefIteratorP);
refListP_old = mdlModelRef_getUpdateSequence(mdlModelRef_getActive());
if(refListP_old) mdlModelRefList_free(&refListP_old);
mdlModelRef_setUpdateSequence(mdlModelRef_getActive(),refListP);
// if(refListP) mdlModelRefList_free(&refListP); // -- здесь нельзЯ, рушим Ustation
// mdlSystem_flushDesignFile(); // -- надо-ли?
return;
}
//
// Фрагмент кода, как можно удалить RefList
// После выполнения кода порядок реф.файлов определяется номером слота
refListP_old = mdlModelRef_getUpdateSequence(mdlModelRef_getActive());
if(refListP_old) mdlModelRefList_free(&refListP_old);
mdlModelRef_setUpdateSequence(mdlModelRef_getActive(),NULL);
|
Немного о номере слота
Номер слота удобно получать функцией
Код: |
mdlRefFile_getParameters(&slot,REFERENCE_REFNUM,ModelRefP);
|
К сожалению, что б изменить номер функцию mdlRefFile_setParameters()
использовать нельзя. Приходится обращаться непосредственно к
структуре типа refFile->file_id.referenceNum=...
Вот только возможно-ли все это сказать на бейсике ) |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Чт Ноя 16, 2006 9:06 pm Заголовок сообщения: |
|
|
Даа...
теперь все ясно с этим UpdateSequence
На бейсике сделать можно и это,
только получится, мягко говоря, не тривиально...
Действительно, проще сделать на MDL
ну или поставить версию МС поновее... |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|