﻿from win32com.client import CDispatch

from IFikoAcilar.IFikoAcilar import IFikoAcilar
from IFikomObject import IFikomObject


__author__ = 'PC'

import os

"""
Soraluce Tezgahı İçin
"""


class IBCAciSonuc(object):
    B = 0.000
    C = 0.000
    aciFarki = 0.000
    BFark = 0.000
    CFark = 0.000
    dik = False
    islenebilir = True
    hata = False
    hataStr = str

    def __repr__(self):
        return repr(str(self))

    def __str__(self):
        return str({"B": self.B, "C": self.C, "dik": self.dik, "islenebilir": self.islenebilir, "hata": self.hata,
                     "hatastr": self.hataStr, "AciFarki": self.aciFarki, "BFark": self.BFark, "CFark": self.CFark})


class IFikoBCAci(IFikomObject):
    def __init__(self, obj:CDispatch, sahip:IFikoAcilar=None):
        super(IFikoBCAci, self).__init__(obj, sahip)
        self.__aktivite = sahip.aktivite
        self.__saltAcilar = sahip.saltAcilar

        self.__dosya = os.path.realpath(os.path.join(self.anaProgram.scriptYolu, "Prg", "FikoDosya"))
        self.__docKapat = True

    @property
    def islenebilir(self):
        if (self.__saltAcilar.ustAci < 90 or self.__saltAcilar.ustAci > 270) and self.__saltAcilar.altAci < 180:
            return True
        else:
            return False

    @property
    def __islenebilir(self):
        if (self.__saltAcilar.ustAci < 90 or self.__saltAcilar.ustAci > 270) and self.__saltAcilar.altAci < 180:
            return True
        else:
            return False

    @property
    def __saltAciAl(self):
        docKapat = self.__docKapat
        self.anaProgram.dosyaUyarilariniGoster = False

        self.dok = self.__aktivite.anaProgram.dokumanlar.oku(
            os.path.join(self.__dosya, "Src.FikoDll"))
        part = self.dok.asPartDokuman.part
        parametreler = part.parametreler

        parametreler.item(u"Ust").degeri = self.__saltAcilar.ustAci
        parametreler.item(u"Alt").degeri = self.__saltAcilar.altAci

        part.guncelle()

        srBK = parametreler.item(u"BAci").degeri
        srCK = parametreler.item(u"CAci").degeri
	
        print("Buu B AÇISI", srBK)
        print("C AÇISI", srCK)

        srB = round(srBK / 2.5) * 2.5
        srC = round(srCK / 2.5) * 2.5

        parametreler.item(u"eksBAcisi").degeri = srB
        parametreler.item(u"eksCAcisi").degeri = srC

        part.guncelle()

        BFark = srB - srBK
        CFark = srC - srCK

        srAciFark = parametreler.item(u"AciFark").degeri

        if docKapat:
            self.dok.kapat()
        self.anaProgram.dosyaUyarilariniGoster = True

        return {"B": float(srB), "C": float(srC), "AciFarki": srAciFark, "BFark": BFark, "CFark": CFark}

    @property
    def acilar(self):
        self.__sonuc = IBCAciSonuc()
        ust = self.__saltAcilar.ustAci
        alt = self.__saltAcilar.altAci

        # - Dik Acilar
        if alt == 180.000:
            self.__sonuc.B = 180.000
            self.__sonuc.C = 0.000
            self.__sonuc.islenebilir = True
            self.__sonuc.dik = True
        if ust == 270.000 and alt == 90.000:
            self.__sonuc.B = 90.000
            self.__sonuc.C = 0.000
            self.__sonuc.islenebilir = True
            self.__sonuc.dik = True
        if ust == 180.000 and alt == 90.000:
            self.__sonuc.B = 0.000
            self.__sonuc.C = 180.000
            self.__sonuc.islenebilir = True
            self.__sonuc.dik = True
        if ust == 90.000 and alt == 90.000:
            self.__sonuc.B = 270.000
            self.__sonuc.C = 0.000
            self.__sonuc.islenebilir = True
            self.__sonuc.dik = True
        if ust == 0.000 and alt == 0.000:
            self.__sonuc.B = 0.000
            self.__sonuc.C = 0.000
            self.__sonuc.islenebilir = True
            self.__sonuc.dik = True

        if self.__islenebilir:
            self.__sonuc.B = 0.000
            self.__sonuc.C = 0.000
            self.__sonuc.BFark = 0.000
            self.__sonuc.CFark = 0.000
            self.__sonuc.aciFarki = 0.000
            self.__sonuc.islenebilir = False
            self.__sonuc.dik = False
            self.__sonuc.hata = True
            self.__sonuc.hataStr = "Bu Açılarda Soralucede İşlem Yapılamaz"

        if self.__sonuc.dik == False and self.__sonuc.hata == False and self.__sonuc.islenebilir == True:
            saltAci = self.__saltAciAl
            self.__sonuc.B = saltAci["B"]
            self.__sonuc.C = saltAci["C"]
            self.__sonuc.aciFarki = saltAci["AciFarki"]
            self.__sonuc.BFark = saltAci["BFark"]
            self.__sonuc.CFark = saltAci["CFark"]
        return self.__sonuc

    def aciDuzelt(self, B, C, docKapat=True):
        self.__sonuc = IBCAciSonuc()
        self.__docKapat = False
        self.__saltAciAl
        # --->
        part = self.dok.asPartDokuman.part
        parametreler = part.parametreler

        srBK = parametreler.item(u"BAci").degeri
        srCK = parametreler.item(u"CAci").degeri

        prmEksB = parametreler.item(u"eksBAcisi")
        prmEksC = parametreler.item(u"eksCAcisi")

        prmEksB.degeri = B
        prmEksC.degeri = C

        part.guncelle()

        srB = prmEksB.degeri
        srC = prmEksC.degeri

        BFark = srB - srBK
        CFark = srC - srCK

        srAciFark = parametreler.item(u"AciFark").degeri

        if docKapat:
            self.dok.kapat()
        self.__docKapat = True
        self.__sonuc.B = float(B)
        self.__sonuc.C = float(C)
        self.__sonuc.aciFarki = float(srAciFark)
        self.__sonuc.BFark = BFark
        self.__sonuc.CFark = CFark
        return self.__sonuc

    def eksenAktar(self, B, C, poAyarla:bool=False,takimDik:bool=False):
        PO = self.__aktivite.po.catNesne
        PoVector = self.__aktivite.po.eksen()
        # --->
        Aci = self.aciDuzelt(B=B, C=C, docKapat=False)
        # --->
        part = self.dok.asPartDokuman.part
        merkezEksen = part.eksenler.item(1)

        merkezEksen.merkez = PoVector[3]
        merkezEksen.x = PoVector[0]
        merkezEksen.y = PoVector[1]
        merkezEksen.z = PoVector[2]
        part.guncelle()

        params = part.parametreler
        NewAxisVector = [
            [params.item("YeniEksenOX").degeri, params.item("YeniEksenOY").degeri, params.item("YeniEksenOZ").degeri],
            [params.item("YeniEksenXX").degeri, params.item("YeniEksenXY").degeri, params.item("YeniEksenXZ").degeri],
            [params.item("YeniEksenYX").degeri, params.item("YeniEksenYY").degeri, params.item("YeniEksenYZ").degeri],
            [params.item("YeniEksenZX").degeri, params.item("YeniEksenZY").degeri, params.item("YeniEksenZZ").degeri]]

        partDok = self.anaProgram.aktifDokuman.asPPRDokuman.productlar.item(0).referansProduct.dokuman.asPartDokuman
        part = self.anaProgram.aktifDokuman.asPPRDokuman.productlar.item(0).referansProduct.dokuman.asPartDokuman.part
        eksen = part.eksenler.ekle()
        eksen.merkez = NewAxisVector[0]
        eksen.x = NewAxisVector[1]
        eksen.y = NewAxisVector[2]
        eksen.z = NewAxisVector[3]
        eksen.ismi = "FikoYT Eksen -> " + "B =" + str(Aci.B) + "° " + "C =" + str(Aci.C) + "° Fark =" + str(
            Aci.aciFarki) + "° (" + self.__aktivite.ismi + ")"
        part.guncelle()
        # --->
        partDok.secililer.temizle()
        partDok.secililer.ekle(eksen)
        partDok.secililer.gorunum.renkRGB = [255, 255, 0, 1]
        partDok.secililer.gorunum.cizgiTipiGercek = 1
        partDok.secililer.gorunum.cizgiTipiGenislik = 3

        if poAyarla:
            partOp=self.__aktivite.po
            partOp.islemeEkseni.eksenSec(eksen, partOp.urunDokumani)
            partOp.islemeEkseni.ismi = "FikoYT " + "B =" + str(Aci.B) + "° " + "C =" + str(Aci.C) + "° Fark =" + str(
                Aci.aciFarki) + "°"
        if takimDik:
            self.__aktivite.takimYonu = [NewAxisVector[3][0],NewAxisVector[3][1],NewAxisVector[3][2]]

        self.dok.kapat()

        return NewAxisVector

    def __call__(self):
        return {"Acilar": self.acilar}

    def __str__(self):
        return repr({"Acilar": self.acilar})

    @property
    def acilar_yuvarlamasiz(self):
        docKapat = self.__docKapat
        self.anaProgram.dosyaUyarilariniGoster = False

        self.dok = self.__aktivite.anaProgram.dokumanlar.oku(
            os.path.join(self.__dosya, "Src.FikoDll"))
        part = self.dok.asPartDokuman.part
        parametreler = part.parametreler

        parametreler.item(u"Ust").degeri = self.__saltAcilar.ustAci
        parametreler.item(u"Alt").degeri = self.__saltAcilar.altAci

        part.guncelle()

        srBK = parametreler.item(u"BAci").degeri
        srCK = parametreler.item(u"CAci").degeri
	
        print("B AÇISI", srBK)
        print("C AÇISI", srCK)

        if docKapat:
            self.dok.kapat()
        self.anaProgram.dosyaUyarilariniGoster = True

        return {"B": float(srBK), "C": float(srCK)}