• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Регистрация будет доступна с 8:00 (мск) 12 января.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

VBA (Excel) Чтение и Запись в Чертеж КОМПАСа

Автор Валерич, 04.03.26, 13:50:21

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Валерич

Добрый день!
Прошу советов по Теме...
Как из чертежа КОМПАСА считать данные: тип 2D-документа, имя файла, активный лист, количество видов, количество сборок и деталей в активном виде, путь к файлу каждой сборки, детали и т.д.?
Через API 5, получаю пустые структуры.
Пожалуйста, посмотрите прикрепленные файлы.
Текст модуля вставить не могу, некорректно отображаются комментарии на русском.
Т.к. на рабочем ПК нет доступа к реестру (к CP1251), из средств программирования - только VBA.

Спасибо!

Student2025

Цитата: Валерич от 04.03.26, 13:50:21Текст модуля вставить не могу, некорректно отображаются комментарии на русском.

Как вариант пользоваться - https://involta.ru/tools/decoder/

p3452

Цитата: Валерич от 04.03.26, 13:50:21Прошу советов по Теме...
Не помешало бы перечитать Справку API по используемым функциям...

Михаил88


Валерич

А есть ли у кого-то, конкретные примеры по теме?

Михаил88


Валерич


Михаил88

У меня в основном все через API7, если найду на API5, то пришлю.

Валерич

Цитата: Михаил88 от 04.03.26, 15:00:04У меня в основном все через API7, если найду на API5, то пришлю.


Спасибо!
Можно на API7...
Мне главное понять, как работать с интерфейсом.
В SDK, очень запутано.
Например, какому типу данных присваивать указатель на свойство интерфейса?

Михаил88

+ Благодарностей: 1

Михаил88

такой есть пример на python

ks_ViewParam = kompas_object.GetParamStruct(8)
ks_document2d = kompas_object.ActiveDocument2D()
ks_Iterator = kompas_object.GetIterator()
ks_Iterator.ksCreateIterator(123, 0)
ref_obj = ks_Iterator.ksMoveIterator("F")
if ref_obj != 0:
    while ref_obj != 0:
        ref_obj = ks_Iterator.ksMoveIterator("N")
        if ref_obj != 0:
            print('****' * 10)
            ks_document2d.ksGetObjParam(ref_obj, ks_ViewParam, -1)
            print("Имя вида:", ks_ViewParam.name)
            print("Масштаб вида:", ks_ViewParam.scale_)
            print("Угол поворота:", ks_ViewParam.angle)
            print("Цвет вида:", ks_ViewParam.color)
            print("Масштаб вида:", ks_ViewParam.scale_)
            print("Состояние вида:", ks_ViewParam.state)
            print("Координаты точки привязки по x:", ks_ViewParam.x)
            print("Координаты точки привязки по y:", ks_ViewParam.y)

ks_Iterator.ksDeleteIterator()

Результат итерации по видам

****************************************
Имя вида: Спереди 1
Масштаб вида: 0.4
Угол поворота: 0.0
Цвет вида: 0
Масштаб вида: 0.4
Состояние вида: 3
Координаты точки привязки по x: 156.51904072816706
Координаты точки привязки по y: 164.9981072005942
****************************************
Имя вида: Проекционный вид 2
Масштаб вида: 0.4
Угол поворота: 0.0
Цвет вида: 0
Масштаб вида: 0.4
Состояние вида: 0
Координаты точки привязки по x: 156.51904072816706
Координаты точки привязки по y: 148.1866890270187
****************************************
Имя вида: Проекционный вид 3
Масштаб вида: 0.4
Угол поворота: 0.0
Цвет вида: 0
Масштаб вида: 0.4
Состояние вида: 0
Координаты точки привязки по x: 193.411944771241
Координаты точки привязки по y: 164.9981072005942
****************************************
Имя вида: Проекционный вид 4
Масштаб вида: 0.4
Угол поворота: 0.0
Цвет вида: 0
Масштаб вида: 0.4
Состояние вида: 0
Координаты точки привязки по x: 118.97654101914948
Координаты точки привязки по y: 164.9981072005942
****************************************
Имя вида: Проекционный вид 5
Масштаб вида: 0.4
Угол поворота: 0.0
Цвет вида: 0
Масштаб вида: 0.4
Состояние вида: 0
Координаты точки привязки по x: 156.51904072816706
Координаты точки привязки по y: 212.99784182920038
****************************************
Имя вида: Проекционный вид 6
Масштаб вида: 0.4
Угол поворота: 0.0
Цвет вида: 0
Масштаб вида: 0.4
Состояние вида: 0
Координаты точки привязки по x: 234.30484881431488
Координаты точки привязки по y: 164.9981072005942
****************************************
Имя вида: Изометрия 7
Масштаб вида: 0.4
Угол поворота: 0.0
Цвет вида: 0
Масштаб вида: 0.4
Состояние вида: 0
Координаты точки привязки по x: 231.18032630512926
Координаты точки привязки по y: 225.0475923852849
+ Благодарностей: 1

Михаил88

API7 VBA

Sub Test2()

Dim application As KompasAPI7.IApplication
Dim kompas_document As KompasAPI7.IKompasDocument
Dim doc_type As String
Dim doc_path As String


Set application = GetObject(, "Kompas.Application.7")
Set kompas_document = application.ActiveDocument

