Получить габариты детали API7

Автор andykl, 21.09.22, 18:06:11

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

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

andykl

Коллеги, подскажите, пожалуйста!
Требуется получить габариты детали. Воспользовавшись поиском, нашел тему где предлагается для этого использовать IBody7.GetGabarit. Накидал по быстрому следующее:
void GetGab(IModelObjectPtr m_model) {
    if (m_model) {                                           
        IFeature7Ptr feature7(m_model->Owner);
        if (feature7) {
            _variant_t result_bodies(feature7->GetResultBodies());
            if (result_bodies.vt == (VT_DISPATCH)) {
                MessageT(_T("result_bodies: VT_DISPATCH"));
                IBody7Ptr f = result_bodies.pdispVal;
                _bstr_t bname(f->GetName());
                MessageT(_T("Имя тела: " + bname));
                f->GetGabarit(x_1, y_1, z_1, x_2, y_2, z_2);
                _bstr_t xGabaritSize = x_2 - x_1;  // габаритный размер по оси X
                _bstr_t yGabaritSize = y_2 - y_1;  // габаритный размер по оси Y
                _bstr_t zGabaritSize = z_2 - z_1;  // габаритный размер по оси Z
                MessageT(_T("Размеры: X = " + xGabaritSize + "; Y = " + yGabaritSize + "; Z = " + zGabaritSize));
            }
            else if (result_bodies.vt == (VT_ARRAY | VT_DISPATCH)) {
                MessageT(_T("result_bodies: VT_ARRAY | VT_DISPATCH"));
            }
        }
    }
}

Результат x_1, y_1, z_1, x_2, y_2, z_2 = 0.

Читаю справку SDK:
Цитата: undefinedBOOL GetGabarit( double * X1, double * Y1, double * Z1, double * X2, double * Y2, double * Z2 );

Входные параметры:

X1, Y1, Z1, X2, Y2, Z2  - координаты габаритного прямоугольника.
 
Возвращаемое значение: TRUE - успешное завершение, FALSE - в случае неудачи.
 
Примечание: Метод позволяет установить габаритный прямоугольник Панели свойств. Точки задают­ся в относительных координатах окна КОМПАС.


Подозреваю что это что-то не то вообще :o:

p3452

К справке SDK надо приспособится - надо было просмотреть весь список выдаваемый Поиском...
Габариты Детали.png

andykl

Цитата: p3452 от 21.09.22, 20:36:00К справке SDK надо приспособится - надо было просмотреть весь список выдаваемый Поиском...
Габариты Детали.png


Это же API5. попробовал, указатель на IPart получил, но когда делаю part->GetGabarit(FALSE, FALSE, x_1, y_1, z_1, x_2, y_2, z_2) Компас вылетает.
Как получить то же через API7?

Может я вообще не тем путём иду?! Мне требуется построить габаритный параллелепипед в который вписана деталь. Чтобы его построить требуется знать габариты детали, правильно? 8-)

Михаил88

# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache

#  Получи константы
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants

#  Получи API интерфейсов версии 7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(
    Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID,
                                                            pythoncom.IID_IDispatch))
application = kompas_api_object.Application
#  Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iPart7 = kompas_document_3d.TopPart
iFeature7 = kompas_api7_module.IFeature7(iPart7)
iBody7 = iFeature7.ResultBodies
rez, x1, y1, z1, x2, y2, z2 = iBody7.GetGabarit()
print(rez, x1, y1, z1, x2, y2, z2)

Screenshot_1.png
Screenshot_2.png
+ Благодарностей: 1

p3452

- Только для "Тела"

Через ksPart или IPart - для "Компонента".

p3452

Если "плясать" от API7:
Габариты Сборки.png
где
kompasT - это переменная типа KompasObject

andykl

Всем спасибо, проблема была в моей невнимательности.
Метод iBody7->GetGabarit(double * X1, double * Y1, double * Z1, double * X2, double * Y2, double * Z2) принимает параметры по ссылке,
то есть:
f->GetGabarit(&x_1, &y_1, &z_1, &x_2, &y_2, &z_2);

p3452

Цитата: andykl от 25.09.22, 23:45:54Всем спасибо, проблема была в моей невнимательности.
- Еще какой!
Озвучили задачу:
Цитата: andykl от 21.09.22, 18:06:11Требуется получить габариты детали.
И закончили:
Цитата: andykl от 25.09.22, 23:45:54iBody7->GetGabarit(
:-)))
Еще раз прочтите пост (сообщение) №4...

Vi2

Цитата: andykl от 25.09.22, 23:45:54Всем спасибо, проблема была в моей невнимательности.
Ну и как с таким определением и используемым кодом тебя не остановил компилятор с++?

andykl

Цитата: p3452 от 26.09.22, 10:23:15- Еще какой!
Озвучили задачу:И закончили: :-)))
Еще раз прочтите пост (сообщение) №4...

Все правильно, имелось ввиду именно "тело". Я ваш пост видел. Я бы отредактировал формулировку задачи, только я не знаю как😁