# -*- coding: utf-8 -*-
#|L_Dimension

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH
import math

#  Подключим константы 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
iDocument2D_7 = kapi_7.IKompasDocument2D(iDocument_7)
iDocument2D_5 = iKompas_5.ActiveDocument2D()
iDocument2D1_7 = kapi_7.IKompasDocument2D1(iDocument_7)
iChooseManager_7 = iDocument2D1_7.ChooseManager

# Функция вывода свойств интерфейса
def printprop(i):
    for prop in sorted(i._prop_map_get_):
        print(prop,getattr(i,prop))

# Функция запроса позиций
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


# Простановка размеров в API5

# Горизонтальный
##iLDimParam_5 = kapi_5.ksLDimParam(iKompas_5.GetParamStruct(const_2d.ko_LDimParam))
##iDimDrawing_5 = kapi_5.ksDimDrawingParam(iLDimParam_5.GetDPar())
##iDimDrawing_5.Init()
####printprop(iDimDrawing_5)
##
####iDimDrawing_5.ang = 0
####iDimDrawing_5.lenght = 0
####iDimDrawing_5.pl1 = False
####iDimDrawing_5.pl2 = False
####iDimDrawing_5.pt1 = 1
####iDimDrawing_5.pt2 = 1
####iDimDrawing_5.shelfDir = 0
####iDimDrawing_5.textBase = 0
####iDimDrawing_5.textPos = 0
##
##iLDimSource_5 = kapi_5.ksLDimSourceParam(iLDimParam_5.GetSPar())
##iLDimSource_5.Init()
##iLDimSource_5.basePoint = 1
##iLDimSource_5.dx = 0
##iLDimSource_5.dy = 12.856391727611
##iLDimSource_5.ps = 0
##iLDimSource_5.x1 = 50
##iLDimSource_5.y1 = 240
##iLDimSource_5.x2 = 100
##iLDimSource_5.y2 = 240
##
##iDimText_5 = kapi_5.ksDimTextParam(iLDimParam_5.GetTPar())
##iDimText_5.Init(0)
####print("Свойства текста")
####printprop(iDimText_5)
##
##iDimText_5.bitFlag = 1
####iDimText_5.sign = 0
####iDimText_5.style = 3
####iDimText_5.stringFlag = False
##obj_5 = iDocument2D_5.ksLinDimension(iLDimParam_5)

# Вертикальный
##pointF = pointQ("Укажите первую точку")
##pointS = pointQ("Укажите вторую точку")
##pointT = pointQ("Укажите положение размерной линии и надписи")
##
##iLDimParam_5 = kapi_5.ksLDimParam(iKompas_5.GetParamStruct(const_2d.ko_LDimParam))
##iDimDrawing_5 = kapi_5.ksDimDrawingParam(iLDimParam_5.GetDPar())
##iDimDrawing_5.Init()
####iDimDrawing_5.ang = 0
####iDimDrawing_5.lenght = 0
####iDimDrawing_5.pl1 = False
####iDimDrawing_5.pl2 = False
####iDimDrawing_5.pt1 = 1
####iDimDrawing_5.pt2 = 1
####iDimDrawing_5.shelfDir = 0
### Если точка размещения текста за крайними позициями
### то меняем параметры
##if (pointT[1] > pointF[1] and pointT[1] > pointS[1]) or (pointT[1] < pointF[1] and pointT[1] < pointS[1]):
##    iDimDrawing_5.textBase = 1
##    iDimDrawing_5.textPos = pointF[1] - pointT[1]
##
##iLDimSource_5 = kapi_5.ksLDimSourceParam(iLDimParam_5.GetSPar())
##iLDimSource_5.Init()
##iLDimSource_5.basePoint = 1
##iLDimSource_5.dx = pointT[0] - pointF[0]
##iLDimSource_5.dy = 0
##iLDimSource_5.ps = 1
##iLDimSource_5.x1 = pointF[0]
##iLDimSource_5.y1 = pointF[1]
##iLDimSource_5.x2 = pointS[0]
##iLDimSource_5.y2 = pointS[1]
##
##iDimText_5 = kapi_5.ksDimTextParam(iLDimParam_5.GetTPar())
##iDimText_5.Init(0)
##iDimText_5.bitFlag = 1
####iDimText_5.sign = 0
####iDimText_5.style = 3
####iDimText_5.stringFlag = False
##obj_5 = iDocument2D_5.ksLinDimension(iLDimParam_5)

# Угловой
##iADimParam_5 = kapi_5.ksADimParam(iKompas_5.GetParamStruct(const_2d.ko_ADimParam))
##iDimDrawing_5 = kapi_5.ksDimDrawingParam(iADimParam_5.GetDPar())
##iDimDrawing_5.Init()
####iDimDrawing_5.ang = 0
####iDimDrawing_5.lenght = 0
####iDimDrawing_5.pl1 = False
####iDimDrawing_5.pl2 = False
####iDimDrawing_5.pt1 = 1
####iDimDrawing_5.pt2 = 1
####iDimDrawing_5.shelfDir = 0
####iDimDrawing_5.textBase = 0
####iDimDrawing_5.textPos = 0
##
##iADimSource_5 = kapi_5.ksADimSourceParam(iADimParam_5.GetSPar())
##iADimSource_5.Init()
##iADimSource_5.xc = 50
##iADimSource_5.yc = 93.357944543042
##iADimSource_5.x1 = 127.942286340599
##iADimSource_5.y1 = 138.357944543042
##iADimSource_5.x2 = 132
##iADimSource_5.y2 = 93.357944543042
##iADimSource_5.ang1 = 30
##iADimSource_5.ang2 = 0
##iADimSource_5.dir = -1
##iADimSource_5.rad = 66.867243696752
##
##iDimText_5 = kapi_5.ksDimTextParam(iADimParam_5.GetTPar())
##iDimText_5.Init(0)
##iDimText_5.bitFlag = 1
####iDimText_5.sign = 0
####iDimText_5.style = 3
####iDimText_5.stringFlag = False
##obj_5 = iDocument2D_5.ksAngDimension(iADimParam_5)

