Чертеж по модели. Выделенный объект.

Автор Spytnik, 02.03.25, 16:08:18

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

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

Spytnik

Доброго дня.
Необходимо получить контур по выделенной поверхности (для дальнейшего сохранения в dxf и резке на лазере).
Помогите реализовать данный алгоритм.
Смог получить выделенную плоскость детали и создать новый 2D документ.

#Базовый класс документов КОМПАС
iKompasDocument = iApplication.ActiveDocument

Documents = iApplication.Documents
#Базовый класс графических документов КОМПАС
iKompasDocument3D = KAPI7.IKompasDocument3D(iKompasDocument)
iKompasDocument2D = KAPI7.IKompasDocument2D(iKompasDocument)

#Менеджер селектированных объектов
iSelectionManager= iKompasDocument3D.SelectionManager
#Получить плоскость выделенных объектов в виде SAFEARRAY | VT_DISPATCH
SelectedObjects = iSelectionManager.SelectedObjects

#  Создаем новый документ
kompas_document = Documents.AddWithDefaultSettings(const.ksDocumentDrawing, True)


UU

В чем проблема?
Ставится точка и собирается контур.

Spytnik

Цитата: UU от 02.03.25, 19:03:29В чем проблема?
Ставится точка и собирается контур.
Можно немного подробнее. Особенно про точку.

Doom2

А тут есть готовые утилиты, для кого старались ?

Spytnik

Дайте пжлст ссылку, не могу найти.

Lemieux

Цитата: Spytnik от 02.03.25, 16:08:18Доброго дня.
Необходимо получить контур по выделенной поверхности (для дальнейшего сохранения в dxf и резке на лазере).
Помогите реализовать данный алгоритм.
Смог получить выделенную плоскость детали и создать новый 2D документ.

#Базовый класс документов КОМПАС
iKompasDocument = iApplication.ActiveDocument

Documents = iApplication.Documents
#Базовый класс графических документов КОМПАС
iKompasDocument3D = KAPI7.IKompasDocument3D(iKompasDocument)
iKompasDocument2D = KAPI7.IKompasDocument2D(iKompasDocument)

#Менеджер селектированных объектов
iSelectionManager= iKompasDocument3D.SelectionManager
#Получить плоскость выделенных объектов в виде SAFEARRAY | VT_DISPATCH
SelectedObjects = iSelectionManager.SelectedObjects

#  Создаем новый документ
kompas_document = Documents.AddWithDefaultSettings(const.ksDocumentDrawing, True)


Получаете IFace -> LimitedEdges -> Vertex -> Принимаете локальную систему координат -> Переводите координаты вершин в локальные -> По этим данным строите чертёж.

p3452

Цитата: Spytnik от 02.03.25, 16:08:18#Получить плоскость выделенных объектов в виде SAFEARRAY | VT_DISPATCH
SelectedObjects = iSelectionManager.SelectedObjects
?
p/s: Даже скопипастить без ошибок не могут...


Михаил88

Цитата: Spytnik от 02.03.25, 16:08:18Помогите реализовать данный алгоритм.

Можно так сделать. Нужно выделить плоскую грань и запустить.

documents = application.Documents
kompas_document = application.ActiveDocument
if kompas_document is not None:
    document_type = kompas_document.DocumentType
    if document_type == kompas6_constants.ksDocumentPart:
        path_name = kompas_document.PathName
        kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
        part7 = kompas_document_3d.TopPart
        selection_manager = kompas_document_3d.SelectionManager
        selected_object = selection_manager.SelectedObjects
        if isinstance(selected_object, tuple) is False:
            if selected_object.ModelObjectType == kompas6_constants_3d.o3d_face:
                face_definition = kompas_object.TransferInterface(selected_object, kompas6_constants.ksAPI5Auto,
                                                                  kompas6_constants_3d.o3d_face)
                if face_definition.IsPlanar():
                    model_container = kompas_api7_module.IModelContainer(part7)
                    sketchs = model_container.Sketchs
                    sketch = sketchs.Add()
                    part7 = kompas_document_3d.TopPart
                    sketch.Plane = selected_object
                    sketch.Name = "Эскиз:проекция"
                    sketch.Update()

                    kompas_document = sketch.BeginEdit()
                    ks_sketch = kompas_object.TransferInterface(sketch, 1, 0)
                    ks_edge_definition = kompas_object.TransferInterface(selected_object, kompas6_constants.ksAPI5Auto,
                                                                         kompas6_constants_3d.o3d_sketch)
                    ks_sketch.AddProjectionOf(ks_edge_definition)
                    sketch.EndEdit()

                    fragment = documents.Add(kompas6_constants.ksDocumentFragment, False)
                    file_name = f'{path_name[:-4]}.frw'
                    fragment.SaveAs(file_name)
                    fragment.Close(kompas6_constants.kdDoNotSaveChanges)

                    sketch.WriteToFragment(file_name)

                    feature7 = sketch.Owner
                    feature7.Delete()

                    documents.Open(file_name, True, False)
                    application.ExecuteKompasCommand(kompas6_constants.ksCMZoomEntireDocument, False)
