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

UserAttributeDATA

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



Зарегистрирован: 26.07.2006
Сообщения: 14
Откуда: Тюмень

СообщениеДобавлено: Чт Июл 27, 2006 7:50 am    Заголовок сообщения: UserAttributeDATA Ответить с цитатой

Вопрос о Пользовательских атрибутах.
На любой элемент есть возможность навесть атрибуты
В VBA:
AddUserAttributeData
В MDL:
mdlElmdscr_appendAttributes
Так вот, если записывать атрибуты в MDL, то функцией mdlElmdscr_extractAttributes можно прекрассно их считать.
В VBA эту функцию использовать нельзя(или я не знаю как), так как бэйсик не работает с указателями.
Можно ли как-либо считать в VBA атрибуты записаные из MDL?!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Leonid
давно здесь сидим


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

СообщениеДобавлено: Чт Июл 27, 2006 9:39 am    Заголовок сообщения: Ответить с цитатой

MDL функции можно использовать в VBA, и указатель передавать можно, используя перед аргументом ByRef. Здесь подобная проблема уже обсуждалась в теме про разборку конуса.

А функция GetUserAttributeData() не берет эти атрибуты, добавленные в MDL?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Dmitriy



Зарегистрирован: 26.07.2006
Сообщения: 14
Откуда: Тюмень

СообщениеДобавлено: Чт Июл 27, 2006 12:00 pm    Заголовок сообщения: Ответить с цитатой

Что GetUserAttributeData их не берет я понял с самого начала... Smile
Да, атрибуты добавлены в MDL.

Declare Sub mdlElmdscr_extractAttributes Lib "stdmdlbltin.dll" ( ByRef length As Long , ByRef attributes As Long , ByVal elDscr As Long )

С певым и третим параметрами все вполне понятно, а вот со вторым...
В MDL, атрибуты были записаны следующим образом:
Код:

   short            attrib[MAX_ATTRIBSIZE];
   int              len_attr=0;
  .........
  mdlElmdscr_appendAttributes(&newpipeElmDS,len_attr,attrib);
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Leonid
давно здесь сидим


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

СообщениеДобавлено: Чт Июл 27, 2006 4:30 pm    Заголовок сообщения: Ответить с цитатой

Можно попробовать так

Код:

Declare Sub mdlElmdscr_extractAttributes Lib "stdmdlbltin.dll" (ByRef length As Long, ByRef attributes() As Byte, ByVal elDscr As Long)

Dim attr(MAX_ATTRIBSIZE) As Byte
....
mdlElmdscr_extractAttributes length, attr, elDescrP
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Dmitriy



Зарегистрирован: 26.07.2006
Сообщения: 14
Откуда: Тюмень

СообщениеДобавлено: Пт Июл 28, 2006 8:52 am    Заголовок сообщения: Ответить с цитатой

Так я уже тоже пробовал...
Все класно, даже иногда длину правильно считывает... (Бывает что Микрашка просто падает, это она любит Smile )
Но в любом случае массив остается пустым...
Что делать, ума не приложу...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Leonid
давно здесь сидим


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

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

Да... задачка интересная
Решил ее все-таки разгрызть Smile
Вот что получилось...

В элементе записан атрибут:
Код:

   MSWChar attrib[10];
   short* s_attrib;

   wcscpy(attrib, L"123456789");
   s_attrib = (short*)attrib;

   mdlElmdscr_appendAttributes(&ed, length, s_attrib);


Вот такой код в VB у меня его взял:
Код:


