Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 |
|
Вернуться к началу |
|
|
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
Вроде все сходится |
|
Вернуться к началу |
|
|
Rus77
Зарегистрирован: 06.03.2006 Сообщения: 53
|
Добавлено: Вт Мар 07, 2006 4:50 pm Заголовок сообщения: |
|
|
Спасибо за совет. После праздника обязательно попробую.....а сейчас как-то не до работы.....
Кстати, объясните мне смысл строк:
[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 Заголовок сообщения: |
|
|
Скопировал Ваш код, вставил себе в программу и ..... не работает..
Все равно eleP==0.....Почему-то функция ElmdscrAccessor_getFirst(elDescrP) не срабатывает или некорректно работает. Может быть на это влияют какие-то настройки? Хотя сделал новый файл и все равно не работает.....
Что неправильно я делаю?.....Может можно это побороть как-то по другому?
-------------------------
Заранее спасибо.... |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Чт Мар 09, 2006 12:19 pm Заголовок сообщения: |
|
|
Да, по сути
Set curElem = Application.ActiveModelReference.GetElementByID(oEl.ID)
лишняя строчка.
Накануне праздника не до оптимизаций было
Насчет примеров - в этом разделе есть подходящие ссылки.
Кроме того, в папке $(MS)\mdl\examples\
достаточно хороших примеров, для начинающих порекомендовал бы изучить basic и myapp
Цитата: |
Все равно eleP==0..
|
elDescrP = oEl.MdlElementDescrP срабатывает? |
|
Вернуться к началу |
|
|
Rus77
Зарегистрирован: 06.03.2006 Сообщения: 53
|
Добавлено: Чт Мар 09, 2006 12:34 pm Заголовок сообщения: |
|
|
Сейчас повешусь от всего этого...
Перерыл почти весь справочник, новый файл с нового шаблона - не работает. Пробовал библиотеку stdkisolid.dll, но она вообще похоже и не срабатывала. Решился на последний шаг. На чистой винде (WinXp Pro SP2) поставил MicroStation 08050057en - заработало. Поставил MicroStation 08050064ru (она же у меня и стоит основной) - начала ругаться, каких-то модулей не нашла, библиотек.....Treeview выбросило из проекта....
Вот сейчас ставлю новую операционку для чистоты экперимента.
Правда, если на русской версии так и не заработает - то это будет печально..... |
|
Вернуться к началу |
|
|
Rus77
Зарегистрирован: 06.03.2006 Сообщения: 53
|
Добавлено: Чт Мар 09, 2006 5:25 pm Заголовок сообщения: |
|
|
Все, заработало. Виной всему был Касперский. Как всегда все портит...
Теперь далее вопрос. Разбив тело на "планарные" элементы, я получил массив точек Point3D:
Dim pointsVert() As Point3d
pointsVert = curElem.ConstructVertexList(dVal) ' dVal=150 (мм?)
Чем можно получить обратно элемент, изменив координаты вершин (например, обнулить Z)?
И что такое VertexList? И для чего ему задавать допуск?
--------------------------------------------------------------------
заранее спасибо. |
|
Вернуться к началу |
|
|
|