Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 Заголовок сообщения: |
|
|
Вот что-то типа этого...
Довольно топорно, но у меня заработало
Используем
Код: |
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
|
|
|
Вернуться к началу |
|
|
AndrejS
Зарегистрирован: 12.10.2006 Сообщения: 18
|
Добавлено: Пн Ноя 13, 2006 6:33 pm Заголовок сообщения: |
|
|
Спасибо большое Вам, Leonid! Всё работает на ура!
Мало того, что Вы очень отзывчивый, Вы ещё и супер мозг (очень умный человек).
Ещё раз СПАСИБО. |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Чт Ноя 16, 2006 8:38 pm Заголовок сообщения: |
|
|
За добрые слова конечно и Вам спасибо,
но, оказывается, все можно было решить гораздо проще и корректнее
(если бы они написали в хелпе про параметр 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
|
Век живи - век учись! |
|
Вернуться к началу |
|
|
AndrejS
Зарегистрирован: 12.10.2006 Сообщения: 18
|
Добавлено: Пт Dec 15, 2006 2:50 pm Заголовок сообщения: |
|
|
Ещё раз спасибо Leonid.
Попробую вторым способом. Хотя первый способ выглядит круче |
|
Вернуться к началу |
|
|
AndrejS
Зарегистрирован: 12.10.2006 Сообщения: 18
|
Добавлено: Пн Dec 18, 2006 5:19 pm Заголовок сообщения: |
|
|
Тут обнаружалась одна проблемка:
На RedLine не поддерживается язык MDL и соответственно нет библитеки "stdmdlbltin.dll".
Решение пока некрасивое, но простое скопировать этот файл в корень RedLine. |
|
Вернуться к началу |
|
|
|