# -*- coding: utf-8 -*-
#|L_Edit

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH

#  Подключим константы API Компас
const_2d = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
const_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

#  Подключим описание интерфейсов API5
kapi_5 = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
iKompas_5 = kapi_5.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kapi_5.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject = iKompas_5

#  Подключим описание интерфейсов API7
kapi_7 = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
iApplication_7 = kapi_7.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kapi_7.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication = iApplication_7


iDocuments_7 = iApplication_7.Documents
#  Получим активный документ
iDocument_7 = iApplication_7.ActiveDocument
iDocument1_7 = kapi_7.IKompasDocument1(iDocument_7)
iDocument2D_7 = kapi_7.IKompasDocument2D(iDocument_7)
iDocument2D_5 = iKompas_5.ActiveDocument2D()
iDocument2D1_7 = kapi_7.IKompasDocument2D1(iDocument_7)

# Функция запроса позиций
def pointQ(strP):
    iVr1 = 0
    iVr2 = 0

    iRequestInfo_5 = kapi_5.ksRequestInfo(iKompas_5.GetParamStruct(const_2d.ko_RequestInfo))
    iRequestInfo_5.Init()
    iRequestInfo_5.prompt = strP

    iPhantom_5 = kapi_5.ksPhantom(iKompas_5.GetParamStruct(const_2d.ko_Phantom))
    iPhantom_5.Init()

    iRet = iDocument2D_5.ksCursor (iRequestInfo_5, iVr1, iVr2, iPhantom_5)
    p = [iRet[1], iRet[2]]
    return p

# Функция запроса объекта
def objectQ(strP):
    # Запрашиваем точку около объекта
    pointObj = pointQ(strP)

    # Находим объект около запрошенной точки
    retObj = iDocument2D_5.ksFindObj (pointObj[0],pointObj[1],20)

    # Возвращаем указатель на объект
    return retObj

# Редактирование в API5

# Параметры графических примитивов

# Окружность
refCircle_5 = objectQ("Укажите окружность")

pParmsCircle_5 = iKompas_5.GetParamStruct(const_2d.ko_CircleParam)
typeParam_5 = LDefin2D.ALLPARAM
iDocument2D_5.ksGetObjParam(refCircle_5, pParmsCircle_5, typeParam_5)

pParmsCircle_5.rad = pParmsCircle_5.rad + 5
iDocument2D_5.ksSetObjParam(refCircle_5, pParmsCircle_5, LDefin2D.ALLPARAM)

# Прямоугольник
refRectangle_5 = objectQ("Укажите прямоугольник")

pParmsRectangle_5 = iKompas_5.GetParamStruct(const_2d.ko_RectangleParam)
typeParam_5 = LDefin2D.ALLPARAM
iDocument2D_5.ksGetObjParam(refRectangle_5, pParmsRectangle_5, typeParam_5)

pParmsRectangle_5.width = pParmsRectangle_5.width + 10
iDocument2D_5.ksSetObjParam(refRectangle_5, pParmsRectangle_5, LDefin2D.ALLPARAM)

# Редактирование объектов

# Копирование:
# окружности
refCircle_5 = objectQ("Укажите окружность")

pParmsCircle_5 = iKompas_5.GetParamStruct(const_2d.ko_CircleParam)
typeParam_5 = LDefin2D.ALLPARAM
iDocument2D_5.ksGetObjParam(refCircle_5, pParmsCircle_5, typeParam_5)

iDocument2D_5.ksCopyObj (refCircle_5, pParmsCircle_5.xc, pParmsCircle_5.yc, 0, 20, 2, 0)

# прямоугольника
refRectangle_5 = objectQ("Укажите прямоугольник")

pParmsRectangle_5 = iKompas_5.GetParamStruct(const_2d.ko_RectangleParam)
typeParam_5 = LDefin2D.ALLPARAM
iDocument2D_5.ksGetObjParam(refRectangle_5, pParmsRectangle_5, typeParam_5)

iDocument2D_5.ksCopyObj (refRectangle_5, pParmsRectangle_5.x, pParmsRectangle_5.y, 100, 20, 2, 45)

# Зеркальная симметрия
refRectangle_5 = objectQ("Укажите прямоугольник")

pParmsRectangle_5 = iKompas_5.GetParamStruct(const_2d.ko_RectangleParam)
typeParam_5 = LDefin2D.ALLPARAM
iDocument2D_5.ksGetObjParam(refRectangle_5, pParmsRectangle_5, typeParam_5)

iDocument2D_5.ksSymmetryObj(refRectangle_5, pParmsRectangle_5.x, pParmsRectangle_5.y - 5, pParmsRectangle_5.x + 10, pParmsRectangle_5.y - 5, "1")

# Преобразование по матрице
# 1-ый способ
iKompas_5.ksMessage ("1-ый способ Преобразования по матрице")
iDocument2D_5.ksMtr(50, 50, 0, 1, 1);
iDocument2D_5.ksCircle(0, 0, 10, 1)
iDocument2D_5.ksZoomPrevNextOrAll(2)
iKompas_5.ksMessage ("Начерчена окружность")
iDocument2D_5.ksDeleteMtr()

# 2-ой способ
iKompas_5.ksMessage ("2-ой способ Преобразования по матрице")
refCircle_5 = objectQ("Укажите окружность")
iDocument2D_5.ksMtr(0, 50, 0, 2, 2)
iDocument2D_5.ksTransformObj(refCircle_5)
iKompas_5.ksMessage ("Применено преобразование")
iDocument2D_5.ksDeleteMtr()