'ksDocumentUnknown 0 Неизвестный тип
'ksDocumentDrawing 1 Чертеж
'ksDocumentFragment 2 Фрагмент
'ksDocumentSpecification 3 Спецификация
'ksDocumentPart 4 Деталь
'ksDocumentAssembly 5 сборка
'ksDocumentTextual 6 Текстовый документ
'ksDocumentTechnologyAssembly 7 Технологическая сборка

doc_type = kompas_document.DocumentType()
doc_path = kompas_document.Path
doc_path = kompas_document.PathName

End Sub
+ Благодарностей: 1

Михаил88

API7 Python

kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iViewsAndLayersManager = kompas_document_2d.ViewsAndLayersManager
print(iViewsAndLayersManager)
iViews = iViewsAndLayersManager.Views
# Koличество видов
print(iViews.Count)
# Получить вид
view = iViews.View(1)
# получить ассоциативный вид
iAssociationView = kompas_api7_module.IAssociationView(view)
print(iAssociationView)
# Полное имя файла-источника
source_file_name = iAssociationView.SourceFileName
print(source_file_name)

+ Благодарностей: 1

p3452

"Не в коня, корм!"...
ТС .png

Вот о чем конкретно речь:
iVar.longVal = iDocument2D.ksGetObjParam(1, iDocPar, -1)
Смотрим Справку:
Функция:
long ksGetObjParam (long reference,
LPDISPATCH param,
long paramType);
Параметры:
reference  - указатель на объект.
param - указатель на интерфейс параметров
paramType -  тип параметров объекта
при ЭТОМ еще и удивляется, что получает пустые строки...

Михаил88

Цитата: Валерич от 04.03.26, 13:50:21количество сборок и деталей в активном виде, путь к файлу каждой сборки, детали и т.д.?

Вот тут нужно, чтобы Вы пояснили. А пока можете посмотреть в сторону IProductDataManager.

Михаил88

Цитата: p3452 от 04.03.26, 15:59:50Вот о чем конкретно речь:
Код Выделить Развернуть
iVar.longVal = iDocument2D.ksGetObjParam(1, iDocPar, -1)Смотрим Справку:

Тоже сразу обратил на это внимание. Уже скинул пример, где поясняется этот момент.
Он пока еще не разобрался.
+ Благодарностей: 1

Михаил88

Вот такой еще пример недавно писал, можете посмотреть, чтобы лучше разобраться.
Заполнение основной надписи в чертеже.
Sub FillName()

Dim application As KompasAPI7.IApplication
Dim kompas_document As KompasAPI7.IKompasDocument
Dim layout_sheets As KompasAPI7.LayoutSheets
Dim layout_sheet As KompasAPI7.LayoutSheet
Dim stamp As KompasAPI7.IStamp
Dim Text As KompasAPI7.Text
Dim text_lines As Variant
Dim text_line As KompasAPI7.TextLine
Dim text_item As KompasAPI7.TextItem
Dim text_font As KompasAPI7.TextFont
Dim height As Double
Dim str As String

height = 7
 
Set application = GetObject(, "Kompas.Application.7")
Set kompas_document = application.ActiveDocument
Set layout_sheets = kompas_document.LayoutSheets
Set layout_sheet = layout_sheets.Item(0)
Set stamp = layout_sheet.stamp
Set Text = stamp.Text(1)
Set text_font = text_item
Set text_line = Text.Add
Set text_item = text_line.Add
Set text_font = text_item
text_font.height = height
text_font.FontName = "GOST type B"
text_item.str = "Наименование_" & height
text_item.Update
stamp.Update

End Sub
+ Благодарностей: 1

Student2025

В VBA не обязательно указывать типы объектов что бы сэкономить время, так же работает и WSH.

Sub Test2()
    Dim dynamicObjKompasApi5
    Dim dynamicTypeDoc
   
    Dim dynamicDoc2D
   
    'получить api 5
    Set dynamicObjKompasApi5 = GetObject(, "Kompas.Application.5")
    'получить тип активного документа
    dynamicTypeDoc = dynamicObjKompasApi5.ksGetDocumentType(0)
    'если 2Д документ то получаем его интерфейс
    If dynamicTypeDoc = 1 Then
        Set dynamicDoc2D = dynamicObjKompasApi5.ActiveDocument2D
       
        'и выводим информацию
    End If
End Sub
+ Благодарностей: 1

Student2025

И да - правило хорошего тона рекомендуется освобождать занятую память:

Set dynamicObjKompasApi5 = Nothing

возможно:

Declare PtrSafe Sub CoFreeUnusedLibraries Lib "ole32.dll" ()

'Принудительный запуск очистки
CoFreeUnusedLibraries
+ Благодарностей: 1

Петрович-47

Цитата: Михаил88 от 04.03.26, 16:39:48Вот такой еще пример недавно писал, можете посмотреть, чтобы лучше разобраться.
Заполнение основной надписи в чертеже...

Что-то Михаил88, Ваш код не работает...
Во первых, пока не убрал из объявлений типы, ВБА ругался, что пользовательские типы не определены, откуда их взять?
Во вторых, у объекта "text_font" нет свойства "height"
и вообще он является копией объекта "text_item", строкой выше происходит определение "Set text_font = text_item", может чего-то не хватает?
Ну и при остановке Эксель валится напрочь