+ Благодарностей: 1

p3452

Прекрасно!
А если, проще:
- делаем выделенную плоскость, плоскостью главного вида;
- создаем чертеж с одним главным видом (без оформления, с масштабом вида 1:1);
- сохраняем чертеж как dxf.

Михаил88

#10
Цитата: p3452 от 08.04.25, 20:19:43Прекрасно!
А если, проще:
- делаем выделенную плоскость, плоскостью главного вида;
- создаем чертеж с одним главным видом (без оформления, с масштабом вида 1:1);
- сохраняем чертеж как dxf.

Согласен. Это сразу тоже в голову и пришло. Я так как в 99% работаю с листовыми деталями, так и делаю, вставляю в чертеж вид «Развертка» с параметром «Развертка», далее сохраняю в dxf.
Просто я хотел еще сделать так, чтобы можно было сохранить любую плоскую грань и уже ее контур сохранить во фрагмент.
Типа такого варианта, если, например, выбрать наклонную грань.

Nickeriy

Цитата: p3452 от 08.04.25, 20:19:43Прекрасно!
А если, проще:
- делаем выделенную плоскость, плоскостью главного вида;
- создаем чертеж с одним главным видом (без оформления, с масштабом вида 1:1);
- сохраняем чертеж как dxf.

Поднимаю заглохшую тему. Пару недель назад хотел такое реализовать, нашёл iViewProjectionManager.OrientationNormalTo, но эта функция появилась только в 23 версии, а я работаю в 22-й. Загрустил, забросил. Сегодня что-то меня дёрнуло опять почитать API, и я понял, что можно у iFace в конечном счёте получить 3D матрицу, а по ней создать пользовательский вид.

Поэкспериментировал, вот код для создания вида:
def create_view_byface(name = '#by_face'):
    iKompasDocument = iApplication.ActiveDocument
    if iKompasDocument.DocumentType != ksConst.ksDocumentPart:
        return False
    iKompasDocument3D = KAPI7.IKompasDocument3D(iKompasDocument)
    iKompasDocument3D1 = KAPI7.IKompasDocument3D1(iKompasDocument)
    iViewProjectionManager = iKompasDocument3D1.ViewProjectionManager
    iSelectionManager = iKompasDocument3D.SelectionManager
    selected_obj = iSelectionManager.SelectedObjects
    if not selected_obj:
        iApplication.MessageBoxEx('Ничего не выбрано', 'Ошибка', 0)
    else:
        if isinstance(selected_obj, tuple) or selected_obj.Type != ksConst.ksObjectFace:
            iApplication.MessageBoxEx('Выбран неподходящий объект', 'Ошибка', 0)
        else:
            if not selected_obj.IsPlanar:
                iApplication.MessageBoxEx('Выбрана не плоская грань', 'Ошибка', 0)
            else:
                math_surface = selected_obj.MathSurface
                placement = math_surface.Placement
                matrix = placement.GetMatrix3D()
               
                # Проверяем, есть ли вид с таким именем или создаём заново
                view_by_face = iViewProjectionManager.ViewProjection(name)
                if not view_by_face:
                    view_by_face = iViewProjectionManager.Add()
                    view_by_face.Name = name
                    view_by_face.Scale = 1
                view_by_face.SetMatrix3D(matrix)
                if view_by_face.Update():
                    iKompasDocument3D.RebuildDocument()
                    return view_by_face
    return None

