Форум » Программирование в Autodesk Inventor|VBA, iPart, iFeature » Клиентская панель в браузере Инвентора » Ответить

Клиентская панель в браузере Инвентора

Витек: При создание пользовательской панели в браузере Инвентора используется функция (пример описан в хелпе Инвентора достаточно полно), используется функция: Public Function CreateBrowserNodeDefinition( _ ByVal Label As String, _ ByVal Id As Long, _ ByVal Icon As ClientNodeResource, _ Optional ByVal ToolTipText As Variant, _ Optional ByVal ExpandedIcon As Variant, _ Optional ByVal StateIcon As Variant, _ Optional ByVal StateIconToolTipText As Variant _ ) As ClientBrowserNodeDefinition В ней вторым параметром идет id уникальный номер (идентификатор) принадлежащий исходному документу. Вопрос Как (какой функцией) програмно узнать все пользовательские id уже примененые (которые уже принадлежат данному документу) Простой выбор из списка ClientBrouserNodeDefinition дает только все id документа верхнего уровня , и если имеется (для сборки) подсборка с такойже клиентской панелью , доступ к ее параметрам (возможен) но затруднен (большой временной). Должна же быть функция (типа глобальная) которая возращает скмество всех id (идентификаторов) задействованных в документе. При попытке создать пользовательский ресурс (Definition) с id номером которой УЖЕ есть в документе приводит к ошибке его создания. Заранее благодарю.

Ответов - 6

brigval: Может быть воспользоваться циклом? Перехватывать ошибку, увеличивать ID, перехватывать ошибку... до тех пор, пока операция не пройдет без ошибки. Этот номер ID и будет (точнее, был) первым свободным.

Витек: brigval спасибо за ответ. Я попробую воспользоваться данным советом, главное что бы это не привело к временным задержкам (правдо они должны быть минимальны).Честно говоря как то перебирать (конечно в практике 5 -6 id не так и долго) на err как то обидно, хотя и в данном случае , наверно единственно правильно (щас попробую)) Спасибо. Обидно что нет функции по освобождению ресурса , это происходит при закрытиии открытии вновь , данного документа, но как то это не совсем устраивает. При Update документа и всех его Documents ошибка присутствует. Update (где возможно) всех составляющих Panels ничего не дает. Из за отсутствия открытой функции по определению таких идентификаторов ( это затрагивает, например к слову и объект Атрибуты и другие объекты с пользовательскими возможностями) очень ограничивает использование API Инвентора , и складывается такое впечатление что Доска (ну просто из за не "профессиональности" (за этим словом каждый может видеть свою проблему)) при каждом выходе нового релиза "чуть - чуть" приоткрывает внутренний код наружу, и кстати не всегда профессионально {ну в плане использованных функций}. Обидно сравнивать даже рядом , возможности доступа к объектам в среде development SW и Доски. Чисто сумбурно , но просто наболело. Спасибо.

Витек: brigval Еще раз огромное спасибо за совет, попробовал, на цикле While ..... <> err , все прекрасно работает , итерация на сборке с 12 панелями (в подсборках) не выявило временной задержки (итерация по id как Long = всего 12 (столько набролось id ClientBrowserdefinition в подсборках ) ). Еще раз спасибо. Удалось создать динамическую панель в браузере Инвентора как пользовательскую с представление подключаемых Документов ( через dll как ActiveX обьект Client панели браузера). А вот Атрибуты Nodes (их перебор и нахождение KeyReference) заметно тормозят. Как то от Атрибутов (точнее определение их Reference как альтернатива связи с AutoCad блоками ) придется отказаться. Всего хорошего!


brigval: Витек Я тоже заметил, что узлы браузера обрабатываются довольно медленно.

Ab: По поводу генерации уникальных (на самом деле, конечно же, практически уникальных) последовательностей символов уже все решено. Есть такая вещь на платформе Windows, как GUID - глобальный унифицированный идентификатор. Каждый раз при его генерации образуется уникальная последовательность символов и букв (что-то вроде 1596574F-9EE1-4439-854B-DF503099CEAE - наверняка видели в реестре). Type GUID l1 As Long l2 As Long l3 As Long l4 As Long End Type Declare Function CoCreateGuid Lib "OLE32.DLL" (lpGuid As GUID) As Long Declare Function StringFromGUID2 Lib "OLE32.DLL" (lpGuid As GUID, ByVal lpString As String, ByVal cbBytes As Integer) As Integer Public Function MakeGuid() As String Dim id As GUID Dim sTemp$ Dim nLen%, hr& hr = CoCreateGuid(id) If (hr = 0) Then sTemp = StrConv(String(38, Chr(0)), vbUnicode) StringFromGUID2 id, sTemp, Len(sTemp) sTemp = StrConv(sTemp, vbFromUnicode) MakeGuid = sTemp End If End Function Public Sub testGuid() Debug.Print MakeGuid End Sub немного другой пример: Благодаря ф-ции CoCreateGuid из Microsoft OLE библиотеки ole32.dll можно гуиды даже в Екселе генерить (VBA макросом): Option Explicit Option Compare Binary Public Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(7) As Byte End Type Public Declare Function StringFromGUID2 Lib "ole32.dll" _ (rclsid As GUID, ByVal lpsz As Long, ByVal cbMax As Long) As Long Public Declare Function CoCreateGuid Lib "ole32.dll" _ (rclsid As GUID) As Long Public Function StGuidGen() As String Dim rclsid As GUID If CoCreateGuid(rclsid) = 0 Then StGuidGen = StGuidFromGuid(rclsid) End If End Function Public Function StGuidFromGuid(rclsid As GUID) As String Dim rc As Long Dim stGuid As String stGuid = String$(40, vbNullChar) rc = StringFromGUID2(rclsid, StrPtr(stGuid), Len(stGuid) - 1) StGuidFromGuid = Left$(stGuid, rc - 1) End Function

Витек: Ab Cпасибо, за пример. Нужно попробовать, но напрямую это не совсем то.



полная версия страницы