Private Declare Sub CopyMemory Lib "kernel32" _
    Alias "RtlMoveMemory" (Destination As Any, _
    Source As Any, ByVal Length As Long)
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" _
    (ByVal hHeap As Long, ByVal dwFlags As Long, _
     ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" _
    (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long


    Dim oElEnum As ElementEnumerator
    Dim oEl As element
    Dim elDescrP As Long
    Dim Length As Long
    Dim ptr As Long
    Dim hHeap As Long
    Dim I As Integer
    Dim attrSymbol As Integer
   
    hHeap = GetProcessHeap()
   
    ' alloc memory
    ptr = HeapAlloc(hHeap, 0, 2 * 650) 'an integer in Visual Basic is 2 bytes

   Set oElEnum = ActiveModelReference.GetSelectedElements
   oElEnum.Reset
   
   While oElEnum.MoveNext
        Set oEl = oElEnum.Current
        elDescrP = oEl.MdlElementDescrP
       
        If ptr <> 0 Then 'memory was allocated
       
            mdlElmdscr_extractAttributes Length, ptr, elDescrP
           
            For I = 0 To (Length - 1) * 2 Step 2 ' I - offset
                CopyMemory attrSymbol, ByVal ptr + I, 2 ' an intger is two bytes
                Debug.Print Chr(attrSymbol)
            Next I
           
        End If
   Wend
           
    ' free memory
   HeapFree GetProcessHeap(), 0, ptr
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Dmitriy



Зарегистрирован: 26.07.2006
Сообщения: 14
Откуда: Тюмень

СообщениеДобавлено: Пт Июл 28, 2006 12:34 pm    Заголовок сообщения: Ответить с цитатой

Дааааа... Smile
Как я понял mdlElmdscr_extractAttributes ты объявил все три параметра Long.
При этом, возвращается длина неимоверных размеров... Не пашет одним словом...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Leonid
давно здесь сидим


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

СообщениеДобавлено: Пт Июл 28, 2006 1:00 pm    Заголовок сообщения: Ответить с цитатой

Забыл про эту функцию...
Все параметры Long, первый - длина атррибута - по ссылке, остальные ByVal
Код:

Declare Sub mdlElmdscr_extractAttributes Lib "stdmdlbltin.dll" (ByRef Length As Long, ByVal attributes As Long, ByVal elDscr As Long)

Length у меня для моего случая все время возвращает 9
Должно работать, все чисто...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Dmitriy



Зарегистрирован: 26.07.2006
Сообщения: 14
Откуда: Тюмень

СообщениеДобавлено: Вт Авг 01, 2006 7:12 am    Заголовок сообщения: Ответить с цитатой

Если записано вот так:
Код:
short            attrib[MAX_ATTRIBSIZE];
   int              len_attr=0;
  .........
  mdlElmdscr_appendAttributes(&newpipeElmDS,len_attr,attrib);

То ни чего не читается...
Проблема в том, что приходится читать атрибуты записаные другой программой(она очень давно используется, менять нельзя)...

P.S. Может по почте свяжемся?!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Leonid
давно здесь сидим


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

СообщениеДобавлено: Вт Авг 01, 2006 11:42 am    Заголовок сообщения: Ответить с цитатой

Я изначально понял, что проблема в считывании атрбибутов,
а оказывается - в их записи Shocked
Конечно при записи надо определять их длину,
если длина равна 0, то ничего записано не будет...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Dmitriy



Зарегистрирован: 26.07.2006
Сообщения: 14
Откуда: Тюмень

СообщениеДобавлено: Вт Авг 01, 2006 12:07 pm    Заголовок сообщения: Ответить с цитатой

Smile
Изначально ты все понял правильно...
Аттрибуты записанные MDL'ем (тем способом что я написал), в VBA не читаются, даже так как ты написал...
При записи все Ок. Записывается MDL'ем и им же читается. Из VBA прочитать не могу...
Извиняюсь если запутал... Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Leonid
давно здесь сидим


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

СообщениеДобавлено: Вт Авг 01, 2006 4:23 pm    Заголовок сообщения: Ответить с цитатой

Я действительно малеха не въезжаю, потому что никогда не пробовал записывать атрибуты с нулевой длиной,
потому что не понимаю - какой смысл...

В твоем файле мой код прочитал, что в элементе есть атрибут с длиной Length=8,
значение массива атрибутов, если брать Integer, такие
18768
17744
11824
...

То есть, этому коду все равно - есть там атрибуты или нет, он просто читает память. А уж есть там атрибуты, или нет - это проблемы того кто их туда записывает...
Что там в атрибутах хоть быть должно?...
Какой формат данных?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Dmitriy



Зарегистрирован: 26.07.2006
Сообщения: 14
Откуда: Тюмень

СообщениеДобавлено: Ср Авг 02, 2006 7:31 am    Заголовок сообщения: Ответить с цитатой

Спасибо!!! Твой код делает все что надо... Good Это я "немоного" тормозил Smile.
Записаны они были не с нулевой длиной.
Записано там было PIPE0.80.
18768 = HEX(4950) = IP
17744 = HEX(4550) = EP
и т.д.
Еще раз Огромный спасиб!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Прикладное Часовой пояс: GMT + 3
Страница 1 из 1

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


Powered by phpBB © 2001, 2005 phpBB Group