Стрелка взгляда.

Автор abvgdeyka, 20.07.26, 16:20:48

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

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

abvgdeyka

Здравствуйте! Столкнулся с непониманием работы функций создания вида по стрелке взгляда.
1) Если после создания стрелки зайти в ее свойства на чертеже и что то изменить, например выставить отображение листа или масштаба, то сама стрелка зеркалится, но текст остается на месте.
2) Не понимаю как связать стрелку непосредственно с видом, раньше вид создавал через vt_Projected (Проекционный вид) и все +- работало, но стрелка была не связана с видом и обозначения вида не было (только наименование), решил сделать по нормальному попробовал выставить vt_Arrow при создании вида, но вид вообще не создается.
3) Не совсем понятно с IViewDesignation в API есть фраза "Для ассоциативных видов изменить ссылку на объект нельзя. Можно только регулировать надпись обозначения вида при помощи флагов.". Может я не так понял, но судя по этой фразе я должен делать все так же как и в vt_Projected, только для vt_Arrow должен подтянуть обозначение со стрелки, но в какой момент (и как) не понятно.

Код, модель и чертеж в архиве. 

abvgdeyka

Через API5 заработало сразу, код оставлю может пригодится кому.
import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject  = kompas_object

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication  = application


Documents = application.Documents
#  Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()
iViewsAndLayersManager = kompas_document_2d.ViewsAndLayersManager
iViews = iViewsAndLayersManager.Views


def get_object_bounds(obj_ref):
    try:
        rect_param = kompas_object.GetParamStruct(kompas6_constants.ko_RectParam)
        result = iDocument2D.ksGetObjGabaritRect(obj_ref, rect_param)
        if result == 1:
            p_bottom = rect_param.GetpBot()
            p_top = rect_param.GetpTop()
            x1, y1 = round(p_bottom.x, 2), round(p_bottom.y, 2)
            x2, y2 = round(p_top.x, 2), round(p_top.y, 2)
            return {
                'x1': x1, 'y1': y1, 'x2': x2, 'y2': y2,
                'dx': round(x2-x1, 2), 'dy': round(y2-y1, 2),
                'center_x': round(x1+(x2-x1)/2, 2),
                'center_y': round(y1+(y2-y1)/2, 2)
            }
        return None
    except:
        return None

# Создаем параметры для ассоциативного вида
AssociationViewParam = kompas6_api5_module.ksAssociationViewParam(kompas_object.GetParamStruct(kompas6_constants.ko_AssociationViewParam))
AssociationViewParam.projBodies = True
AssociationViewParam.projectionLink = False  # Связь можно отключить

left_view = None
main_view = None

print("Поиск видов...")
for View in iViews:
    iView = kompas_api7_module.IView(View)
    print("  {0}".format(iView.Name))
    if iView.Name == 'Вид слева':
        left_view = iView
    if iView.Name == 'Вид сверху':
        main_view = iView

left_bounds = get_object_bounds(left_view.Reference)
main_bounds = get_object_bounds(main_view.Reference)

print("Габариты вида слева:", left_bounds)
print("Габариты вида сверху:", main_bounds)

# Создаем стрелку в виде слева
IViewPointer = None
for View in iViews:
    iView = kompas_api7_module.IView(View)
    if iView.Name == 'Вид слева':
        ISymbols2DContainer = kompas_api7_module.ISymbols2DContainer(iView)
        IDrawingContainer = kompas_api7_module.IDrawingContainer(iView)

        IViewPointers = ISymbols2DContainer.ViewPointers
        IViewPointer = IViewPointers.Add()
        print("Стрелка создана:", IViewPointer)

        IViewPointer.ArrowType = kompas6_constants.ksArrow
        IViewPointer.AutoSheet = False
        IViewPointer.AutoSorted = True
        IViewPointer.AutoZone = False

        # Координаты стрелки (слева от вида слева, направлена вниз)
        IViewPointer.X1 = left_bounds['x1'] - 3 - iView.X
        IViewPointer.X2 = left_bounds['x1'] - 20 - iView.X
        IViewPointer.Y1 = left_bounds['center_y'] - iView.Y
        IViewPointer.Y2 = left_bounds['center_y'] - iView.Y
        IViewPointer.TextX = IViewPointer.X2
        IViewPointer.TextY = IViewPointer.Y2 + 2.5
        IViewPointer.Update()

