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

Работа с элементами в VBA

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



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

СообщениеДобавлено: Пн Мар 06, 2006 2:45 pm    Заголовок сообщения: Работа с элементами в VBA Ответить с цитатой

Помогите кто знает!! Как можно "разбить" элемент MicroStation?
Дано - элемент "тело" (параллелепипед, сфера, кольцо, созданные стандартными функциями 3D построения). В общем случае он перехватывается как
Dim curElem as Element
Теперь необходимо узнать список вершин данного элемента (элемент типа msdElementTypeSolid = 19). Но в свойствах "принадлежности" элемента выдает только, что он IsGraphical, IsNew, IsValid. Из этих параметров невозможно преобразовать его в список элементов (cell, complex) - выдает ошибку.
В то же время стандартными функциями (функция Info, Разбиение тела) возможно получить список простых элементов, из которых состоит тело.
Как можно реализовать такой подход программно? и желательно в VBA
----------------------------------------
Заранее спасибо за советы/подсказки.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


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

СообщениеДобавлено: Пн Мар 06, 2006 8:52 pm    Заголовок сообщения: Ответить с цитатой

Здесь сказывается, что VBA все-таки ограничен в своих возможностях.
Я бы для этого случая использовал функции MDL напрямую из кода VBA, если уж чистый MDL не подходит.
Секция хелпа:
Calling DLL functions from VBA
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Rus77



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

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

В процессе поиска решения интуитивно я уже понял, что необходимо действовать через MDL функции. Но опять же встает вопрос - где можно взять описание функций? Какой модуль для чего подгружать? Какие параметры передаются и возвращаются?
Мне прислали код, но он не работает. Может подскажете в чем проблема?
-----------------------------------------------------
Public Declare Function ElmdscrAccessor_getNext Lib "stdmdlaccessor.dll" (ByVal ElementDescr As Long) As Long
Public Declare Function ElmdscrAccessor_getFirst Lib "stdmdlaccessor.dll" (ByVal ElementDescr As Long) As Long
'*************************
Private Sub CommandButton4_Click()
Dim curStr As String, curKey As String, curName As String, curParKey As String
Dim arStr() As String
Dim curDL As DLong
Dim curElem As Element
Dim curEE As ElementEnumerator
Dim curCellEl As CellElement
Dim i As Long, lenAr As Long
Dim curNode As Node
Dim elDescrP As Long
Dim eleP As Long
curStr = TreeView1.SelectedItem.Tag
curParKey = TreeView1.SelectedItem.Key
arStr = Split(curStr, "@")
curDL.High = Val(arStr(0))
curDL.Low = Val(arStr(1))
Set curElem = Application.ActiveModelReference.GetElementByID(curDL)
elDescrP = curElem.MdlElementDescrP '[DEBUG =49814440]
eleP = ElmdscrAccessor_getFirst(elDescrP) '[DEBUG =0] !!!!!!!!!
While (eleP)
Set curElem = MdlCreateElementFromElementDescrP(eleP)
countNodes = countNodes + 1
curName = "Elem" + Str(countNodes)
curDL = curEE.Current.ID
curStr = Str(curDL.High) + "@" + Str(curDL.Low)
Set curNode = TreeView1.Nodes.Add(curParKey, tvwChild, curName, curName)
curNode.Tag = curStr
eleP = ElmdscrAccessor_getNext(eleP)
Wend
end sub
----------------------------------------------
Программа дает выбрать элемент, после чего его ID заносится в узел дерева. В данном тексте происходит обработка функции "Разбить" текущий элемент. Хотя и по команде "analyze element" видно, что текущая сфера имеет список простых элементов, я не смог получить этот список. Что я неправильно делаю?
-------------
Заранее спасибо....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


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

СообщениеДобавлено: Вт Мар 07, 2006 3:21 pm    Заголовок сообщения: Ответить с цитатой

У меня вот так заработало:
Код:

