import pathlib
from ICikaricilar.IFikoAptv1 import IFikoAptv1
import IProcessDokuman
import os

from win32com.client import CDispatch

# from IAktiviteler.IAktivite import IAktivite
from IAktiviteler.IAktiviteler import IAktiviteler
from IFikomObject import IFikomObject
from IKamera import IKamera
from IKameralar import IKameralar
from IMfgTakim.IMfgTakim import IMfgTakim
from IParametreler import IParametreler
from IYardimciSiniflar import timeit


# class IProcessDokuman:
#     pass


class IProgram(IFikomObject):
    def __init__(self, obj: CDispatch, sahip: IFikomObject = None):
        super(IProgram, self).__init__(obj, sahip)
        self.sahip = sahip
        self.tipi = "IProgram"
        # --->Mirasci Sinif
        self.__PO = sahip

    @property
    def ismi(self) -> str:
        return self.catNesne.Name

    @ismi.setter
    def ismi(self, value: str):
        self.catNesne.Name = value

    @property
    def processDokuman(self) -> IProcessDokuman:
        # self.marshalOku()
        return IProcessDokuman.IProcessDokuman(self.catNesne.Parent)

    @processDokuman.setter
    def processDokuman(self, value: IProcessDokuman):
        self.__processDokuman = value

    def poTespit(self):
        # BİLGİ Part Operasyonunu Bulur
        self.CatProcess = self.processDokuman.partOperasyonlari
        poSayac = 0
        PoSayisi = self.CatProcess.sayisi
        for x in range(0, self.catNesne.PossiblePrecedenceActivities.Count):
            Activity = self.catNesne.PossiblePrecedenceActivities.item(x + 1).Type
            if Activity == "ManufacturingSetup":
                poSayac = poSayac + 1
                if poSayac > PoSayisi:
                    break
            if Activity != "ManufacturingSetup" and Activity != "MachiningProcessList":
                break
        return self.processDokuman.partOperasyonlari.item(poSayac)

    @property
    def indexPo(self):
        # BİLGİ Part Operasyonunu Sayısal Olarak Verir
        self.CatProcess = self.processDokuman.partOperasyonlari
        poSayac = 0
        PoSayisi = self.CatProcess.sayisi
        for x in range(0, self.catNesne.PossiblePrecedenceActivities.Count):
            Activity = self.catNesne.PossiblePrecedenceActivities.item(x + 1).Type
            if Activity == "ManufacturingSetup":
                poSayac = poSayac + 1
                if poSayac > PoSayisi:
                    break
            if Activity != "ManufacturingSetup" and Activity != "MachiningProcessList":
                break
        return poSayac

    @property
    def index(self):
        __toplamOncekiProgram = 0
        __indexPO = self.indexPo
        for x in range(0, __indexPO):
            if __indexPO != x:
                __toplamOncekiProgram += self.processDokuman.partOperasyonlari[
                    x
                ].programlar.sayisi

        PossiblePrecedenceActivities = self.catNesne.PossiblePrecedenceActivities
        prgSayac = 0
        for x in range(0, PossiblePrecedenceActivities.Count):
            Activity = PossiblePrecedenceActivities.item(x + 1).Type
            if Activity == "ManufacturingProgram":
                prgSayac = prgSayac + 1
            if Activity == "ManufacturingSetup" and Activity == "MachiningProcessList":
                break

        return prgSayac - __toplamOncekiProgram

    @property
    def po(self):
        if not self.__PO:
            poIndex = self.indexPo
            self.__PO = self.processDokuman.partOperasyonlari[poIndex]
        return self.__PO

    @property
    def kameraVarmi(self):
        if len(self.kameralar) > 0:
            return True
        else:
            return False

    @property
    def kameralar(self) -> IKameralar:
        rslt = []
        DocCams = IProcessDokuman.IProcessDokuman(self.catNesne.Parent)
        self.__Kameralar = DocCams.kameralar
        PrgCamStr = "['" + self.po.sahip.catNesne.ProcessID + "','" + self.ismi + "'"
        for x in range(len(self.__Kameralar) - 7):
            if PrgCamStr in self.__Kameralar[x].ismi:
                rslt.append(self.__Kameralar[x])

        return rslt

    def kameraEkle(self) -> IKamera:
        DocCams = IProcessDokuman.IProcessDokuman(self.catNesne.Parent)
        self.__Kameralar = DocCams.kameralar
        return self.__Kameralar.yeniKamera3d(
            "['"
            + self.po.sahip.catNesne.ProcessID
            + "','"
            + self.ismi
            + "','"
            + str(len(self.kameralar))
            + "']"
        )

    def ekleKod(self, val: str) -> IFikomObject:
        """Yeni 2021"""
        return self.catNesne.AddPPInstruction(val)

    def nesneTasi(self, referans, tasinacak):
        self.catNesne.MoveOperation(referans, tasinacak)

    @property
    def aktif(self) -> bool:
        return bool(self.catNesne.Active)

    @aktif.setter
    def aktif(self, value: bool):
        self.catNesne.Active = bool(value)

    @property
    def aciklama(self) -> str:
        return self.catNesne.Comment

    @aciklama.setter
    def aciklama(self, value: str):
        self.catNesne.Comment = value

    @property
    def bos(self) -> bool:
        return not self.aktiviteler.sayisi

    @property
    def isimsiz(self) -> bool:
        return "Manufacturing " in self.ismi

    @property
    def aciklamali(self) -> str:
        return self.aciklama != "No Description" and self.aciklama != ""

    def kilitle(self):
        self.catNesne.LockActivitesWithinProgram()

    def kilidiAc(self):
        self.catNesne.UnlockActivitesWithinProgram()

    @property
    def aktiviteler(self) -> IAktiviteler:
        return IAktiviteler(obj=self.catNesne, sahip=self)

    @property
    def aktiviteTurleri(self) -> list:
        _rslt = []
        for akt in self.aktiviteler():
            _rslt.append(akt.turu)
        return _rslt

    def miAktiviteTuruVar(self, turler: list = []) -> list:
        if isinstance(turler, str):
            turler = [turler]
        return list(set(turler).intersection(set(self.aktiviteTurleri)))

    @property
    def hesaplatilmamisVarMi(self) -> bool:
        rslt = False
        # --->
        # Activities = self.catNesne.Activities
        # --->
        for akt in self.aktiviteler():
            if akt.gecerliTur:
                if not akt.hesaplatilmis:
                    rslt = True
                    break
        # for x in range(0, Activities.Count):
        #     Aktivite = Activities.GetElement(x + 1)
        #     if not Aktivite.type in Notin:
        #         if Aktivite.CalculatedCycleTime == 0:
        #             rslt = True
        #         break
        return rslt

    @property
    def aciliAktiviteVarMi(self) -> bool:
        rslt = False
        # --->
        Aktiviteler = self.aktiviteler
        # --->
        for akt in range(Aktiviteler.sayisi):
            if not Aktiviteler[akt].dikMi:
                rslt = True
                break
        return rslt
        # --->
        # for akt in Aktiviteler:
        #     if not akt.dikMi:
        #         rslt = True
        #         break
        # return rslt

    def aktiviteleriSec(self):
        Catia = self.anaProgram.catNesne
        Aktiviteler = self.aktiviteler
        AktiviteSayisi = Aktiviteler.sayisi
        for x in range(AktiviteSayisi):
            Aktivite = Aktiviteler.item(x).catNesne
            Catia.ActiveDocument.Selection.Add(Aktivite)

    @property
    def toplamIslemeSuresi(self):
        rslt = 0
        # --->
        # Activities = self.aktiviteler
        # for x in range(0, Activities.sayisi):
        #     Aktivite = Activities.item(x)
        #     if not Aktivite.gecerliTur:
        #         if Aktivite.hesaplatilmis:
        #             _islemeSuresi=Aktivite.islemeSuresi
        #             rslt = + (_islemeSuresi.toplamGecisSuresi + _islemeSuresi.toplamSure)

        for akt in self.aktiviteler():
            if akt.gecerliTur:
                if akt.hesaplatilmis:
                    _islemeSuresi = akt.islemeSuresi
                    rslt += _islemeSuresi.toplamGecisSuresi + _islemeSuresi.toplamSure

        return rslt

    @property
    def parametreler(self) -> IParametreler:
        return IParametreler(self.catNesne.Parameters, self)

    # def aptUret(self, Ayar:dict=None, Sonra=None, Once=None):
    #     EvalCode = """
    #         Dim outputGen As ManufacturingOutputGenerator
    #         Dim genData As ManufacturingGeneratorData
    #
    #         Set outputGen = MFG
    #         outputGen.InitFileGenerator "APT", AptDosyasi, genData
    #         outputGen.RunFileGenerator genData
    #         genData.ResetAllModalValues
    #     """
    #     ProcessDokuman = IProcessDokuman.IProcessDokuman(self.catNesne.Parent)
    #     SabitAyarlar = {"ToolCenter": False, "AptUzantisi": "FikoApt", "Klasor": ProcessDokuman.klasoru}
    #     # SabitAyarlar.update(Ayar)
    #     # --->
    #     if Ayar != None:
    #         SabitAyarlar.update(Ayar)
    #     # --->
    #     if Once != None:
    #         Once(self)
    #     # --->
    #     if not SabitAyarlar["ToolCenter"]:  # Eger Tool Center Degil Ise
    #         sArgs = []
    #         sArgs.append(self.catNesne)
    #         sMacro = "AptUret"
    #
    #         sArgs.append(SabitAyarlar["Klasor"] + "\\" + self.ismi + "." + SabitAyarlar["AptUzantisi"])
    #
    #         self.anaProgram.scriptCalistir(sMacro, sArgs)
    #
    #     else:  # Eger Tool Center Ise
    #         if not ProcessDokuman.kaydedilmismi:
    #             ProcessDokuman.kaydet()
    #         ScriptYolu = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
    #         FT05Dosyasi = open(ScriptYolu + "\\Prg\\Post Yardimcilari\\Catia Batch\\FT05.tmp")
    #         TempFT05 = FT05Dosyasi.read()
    #         # FT05Dosyasi.close()
    #         TempFT05 = TempFT05.replace("[AptUzantisi]", SabitAyarlar["AptUzantisi"])
    #         TempFT05 = TempFT05.replace("[ProcessKlasoru]", ProcessDokuman.klasoru)
    #         TempFT05 = TempFT05.replace("[ProcessDosyaIsmi]", ProcessDokuman.ismi)
    #         TempFT05 = TempFT05.replace("[ProgramIsmi]", self.ismi)
    #         tmpfile = open(ScriptYolu + "\\Prg\\Post Yardimcilari\\Catia Batch" + "\\" + "FT05Temp", 'w')
    #         tmpfile.write(TempFT05)
    #         tmpfile.close()
    #
    #         Popen_arg = str(ScriptYolu + "\\Prg\\Post Yardimcilari\\Catia Batch\\FikoMfgBatch.bat" + " \"" + str(
    #             ScriptYolu + "\\Prg\\Post Yardimcilari\\Catia Batch" + "\\" + "FT05Temp\""))
    #         ProgramCalistirBekle(Popen_arg, PencereGoster=1)
    #     # --->
    #     if Sonra != None:
    #         Sonra(self)
    #     # --->
    #
    #     return str(SabitAyarlar["Klasor"] + "\\" + self.ismi + "." + SabitAyarlar["AptUzantisi"])
    #
    #     # --->
    #
    # def ncUret(self, Ayar={}, Sonra=None, Once=None):
    #     ScriptYolu = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
    #     ProcessDokuman = IProcessDokuman.IProcessDokuman(self.catNesne.Parent)
    #     # --->
    #     SabitAyarlar = {"ToolCenter": False, "Uzanti": "H", "Klasor": ProcessDokuman.klasoru,
    #                     "FikuralDosyasi": ScriptYolu + "\\Prg\\Post Yardimcilari\\Post Kurallari\\Fikomero_1.Fikural",
    #                     "CeviriciParametreler": "/v:4 /s:0 /c:4",
    #                     "CeviriciPrg": ScriptYolu + "\\Prg\\Post Yardimcilari\\FikoPost\\FikoPost.exe", }
    #     # SabitAyarlar.update(Ayar)
    #     # --->
    #     if Once != None:
    #         Once(self)
    #     # --->
    #     try:
    #         KuralDosyasi = "\"" + SabitAyarlar["FikuralDosyasi"] + "\""
    #         AptDosyasi = "\"" + self.aptUret(Ayar) + "\""
    #         NcDosyasi = "\"" + SabitAyarlar["Klasor"] + "\\" + self.ismi + "." + SabitAyarlar["Uzanti"] + "\""
    #         CeviriciParam = SabitAyarlar["CeviriciParametreler"]
    #         Parametreler = KuralDosyasi + " " + AptDosyasi + " " + NcDosyasi + " " + CeviriciParam
    #         Popen_arg = SabitAyarlar["CeviriciPrg"] + " " + Parametreler
    #         ProgramCalistirBekle(Popen_arg)
    #     finally:
    #         if Sonra != None:
    #             Sonra(self)
    #     # --->
    #     return ProcessDokuman.klasoru + "\\" + self.ismi + SabitAyarlar["Uzanti"]

    def aptUretNormal(self) -> str:
        EvalCode = """
            Dim outputGen;
            Dim genData As ManufacturingGeneratorData

            Set outputGen = MFG
            outputGen.InitFileGenerator "APT", AptDosyasi, genData
            outputGen.RunFileGenerator genData
            genData.ResetAllModalValues
        """
        # --->
        sArgs = []
        sArgs.append(self.catNesne)
        sMacro = "AptUret"
        if self.anaProgram.fikoSistem.ayarlar.item("ncÇıktıKlasörü").asInt == 0:
            klasor = self.processDokuman.klasoru
        elif isinstance(
            self.anaProgram.fikoSistem.ayarlar.item("ncÇıktıKlasörü").degeri, str
        ):
            klasor = self.anaProgram.fikoSistem.ayarlar.item("ncÇıktıKlasörü").asStr

        sArgs.append(
            klasor
            + "\\"
            + self.ismi
            + "."
            + self.anaProgram.fikoSistem.ayarlar.item("aptUzantısı").degeri
        )

        # obj1 = self.anaProgram.eval(EvalCode, "Process", [self.catNesne])

        self.anaProgram.scriptCalistir(sMacro, sArgs)
        # self.anaProgram.eval(EvalCode, "MFG As Object, AptDosyasi As String", sArgs)
        return os.path.join(
            klasor,
            self.ismi
            + "."
            + self.anaProgram.fikoSistem.ayarlar.item("aptUzantısı").degeri,
        )

    def aptUretToolCenter(self) -> str:
        anaProgram = self.anaProgram
        processDokuman = self.processDokuman
        ayarlar = anaProgram.fikoSistem.ayarlar
        FT05Dosyasi = open(
            os.path.join(
                anaProgram.scriptYolu,
                "Prg",
                "Post Yardimcilari",
                "Catia Batch",
                "FT05.tmp",
            )
        )
        TempFT05 = FT05Dosyasi.read()
        # FT05Dosyasi.close()
        TempFT05 = TempFT05.replace("[AptUzantisi]", ayarlar.item("aptUzantısı").degeri)
        if ayarlar.item("ncÇıktıKlasörü").asInt == 0:
            TempFT05 = TempFT05.replace("[ProcessKlasoru]", processDokuman.klasoru)
        elif isinstance(ayarlar.item("ncÇıktıKlasörü").degeri, str):
            TempFT05 = TempFT05.replace(
                "[ProcessKlasoru]", ayarlar.item("ncÇıktıKlasörü").degeri
            )

        TempFT05 = TempFT05.replace("[ProcessDosyaIsmi]", processDokuman.ismi)
        TempFT05 = TempFT05.replace("[ProgramIsmi]", self.ismi)
        tmpfile = open(
            os.path.join(
                anaProgram.scriptYolu,
                "Prg",
                "Post Yardimcilari",
                "Catia Batch",
                "FT05Temp",
            ),
            "w",
        )
        tmpfile.write(TempFT05)
        tmpfile.close()

        Popen_arg = (
            os.path.join(
                anaProgram.scriptYolu,
                "Prg",
                "Post Yardimcilari",
                "Catia Batch",
                "FikoMfgBatch.bat",
            )
            + ' "'
            + os.path.join(
                anaProgram.scriptYolu,
                "Prg",
                "Post Yardimcilari",
                "Catia Batch",
                'FT05Temp"',
            )
        )
        anaProgram.fikoSistem.dosyaSistemi.programCalistirBekle(
            Popen_arg, PencereGoster=1
        )

        return os.path.join(
            processDokuman.klasoru,
            self.ismi
            + "."
            + self.anaProgram.fikoSistem.ayarlar.item("aptUzantısı").degeri,
        )

    @property
    def apt(self) -> str:
        __tezgah = self.processDokuman.fikoPost.tezgah
        if __tezgah.kureMerkezi == 1:
            return self.aptUretToolCenter()
        else:
            return self.aptUretNormal()
        
   
    def aptUret(self,kureMerkezi:bool=False) -> str:
        if kureMerkezi:
            return self.aptUretToolCenter()
        else:
            return self.aptUretNormal()
        
    @property
    def nc(self):
        anaProgram = self.anaProgram
        self.anaProgram.marshalOku()
        __tezgah = self.processDokuman.fikoPost.tezgah
        ayarlar = anaProgram.fikoSistem.ayarlar
        try:
            KuralDosyasi = (
                '"'
                + os.path.join(
                    anaProgram.scriptYolu,
                    ayarlar.item("ncKuralDosyasıKlasörü").asStr,
                    __tezgah.kuralDosyasi,
                )
                + '"'
            )
            AptDosyasi = '"' + self.apt + '"'

            if ayarlar.item("ncÇıktıKlasörü").asInt == 0:
                NcDosyasi = (
                    '"'
                    + os.path.join(
                        self.processDokuman.klasoru,
                        self.ismi + "." + __tezgah.postUzantisi,
                    )
                    + '"'
                )
            elif isinstance(ayarlar.item("ncÇıktıKlasörü").degeri, str):
                NcDosyasi = (
                    '"'
                    + os.path.join(
                        ayarlar.item("ncÇıktıKlasörü").degeri,
                        self.ismi + "." + __tezgah.postUzantisi,
                    )
                    + '"'
                )

            CeviriciParam = ayarlar.item("ncÇeviriciParametreler").degeri
            Parametreler = (
                KuralDosyasi + " " + AptDosyasi + " " + NcDosyasi + " " + CeviriciParam
            )
            print(Parametreler)
            Popen_arg = (
                os.path.join(
                    anaProgram.scriptYolu, ayarlar.item("ncÇeviriciProgram").asStr
                )
                + " "
                + Parametreler
            )
            anaProgram.fikoSistem.dosyaSistemi.programCalistirBekle(Popen_arg)

            if __tezgah.postDuzenlemeProgrami != None:
                Popen_arg = (
                    os.path.join(anaProgram.scriptYolu, __tezgah.postDuzenlemeProgrami)
                    + " "
                    + NcDosyasi
                )
                try:
                    print(
                        anaProgram.fikoSistem.dosyaSistemi.programCalistirBekle(
                            Popen_arg
                        )
                    )
                except:
                    pass
        finally:
            if ayarlar.item("ncPosttanSonraAtiklariSil").asBool:
                Liste = ayarlar.item("ncAtıkDosyaUzantıları").asObject
                print(Liste)
                self.processDokuman.klasoruTemizle(Liste)

        # --->
        return (
            self.processDokuman.klasoru + "\\" + self.ismi + "." + __tezgah.postUzantisi
        )
    
    
    def ncUret(self, kureMerkezi:bool=False):
        anaProgram = self.anaProgram
        self.anaProgram.marshalOku()
        __tezgah = self.processDokuman.fikoPost.tezgah
        ayarlar = anaProgram.fikoSistem.ayarlar
        try:
            KuralDosyasi = (
                '"'
                + os.path.join(
                    anaProgram.scriptYolu,
                    ayarlar.item("ncKuralDosyasıKlasörü").asStr,
                    __tezgah.kuralDosyasi,
                )
                + '"'
            )
            AptDosyasi = '"' + self.aptUret(kureMerkezi=kureMerkezi) + '"'

            if ayarlar.item("ncÇıktıKlasörü").asInt == 0:
                NcDosyasi = (
                    '"'
                    + os.path.join(
                        self.processDokuman.klasoru,
                        self.ismi + "." + __tezgah.postUzantisi,
                    )
                    + '"'
                )
            elif isinstance(ayarlar.item("ncÇıktıKlasörü").degeri, str):
                NcDosyasi = (
                    '"'
                    + os.path.join(
                        ayarlar.item("ncÇıktıKlasörü").degeri,
                        self.ismi + "." + __tezgah.postUzantisi,
                    )
                    + '"'
                )

            CeviriciParam = ayarlar.item("ncÇeviriciParametreler").degeri
            Parametreler = (
                KuralDosyasi + " " + AptDosyasi + " " + NcDosyasi + " " + CeviriciParam
            )
            print(Parametreler)
            Popen_arg = (
                os.path.join(
                    anaProgram.scriptYolu, ayarlar.item("ncÇeviriciProgram").asStr
                )
                + " "
                + Parametreler
            )
            anaProgram.fikoSistem.dosyaSistemi.programCalistirBekle(Popen_arg)

            if __tezgah.postDuzenlemeProgrami != None:
                Popen_arg = (
                    os.path.join(anaProgram.scriptYolu, __tezgah.postDuzenlemeProgrami)
                    + " "
                    + NcDosyasi
                )
                try:
                    print(
                        anaProgram.fikoSistem.dosyaSistemi.programCalistirBekle(
                            Popen_arg
                        )
                    )
                except:
                    pass
        finally:
            if ayarlar.item("ncPosttanSonraAtiklariSil").asBool:
                Liste = ayarlar.item("ncAtıkDosyaUzantıları").asObject
                print(Liste)
                self.processDokuman.klasoruTemizle(Liste)

        # --->
        return (
            self.processDokuman.klasoru + "\\" + self.ismi + "." + __tezgah.postUzantisi
        )

    def operasyonEkle(self, opIsmi: str, oto: int = 1):
        from IAktiviteler.IAktivite import IAktivite

        return IAktivite(obj=self.catNesne.AppendOperation(opIsmi, oto), sahip=self)

    def merkezeGetir(self):
        self.processDokuman.secililer.temizle()
        self.processDokuman.secililer.ekle(self)
        self.processDokuman.anaProgram.komut("center graph")

    @property
    def takimlar1(self):
        rslt = list(
            map(
                lambda x: x.takim.toStr,
                filter(lambda x: x.turu == "ToolChange", self.aktiviteler()),
            )
        )
        # for akt in self.aktiviteler():
        #     if akt.turu == "ToolChange":
        #         rslt.append(akt.takim.toStr)

        return rslt

    @property
    def takimlar(self):
        rslt = []
        for akt in self.aktiviteler():
            if akt.turu == "ToolChange":
                rslt.append(akt.takim.toStr)

        return rslt

    @property
    def takimlar2(self):
        rslt = []
        for akt in self.aktiviteler():
            if akt.turu != "ToolChange":
                rslt.append(akt.takim.toStr2)

        return rslt

    @property
    def magazinli(self):
        rslt = 0
        for akt in self.aktiviteler():
            if akt.turu == "ToolChange":
                rslt += 1
                if rslt > 1:
                    break
        return True if rslt > 1 else False

    @property
    def operasyonBoyutlari(self):
        rslt = []
        for akt in self.aktiviteler():
            if akt.turu != "ToolChange":
                if akt.besEksenMi:
                    if not "5D" in rslt:
                        rslt.append("5D")
                else:
                    if akt.ucBoyutluMu:
                        if not "3D" in rslt:
                            rslt.append("3D")
                    else:
                        if not "2D" in rslt:
                            rslt.append("2D")

        return rslt

    @property
    def gonderilmismi(self):
        if not self.parametreler.parametreVarmi("Gonderilmismi"):
            return False
        else:
            return True

    @property
    def enBuyukTakimBoyu(self):
        liste = []
        for akt in self.aktiviteler():
            if akt.gecerliTur:
                deger = akt.takimBoyu[0]
                liste.append(deger)

        maxAkt = max(liste)
        return maxAkt

    @property
    def enYuksekIlerleme(self):
        liste = []
        for akt in self.aktiviteler():
            if akt.gecerliTur:
                deger = akt.ilerlemeIsleme
                liste.append(deger)
        maxAkt = max(liste)
        return maxAkt

    @property
    def enYuksekDevir(self):
        liste = []
        for akt in self.aktiviteler():
            if akt.gecerliTur:
                deger = akt.devir
                liste.append(deger)

        maxAkt = max(liste)
        return maxAkt

    @property
    def enYuksekHatve(self):
        liste = []
        for akt in self.aktiviteler():
            if akt.gecerliTur:
                _hatve = akt.hatve
                if isinstance(_hatve, tuple):
                    _hatve = _hatve[len(_hatve) - 1].degeri
                else:
                    _hatve = _hatve.degeri if _hatve != None else 0.0
                liste.append(_hatve)

        maxAkt = max(liste)
        return maxAkt

    @property
    def enDusukCevreOffset(self):
        liste = []
        for akt in self.aktiviteler():
            if akt.gecerliTur:
                try:
                    _hatve = akt.cevreOffset.degeri
                except:
                    _hatve = akt.cevreOffset.degeri if akt.cevreOffset != None else 0.0
                deger = _hatve
                liste.append(deger)

        maxAkt = min(liste)
        return maxAkt

    @property
    def enDusukYuzeyOffset(self):
        liste = []
        for akt in self.aktiviteler():
            if akt.gecerliTur:
                try:
                    _hatve = akt.yuzeyOffset.degeri
                except:
                    _hatve = akt.yuzeyOffset.degeri if akt.yuzeyOffset != None else 0.0
                deger = _hatve
                liste.append(deger)
        maxAkt = min(liste)

        return maxAkt

    @property
    def tumAcilar(self) -> list:
        rslt = []
        if not self.aciliAktiviteVarMi:
            return {"U": 0.000, "A": 0.000}

        farkliAci = self.farkliAciVarMi

        for akt in self.aktiviteler():
            if akt.gecerliTur:
                try:
                    temp = akt.acilar.tav20Er32.__dict__()
                except:
                    return {"U": 0.000, "A": 0.000}
                finally:
                    if not farkliAci:
                        rslt.append(temp)
                    else:
                        return temp
        return rslt

    @property
    def farkliAciVarMi(self):
        _tempTakimYonu = None
        for akt in self.aktiviteler():
            if not akt.turu != "ToolChange":
                if not _tempTakimYonu:
                    _tempTakimYonu = akt.takimYonu()
                else:
                    if _tempTakimYonu != akt.takimYonu():
                        return True
                    else:
                        return False

    @property
    def hataKodlari(self):
        rslt = ""
        if len(self.takimlar) > 1:
            rslt = "[M]"
        if self.farkliAciVarMi:
            rslt = rslt + "[A]"
        if self.hesaplatilmamisVarMi:
            rslt = rslt + "[H]"
        if rslt == "":
            rslt = "Yok"
        return rslt

    def magazinKodlariEkle(self):
        # self.aktiviteGuvenlikStobuEkle()
        # --->
        __prg: IProgram = self
        aktiviteler = __prg.aktiviteler
        # --->
        _sNo = 0
        _liste: list[str] = []
        _liste.append("INSERT (*** FIKOYT TAKIMLAR ***)")
        for akti in range(0, aktiviteler.sayisi):
            akt = aktiviteler[akti]
            if akt.turu == "ToolChange":
                tkm = IMfgTakim(akt.catNesne.tool, __prg)
                _liste.append(
                    f"INSERT (T{str(tkm.takimNo).ljust(2)} {tkm.ismi.upper()})"
                )
                _sNo += 1
        # print("\n".join(_liste))
        _liste.append("INSERT (*** ********** ***)")
        # _liste.append("INSERT G90 G54 X0. Y0.")
        # _liste.append("INSERT M8")
        if "FikoYT Takımlar" in __prg.aktiviteler[0].ismi:
            __prg.aktiviteler[0].asOperasyon.asPPInstruction.kodlar.degeri = "\n".join(
                _liste
            )
        else:
            _ppins = __prg.ekleKod("\n".join(_liste))
            _ppins.name = "*** FikoYT Takımlar ***"
            __prg.nesneTasi(aktiviteler[0].catNesne, _ppins)
        # --->
        _liste: list[str] = []
        _liste.append("INSERT G90 G54 X0. Y0.")
        _liste.append("INSERT M8")
        _ppins = __prg.ekleKod("\n".join(_liste))
        _ppins.name = "*** FikoYT Başlangıç ***"
        __prg.nesneTasi(aktiviteler[2].catNesne, _ppins)
        # --->
        __bitis_kodlar = ["INSERT M9", "INSERT G91 G28 Z1.", "INSERT G91 G28 Y1."]
        if "FikoYT Bitiş" in __prg.aktiviteler[__prg.aktiviteler.sayisi - 1].ismi:
            __prg.aktiviteler[
                __prg.aktiviteler.sayisi - 1
            ].asOperasyon.asPPInstruction.kodlar.degeri = "\n".join(__bitis_kodlar)
        else:
            _ppins_bitis = __prg.ekleKod("\n".join(__bitis_kodlar))
            _ppins_bitis.name = "*** FikoYT Bitiş ***"

    def aktiviteGuvenlikStobuEkle(self):
        __prg: IProgram = self
        _aktiviteler = []
        # --->
        for akti in range(0, __prg.aktiviteler.sayisi):
            akt = __prg.aktiviteler[akti]
            if akt.turu != "ToolChange":
                _aktiviteler.append(akt)
        sayac = 0
        for akti in range(0, len(_aktiviteler)):
            akt = _aktiviteler[akti]
            if (
                akt.turu != "ToolChange"
                and "Processor" not in akt.ismi
                and "FikoYT Takımlar" not in akt.ismi
                and "FikoYT Bitiş" not in akt.ismi
            ):
                if "FikoYT Güvenlik Ayraç" not in _aktiviteler[akti - 1].ismi:
                    sayac += 1
                    _kod = [
                        "INSERT (*** ********** ***)",
                        f"INSERT (FIKO AYRAC AKT{sayac})",
                        "INSERT M01",
                        "INSERT (*** ********** ***)",
                    ]
                    _kod_nesnesi = __prg.ekleKod("\n".join(_kod))
                    _kod_nesnesi.name = f"*** FikoYT Güvenlik Ayraç AKT{sayac} ***"
                    __prg.nesneTasi(akt.catNesne, _kod_nesnesi)
                else:
                    _kod = [
                        "INSERT (*** ********** ***)",
                        f"INSERT (FIKO AYRAC AKT{sayac})",
                        "INSERT M01",
                        "INSERT (*** ********** ***)",
                    ]
                    _aktiviteler[
                        akti - 1
                    ].asOperasyon.asPPInstruction.kodlar.degeri = "\n".join(_kod)
                    _aktiviteler[
                        akti - 1
                    ].ismi = f"*** FikoYT Güvenlik Ayraç AKT{sayac} ***"
                print(akt.ismi)

    def aktiviteGuvenlikStobuEkle0(self):
        __prg: IProgram = self
        aktiviteler = __prg.aktiviteler
        # --->
        sayac = 1
        _yeni_kodlar = []
        _yeni_siralar = []

        _eski_kodlar = []
        _eski_siralar = []
        _eski_sayac = []
        for akti in range(0, aktiviteler.sayisi):
            akt = aktiviteler[akti]
            if akt.turu != "ToolChange":
                if (
                    "Processor" not in akt.ismi
                    and "FikoYT Takımlar" not in akt.ismi
                    and "FikoYT Bitiş" not in akt.ismi
                ):
                    # sayac+=1
                    if "FikoYT Güvenlik Ayraç" not in akt.ismi:
                        sayac += 1
                        # print(f"{sayac} {akti} {akt.ismi}")
                        _kod = [
                            "INSERT (*** ********** ***)",
                            f"INSERT (FIKO AYRAC AKT{sayac})",
                            "INSERT M01",
                            "INSERT (*** ********** ***)",
                        ]
                        # _kod_nesnesi = __prg.ekleKod("\n".join(_kod))
                        # _kod_nesnesi.name = f"*** FikoYT Güvenlik Ayraç AKT{sayac} ***"
                        # __prg.nesneTasi(aktiviteler[akti].catNesne, _kod_nesnesi)
                        _yeni_kodlar.append(_kod)
                        _yeni_siralar.append(akti)
                    else:
                        # sayac+=1
                        _yeni_siralar = (
                            _yeni_siralar[:-1]
                            if len(_yeni_siralar) > 0
                            else _yeni_siralar
                        )
                        _yeni_kodlar = (
                            _yeni_kodlar[:-1] if len(_yeni_kodlar) > 0 else _yeni_kodlar
                        )
                        # --->
                        _kod = [
                            "INSERT (*** ********** ***)",
                            f"INSERT (FIKO AYRAC AKT{sayac})",
                            "INSERT M01",
                            "INSERT (*** ********** ***)",
                        ]
                        _eski_kodlar.append(_kod)
                        _eski_siralar.append(akti)
                        _eski_sayac.append(sayac)
                        # sayac+=1
            else:
                sayac += 1

        for esk_sira in range(len(_eski_siralar) - 1, 0, -1):
            __prg.aktiviteler[
                _eski_siralar[esk_sira]
            ].asOperasyon.asPPInstruction.kodlar.degeri = "\n".join(
                _eski_kodlar[esk_sira]
            )
            __prg.aktiviteler[
                _eski_siralar[esk_sira]
            ].ismi = f"*** FikoYT Güvenlik Ayraç AKT{_eski_sayac[esk_sira]} ***"

        for yeni_sira in range(len(_yeni_siralar) - 1, 0, -1):
            _kod_nesnesi = __prg.ekleKod("\n".join(_yeni_kodlar[yeni_sira]))
            _kod_nesnesi.name = f"*** FikoYT Güvenlik Ayraç AKT{yeni_sira} ***"
            __prg.nesneTasi(
                aktiviteler[_yeni_siralar[yeni_sira]].catNesne, _kod_nesnesi
            )

    def magazinKodlariEkleNT(self):
        prg: IProgram = self
        aktiviteler = prg.aktiviteler

        for akti in range(0, aktiviteler.sayisi + 2):
            akt = aktiviteler[akti]
            if akt.turu == "ToolChange":
                tkm = IMfgTakim(akt.catNesne.tool, prg)
                ppins = prg.ekleKod(
                    f"""\
$$ FikoYT CAtia Otomasyon Sistemleri
$$ 0x1011 0x0005 0x1010 0x0101
$$ 0x1010 0x0000 0x0005 0x001 0x0101
$$ import sys.env(arg[0].catTool)
$$ sys.fikoyt.catia.takim.iste()
INSERT G90 G28 Z0.
$$ sys.fikoyt.catia.makine.sifir0()
INSERT G90 G28 Y0.
$$ sys.fikoyt.catia.makine.sifir1()
$$ sys.fikoyt.catia.makine.sifir0()
INSERT G90 G28 X0.
$$ sys.fikoyt.catia.makine.sifir2()
$$ sys.fikoyt.catia.takim.degistir()
INSERT M01
INSERT T{tkm.takimNo} M06
INSERT M01
$$ sys.fikoyt.catia.takim.boyAl()
# 1=ABS[{ '#'+str(2200 + int(tkm.takimNo)) if int(tkm.takimNo)!=1 else 0}]
INSERT
INSERT G91 G0 Z-#1
$$ sys.fikoyt.catia.takim.boyAl()
INSERT G43 H{tkm.takimNo}
$$ sys.fikoyt.catia.makine.sifir1()
INSERT G0 G90 X0. Y0."""
                )
                ppins.name = f"FikoY-T{tkm.takimNo}H{tkm.takimNo}"
                print(tkm.takimNo)
                prg.nesneTasi(aktiviteler[akti + 1].catNesne, ppins)
        prg.ekleKod(
            f"""\
$$ FikoYT CAtia Otomasyon Sistemleri
$$ 0x1011 0x0005 0x1010 0x0101
$$ 0x1010 0x0000 0x0005 0x001 0x0101
$$ import sys.env(arg[0].catTool)
$$ sys.fikoyt.catia.takim.iste()
INSERT G90 G28 Z0.
$$ sys.fikoyt.catia.makine.sifir0()
INSERT G90 G28 Y0.
$$ sys.fikoyt.catia.makine.sifir1()
INSERT G90 G28 X0.
$$ sys.fikoyt.catia.makine.sifir2()
$$ sys.fikoyt.catia.takim.degistir()
INSERT T01 M06
$$ sys.fikoyt.catia.makine.sifir1()"""
        ).name = "FikoYT-Bitiş"

    @property
    def fiko_apt_v1(self) -> IFikoAptv1:
        return IFikoAptv1(self)
    
    def fikoAptV1(self,kureMerkezi:bool=False) -> IFikoAptv1:
        return IFikoAptv1(self,kureMerkezi=kureMerkezi)

    @property
    def toFikoGL(self):
        __rslt = {}
        aktiviteler = []
        for ai in range(self.aktiviteler.sayisi):
            akt = self.aktiviteler.item(ai)
            aktiviteler.append(
                {
                    "ismi": akt.ismi,
                    "aciklama": akt.aciklama,
                    "turu": akt.turu,
                    "parametreler": akt.fikoGlParametreler,
                }
            )
        # if self.bos and self.isimsiz == False:
        #     __rslt = {"ismi": self.ismi,
        #               "aciklama": self.aciklama, "turu": self.tipi}
        # else:
        # aptFilePath = prg.apt
        # with open(aptFilePath, "r") as f:
        __po = self.po
        if __po and __po.tipi == "IProgramlar":
            __po = self.sahip.sahip
        __rslt = {
            "ismi": self.ismi,
            "aciklama": self.aciklama,
            "aktiviteler": aktiviteler,
            "turu": self.tipi,
            "islemeEkseni": {
                "x": __po.islemeEkseni.x.to_array(),
                "y": __po.islemeEkseni.y.to_array(),
                "z": __po.islemeEkseni.z.to_array(),
                "merkez": __po.islemeEkseni.merkez.to_array(),
            },
            "operasyonIsmi": __po.ismi
            # "apt":f.readlines(),
        }
        return __rslt

    def inoStandartProgramlariEkle(self):
        self.processDokuman.asPPR.kaynaklar.dosyadanTakimlariEkle()

    def inoStandartProgramlariEkle(self):
        facing = self.operasyonEkle("Facing")
        facing.parametreler["Machining tolerance"].degeri = 0.01
        facing.parametreler["Percentage of tool diameter"].degeri = 20
        facing.parametreler["Overhang ratio"].degeri = 20
        facing.parametreler["Facing tool path style"].degeriStr = "MfgBackAndForth"
        facing.parametreler["End of path"].degeriStr = "MfgOut"
        facing.parametreler["Tool side approach clearance"].degeriStr = "5mm"
        facing.parametreler["Approach feedrate"].degeriStr = "3000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "1000mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Finishing feedrate"].degeriStr = "500mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "1500turn_mn"
        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Approach.1\Active macro ?"
        ].degeri = True
        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Active macro ?"
        ].degeri = True
        facing.asOperasyon.makroEkseneDikMesafeEkle("Approach", 25)
        facing.asOperasyon.makroEkseneDikMesafeEkle("Retract", 25, hizTipi="Retract")

        facing.ismi = f"FikoYT Yüzey Traşlama{pathlib.Path(facing.ismi).suffix}"

        # facing.catNesne.SetTool("50 TRM")
        # ---->
        # ---->
        facing = self.operasyonEkle("ProfileContouring")

        facing.parametreler["Tool path style"].degeriStr = "MfgOneWay"
        facing.parametreler["Machining tolerance"].degeri = 0.01
        facing.parametreler["Approach feedrate"].degeriStr = "3000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "750mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Finishing feedrate"].degeriStr = "500mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "3500turn_mn"
        facing.parametreler["Offset on Bottom"].degeriStr = "-3mm"
        facing.parametreler["Contouring mode"].degeri = True

        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Approach.1\Active macro ?"
        ].degeri = True
        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Active macro ?"
        ].degeri = True
        facing.asOperasyon.makroEkseneYatayMesafeEkle("Approach", 5)
        facing.asOperasyon.makroEkseneDikMesafeEkle("Approach", 25)
        facing.asOperasyon.makroEkseneYatayMesafeEkle("Retract", 5)
        facing.asOperasyon.makroEkseneDikMesafeEkle("Retract", 25, hizTipi="Retract")
        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Group.1\Horizontal.1\Feedrate type"
        ].degeriStr = "MfgMacroRetractFeedrate"
        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Group.1\Horizontal.1\MfgMacroActive"
        ].degeri = True

        facing.ismi = f"FikoYT Pah{pathlib.Path(facing.ismi).suffix}"

        # facing.catNesne.SetTool("PAH")
        # ---->
        # ---->
        facing = self.operasyonEkle("ProfileContouring")

        facing.parametreler["Tool path style"].degeriStr = "MfgHelix"
        facing.parametreler["Axial strategy"].degeriStr = "MfgMaxDepthOfCut"
        facing.parametreler["Machining tolerance"].degeri = 0.01
        facing.parametreler["Approach feedrate"].degeriStr = "3000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "2000mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Finishing feedrate"].degeriStr = "1500mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "2500turn_mn"
        facing.parametreler["Offset on Bottom"].degeriStr = "-0.5mm"
        facing.parametreler["Offset on Top"].degeriStr = "0.5mm"
        facing.parametreler["Offset on Contour"].degeriStr = "0.15mm"
        facing.parametreler["Contouring mode"].degeri = True

        facing.parametreler["Maximum depth of cut"].degeriStr = "0.75mm"

        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Approach.1\Active macro ?"
        ].degeri = True
        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Active macro ?"
        ].degeri = True
        facing.asOperasyon.makroEkseneDikMesafeEkle("Approach", 25)
        facing.asOperasyon.makroEkseneDikMesafeEkle("Retract", 25, hizTipi="Retract")

        facing.ismi = f"FikoYT Helisel Kaba{pathlib.Path(facing.ismi).suffix}"

        # facing.catNesne.SetTool("18 TRM")
        # ---->
        # ---->
        facing = self.operasyonEkle("ProfileContouring")

        facing.parametreler["Tool path style"].degeriStr = "MfgOneWay"
        facing.parametreler["Machining tolerance"].degeri = 0.01
        facing.parametreler["Approach feedrate"].degeriStr = "3000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "1000mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Finishing feedrate"].degeriStr = "750mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "2800turn_mn"
        facing.parametreler["Offset on Bottom"].degeriStr = "-0.4mm"
        facing.parametreler["Offset on Contour"].degeriStr = "-0.05mm"
        facing.parametreler["Contouring mode"].degeri = True

        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Approach.1\Active macro ?"
        ].degeri = True
        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Active macro ?"
        ].degeri = True

        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Return in a Level.2\Active macro ?"
        ].degeri = True

        facing.asOperasyon.makroEkseneYatayMesafeEkle("Approach", 5)
        facing.asOperasyon.makroEkseneDikMesafeEkle("Approach", 25)
        facing.asOperasyon.makroEkseneYatayMesafeEkle("Retract", 5)
        facing.asOperasyon.makroEkseneDikMesafeEkle("Retract", 25, hizTipi="Retract")
        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Group.1\Horizontal.1\Feedrate type"
        ].degeriStr = "MfgMacroRetractFeedrate"
        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Group.1\Horizontal.1\MfgMacroActive"
        ].degeri = True

        # facing.asOperasyon.makroEkseneYatayMesafeEkle("ReturnBetweenLevelsApproach", 5)
        # facing.asOperasyon.makroEkseneYatayMesafeEkle("ReturnBetweenLevelsRetract", 5)

        facing.ismi = f"FikoYT Profil Finish Tek Tur{pathlib.Path(facing.ismi).suffix}"

        # facing.catNesne.SetTool("12 FN")
        # ---->
        # ---->
        facing = self.operasyonEkle("DrillingDeepHole")

        facing.parametreler["Approach feedrate"].degeriStr = "3000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "150mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "1500turn_mn"

        facing.parametreler["Max depth of cut"].degeriStr = "1mm"
        # facing.parametreler["Jump distance"].degeriStr = "20mm"

        facing.parametreler["Output CYCLE Syntax"].degeri = False
        facing.parametreler["Rapid approach feedrate"].degeri = True
        facing.parametreler["Rapid retract feedrate"].degeri = True
        facing.parametreler["Rapid plunge feedrate"].degeri = True

        facing.ismi = f"FikoYT Gagalı Delik{pathlib.Path(facing.ismi).suffix}"

        # facing.catNesne.SetTool("10.5 MTK")
        # ---->
        # ---->
        facing = self.operasyonEkle("CircularMilling")

        facing.parametreler["Machining mode"].degeriStr = "MfgCircularMillingHelical"
        facing.parametreler["Helix mode "].degeriStr = "MfgHelixPitch"

        facing.parametreler["Machining tolerance"].degeri = 0.01

        facing.parametreler["Approach feedrate"].degeriStr = "3000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "800mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "2800turn_mn"

        facing.parametreler["Number of paths"].degeriStr = "1"
        facing.parametreler["Offset on Contour"].degeriStr = "0.1mm"

        facing.parametreler["Output CYCLE Syntax"].degeri = False

        facing.parametreler["Rapid plunge feedrate"].degeri = True

        facing.ismi = f"FikoYT Helisel Kafa Kaba{pathlib.Path(facing.ismi).suffix}"

        facing.catNesne.GetAttribute("MFG_HELIX_PITCH").value = 0.4

        # facing.catNesne.SetTool("12 KB")
        # ---->
        # ---->
        facing = self.operasyonEkle("CircularMilling")

        facing.parametreler["Machining mode"].degeriStr = "MfgCircularMillingStandard"
        facing.parametreler["Axial strategy"].degeriStr = "MfgNumberOfLevels"

        facing.parametreler["Machining tolerance"].degeri = 0.01

        facing.parametreler["Approach feedrate"].degeriStr = "3000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "800mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "2800turn_mn"

        facing.parametreler["Number of paths"].degeriStr = "1"
        facing.parametreler["Offset on Contour"].degeriStr = "-0.05mm"

        facing.parametreler["Output CYCLE Syntax"].degeri = False

        facing.parametreler["Rapid plunge feedrate"].degeri = True

        facing.ismi = f"FikoYT Kafa Finiş Tek Tur{pathlib.Path(facing.ismi).suffix}"

        facing.catNesne.GetAttribute("MfgMaxDepthOfCut").value = 0.4

        # facing.catNesne.SetTool("12 KB")
        # ---->
        # ---->
        facing = self.operasyonEkle("Pocketing")
        facing.parametreler["Machining tolerance"].degeri = 0.01
        facing.parametreler["Percentage of tool diameter"].degeri = 50
        facing.parametreler["Overhang ratio"].degeri = 50
        facing.parametreler["Axial strategy"].degeriStr = "MfgMaxDepthOfCut"
        facing.parametreler["Start"].degeriStr = "MfgStartOutside"
        facing.parametreler["Offset on Hard Boundary"].degeriStr = "0.1mm"

        facing.parametreler["Approach feedrate"].degeriStr = "3000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "2000mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Finishing feedrate"].degeriStr = "1500mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "2500turn_mn"

        facing.catNesne.GetAttribute("MfgMaxDepthOfCut").value = 0.4

        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Approach.1\Active macro ?"
        ].degeri = True
        facing.parametreler[
            f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Active macro ?"
        ].degeri = True
        facing.asOperasyon.makroEkseneDikMesafeEkle("Approach", 25)
        facing.asOperasyon.makroEkseneDikMesafeEkle("Retract", 25, hizTipi="Retract")

        facing.ismi = f"FikoYT Cep Boşaltma{pathlib.Path(facing.ismi).suffix}"

        # facing.catNesne.SetTool("50 TRM")
        # ---->
        # ---->
        facing = self.ekleKod("\n".join(["INSERT G90 G54 X0. Y0.", "INSERT M8"]))
        facing.name = "FikoYT X0Y0 M8"
        # ---->
        # ---->
        facing = self.ekleKod(
            "\n".join(["INSERT M9", "INSERT G91 G28 Z1.", "INSERT G91 G28 Y1."])
        )
        facing.name = "FikoYT Bitiş"
        # ---->
        self.ismi = "FikoYT Standartlar"

    def uyarStandartProgramlariEkle(self):
        facing = self.operasyonEkle("M3xHardMaterial")
        facing.parametreler["Machining tolerance"].degeri = 0.1
        facing.parametreler["Pass overlap (diameter ratio)"].degeri = 1
        facing.parametreler["Part contouring"].degeri = False
        facing.parametreler["Maximum depth of cut"].degeri = 30
        facing.parametreler["Offset on part"].degeri = 14
        facing.parametreler["Offset on bottom plane"].degeri = 3
        facing.parametreler["Offset on check"].degeri = 0

        facing.parametreler["Approach feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "4500turn_mn"

        facing.ismi = f"FikoYT Strafor Kaba{pathlib.Path(facing.ismi).suffix}"
        #--->
        facing = self.operasyonEkle("M3xAdvZLevel")
        facing.parametreler["Machining tolerance"].degeri = 0.1

        facing.parametreler["Cutting mode"].degeriStr = "M3xCuttingModeNoMatter"

        facing.parametreler["Maximum distance"].degeri = 4
        facing.parametreler["M3xRadialStepDistance"].degeri = 5
        facing.parametreler["Max. horizontal slope"].degeri = 30

        facing.parametreler["Offset on part"].degeri = 12.5
        facing.parametreler["Offset on bottom plane"].degeri = 3
        facing.parametreler["Offset on check"].degeri = 0

        facing.parametreler["Approach feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "4500turn_mn"

        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Approach.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Clearance.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Between passes.1\Active macro ?"
        # ].degeri = True

        facing.ismi = (
            f"FikoYT Strafor Ayrintili Finiş{pathlib.Path(facing.ismi).suffix}"
        )
        #--->
        facing = self.operasyonEkle("M3xBetweenContour")
        facing.parametreler["Machining tolerance"].degeri = 0.1

        facing.parametreler["Maximum width to machine"].degeri = 0.005
        facing.parametreler["Maximum distance"].degeri = 0.1
        facing.parametreler["Stepover mode"].degeriStr = "M3xStepOverModeConstant"
        facing.parametreler["Cycle type"].degeriStr = "M3xContouringModeParallelContour"

        facing.parametreler["Offset on part"].degeri = -3
        facing.parametreler["Offset on bottom plane"].degeri = 3
        facing.parametreler["Offset on check"].degeri = 0.1

        facing.parametreler["Approach feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "4500turn_mn"
        facing.parametreler["Part AutoLimit"].degeri = False

        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Approach.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Clearance.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Between passes.1\Active macro ?"
        # ].degeri = True

        facing.ismi = (
            f"FikoYT Boru Çizme{pathlib.Path(facing.ismi).suffix}"
        )
        #--->
        facing = self.operasyonEkle("M3xBetweenContour")
        facing.parametreler["Machining tolerance"].degeri = 0.1

        facing.parametreler["Maximum width to machine"].degeri = 15.3
        facing.parametreler["Maximum distance"].degeri = 0.1
        facing.parametreler["Stepover mode"].degeriStr = "M3xStepOverModeConstant"
        facing.parametreler["Cycle type"].degeriStr = "M3xContouringModeParallelContour"

        facing.parametreler["Offset on part"].degeri = -3
        facing.parametreler["Offset on bottom plane"].degeri = 3
        facing.parametreler["Offset on check"].degeri = 0.1

        facing.parametreler["Approach feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "4500turn_mn"
        facing.parametreler["Part AutoLimit"].degeri = False

        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Approach.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Clearance.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Between passes.1\Active macro ?"
        # ].degeri = True

        facing.ismi = (
            f"FikoYT Feder Kenar Düzeltme{pathlib.Path(facing.ismi).suffix}"
        )
        #--->
        facing = self.operasyonEkle("M3xZLevel")
        facing.parametreler["Machining tolerance"].degeri = 0.1

        facing.parametreler["Cutting mode"].degeriStr = "M3xCuttingModeNoMatter"

        facing.parametreler["Maximum distance"].degeri = 4
        # facing.parametreler["M3xRadialStepDistance"].degeri = 5
        facing.parametreler["Max. horizontal slope"].degeri = 30

        facing.parametreler["Offset on part"].degeri = 12.5
        facing.parametreler["Offset on bottom plane"].degeri = 3
        facing.parametreler["Offset on check"].degeri = 0

        facing.parametreler["Approach feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "4500turn_mn"
        facing.parametreler["Part AutoLimit"].degeri = False

        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Approach.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Clearance.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Between passes.1\Active macro ?"
        # ].degeri = True

        facing.ismi = (
            f"FikoYT Dik Finiş{pathlib.Path(facing.ismi).suffix}"
        )
        #--->
        facing = self.operasyonEkle("M3xSweeping")
        facing.parametreler["Machining tolerance"].degeri = 0.1

        facing.parametreler["Machined zone"].degeriStr = "M3xMachiningZoneHorizontalZones"

        facing.parametreler["Maximum distance"].degeri = 4
        # facing.parametreler["M3xRadialStepDistance"].degeri = 5
        facing.parametreler["Max. horizontal slope"].degeri = 35

        facing.parametreler["Offset on part"].degeri = 12.5
        facing.parametreler["Offset on bottom plane"].degeri = 3
        facing.parametreler["Offset on check"].degeri = 0

        facing.parametreler["Approach feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "4500turn_mn"
        facing.parametreler["Part AutoLimit"].degeri = False

        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Approach.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Clearance.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Between passes.1\Active macro ?"
        # ].degeri = True

        facing.ismi = (
            f"FikoYT Yatay Finiş{pathlib.Path(facing.ismi).suffix}"
        )
        #--->
        facing = self.operasyonEkle("M3xSweeping")
        facing.parametreler["Machining tolerance"].degeri = 0.1

        facing.parametreler["Machined zone"].degeriStr = "M3xMachiningZoneAll"

        facing.parametreler["Maximum distance"].degeri = 4
        # facing.parametreler["M3xRadialStepDistance"].degeri = 5
        facing.parametreler["Max. horizontal slope"].degeri = 35

        facing.parametreler["Offset on part"].degeri = 12.5
        facing.parametreler["Offset on bottom plane"].degeri = 3
        facing.parametreler["Offset on check"].degeri = 0

        facing.parametreler["Approach feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Retract feedrate"].degeriStr = "10000mm_mn"
        facing.parametreler["Machining spindle"].degeriStr = "4500turn_mn"
        facing.parametreler["Part AutoLimit"].degeri = False

        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Approach.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Retract.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Clearance.1\Active macro ?"
        # ].degeri = True
        # facing.parametreler[
        #     f"Process\{facing.ismi}\MfgParameter.6\Between passes.1\Active macro ?"
        # ].degeri = True

        facing.ismi = (
            f"FikoYT Komple Tarama{pathlib.Path(facing.ismi).suffix}"
        )


    def jsonForFikoKit(self, bilgiler: list = ["ismi"]) -> dict:
        rslt = {}
        for bilgi in bilgiler:
            rslt[bilgi] = getattr(self, bilgi, None)
        return rslt

    def __str__(self) -> str:
        return repr(self.ismi)