Добавил в свою функцию создание DXF из чертежа по заданному по имени виду и вуаля.
view = create_view_byface()
saveSheetUnfoldDXF(iPart7, prj_name=view.Name)
Если кто найдёт путь короче, буду рад поправить свой код.
+ Благодарностей: 2

p3452

Цитата: Nickeriy от 21.04.26, 05:57:42нашёл iViewProjectionManager.OrientationNormalTo, но эта функция появилась только в 23 версии, а я работаю в 22-й.
И как Мы, до v23, жили? :angel:

ksVPNormalTo - было реализовано в да-а-авние времена...
+ Благодарностей: 1


Nickeriy

Цитата: p3452 от 21.04.26, 09:36:44И как Мы, до v23, жили? :angel:

ksVPNormalTo - было реализовано в да-а-авние времена...

Я же говорил о том, что нашёл простую, но недоступную мне однострочную команду, а не утверждал о единственном решении. Технически, вы можете числа возводить в степень через сложение, но вы же этим не занимаетесь?

>ksVPNormalTo
Прошу раскрыть тезис. В SDK ровно одна статья с этим - константы ksViewProjectionType. Есть что-то проще указания через Matrix3D или Placement?

Цитата: Михаил88 от 21.04.26, 13:46:38https://forum.ascon.ru/index.php?topic=37759.msg306822#msg306822

Вот тема была.

Там буквально тот же метод, что у меня, только ещё и "сползать" в API5 приходится. Я ещё и проверку на правильную грань прописывал.
Так ещё и там же следующим постом проблему "доворачивания" указывают - с матрицей деталь "крутит" под параллели, уж почему не знаю.

Параллельно задам вопрос для следующего этапа - передачи в чертёж.
Вот я создал нужную ориентацию, уже могу сделать чертёж и конвертировать его в DXF.
Повисает желание указывать грань прямо на сборке, а скрипт сам отделял нужную деталь.
Возникает 2 пути: создавать чертёж, переходя в файл детали или в чертеже сборки оставлять видимым только нужное тело/деталь.

Первое я уже реализовал через parent, но пока не решил проблему разных СК - в детали остаётся ориентация из сборки, а построение может отличаться. Если есть решение без трансформации через матрицу размещения детали, то буду благодарен поделившемуся.
Итак, основной вопрос: как программно использовать "показывать выбранные тела" при вставке ассоциативного вида? Очень мне актуально, потому что хочу так извлекать проекции тел из библиотеки металлоконструкций (плиты, косынки и пр.), а они вообще за отдельные детали не считаются.

Gruden

Цитата: Nickeriy от 21.04.26, 15:52:25..., а они вообще за отдельные детали не считаются.
Могу ошибаться, но там - макроэлемент, развалить его на детали или тела.

Михаил88

Цитата: Nickeriy от 21.04.26, 15:52:25Там буквально тот же метод, что у меня, только ещё и "сползать" в API5 приходится.

Я дал ссылку т.к. не у всех может быть ViewProjectionManager
Вот и проходится сползать в API 5 или тольк его и использовать для определенных задач.

Screenshot_2.png

lavgirb

Цитата: Nickeriy от 21.04.26, 15:52:25Итак, основной вопрос: как программно использовать "показывать выбранные тела" при вставке ассоциативного вида? Очень мне актуально, потому что хочу так извлекать проекции тел из библиотеки металлоконструкций (плиты, косынки и пр.), а они вообще за отдельные детали не считаются.
Исключать из расчета в сборке (или временно, или создать вариант/исполнение), тогда и на чертеже не будет мелочевки.
Нет?

Михаил88

Цитата: Nickeriy от 21.04.26, 15:52:25Так ещё и там же следующим постом проблему "доворачивания" указывают
Этот пост писал человек, никаким образом не имеющий отношения к программированию.

Gruden

Цитата: Михаил88 от 21.04.26, 16:20:00Я дал ссылку т.к. не у всех может быть ViewProjectionManager
Вот и проходится сползать в API 5 или тольк его и использовать для определенных задач.
ksViewProjection в V16.1 присутствует и работает.
IViewProjectionManager появился в v22.
+ Благодарностей: 1