Как получить габариты детали?

Автор А8208, 14.10.11, 11:05:08

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

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

А8208

Здравствуйте!
Небходимо получить габаритные размеры 3D детали пытаюсь сделать примерно так:
If Kompas Is Nothing Then
            Kompas = CreateObject("KOMPAS.Application.7")
            If Not Kompas Is Nothing Then
                Kompas.Visible = True
                'Проверка соответствия пути
                ReDim Stroki_print(1)
                i = 0
                j = 0
                'Цикл обработки списка чертежей использованных в КД
                For a = 1 To UBound(Spisok_oboznach, 1)
                    Filename = Spisok_oboznach(a)
                    For i = 0 To UBound(coll) 'Count - 1
                        j = InStr(1, coll(i), Filename) 'поиск совпадений в строке из списка коллекции с нужным файлом
                        If j <> 0 Then
                            'ОТКРЫТИЕ ДОКУМЕНТА ДЛЯ СЧИТЫВАНИЯ ИНФОРМАЦИИ
                            Kompas.HideMessage = Kompas6Constants.ksHideMessageEnum.ksHideMessageYes
                            Dim Document3D As IKompasDocument 'Documents
                            Document3D = Kompas.Documents.Open(coll(i))
                            Document3D.Active
                            Dim iKompasObject As Object 'KompasObject
                            Dim iDocument3D As Object 'ksDocument3D
                            iKompasObject = Kompas
                            iDocument3D = iKompasObject.iActiveDocument3D





                            Dim Body As IDocument3D
                            'Body = Kompas.ActiveDocument(IGetActive3dDocument())

                            Dim x1, x2, y1, y2, z1, z2 As Double
                            Body.GetGabarit(X1:=x1, Y1:=y1, Z1:=z1, X2:=x2, Y2:=y2, Z2:=z2)

Пытался получить тип IBody7 из объекта "Kompas" выдаёт ошибку.
Подскажите, пожалуйста, как добраться до габаритного размера детали.

Сначала Вам нужно получить IPart7 -> IFeature7 -> IBody7 вроде, как-то так подробнее читайте в SDK.


А8208

Так вот именно на этапе получения IPart7 и возникают проблема в виду малого опыта програмирования.

На Delphi так

var
  doc : IKompasDocument;
  doc3d : IKompasDocument3D;
  part7 : IPart7;
begin
  if doc <> nil then
  begin
    // Получаем документ 3D
    doc3d := doc As IKompasDocument3D;
    if doc3d <> nil then
    begin
      // Получаем верхний компонент
      part7 := doc3d.TopPart;
      if part7 <> nil then
        ...
    end;
  end;
end;

Вячеслав_К


Dim iDoc3D As Kompas6API5.ksDocument3D = iKompas.ActiveDocument3D
Dim iPart As Kompas6API5.ksPart = iDoc3D.GetPart(Kompas6Constants3D.Part_Type.pTop_Part)
Dim X1, Y1, Z1, X2, Y2, Z2 As Double 'координаты первой и второй точки габаритного параллелепипеда
If iPart.GetGabarit(False, False, X1, Y1, Z1, X2, Y2, Z2) Then 'координаты получены
    XGabaritSize = X2 - X1 'габаритный размер по оси X
    YGabaritSize = Y2 - Y1 'габаритный размер по оси Y
    ZGabaritSize = Z2 - Z1 'габаритный размер по оси Z
Else
    XGabaritSize = 0
    YGabaritSize = 0
    ZGabaritSize = 0
End If



А8208

Спасибо!
Всё работает!
А в API7 как реализовывается получение габаритов детали?

Kilia

Оживлю тему,
Габарит получается относительно стандартной(системной) системы координат - ССК. А можно как-то относительно вставленной ЛСК?
Просто получается что если тело повёрнуто относительно ССК на какой-то угол, то габарит выдаёт не верный...

Lemieux

Цитата: Kilia от 24.04.25, 23:04:00Просто получается что если тело повёрнуто относительно ССК на какой-то угол, то габарит выдаёт не верный...
Умножали полученные точки на матрицу трансформации?

Kilia