Sub f1()

    Dim oElEnum As ElementEnumerator
    Dim oEl As element
    Dim curName As String
    Dim curElem As element
    Dim elDescrP As Long
    Dim eleP As Long
    Dim countNodes As Long
   
   Set oElEnum = ActiveModelReference.GetSelectedElements
   oElEnum.Reset
   
   While oElEnum.MoveNext
        Set oEl = oElEnum.Current
        Set curElem = Application.ActiveModelReference.GetElementByID(oEl.ID)
        elDescrP = curElem.MdlElementDescrP
        eleP = ElmdscrAccessor_getFirst(elDescrP)
       
        While (eleP)
            Set curElem = MdlCreateElementFromElementDescrP(eleP)
            countNodes = countNodes + 1
            curName = "Elem " + "number = " + Str(countNodes) + ", type = " + Str(curElem.Type)
            Debug.Print curName
            eleP = ElmdscrAccessor_getNext(eleP)
        Wend

   Wend

End Sub


Происходит обработка выделенного элемента,
в окно Immediate для куба выводится следующее

Elem number = 1, type = 6
Elem number = 2, type = 6
Elem number = 3, type = 3
Elem number = 4, type = 3
Elem number = 5, type = 3
Elem number = 6, type = 3

Вроде все сходится Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Rus77



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

СообщениеДобавлено: Вт Мар 07, 2006 4:50 pm    Заголовок сообщения: Ответить с цитатой

Спасибо за совет. После праздника обязательно попробую.....а сейчас как-то не до работы.....Smile
Кстати, объясните мне смысл строк:
[Set oEl = oElEnum.Current
[Set curElem = Application.ActiveModelReference.GetElementByID(oEl.ID)
Ведь oElEnum.Current вроде и есть элемент, зачем его еще раз получать из чертежа? Или функция получения по ID чем-то отличается?
И еще типы данных - "Element" и "element" чем-то отличаются?
И еще, если нетрудно, есть примерчик простенького создания MDL-приложения (в смысле компиляции) с поясняющими комментариями - типа в каком файле что и как писать и как потом получать компилированный макрос? А то как-то спрашивал, но замяли, выслали справочник MDL функций (без примеров соответственно) и все....
--------------------------
Заранее благодарен.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rus77



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

СообщениеДобавлено: Чт Мар 09, 2006 9:14 am    Заголовок сообщения: Ответить с цитатой

Скопировал Ваш код, вставил себе в программу и ..... не работает..Sad
Все равно eleP==0.....Почему-то функция ElmdscrAccessor_getFirst(elDescrP) не срабатывает или некорректно работает. Может быть на это влияют какие-то настройки? Хотя сделал новый файл и все равно не работает.....
Что неправильно я делаю?.....Может можно это побороть как-то по другому?
-------------------------
Заранее спасибо....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


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

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

Да, по сути
Set curElem = Application.ActiveModelReference.GetElementByID(oEl.ID)
лишняя строчка.
Накануне праздника не до оптимизаций было Smile

Насчет примеров - в этом разделе есть подходящие ссылки.
Кроме того, в папке $(MS)\mdl\examples\
достаточно хороших примеров, для начинающих порекомендовал бы изучить basic и myapp

Цитата:

Все равно eleP==0..

elDescrP = oEl.MdlElementDescrP срабатывает?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Rus77



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

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

Сейчас повешусь от всего этого...SadSad
Перерыл почти весь справочник, новый файл с нового шаблона - не работает. Пробовал библиотеку stdkisolid.dll, но она вообще похоже и не срабатывала. Решился на последний шаг. На чистой винде (WinXp Pro SP2) поставил MicroStation 08050057en - заработало. Поставил MicroStation 08050064ru (она же у меня и стоит основной) - начала ругаться, каких-то модулей не нашла, библиотек.....Treeview выбросило из проекта....Smile
Вот сейчас ставлю новую операционку для чистоты экперимента.
Правда, если на русской версии так и не заработает - то это будет печально.....Sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rus77



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

СообщениеДобавлено: Чт Мар 09, 2006 5:25 pm    Заголовок сообщения: Ответить с цитатой

Все, заработало. Виной всему был Касперский. Как всегда все портит...Sad
Теперь далее вопрос. Разбив тело на "планарные" элементы, я получил массив точек Point3D:

Dim pointsVert() As Point3d
pointsVert = curElem.ConstructVertexList(dVal) ' dVal=150 (мм?)

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

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


Powered by phpBB © 2001, 2005 phpBB Group