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

Через MVBA определить номер слота Референса (не UpdateOrder)

 
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Прикладное
Предыдущая тема :: Следующая тема  
Автор Сообщение
AndrejS



Зарегистрирован: 12.10.2006
Сообщения: 18

СообщениеДобавлено: Ср Ноя 08, 2006 9:53 pm    Заголовок сообщения: Через MVBA определить номер слота Референса (не UpdateOrder) Ответить с цитатой

Всем, добрый день.

Подскажите пожалуйста, как определить номер слота (Slot) Референса, тот который отображается на панели References(Не UpdateOrder). Либо подскажите как однозначно определить Референс в Мастер-файле потаму как одного имени не достаточно (случай когда один файл подключается много раз).


Последний раз редактировалось: AndrejS (Чт Ноя 09, 2006 6:05 pm), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AndrejS



Зарегистрирован: 12.10.2006
Сообщения: 18

СообщениеДобавлено: Чт Ноя 09, 2006 10:03 am    Заголовок сообщения: Ответить с цитатой

Может быть есть способ как-то использовать MDL для решения этой задачи?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AndrejS



Зарегистрирован: 12.10.2006
Сообщения: 18

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

Вот нашёл код, который возвращает слот элемента выделенного в окне References:

Код:
Dim refSlot As Variant
refSlot = GetCExpressionValue("refEditor.editorBuffer")


Если я правильно понял то осталось только найти правильный параметр( вместо "refEditor.editorBuffer") этой функции.

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


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

СообщениеДобавлено: Пт Ноя 10, 2006 12:12 am    Заголовок сообщения: Ответить с цитатой

Вот что-то типа этого...
Довольно топорно, но у меня заработало Smile
Используем
Код:

Declare Function mdlRefFile_getInfo Lib "stdmdlbltin.dll" _
    ( ByVal modelRef As Long ) As Long

Возвращает ссылку на структуру ReferenceFile,
содержимое которое можно посмотреть в refernce.h
Код:

Private Declare Sub CopyMemory Lib "kernel32" _
    Alias "RtlMoveMemory" (Destination As Any, _
    Source As Long, ByVal Length As Long)

Dim I As Integer
Dim lngSlotNumber As Long
Dim refPtr As Long
Dim lngShift As Long

'struct referenceFile
'    {
'    File_id_desc            file_id;                /* file identification */
'    .........
'    };

'typedef struct file_id_descr
'    {
'    char    const * const   fileName;           /* file specification */
'    char    const * const   fullFileSpec;       /* Full specification for found file */
'    ModelID         sourceModelID;              /* ID of Attached Model */
'    MSWChar const * const   modelName;          /* Name of Attached Model */
'    DgnModelRefP        modelRef;           /* this reference's ModelRef */
'    ULong           referenceNum;       /* reference number */ ТО ЧТО НАМ НАДО
'    .........
'    } File_id_desc;

' 5 - смещение параметра referenceNum в структуре File_id_desc
lngShift = 5

For I = 1 To Application.ActiveModelReference.Attachments.Count

    Dim att As Attachment
    Set att = Application.ActiveModelReference.Attachments(I)
    refPtr = mdlRefFile_getInfo(att.MdlModelRefP)
   
    ' копируем в память (4 - длина Long)
    CopyMemory lngSlotNumber, ByVal (refPtr + 4 * lngShift), Len(lngSlotNumber)
   
    ' печатает файл, номер слота (можете проверить в списке референсов)
    Debug.Print att.AttachName, lngSlotNumber

Next I
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
AndrejS



Зарегистрирован: 12.10.2006
Сообщения: 18

СообщениеДобавлено: Пн Ноя 13, 2006 6:33 pm    Заголовок сообщения: Ответить с цитатой

Спасибо большое Вам, Leonid! Всё работает на ура! Very Happy

Мало того, что Вы очень отзывчивый, Вы ещё и супер мозг (очень умный человек). Good

Ещё раз СПАСИБО.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


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

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

За добрые слова конечно и Вам спасибо,
но, оказывается, все можно было решить гораздо проще и корректнее Embarassed
(если бы они написали в хелпе про параметр REFERENCE_REFNUM)

Помогло то что написал vikk здесь
http://forum.ustation.ru/viewtopic.php?t=175

в результате решение будет выглядеть примерно так:
Код:

Declare Function mdlRefFile_getParameters Lib "stdmdlbltin.dll" _
    (ByRef param As Long, _
    ByVal paramName As Long, _
    ByVal modelRef As Long) As Long

Dim I As Integer
Dim lngSlotNumber As Long
Dim att As Attachment

For I = 1 To Application.ActiveModelReference.Attachments.Count

    Set att = Application.ActiveModelReference.Attachments(I)
   
    '#define REFERENCE_REFNUM           28   (mdl.h)
    mdlRefFile_getParameters lngSlotNumber, 28, att.MdlModelRefP
   
    Debug.Print att.AttachName, lngSlotNumber

Next I


Век живи - век учись! Very Happy
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
AndrejS



Зарегистрирован: 12.10.2006
Сообщения: 18

СообщениеДобавлено: Пт Dec 15, 2006 2:50 pm    Заголовок сообщения: Ответить с цитатой

Ещё раз спасибо Leonid.

Попробую вторым способом. Хотя первый способ выглядит круче Cool Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AndrejS



Зарегистрирован: 12.10.2006
Сообщения: 18

СообщениеДобавлено: Пн Dec 18, 2006 5:19 pm    Заголовок сообщения: Ответить с цитатой

Тут обнаружалась одна проблемка:
На RedLine не поддерживается язык MDL и соответственно нет библитеки "stdmdlbltin.dll".

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

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


Powered by phpBB © 2001, 2005 phpBB Group