# Диаметр
### Получение ближайшего объекта к выбранной точке
### myobj_5 = iDocument2D_5.ksFindObj(x,y,limit)
##
##iRDimParam_5 = kapi_5.ksRDimParam(iKompas_5.GetParamStruct(const_2d.ko_RDimParam))
##iRDimDrawing_5 = kapi_5.ksRDimDrawingParam(iRDimParam_5.GetDPar())
##iRDimDrawing_5.Init()
##printprop(iRDimDrawing_5)
##iRDimDrawing_5.ang = 46.672381688634
####iRDimDrawing_5.pt1 = 1
####iRDimDrawing_5.pt2 = 1
####iRDimDrawing_5.shelfDir = 0
####iRDimDrawing_5.textPos = 0
##
##iRDimSource_5 = kapi_5.ksRDimSourceParam(iRDimParam_5.GetSPar())
##iRDimSource_5.Init()
##iRDimSource_5.rad = 20
##iRDimSource_5.xc = 75
##iRDimSource_5.yc = 170.409374748436
##
##iDimText_5 = kapi_5.ksDimTextParam(iRDimParam_5.GetTPar())
##iDimText_5.Init(0)
##iDimText_5.bitFlag = 1
####iDimText_5.sign = 1
####iDimText_5.style = 3
####iDimText_5.stringFlag = False
##obj_5 = iDocument2D_5.ksDiamDimension(iRDimParam_5)

# Простановка размеров в API7

iViewsAndLayersManager = iDocument2D_7.ViewsAndLayersManager
iViews_7 = iViewsAndLayersManager.Views
iView_7 = iViews_7.ActiveView
iSymbols2DContainer_7 =  kapi_7.ISymbols2DContainer(iView_7)

# Линейный
##iLineDimensions_7 = iSymbols2DContainer_7.LineDimensions
##iLineDimension_7 = iLineDimensions_7.Add()
##
##pointF = pointQ("Укажите первую точку")
##pointS = pointQ("Укажите вторую точку")
##pointT = pointQ("Укажите положение размерной линии и надписи")
##
##if pointF[1] == pointS[1]:
##    iLineDimension_7.Orientation = 1
##else:
##    iLineDimension_7.Orientation = 2
##
##iLineDimension_7.X1 = pointF[0]
##iLineDimension_7.Y1 = pointF[1]
##iLineDimension_7.X2 = pointS[0]
##iLineDimension_7.Y2 = pointS[1]
##iLineDimension_7.X3 = pointT[0]
##iLineDimension_7.Y3 = pointT[1]
##
##iLineDimension_7.Update()

# Угловой

##iAngleDimensions_7 = iSymbols2DContainer_7.AngleDimensions
##iAngleDimension_7 = iAngleDimensions_7.Add(const_2d.ksDrADimension)
##
##pointF = pointQ("Укажите первую линию углового размера")
##obj1_7 = iDocument2D1_7.FindObject(pointF[0],pointF[1],20,None)
##iChooseManager_7.Choose(obj1_7)
##
##pointS = pointQ("Укажите вторую линию  углового размера")
##obj2_7 = iDocument2D1_7.FindObject(pointS[0],pointS[1],20,None)
##iChooseManager_7.Choose(obj2_7)
##
##pointT = pointQ("Укажите положение надписи углового размера")
##iChooseManager_7.Unchoose(obj1_7)
##iChooseManager_7.Unchoose(obj2_7)
##
##iAngleDimension_7.BaseObject1 = obj1_7
##iAngleDimension_7.BaseObject2 = obj2_7
##iAngleDimension_7.X3 = pointT[0]
##iAngleDimension_7.Y3 = pointT[1]
##iAngleDimension_7.Radius = 0
##
##iAngleDimension_7.Update()
##printprop(iAngleDimension_7)

# Диаметр
iDiametralDimensions_7 = iSymbols2DContainer_7.DiametralDimensions
iDiametralDimension_7 = iDiametralDimensions_7.Add()

pointF = pointQ("Укажите диаметр")
obj1_7 = iDocument2D1_7.FindObject(pointF[0],pointF[1],20,None)
iChooseManager_7.Choose(obj1_7)

pointT = pointQ("Укажите положение надписи диаметра")
iChooseManager_7.Unchoose(obj1_7)

iDiametralDimension_7.BaseObject = obj1_7

iDiametralDimension_7.Update()

xc = iDiametralDimension_7.Xc
yc = iDiametralDimension_7.Yc
angleR = math.atan((pointT[1] - yc)/(pointT[0] - xc))
angle = (angleR * 180) / math.pi

iDiametralDimension_7.Angle = angle

iDiametralDimension_7.Update()