Lemieux

Цитата: Kilia от 25.04.25, 13:08:32Об этом речь? https://help.ascon.ru/KOMPAS_SDK/23/ru-RU/ksdocument2d_ksmtr.html?q=матрица+трансформаци
Нет. Речь про матрицу трансформации. Нужную информацию я Вам дал. Дальше сами покопайте.

Kilia

Я попробовал:
iPart7 = iKompasDocument3D.TopPart
iLocalCoordinateSystems = API7.IAuxiliaryGeomContainer(iPart7).LocalCoordinateSystems
iLocalCoordinateSystem = iLocalCoordinateSystems.LocalCoordinateSystem(0)
iPlacement3D = API7.IPlacement3D(iLocalCoordinateSystem)
matrix_LSK = iPlacement3D.GetMatrix3D()

print(f'iLocalCoordinateSystem.Name: {iLocalCoordinateSystem.Name}')
print(f'matrix_LSK: {matrix_LSK}')

Получаю
iLocalCoordinateSystem.Name: ЛСК:1
matrix_LSK: 0

Подскажите, пожалуйста, что делаю не так?

Lemieux

Цитата: Kilia от 25.04.25, 15:38:10Я попробовал:
iPart7 = iKompasDocument3D.TopPart
iLocalCoordinateSystems = API7.IAuxiliaryGeomContainer(iPart7).LocalCoordinateSystems
iLocalCoordinateSystem = iLocalCoordinateSystems.LocalCoordinateSystem(0)
iPlacement3D = API7.IPlacement3D(iLocalCoordinateSystem)
matrix_LSK = iPlacement3D.GetMatrix3D()

print(f'iLocalCoordinateSystem.Name: {iLocalCoordinateSystem.Name}')
print(f'matrix_LSK: {matrix_LSK}')

Получаю
iLocalCoordinateSystem.Name: ЛСК:1
matrix_LSK: 0

Подскажите, пожалуйста, что делаю не так?
iPart7.GetSummMatrix что показывает? И зачем вы берёте МТ ЛСК? Вам нужно пространство модели.

Kilia

Цитата: Lemieux от 25.04.25, 15:47:54iPart7.GetSummMatrix что показывает? И зачем вы берёте МТ ЛСК? Вам нужно пространство модели.

<bound method IPart7.GetSummMatrix of <win32com.gen_py.69AC2981-37C0-4379-84FD-5DD2F3C0A520x0x1x0.IPart7 instance at 0x1825073995824>>

Мне нужно получить правильный габарит тела относительно моей ЛСК, и получается матрицу трансофрмации я должен взять от ЛСК ведь?
 
UPD:
извиняюсь сразу не въехал

Суммарная матрица преобразования:
[1.0, 0.0, 0.0, 0.0]
[0.0, 1.0, 0.0, 0.0]
[0.0, 0.0, 1.0, 0.0]
[0.0, 0.0, 0.0, 1.0]

Lemieux

Сначала не подумал об этой засаде, а потом как подумал! Тут посложнее.

Lemieux

Теперь вопрос. Зачем так делать?

Lemieux

А теперь картинко-ребус.
Screenshot 2025-04-25 161237.png
Screenshot 2025-04-25 161228.png
Screenshot 2025-04-25 161256.png
Screenshot 2025-04-25 161251.png

Правильный ответ - API КОМПАС днище. Как видим из скринов, при входе в режим редактирования операции "Изменить положение" создаётся ещё какая-то ЛСК, к которой нельзя получить доступ. На этом мои полномочия всё © В очередной раз КОМПАС подтвердил, что это днищенский продукт.

Конечно, если у Вас всегда будут листовые тела, то можно придумать костыли, но...

Lemieux

Короче, батхерт случился у меня. Добраться до этой СК можно. И тут нужно танцевать с бубном.

Kilia

Цитата: Lemieux от 25.04.25, 16:26:48Короче, батхерт случился у меня. Добраться до этой СК можно. И тут нужно танцевать с бубном.
подскажете как?

Lemieux

Короче, добраться можно, но от этого легчен не становится. Спасибо вам, разработчики API КОМПАС!