iDocument2D_5.ksZoomPrevNextOrAll(2)

# Применение 1-ого способа к группе
iDocument2D_5.ksMtr(0, 100, 45, 2, 1)

iGroupM_5 = iDocument2D_5.ksNewGroup(0)
iDocument2D_5.ksCircle(0, 0, 10, 1)
iDocument2D_5.ksLineSeg(0, 0, 10, 0, 1)
iDocument2D_5.ksEndGroup()

iDocument2D_5.ksDeleteMtr()

iDocument2D_5.ksZoomPrevNextOrAll(2)

# Применение 2-ого способа к прямоугольнику
refRectangle_5 = objectQ("Укажите прямоугольник")

pParmsRectangle_5 = iKompas_5.GetParamStruct(const_2d.ko_RectangleParam)
typeParam_5 = LDefin2D.ALLPARAM
iDocument2D_5.ksGetObjParam(refRectangle_5, pParmsRectangle_5, typeParam_5)

# Переносим в начало координат
iDocument2D_5.ksMtr(-pParmsRectangle_5.x, 0, 0, 1, 1)
iDocument2D_5.ksTransformObj(refRectangle_5)
iDocument2D_5.ksDeleteMtr()
iKompas_5.ksMessage ("Перенесли в начало координат")

# Переносим в заданную точку
iDocument2D_5.ksMtr(100, 50, 30, 0.5, 0.5)
iDocument2D_5.ksTransformObj(refRectangle_5)
iDocument2D_5.ksDeleteMtr()

iDocument2D_5.ksZoomPrevNextOrAll(2)
iKompas_5.ksMessage ("Выполнили окончательное преобразование")

# Вложенные матрицы преобразований
iGroupM_5 = iDocument2D_5.ksNewGroup(0)
iDocument2D_5.ksLineSeg(0, 0, 20, 0, 1)
iDocument2D_5.ksLineSeg(20, 0, 20, 20, 1)
iDocument2D_5.ksLineSeg(20, 20, 10, 25, 1)
iDocument2D_5.ksLineSeg(10, 25, 0, 20, 1)
iDocument2D_5.ksLineSeg(0, 20, 0, 0, 1)

iKompas_5.ksMessage ("Начертили основную часть группы")

iDocument2D_5.ksMtr(10, 10, 0, 1, 1)
iDocument2D_5.ksLineSeg(-5, 0, 5, 0, 1)
iDocument2D_5.ksArcByPoint(0, 0, 5, -5, 0, 5, 0, -1, 1)
# Параметры дуги - координаты центра, радиус, левая точка,
# правая точка, -1 - направление по часовой стрелке, тип
iDocument2D_5.ksDeleteMtr()

iKompas_5.ksMessage ("Начертили вложенную часть группы")

iDocument2D_5.ksEndGroup()

iDocument2D_5.ksMtr(50, 150, 0, 2, 2)
iDocument2D_5.ksMtr(0, 0, 30, 1, 1)
iDocument2D_5.ksTransformObj(iGroupM_5)
iDocument2D_5.ksDeleteMtr()
iDocument2D_5.ksDeleteMtr()

iDocument2D_5.ksZoomPrevNextOrAll(2)
iKompas_5.ksMessage ("Выполнили окончательное преобразование")

# Редактирование в API7

# Параметры графических примитивов

# Окружность
refCircle_5 = objectQ("Укажите окружность")
iCircle_7 = iKompas_5.TransferReference(refCircle_5, 0)

### Пример получения указателя на интерфейс объекта по выбранному объекту
### Находим объект
##iDrawCircle_7 = iDocument2D1_7.FindObject(pointX,pointY,20,None)
### Получаем указатель на объект
##refCircle_7 = iDrawCircle_7.Reference
### Получаем указатель на интерфейсc объекта
##iCircle_7 = iKompas_5.TransferReference(refCircle_7, 0)

iCircle_7.Radius = iCircle_7.Radius + 5
iCircle_7.Update()

# Прямоугольник
refRectangle_5 = objectQ("Укажите прямоугольник")
iRectangle_7 = iKompas_5.TransferReference(refRectangle_5, 0)

iRectangle_7.Width = iRectangle_7.Width + 10
iRectangle_7.Update()

# Редактирование объектов

# Копирование:
# окружности
refCircle_5 = objectQ("Укажите окружность")
iCircle_7 = iKompas_5.TransferReference(refCircle_5, 0)

iCopyObjectParam_7 = kapi_7.ICopyObjectParam(iDocument1_7.GetInterface(const_2d.ksObjectCopyObjectParam))

iCopyObjectParam_7.XOld = iCircle_7.Xc
iCopyObjectParam_7.XNew = 0
iCopyObjectParam_7.YOld = iCircle_7.Yc
iCopyObjectParam_7.YNew = 20
iCopyObjectParam_7.Scale = 2

obj_7 = iDocument2D1_7.CopyObjects(iCircle_7, iCopyObjectParam_7)
iDocument2D_5.ksZoomPrevNextOrAll(2)

# прямоугольника
refRectangle_5 = objectQ("Укажите прямоугольник")
iRectangle_7 = iKompas_5.TransferReference(refRectangle_5, 0)

iCopyObjectParam_7.XOld = iRectangle_7.X
iCopyObjectParam_7.XNew = 100
iCopyObjectParam_7.YOld = iRectangle_7.Y
iCopyObjectParam_7.YNew = 20
iCopyObjectParam_7.Scale = 2

iDocument2D1_7.CopyObjects(iRectangle_7, iCopyObjectParam_7)
iDocument2D_5.ksZoomPrevNextOrAll(2)
