Пост N: 445
Откуда: Россия, Новосибирск
Рейтинг:
2
Отправлено: 19.10.07 08:34. Заголовок: Клиентская панель в браузере Инвентора
При создание пользовательской панели в браузере Инвентора используется функция (пример описан в хелпе Инвентора достаточно полно), используется функция: 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 номером которой УЖЕ есть в документе приводит к ошибке его создания. Заранее благодарю.
Пост N: 334
Откуда: Россия, Московская область
Рейтинг:
0
Отправлено: 19.10.07 14:36. Заголовок: Re:
Может быть воспользоваться циклом? Перехватывать ошибку, увеличивать ID, перехватывать ошибку... до тех пор, пока операция не пройдет без ошибки. Этот номер ID и будет (точнее, был) первым свободным.
Пост N: 446
Откуда: Россия, Новосибирск
Рейтинг:
2
Отправлено: 19.10.07 17:16. Заголовок: Re:
brigval спасибо за ответ. Я попробую воспользоваться данным советом, главное что бы это не привело к временным задержкам (правдо они должны быть минимальны).Честно говоря как то перебирать (конечно в практике 5 -6 id не так и долго) на err как то обидно, хотя и в данном случае , наверно единственно правильно (щас попробую)) Спасибо. Обидно что нет функции по освобождению ресурса , это происходит при закрытиии открытии вновь , данного документа, но как то это не совсем устраивает. При Update документа и всех его Documents ошибка присутствует. Update (где возможно) всех составляющих Panels ничего не дает. Из за отсутствия открытой функции по определению таких идентификаторов ( это затрагивает, например к слову и объект Атрибуты и другие объекты с пользовательскими возможностями) очень ограничивает использование API Инвентора , и складывается такое впечатление что Доска (ну просто из за не "профессиональности" (за этим словом каждый может видеть свою проблему)) при каждом выходе нового релиза "чуть - чуть" приоткрывает внутренний код наружу, и кстати не всегда профессионально {ну в плане использованных функций}. Обидно сравнивать даже рядом , возможности доступа к объектам в среде development SW и Доски. Чисто сумбурно , но просто наболело. Спасибо.
Пост N: 447
Откуда: Россия, Новосибирск
Рейтинг:
2
Отправлено: 19.10.07 18:32. Заголовок: Re:
brigval Еще раз огромное спасибо за совет, попробовал, на цикле While ..... <> err , все прекрасно работает , итерация на сборке с 12 панелями (в подсборках) не выявило временной задержки (итерация по id как Long = всего 12 (столько набролось id ClientBrowserdefinition в подсборках ) ). Еще раз спасибо. Удалось создать динамическую панель в браузере Инвентора как пользовательскую с представление подключаемых Документов ( через dll как ActiveX обьект Client панели браузера). А вот Атрибуты Nodes (их перебор и нахождение KeyReference) заметно тормозят. Как то от Атрибутов (точнее определение их Reference как альтернатива связи с AutoCad блоками ) придется отказаться. Всего хорошего!
По поводу генерации уникальных (на самом деле, конечно же, практически уникальных) последовательностей символов уже все решено. Есть такая вещь на платформе 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
Все даты в формате GMT
3 час. Хитов сегодня: 3
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация вкл, правка нет