Список форумов Конференция САПР Bentley MicroStation Конференция САПР Bentley MicroStation
www.ustation.ru
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Управление порядком отображения референсов

 
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Прикладное
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 не знаю. Помогите, кто может. Don't know
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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
Разве номера слотов и порядок отображения референсов как-то связаны?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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=...

Вот только возможно-ли все это сказать на бейсике Smile)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


Зарегистрирован: 28.01.2006
Сообщения: 598
Откуда: С.-Петербург

СообщениеДобавлено: Чт Ноя 16, 2006 9:06 pm    Заголовок сообщения: Ответить с цитатой

Даа...
теперь все ясно с этим UpdateSequence
На бейсике сделать можно и это,
только получится, мягко говоря, не тривиально...
Действительно, проще сделать на MDL
ну или поставить версию МС поновее... Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Прикладное Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group