# Создаем вид по стрелке через API5
print("\nСоздание вида по стрелке...")
arrow_view_ref = iDocument2D.ksCreateSheetArrowView(AssociationViewParam, 0, IViewPointer.Reference)
print("Вид по стрелке создан, ссылка:", arrow_view_ref)

# Ищем созданный вид
arrow_view = None
for View in iViews:
    iView = kompas_api7_module.IView(View)
    if iView.ViewType == kompas6_constants.vt_Arrow:
        arrow_view = iView
        print("Найден вид по стрелке: {0}, тип: {1}".format(iView.Name, iView.ViewType))
        break

if arrow_view:
    # Настраиваем вид
    arrow_view.Name = "Вид снизу"
    arrow_view.Update()

    # Получаем габариты созданного вида
    arrow_bounds = get_object_bounds(arrow_view.Reference)
    if arrow_bounds:
        print("Габариты вида по стрелке ДО перемещения:", arrow_bounds)
        print("Текущая позиция вида: X={0}, Y={1}".format(arrow_view.X, arrow_view.Y))

        # Вычисляем правильное смещение
        # Центрируем вид относительно вида сверху
        target_center_x = main_bounds['center_x']
        current_center_x = arrow_bounds['center_x']

        # Смещение по X: разница между целевым центром и текущим центром
        offset_x = target_center_x - current_center_x

        # Смещение по Y: размещаем под видом сверху с отступом 30 мм
        target_y2 = main_bounds['y1'] - 30  # Верхняя граница нового вида
        current_y2 = arrow_bounds['y2']     # Текущая верхняя граница

        offset_y = target_y2 - current_y2

        print("Смещение: offset_x={0}, offset_y={1}".format(offset_x, offset_y))

        # Применяем смещение к позиции вида
        new_x = arrow_view.X + offset_x
        new_y = arrow_view.Y + offset_y

        print("Новая позиция вида: X={0}, Y={1}".format(new_x, new_y))

        arrow_view.X = new_x
        arrow_view.Y = new_y
        arrow_view.Update()

        # Проверяем финальные габариты
        final_bounds = get_object_bounds(arrow_view.Reference)
        if final_bounds:
            print("Финальные габариты вида по стрелке:", final_bounds)
            print("Финальная позиция вида: X={0}, Y={1}".format(arrow_view.X, arrow_view.Y))

            # Проверяем выравнивание
            print("\nПроверка выравнивания:")
            print("  Центр вида сверху X: {0}".format(main_bounds['center_x']))
            print("  Центр вида снизу X: {0}".format(final_bounds['center_x']))
            print("  Разница центров: {0} мм".format(abs(main_bounds['center_x'] - final_bounds['center_x'])))
            print("  Нижняя граница вида сверху Y: {0}".format(main_bounds['y1']))
            print("  Верхняя граница вида снизу Y: {0}".format(final_bounds['y2']))
            print("  Отступ между видами: {0} мм".format(abs(main_bounds['y1'] - final_bounds['y2'])))

    # Настройка обозначения вида
    try:
        IViewDesignation = kompas_api7_module.IViewDesignation(arrow_view)
        IViewDesignation.ShowAngle = False
        IViewDesignation.ShowName = True
        IViewDesignation.ShowPage = False
        IViewDesignation.ShowScale = True
        IViewDesignation.ShowTurn = False
        IViewDesignation.ShowUnfold = False
        IViewDesignation.ShowZone = False
        arrow_view.Update()

        print("\nОбозначение вида: [{0}]".format(IViewDesignation.Designation))
    except:
        print("\nНе удалось настроить обозначение вида")

print("\nГотово! Вид по стрелке создан и правильно позиционирован.")
+ Благодарностей: 1