Добавление пользовательской ориентации детали, параллельной одной из её граней

Автор ТрындецЪ, 12.05.23, 22:06:58

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

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

ТрындецЪ

Задача: добавить в список ориентаций 3d-модели пользовательскую ориентацию, которая ориентирует деталь таким образом, что определённая грань становится параллельна плоскости экрана. Нужно это для последующего создания 2d вида по этой ориентации.
Имеем: интерфейс грани IFaceDefinition

Как это реализуется вручную:
- выделяется мышью грань (грань подсвечивается зелёным);
- запускается команда "Нормально к..." (КОМПАС разворачивает модель, грань становится параллельна экрану);
- выбирается Вид/Ориентация модели/Настройка ориентации (открывается панель Парамеры "Ориентация вида");
- нажимаем на кнопку с иконкой "+" (в списке "Сохраненные виды" появляется новая пользовательская ориентация "Вид:1");
- закрываем панель Параметры.

Вират Лакх

Этот код устанавливает изометрию с осью Y вверх.
from win32com.client import gencache
import pythoncom

api5 = gencache.EnsureModule('{0422828C-F174-495E-AC5D-D31014DBBE87}', 0, 1, 0)
KompasObject = api5.KompasObject(pythoncom.connect('Kompas.Application.5'))

ksDocument3D = KompasObject.ActiveDocument3D() # Интерфейс документа-модели
ksViewProjectionCollection = ksDocument3D.GetViewProjectionCollection() # Интерфейс массива проекций отображения модели в окне
ksViewProjectionCollection.viewProjectionScheme = 2 # Текущая схема ориентаций модели; Y-аксонометрия = 2
ksViewProjection = ksViewProjectionCollection.GetByIndex(7) # Получить указатель на элемент массива по индексу
ksViewProjection.SetCurrent() # Установить данную проекцию отображения модели в окне текущей
У SetCurrent написано: "Для проекции с индексом vp_NormalTo необходимо, чтобы в модели был выбран хотя бы один плоский объект."
Добавить новую проекцию с помощью Add или NewViewProjection из ksViewProjectionCollection
Надо как-то связать IFaceDefinition с ksViewProjection
+ Благодарностей: 1

ТрындецЪ

Сам решил так.

# -*- coding: utf-8 -*-
# Создаёт пользовательскую ориентацию в модели, параллельную выделенной плоской грани

import pythoncom
from win32com.client import Dispatch, gencache

KAPI = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
iKompasObject = KAPI.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(KAPI.KompasObject.CLSID, pythoncom.IID_IDispatch))

KAPI7 =  gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
api = KAPI7.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(KAPI7.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
iApplication = api.Application

iDocument = iApplication.ActiveDocument
iKompasDocument3D = KAPI7.IKompasDocument3D(iDocument)
ksDocument3D = iKompasObject.ActiveDocument3D()

# От выделенной грани получаем интерфейс локальной системы координат (положение объекта)
SelectionManager = iKompasDocument3D.SelectionManager
SelectedObjects = SelectionManager.SelectedObjects
# переводим интерфейс грани из API7 в API5
ksFaceDefinition = KAPI.ksFaceDefinition(iKompasObject.TransferInterface(SelectedObjects, 1, 0))
ksSurface = ksFaceDefinition.GetSurface()
ksPlaneParam = ksSurface.GetSurfaceParam()
ksPlacement = ksPlaneParam.GetPlacement()

# Интерфейс коллекции проекций отображения модели
ksViewProjectionCollection = ksDocument3D.GetViewProjectionCollection()
# Добавить новую проекцию
ksViewProjection = ksViewProjectionCollection.NewViewProjection()
# Имя проекции
ksViewProjection.name = 'Проекция 1'
# Установить систему координат отображения модели в окне
ksViewProjection.SetPlacement (ksPlacement)
# Добавить элемент в конец массива
ksViewProjectionCollection.Add(ksViewProjection)\
# Установить ориентацию текущей
ksViewProjection.SetCurrent()

# обновить коллекцию ориентаций (не разбирался, в каких случаях это надо применять)
#iViewProjectionCollection.refresh()
+ Благодарностей: 2

СВ

Цитата: ТрындецЪ от 12.05.23, 22:06:58Задача: добавить в список ориентаций 3d-модели пользовательскую ориентацию, которая ориентирует деталь таким образом, что определённая грань становится параллельна плоскости экрана. Нужно это для последующего создания 2d вида по этой ориентации.
...
Бывает нужно в некоторых случаях доворачивать деталь, чтобы какое-то ребро "определённой грани" было определённым образом расположено?
Например, при нажатии на Нормально к ... получилось так (пример условный):

Доворот грани -1.png

а нам нужно так:

Доворот грани -2.png

(или наоборот).
Может, добавить программе чуточку универсальности?