{
    "macros":  [
                   {
                       "id":  "1789941358258450-0",
                       "name":  "dene",
                       "description":  "Catiaya Bağlan Scripti",
                       "path":  "D:\\Masaustu-2025\\dene.catscript",
                       "func":  "CATMain",
                       "passApp":  false
                   },
                   {
                       "id":  "1790147725639535-0",
                       "name":  "Düzlem",
                       "description":  "Catiadaki Plane Düzlemi",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "command":  "Plane",
                       "emoji":  "💠",
                       "inPalette":  true,
                       "paletteWorkbenches":  [
                                                  "prtcfg"
                                              ],
                       "paletteSelectionTypes":  [
                                                     "planarface"
                                                 ]
                   },
                   {
                       "id":  "1790148019228965-1",
                       "name":  "Sikeç",
                       "description":  "Catiadaki Sketch",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "command":  "Sketch",
                       "emoji":  "✍️",
                       "inPalette":  true,
                       "paletteWorkbenches":  [
                                                  "prtcfg",
                                                  "cathybridpartworkbench"
                                              ],
                       "paletteSelectionTypes":  [
                                                     "face",
                                                     "planarface"
                                                 ]
                   },
                   {
                       "id":  "1790020854537390-1",
                       "name":  "Join / Birleştir",
                       "description":  "Catiadaki Join Komutu",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "command":  "Join",
                       "emoji":  "🔗",
                       "inPalette":  true,
                       "paletteWorkbenches":  [
                                                  "catshapedesignworkbench",
                                                  "cathybridpartworkbench",
                                                  "prtcfg"
                                              ]
                   },
                   {
                       "id":  "1790148176996840-2",
                       "name":  "3d Sınırlar",
                       "description":  "Catianın Project 3D Silhouette Edges Komutu",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "command":  "Project 3D Silhouette Edges",
                       "emoji":  "➰",
                       "inPalette":  true,
                       "paletteWorkbenches":  [
                                                  "cs0wks"
                                              ]
                   },
                   {
                       "id":  "1790020312733093-0",
                       "name":  "Fill / Doldur",
                       "description":  "GSD deki Fill Komutu",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "command":  "Fill",
                       "emoji":  "🧺",
                       "inPalette":  true,
                       "paletteWorkbenches":  [
                                                  "cathybridpartworkbench",
                                                  "catshapedesignworkbench",
                                                  "prtcfg"
                                              ]
                   },
                   {
                       "id":  "1790237788409579-0",
                       "name":  "Katı Yüzey Sil",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "command":  "Remove Face",
                       "inPalette":  true,
                       "paletteWorkbenches":  [
                                                  "prtcfg"
                                              ],
                       "paletteSelectionTypes":  [
                                                     "face"
                                                 ]
                   },
                   {
                       "id":  "1790053075539437-0",
                       "name":  "Programı Simule Et",
                       "description":  "Catiadaki Replay Tool Path",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "command":  "Replay Tool Path",
                       "emoji":  "▶",
                       "inPalette":  true,
                       "paletteWorkbenches":  [
                                                  "m3xprogramworkbench"
                                              ]
                   },
                   {
                       "id":  "1789955088805241-0",
                       "name":  "Aktif Klasör Aç",
                       "description":  "Aktif DÖkümanın Klasörünü Açar",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "code":  "Function CATMain()\n Dim fikopost\r\n Set fikopost =       CreateObject(\"FikoYT.FikoPostV4\")\r\n fikopost.AktifKlasorAc CATIA\nEnd Function\n",
                       "language":  0,
                       "emoji":  "📂",
                       "inPalette":  true
                   },
                   {
                       "id":  "1790101687845038-0",
                       "name":  "Seçimli Test",
                       "description":  "Seçimli Filitre Test",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "code":  "Function CATMain()\n    Dim oSel As Selection\n    Set oSel = CATIA.ActiveDocument.Selection\n\n    \u0027 Ekranda seçili bir şey var mı kontrolü\n    If oSel.Count \u003e 0 Then\n        Dim secilenNesne As AnyObject\n        \u0027 Item2(1) seçilen ilk nesneyi, .Value ise onun altındaki asıl geometriyi verir\n        Set secilenNesne = oSel.Item2(1).Value\n        \n        \u0027 Nesnenin tipini alıyoruz\n        Dim nesneTipi As String\n        nesneTipi = TypeName(secilenNesne)\n        \n        MsgBox \"Seçili nesnenin tipi: \" \u0026 nesneTipi\n    Else\n        MsgBox \"Şu anda hiçbir nesne seçili değil!\"\n    End If\nEnd Function\n",
                       "language":  0,
                       "inPalette":  true
                   },
                   {
                       "id":  "1790086467113674-0",
                       "name":  "Eksen",
                       "description":  "Catia Axis System Komutu",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "command":  "Axis System",
                       "inPalette":  true,
                       "paletteWorkbenches":  [
                                                  "prtcfg",
                                                  "catshapedesignworkbench"
                                              ]
                   },
                   {
                       "id":  "1790041403926066-2",
                       "name":  "FikoYT Vukuatı İntizam",
                       "description":  "Eski Merkez",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "code":  "Function CATMain()\nDim fikopost\r\nSet fikopost = CreateObject(\"FikoYT.IFikoScript\")\r\nfikopost.Calistir CATIA\nEnd Function\n",
                       "language":  0,
                       "emoji":  "🛠️",
                       "inPalette":  true
                   },
                   {
                       "id":  "1789967375993837-0",
                       "name":  "Parttan Processe",
                       "description":  "PartDosyalarını Son Eksene Göre Hazır Programlarla Aynı Klasörüne Oluşturur",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "code":  "Function CATMain()\nDim fikopost\r\nSet fikopost = CreateObject(\"FikoYT.FikoPost2023\")\r\nfikopost.ProcessOlustur CATIA\nEnd Function\n",
                       "language":  0,
                       "emoji":  "📝",
                       "inPalette":  true,
                       "paletteDocKinds":  [
                                               "catpart"
                                           ]
                   },
                   {
                       "id":  "1790158276688836-1",
                       "name":  "Kütük",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "command":  "Creates Rough Stock",
                       "emoji":  "📦",
                       "inPalette":  true,
                       "paletteWorkbenches":  [
                                                  "prtcfg",
                                                  "catshapedesignworkbench",
                                                  "cathybridpartworkbench"
                                              ]
                   },
                   {
                       "id":  "1790368604621720-0",
                       "name":  "Eksen Çevir",
                       "description":  "Ekseni Xte Takla Attırır",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "code":  "Sub CATMain()\r\n\r\n    Dim doc\r\n    Dim part\r\n    Dim sel\r\n    Dim status\r\n    Dim sourceAxis\r\n\r\n    Set doc = CATIA.ActiveDocument\r\n    Set part = doc.Part\r\n    Set sel = doc.Selection\r\n\r\n    sel.Clear\r\n\r\n    status = sel.SelectElement2( _\r\n        Array(\"AxisSystem\"), _\r\n        \"Axis System seçin\", _\r\n        False)\r\n\r\n    If status \u003c\u003e \"Normal\" Then\r\n        MsgBox \"Seçim yapılmadı.\"\r\n        Exit Sub\r\n    End If\r\n\r\n    Set sourceAxis = sel.Item2(1).Value\r\n\r\n    Dim origin(2)\r\n    Dim xAxis(2)\r\n    Dim yAxis(2)\r\n    Dim zAxis(2)\r\n\r\n    sourceAxis.GetOrigin origin\r\n    sourceAxis.GetXAxis xAxis\r\n    sourceAxis.GetYAxis yAxis\r\n    sourceAxis.GetZAxis zAxis\r\n\r\n    \u0027 Y ekseni etrafında 180 derece\r\n    xAxis(0) = -xAxis(0)\r\n    xAxis(1) = -xAxis(1)\r\n    xAxis(2) = -xAxis(2)\r\n\r\n    zAxis(0) = -zAxis(0)\r\n    zAxis(1) = -zAxis(1)\r\n    zAxis(2) = -zAxis(2)\r\n\r\n    Dim axisSystems\r\n    Dim newAxis\r\n\r\n    Set axisSystems = part.AxisSystems\r\n    Set newAxis = axisSystems.Add()\r\n\r\n    newAxis.OriginType = catAxisSystemOriginByCoordinates\r\n    newAxis.PutOrigin origin\r\n\r\n    newAxis.XAxisType = catAxisSystemAxisByCoordinates\r\n    newAxis.PutXAxis xAxis\r\n\r\n    newAxis.YAxisType = catAxisSystemAxisByCoordinates\r\n    newAxis.PutYAxis yAxis\r\n\r\n    newAxis.ZAxisType = catAxisSystemAxisByCoordinates\r\n    newAxis.PutZAxis zAxis\r\n\r\n    newAxis.Name = sourceAxis.Name \u0026 \"_Y180\"\r\n\r\n    part.Update\r\n\r\nEnd Sub",
                       "language":  0,
                       "inPalette":  true,
                       "paletteWorkbenches":  [
                                                  "prtcfg",
                                                  "cathybridpartworkbench",
                                                  "catshapedesignworkbench"
                                              ]
                   },
                   {
                       "id":  "1790053545051716-1",
                       "name":  "Kaydet",
                       "description":  "Dökümanı Kaydet",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  false,
                       "command":  "Save",
                       "emoji":  "💾",
                       "inPalette":  true
                   },
                   {
                       "id":  "1790422591291652-0",
                       "name":  "Eksen Çevir Düzlem",
                       "path":  "D:\\__sistem__\\Masaustu\\FikoYT.Yeni.Cag\\flutter\\fikatia_merkez\\eksen_cevir_plane_at.CATScript",
                       "func":  "CATMain",
                       "passApp":  false,
                       "inPalette":  true
                   },
                   {
                       "id":  "1790711950656-99",
                       "name":  "D30 Kuresel Top Takimi",
                       "description":  "FTK.pyd kutuphanesinden MfgBallStylusTool (18. kaynak) ekler ve MFG_* parametrelerini yazar",
                       "path":  "",
                       "func":  "CATMain",
                       "passApp":  true,
                       "code":  "\u0027=====================================================================\r\n\u0027  FikoCATIA  -  D30 KURESEL TOP TAKIMI (MfgBallStylusTool)\r\n\u0027  CATIA V5  -  .catprocess  -  VBScript\r\n\u0027\r\n\u0027  YONTEM: Python IPPRProductlar.takim_ekle ile AYNI yol:\r\n\u0027    1) Takim kutuphanesini (FTK.pyd) Documents.Open ile ac\r\n\u0027    2) kaynaklar koleksiyonundan 17. sirayi AL  (MfgBallStylusTool)\r\n\u0027    3) Hedef processun PRODUCT listesine ekle\r\n\u0027    4) Eklenen ogenin MFG_* parametrelerini yaz\r\n\u0027\r\n\u0027  DOGRULAMA: FTK.pyd icinde MfgBallStylusTool ve\r\n\u0027  MFG_BALL_LENGTH_DOWN bulundu -\u003e indeks 17 = Kuresel Top Takimi\r\n\u0027  (IMfgTakim.py: TakimTurleri.Top_Takimi, index 17)\r\n\u0027\r\n\u0027  KULLANIM: FikoCATIA \u003e Makro kutuphanesi \u003e Yeni \u003e \"Kod\"\r\n\u0027            \"Uygulamayi parametre gecir\" (passApp) ACIK OLMAMALI.\r\n\u0027\r\n\u0027  DIKKAT - CATMain parametresiz OLMALI:\r\n\u0027    com_bridge.cpp Evaluate\u0027a gonderdigi iParameters dizisinin uzunlugunu\r\n\u0027    passApp bayragindan alir: passApp=Pass -\u003e 1 eleman, yoksa 0 eleman.\r\n\u0027    Fonksiyon (app) ile yazilirsa CATIA 0 elemanli diziye karsi\r\n\u0027    DISP_E_BADPARAMCOUNT (0x80020009) doner:\r\n\u0027      \"Invalid parameter array size (hr=0x80020009)\"\r\n\u0027    Bu yuzden asagida CATMain() parametresiz, CATIA global\u0027i kullanilir.\r\n\u0027=====================================================================\r\n\r\nFunction CATMain(appOrEmpty)\r\n\r\n    \u0027================ TUM DEGISKENLER ===================\r\n    \u0027 KRİTİK: VBScript\u0027te Dim OLMAYAN bir değişken otomatik olarak\r\n    \u0027 Variant/Empty olur. Nesne degiskenlerinde (oApp, oProc, oT ...)\r\n    \u0027 Empty olan bir degiskene erisim \"Nesne gerekli\" (Object required)\r\n    \u0027 HATASI verir ve script ilk satirda cokup o noktaya kadar gelemez.\r\n    \u0027 Once \"Dim prm\" yalnizca sona eklenmis, geri kalanlar hic tanimli\r\n    \u0027 degildi. O yuzden hepsi burada ONCEDEN tanimlaniyor.\r\n    Dim oApp, oCur, oProc, oPart, oTargetDoc, oNewDoc\r\n    Dim oToolDoc, oPPR, oKaynaklar, oT, oTargetPPR, oHedefRes, oYeni\r\n    Dim fso, fh, ts\r\n    Dim D_CAP, D_LENGTH, D_BALLDOW, D_BODYD, D_OVERALL, T_NAME, T_NUMBER\r\n    Dim rep, made, nDoc, nSrc, tmpDir, i\r\n    Dim prm, yazilan, yazilamayan\r\n    Dim FTK_YOLU\r\n    Dim nHedef, k, ad, kaynakAdi, zatenVar\r\n    Dim hataMetni, hataNo\r\n    Dim oSrcParams, oTmpParams, oYeniParams\r\n    Dim bulunduProcess, bulunduPart, hedefOk\r\n\r\n    \u0027--- D30 kuresel top takimi olculeri (mm) ---\r\n    D_CAP      = \"30mm\"\r\n    D_LENGTH   = \"4,665mm\"\r\n    D_BALLDOW  = \"2,5mm\"\r\n    D_BODYD    = \"2,5mm\"\r\n    D_OVERALL  = \"30mm\"\r\n    T_NAME     = \"EM30-BALL\"\r\n    T_NUMBER   = \"1\"\r\n\r\n    rep  = \"\"\r\n    made = False\r\n\r\n    \u0027 🔴 İLK ADIM TEŞHİSİ: hata 31 ms\u0027de oluyor yani CATIA\u0027ya hic\r\n    \u0027 ulasmadan oluyor. oApp gercekten ne? Raporun BASINA yaziyoruz ki\r\n    \u0027 bu sefer gercek veri elimizde olsun.\r\n    Dim t1, t2\r\n    t1 = \"ADIM0 parametre IsObject=\" \u0026 IsObject(appOrEmpty)\r\n    t2 = \" | CATIA globali IsObject=\" \u0026 IsObject(CATIA)\r\n    On Error Resume Next\r\n    Err.Clear\r\n    If IsObject(CATIA) Then\r\n        t2 = t2 \u0026 \" | SystemService=\" \u0026 TypeName(CATIA.SystemService)\r\n    End If\r\n    Err.Clear\r\n    On Error GoTo 0\r\n    rep = t1 \u0026 t2 \u0026 vbCrLf\r\n\r\n    \u0027================ 0) CATIA REFERANSI =================\r\n    \u0027 UI\u0027daki \"app\" anahtari ACIK olabilir (varsayilan). Bu durumda\r\n    \u0027 parametre dizisi 1 elemanli gelir; KAPALI ise 0 elemanli.\r\n    \u0027 0x80020009 (DISP_E_BADPARAMCOUNT) olmamasi icin parametre ALIYORUZ,\r\n    \u0027 ama deger bos/Nothing ise global CATIA\u0027ya dusuyoruz.\r\n    \u0027\r\n    \u0027 DÜZELTME: Once \"Set oApp = Nothing\" + \"If oApp Is Nothing\" yaziliydi\r\n    \u0027 ve On Error COK GEC (3. satirdan sonra) basliyordu. VBScript\u0027te\r\n    \u0027 \"Is Nothing\" tanimsiz/Empty bir degiskende \"Nesne gerekli\" verir ve\r\n    \u0027 Resume Next YAKALAMAZ (tuzak: asagidaki hata bu yuzden cikiyordu).\r\n    \u0027 Burada: Once hata izleme ACIK, sonra TEK bir Set deneniyor.\r\n    Dim oAlindi\r\n    oAlindi = False\r\n    On Error Resume Next\r\n    Err.Clear\r\n    \u0027 1) Gelen parametre\r\n    If IsObject(appOrEmpty) Then\r\n        Set oApp = appOrEmpty\r\n        If Err.Number = 0 Then oAlindi = True\r\n        Err.Clear\r\n    End If\r\n    \u0027 2) Global CATIA\r\n    If Not oAlindi Then\r\n        Set oApp = CATIA\r\n        If Err.Number = 0 Then oAlindi = True\r\n        Err.Clear\r\n    End If\r\n    On Error GoTo 0\r\n\r\n    If Not oAlindi Then\r\n        rep = t1 \u0026 t2 \u0026 vbCrLf \u0026 rep\r\n        CATMain = \"HATA: CATIA referansi alinamadi. \" \u0026 t1 \u0026 t2\r\n        Exit Function\r\n    End If\r\n\r\n    \u0027================ 1) HEDEF PROCESSU BUL =============\r\n    \u0027 TEŞHİS: bu blokta ne gordugumuzu RAPORA yaziyoruz. Kullanicida\r\n    \u0027 .catprocess acikken bulamama sorunu vardi; sebebini ancak boyle\r\n    \u0027 goruruz (belge adi, uzanti, Documents.Count).\r\n    Set oProc = Nothing\r\n    Set oPart = Nothing\r\n    Set oTargetDoc = Nothing      \u0027 🔴 4. adımda lazim: .PPRDocument.Resources\r\n    nDoc = 0\r\n    On Error Resume Next\r\n    Err.Clear\r\n    nDoc = oApp.Documents.Count\r\n    If Err.Number \u003c\u003e 0 Then\r\n        Err.Clear\r\n        nDoc = -1\r\n    End If\r\n    rep = rep \u0026 \"Documents.Count = \" \u0026 nDoc \u0026 vbCrLf\r\n\r\n    If nDoc \u003e 0 Then\r\n        \u0027 Once aktif belge\r\n        Err.Clear\r\n        Set oCur = oApp.ActiveDocument\r\n        If Err.Number = 0 Then\r\n            If IsObject(oCur) Then\r\n                \u0027 🔴 TEŞHİS: .Name tam olarak ne donuyor? Uzunluk + tirnak\r\n                \u0027 icinde yaziyoruz. Onceki raporda \"-\u003e Process/Part degil\"\r\n                \u0027 yaziyordu ama BELGE ADI \".CATProcess\" idi; demek ki\r\n                \u0027 InStr girdisi bekledigimizden farkli.\r\n                Dim hamAd\r\n                hamAd = \"\"\r\n                On Error Resume Next\r\n                Err.Clear\r\n                hamAd = oCur.Name\r\n                If Err.Number \u003c\u003e 0 Then\r\n                    Err.Clear\r\n                    hamAd = \"(Name okunamadi)\"\r\n                End If\r\n                On Error GoTo 0\r\n                rep = rep \u0026 \"AKTIF: [\" \u0026 hamAd \u0026 \"] uzunluk=\" \u0026 Len(hamAd) \u0026 vbCrLf\r\n                rep = rep \u0026 \"  InStr(LCase(ad),\u0027.catprocess\u0027)=\" \u0026 _\r\n                      InStr(LCase(hamAd), \".catprocess\") \u0026 vbCrLf\r\n                rep = rep \u0026 \"  LCase(ad)=[\" \u0026 LCase(hamAd) \u0026 \"]\" \u0026 vbCrLf\r\n                \u0027 🔴 BURADA 5 AYRI HATA VARDI: LCase(InStr(...)) yazilmis.\r\n                \u0027 InStr bir SAYI doner; LCase sayiya uygulanamaz -\u003e\r\n                \u0027 \"Nesne bu ozellige sahip degil\" hatasi ve dal ATLANIR.\r\n                \u0027 Duzgu: once ismi kucult, SONRA ara -\u003e InStr(LCase(ad), ...)\r\n                If InStr(LCase(hamAd), \".catprocess\") \u003e 0 Then\r\n                    \u0027 🔴 SATIR 156 HATASI: \".Process\" YOK.\r\n                    \u0027 IPPRDokuman.py:26  -\u003e  asType(\"PPRDocument\").PPRDocument\r\n                    \u0027 Yani belge nesnesinde \".PPRDocument\" var, \".Process\" yok.\r\n                    Set oTargetDoc = oCur\r\n                    Set oProc = oCur.PPRDocument\r\n                    bulunduProcess = True\r\n                    rep = rep \u0026 \"  -\u003e PPRDocument OK\" \u0026 vbCrLf\r\n                ElseIf InStr(LCase(hamAd), \".catpart\") \u003e 0 Then\r\n                    Set oPart = oCur.Part\r\n                    bulunduPart = True\r\n                    rep = rep \u0026 \"  -\u003e Part OK\" \u0026 vbCrLf\r\n                Else\r\n                    rep = rep \u0026 \"  -\u003e Process/Part degil\" \u0026 vbCrLf\r\n                End If\r\n            Else\r\n                rep = rep \u0026 \"AKTIF: Nothing\" \u0026 vbCrLf\r\n            End If\r\n        Else\r\n            rep = rep \u0026 \"AKTIF: okunamadi\" \u0026 vbCrLf\r\n        End If\r\n        Err.Clear\r\n\r\n        \u0027 Sonra tum belgeler\r\n        For i = 1 To nDoc\r\n            Err.Clear\r\n            Set oCur = oApp.Documents.Item(i)\r\n            If Err.Number = 0 Then\r\n                If IsObject(oCur) Then\r\n                    Dim hamAd2\r\n                    hamAd2 = \"\"\r\n                    On Error Resume Next\r\n                    Err.Clear\r\n                    hamAd2 = oCur.Name\r\n                    If Err.Number \u003c\u003e 0 Then\r\n                        Err.Clear\r\n                        hamAd2 = \"(okunamadi)\"\r\n                    End If\r\n                    On Error GoTo 0\r\n                    rep = rep \u0026 \"  [\" \u0026 i \u0026 \"] [\" \u0026 hamAd2 \u0026 \"] len=\" \u0026 Len(hamAd2) \u0026 _\r\n                          \" InStr=\" \u0026 InStr(LCase(hamAd2), \".catprocess\") \u0026 vbCrLf\r\n                    If InStr(LCase(hamAd2), \".catprocess\") \u003e 0 Then\r\n                        rep = rep \u0026 \"      [PROCESS]\" \u0026 vbCrLf\r\n                        If bulunduProcess = False Then\r\n                            Set oTargetDoc = oCur\r\n                            Set oProc = oCur.PPRDocument\r\n                            bulunduProcess = True\r\n                        End If\r\n                    ElseIf InStr(LCase(hamAd2), \".catpart\") \u003e 0 Then\r\n                        rep = rep \u0026 \"      [PART]\" \u0026 vbCrLf\r\n                        If bulunduPart = False Then\r\n                            Set oPart = oCur.Part\r\n                            bulunduPart = True\r\n                        End If\r\n                    End If\r\n                End If\r\n            Else\r\n                rep = rep \u0026 \"  [\" \u0026 i \u0026 \"] okunamadi\" \u0026 vbCrLf\r\n            End If\r\n            Err.Clear\r\n        Next\r\n    Else\r\n        rep = rep \u0026 \"HICBIR ACIK BELGE YOK\" \u0026 vbCrLf\r\n    End If\r\n    On Error GoTo 0\r\n\r\n\r\n    \u0027================ 1b) PROCESS YOKSA OLUSTUR ==========\r\n    \u0027 Kullanicida .catprocess acik degilse acik .CATPart UZERINDEN\r\n    \u0027 process olustururuz (Insert \u003e Process). Boylece \"once bir catprocess\r\n    \u0027 ac\" demek zorunda kalmayiz.\r\n    If TypeName(oProc) = \"Nothing\" And TypeName(oPart) \u003c\u003e \"Nothing\" Then\r\n        On Error Resume Next\r\n        Err.Clear\r\n        Set oNewDoc = oApp.Documents.Add(\"ProcessDocument\")\r\n        If Err.Number \u003c\u003e 0 Then\r\n            Err.Clear\r\n            Set oNewDoc = Nothing\r\n        End If\r\n        Err.Clear\r\n        If IsObject(oNewDoc) Then\r\n            \u0027 Documents.Add(\"ProcessDocument\") zaten PPRDocument döndürür;\r\n            \u0027 IPPRDokuman.py:26 -\u003e .PPRDocument\r\n            Set oTargetDoc = oNewDoc\r\n            Set oProc = oNewDoc.PPRDocument\r\n            If TypeName(oProc) \u003c\u003e \"Nothing\" Then\r\n                Err.Clear\r\n                oProc.Part = oPart\r\n                If Err.Number \u003c\u003e 0 Then Err.Clear\r\n                rep = \"Acik Part\u0027tan yeni process olusturuldu.\" \u0026 vbCrLf\r\n            End If\r\n        End If\r\n        On Error GoTo 0\r\n    End If\r\n\r\n    \u0027 ---------------- RAPORU BURADA DA YAZ ----------------\r\n    \u0027 Tebhis icin Onemli: belge bulunamadiysa da rapor YAZILIR, yoksa\r\n    \u0027 \"catprocess acin\" hatasini gorup hangi belgenin gorunmedigini\r\n    \u0027 bilemiyoruz.\r\n    If TypeName(oProc) = \"Nothing\" Then\r\n        On Error Resume Next\r\n        Err.Clear\r\n        tmpDir = \"\"\r\n        tmpDir = oApp.SystemService.Environ(\"TEMP\")\r\n        If Err.Number \u003c\u003e 0 Then\r\n            Err.Clear\r\n            tmpDir = \"C:\\Temp\\\"\r\n        End If\r\n        If Len(tmpDir) = 0 Then tmpDir = \"C:\\Temp\\\"\r\n        If Right(tmpDir, 1) \u003c\u003e \"\\\" Then tmpDir = tmpDir \u0026 \"\\\"\r\n        rep = rep \u0026 vbCrLf \u0026 \"RAPOR: \" \u0026 tmpDir \u0026 \"fiko_takim_rapor.txt\" \u0026 vbCrLf\r\n        Err.Clear\r\n        \u0027 RAPOR YAZIMI: CATIA FileSystem.CreateFile + OpenAsTextStream\r\n        \u0027 DOSYAYI 0 BAYT OLUSTURUYOR, sonra textstream sessizce basarisiz\r\n        \u0027 oluyor -\u003e rapor hep bos kaliyordu. FSO OpenTextFile(2=write)\r\n        \u0027 calisiyor. Onun yerine onu kullaniyoruz.\r\n        Err.Clear\r\n        Set fso = CreateObject(\"Scripting.FileSystemObject\")\r\n        Set fh = fso.OpenTextFile(tmpDir \u0026 \"fiko_takim_rapor.txt\", 2, True)\r\n        fh.WriteLine rep\r\n        fh.Close\r\n        CATMain = \"HATA: process bulunamadi. Rapor: \" \u0026 tmpDir \u0026 \"fiko_takim_rapor.txt\"\r\n    End If\r\n    rep = rep \u0026 \"Hedef process hazir.\" \u0026 vbCrLf\r\n\r\n\r\n    \u0027================ 2) TAKIM KUTUPHANESINI AC =========\r\n    \u0027 Python: anaProgram.dokumanlar.oku(\u003cFTK.pyd yolu\u003e)\r\n    \u0027 Burada: verilen FTK_YOLU degistirilirse kutuphane degisir.\r\n    FTK_YOLU = \"D:\\__sistem__\\Masaustu\\FikatiaV2024\\FTK.pyd\"\r\n\r\n    Set oToolDoc = Nothing\r\n    On Error Resume Next\r\n    Err.Clear\r\n    Set oToolDoc = oApp.Documents.Open(FTK_YOLU)\r\n    If Err.Number \u003c\u003e 0 Then\r\n        Err.Clear\r\n        On Error GoTo 0\r\n        CATMain = \"HATA: takim kutuphanesi acilamadi.\" \u0026 vbCrLf \u0026 _\r\n                  \"Yol: \" \u0026 FTK_YOLU \u0026 vbCrLf \u0026 _\r\n                  \"Bu yolu scriptin icindeki FTK_YOLU ile duzeltin.\"\r\n        Exit Function\r\n    End If\r\n    On Error GoTo 0\r\n    rep = rep \u0026 \"Kutuphane: \" \u0026 oToolDoc.Name \u0026 vbCrLf\r\n\r\n    \u0027================ 3) 18. KAYNAK = TOP TAKIMI =========\r\n    \u0027 Python zinciri (IPPRDokuman.py:26 ve :39-40):\r\n    \u0027     self.catNesne = asType(\"PPRDocument\").PPRDocument\r\n    \u0027     kaynaklar    = self.catNesne.Resources\r\n    \u0027 Yani: Document -\u003e .PPRDocument -\u003e .Resources\r\n    \u0027 ÖNEMLİ: \"Resources\" kelimesi \"kaynak\" anlamında; önceki denemelerde\r\n    \u0027 .Kaynaklar / .Sources denendi, ikisi de YOK. Doğrusu .Resources.\r\n    \u0027\r\n    \u0027 VBScript Item() 1 tabanlıdır; Python item(17) 0 tabanlıydı,\r\n    \u0027 yani VBScript\u0027te 18.\r\n    Set oKaynaklar = Nothing\r\n    Set oPPR = Nothing\r\n    On Error Resume Next\r\n    Err.Clear\r\n    \u0027 Once dogrudan dene (bazi surumlerde Document.Resources olabilir)\r\n    Set oKaynaklar = oToolDoc.Resources\r\n    If Err.Number \u003c\u003e 0 Then\r\n        Err.Clear\r\n        \u0027 IPPRDokuman.py\u0027deki gibi: .PPRDocument.Resources\r\n        Set oPPR = oToolDoc.PPRDocument\r\n        If Err.Number = 0 Then\r\n            If IsObject(oPPR) Then\r\n                Err.Clear\r\n                Set oKaynaklar = oPPR.Resources\r\n                If Err.Number \u003c\u003e 0 Then Err.Clear\r\n            End If\r\n        Else\r\n            Err.Clear\r\n        End If\r\n    End If\r\n    If TypeName(oKaynaklar) = \"Nothing\" Then\r\n        Err.Clear\r\n        On Error GoTo 0\r\n        CATMain = \"HATA: kutuphanede .Resources bulunamadi. \" \u0026 _\r\n                  \"Belge: \" \u0026 oToolDoc.Name\r\n        Exit Function\r\n    End If\r\n    On Error GoTo 0\r\n\r\n\r\n    nSrc = 0\r\n    On Error Resume Next\r\n    nSrc = oKaynaklar.Count\r\n    If Err.Number \u003c\u003e 0 Then\r\n        Err.Clear\r\n        On Error GoTo 0\r\n        CATMain = \"HATA: kaynak sayisi okunamadi.\"\r\n        Exit Function\r\n    End If\r\n    On Error GoTo 0\r\n    rep = rep \u0026 \"Kaynak sayisi (Count): \" \u0026 nSrc \u0026 vbCrLf\r\n    rep = rep \u0026 \"Koleksiyon tipi: \" \u0026 TypeName(oKaynaklar) \u0026 vbCrLf\r\n\r\n    \u0027---------------- KAYNAK TARAMASI --------------------\r\n    \u0027 [KOK NEDEN] oKaynaklar.Item(18) HATA VERMEDEN bos (Empty) donuyor.\r\n    \u0027 Once sadece Err.Number kontrol ediyorduk; CATIA koleksiyonlari\r\n    \u0027 0-tabanli OLABILIR. Sonuc: oT bos kalir ve sonraki her \".Add(oT)\"\r\n    \u0027 cagrisi \"Nesne gerekli\" ile PATLAR. Son iki hatanin sebebi bu.\r\n    Dim ilkGecerli, oDeneme, sayilan, tarama, m\r\n    ilkGecerli = -1\r\n    sayilan = 0\r\n    tarama = \"\"\r\n    m = nSrc\r\n    If m \u003e 30 Then m = 30\r\n    For k = 1 To m\r\n        Set oDeneme = Nothing\r\n        On Error Resume Next\r\n        Err.Clear\r\n        Set oDeneme = oKaynaklar.Item(k)\r\n        If Err.Number \u003c\u003e 0 Then\r\n            Err.Clear\r\n            tarama = tarama \u0026 k \u0026 \":HATA \"\r\n        ElseIf IsObject(oDeneme) Then\r\n            If ilkGecerli \u003c 0 Then ilkGecerli = k\r\n            tarama = tarama \u0026 k \u0026 \":VAR \"\r\n            sayilan = sayilan + 1\r\n        Else\r\n            tarama = tarama \u0026 k \u0026 \":BOS \"\r\n        End If\r\n        On Error GoTo 0\r\n    Next\r\n    rep = rep \u0026 \"TARAMA[1..\" \u0026 m \u0026 \"] = \" \u0026 tarama \u0026 vbCrLf\r\n    rep = rep \u0026 \"Nesne donen: \" \u0026 sayilan \u0026 \" / ilk gecerli: \" \u0026 ilkGecerli \u0026 vbCrLf\r\n\r\n    \u0027 Once 18\u0027i dene (Python yolu: item(17) -\u003e Item(18))\r\n    Set oT = Nothing\r\n    On Error Resume Next\r\n    Err.Clear\r\n    Set oT = oKaynaklar.Item(18)\r\n    If Err.Number \u003c\u003e 0 Then\r\n        Err.Clear\r\n        Set oT = Nothing\r\n        rep = rep \u0026 \"Item(18): HATA\" \u0026 vbCrLf\r\n    ElseIf IsObject(oT) Then\r\n        rep = rep \u0026 \"Item(18): NESNE OK\" \u0026 vbCrLf\r\n    Else\r\n        rep = rep \u0026 \"Item(18): BOS\" \u0026 vbCrLf\r\n        Set oT = Nothing\r\n    End If\r\n    On Error GoTo 0\r\n\r\n    If TypeName(oT) = \"Nothing\" Then\r\n        On Error Resume Next\r\n        Err.Clear\r\n        If ilkGecerli \u003e 0 Then\r\n            Set oT = oKaynaklar.Item(ilkGecerli)\r\n            If Err.Number \u003c\u003e 0 Then\r\n                Err.Clear\r\n                Set oT = Nothing\r\n            End If\r\n        End If\r\n        On Error GoTo 0\r\n    End If\r\n\r\n    If TypeName(oT) = \"Nothing\" Then\r\n        On Error GoTo 0\r\n        CATMain = \"HATA: hicbir indeks nesne donmedi. Count=\" \u0026 nSrc \u0026 \" tarama: \" \u0026 tarama\r\n        Exit Function\r\n    End If\r\n    rep = rep \u0026 \"Secilen kaynak: nesne OK\" \u0026 vbCrLf\r\n    \u0027 Python (IPPRProductlar.py:34-41):\r\n    \u0027     ObjeTemp = Product.catNesne   (IFikomObject ise)\r\n    \u0027     self.catNesne.Add(ObjeTemp)\r\n    \u0027     return self.item(self.sayisi - 1)\r\n    \u0027\r\n    \u0027 DÜZELTME 1: Add\u0027in hata metni (Err.Description) atiliyordu; CATIA\r\n    \u0027 gercek sebebi orada yazar. Artik rapora yaziliyor.\r\n    \u0027 DÜZELTME 2: Once isim kontrolu yapiliyor (dosyadanTakimlariEkle,\r\n    \u0027:707-710). Ayni isimli takim varsa Add calismayabilir.\r\n    \u0027\r\n    \u0027 🔴 HEDEF ERİŞİMİ — ASIL KÖK NEDEN (rapor kanıtı):\r\n    \u0027   Hedef koleksiyon tipi: Nothing / Count: -1\r\n    \u0027 Yani oHedefRes GERÇEKTEN Nothing idi ve Add orada patliyordu.\r\n    \u0027\r\n    \u0027 İki sebep vardı, ikisi de burada:\r\n    \u0027\r\n    \u0027 (1) Python HEDEFTE ÖNCE CAST YAPIYOR (IPPRDokuman.py:26):\r\n    \u0027         self.catNesne = self.asType(\"PPRDocument\").PPRDocument\r\n    \u0027     asType = \"Dim x As PPRDocument : Set x = Process\" (IFikomObject.py:274)\r\n    \u0027     Yani .PPRDocument ÖZELLİĞİ CAST OLUNMADAN ERİŞİLEMEZ.\r\n    \u0027     Biz oTargetDoc.PPRDocument dedik ama CAST yoktu -\u003e Nothing.\r\n    \u0027\r\n    \u0027 (2) KONTROL HATASI: \"If Not IsObject(x)\" koruması BOŞ nesneyi\r\n    \u0027     yakalamıyor — VBScript\u0027te IsObject(Nothing) = True döner.\r\n    \u0027     Bu yüzden Nothing ile .Add() çağrılıyordu (hata 424).\r\n    \u0027\r\n    \u0027 Çözüm: CAST\u0027i Evaluate ile yapıyoruz ve sonucu BAYRAKLA doğruluyoruz.\r\n    Set oHedefRes = Nothing\r\n    hedefOk = False\r\n    On Error Resume Next\r\n    Err.Clear\r\n    Set oHedefRes = oTargetDoc.PPRDocument.Resources\r\n    If Err.Number = 0 And TypeName(oHedefRes) \u003c\u003e \"Nothing\" Then hedefOk = True\r\n    Err.Clear\r\n    If Not hedefOk Then\r\n        \u0027 CAST ile dene (Python asType(\"PPRDocument\") yolu)\r\n        Err.Clear\r\n        Set oHedefRes = oApp.SystemService.Evaluate( _\r\n            \"Function CATMain(d)\" \u0026 vbCrLf \u0026 _\r\n            \"  Dim p As PPRDocument\" \u0026 vbCrLf \u0026 _\r\n            \"  Set p = d\" \u0026 vbCrLf \u0026 _\r\n            \"  CATMain = p.PPRDocument.Resources\" \u0026 vbCrLf \u0026 _\r\n            \"End Function\", 0, \"CATMain\", oTargetDoc)\r\n        If Err.Number = 0 And TypeName(oHedefRes) \u003c\u003e \"Nothing\" Then hedefOk = True\r\n        Err.Clear\r\n    End If\r\n    If Not hedefOk Then\r\n        \u0027 Son care: hedefteki Resource\u0027lar Process uzerinden\r\n        Err.Clear\r\n        Set oHedefRes = oProc.Resources\r\n        If Err.Number = 0 And TypeName(oHedefRes) \u003c\u003e \"Nothing\" Then hedefOk = True\r\n        Err.Clear\r\n    End If\r\n    On Error GoTo 0\r\n\r\n    rep = rep \u0026 \"Hedef bulundu mu: \" \u0026 hedefOk \u0026 _\r\n          \" / tip: \" \u0026 TypeName(oHedefRes) \u0026 vbCrLf\r\n\r\n    If Not hedefOk Then\r\n        On Error GoTo 0\r\n        \u0027 ⚠️ oTargetDoc Nothing ise burada da PATLARDI. Once sadece\r\n        \u0027 IsObject() kontrol ediyorduk, oysa o Nothing\u0027a True donuyor.\r\n        Dim belgeAdi\r\n        belgeAdi = \"(bilinmiyor)\"\r\n        On Error Resume Next\r\n        Err.Clear\r\n        If TypeName(oTargetDoc) \u003c\u003e \"Nothing\" Then belgeAdi = oTargetDoc.Name\r\n        Err.Clear\r\n        On Error GoTo 0\r\n        CATMain = \"HATA: hedef .Resources bulunamadi (CAST denendi). Belge: \" \u0026 belgeAdi\r\n        Exit Function\r\n    End If\r\n\r\n    \u0027 Hedefte kac takim var (isim tekilligi icin)\r\n    \u0027 DİKKAT: Raporda \"Hedef Resources.Count = -1\" cikti → oHedefRes\r\n    \u0027 SAYILAMIYOR. Bu, hedefte dogru koleksiyonu bulamadigimizin\r\n    \u0027 belirtisi. Birkaç yol deneyip HEPSINI rapora yaziyoruz.\r\n    nHedef = 0\r\n    Dim hDefTip\r\n    hDefTip = TypeName(oHedefRes)\r\n    On Error Resume Next\r\n    Err.Clear\r\n    nHedef = oHedefRes.Count\r\n    If Err.Number \u003c\u003e 0 Then\r\n        Err.Clear\r\n        nHedef = -1\r\n    End If\r\n    On Error GoTo 0\r\n    rep = rep \u0026 \"Hedef koleksiyon tipi: \" \u0026 hDefTip \u0026 \" / Count: \" \u0026 nHedef \u0026 vbCrLf\r\n\r\n    \u0027 Kaynagin adini oku (tekillik kontrolu icin)\r\n    \u0027 DÜZELTME: Bu adım ÖNCE zorunluydu ve GetAttribute hatasinda script\u0027i\r\n    \u0027 öldürüyordu. Oysa Python\u0027da kaynak üzerinde GetAttribute HIC\r\n    \u0027 çağrılmıyor: kaynak yalnızca Add()\u0027e veriliyor\r\n    \u0027 (IPPRProductlar.py:67-68), parametreler EKLENEN ögeden okunuyor\r\n    \u0027 (:71-72). Yani bu teşhis ADIMI şart değil — şimdi sessizce atlanıyor.\r\n    kaynakAdi = \"(okunamadi)\"\r\n    On Error Resume Next\r\n    Err.Clear\r\n    Set oSrcParams = oT.Parameters\r\n    If Err.Number = 0 Then\r\n        If IsObject(oSrcParams) Then\r\n            Err.Clear\r\n            \u0027 🔴 Once \"MFG_NAME\" ile okunuyordu; bu PYTHON degisken adi,\r\n            \u0027 CATIA parametre adi DEGIL -\u003e hep \"(okunamadi)\" donuyordu ve\r\n            \u0027 tekillik kontrolu sessizce atlaniyordu. Gercek ad: \"Name\u003e\u003e\u003e\"\r\n            \u0027 (RESMI DOKUMAN: Parameters\u0027ta GetAttribute YOK; Item var)\r\n            kaynakAdi = \"(okunamadi)\"\r\n            Err.Clear\r\n            Set oPrm = oSrcParams.Item(\"Name\")\r\n            If Err.Number = 0 Then\r\n                kaynakAdi = oPrm.ValueAsString\r\n            Else\r\n                Err.Clear\r\n            End If\r\n            If Err.Number \u003c\u003e 0 Then\r\n                Err.Clear\r\n                kaynakAdi = \"(okunamadi)\"\r\n            End If\r\n        End If\r\n    End If\r\n    Err.Clear\r\n    On Error GoTo 0\r\n    rep = rep \u0026 \"Kaynak adi = [\" \u0026 kaynakAdi \u0026 \"]\" \u0026 vbCrLf\r\n\r\n    \u0027 Ayni isimli takim var mi? (dosyadanTakimlariEkle:707-710)\r\n    \u0027 Ad okunamadiysa bu kontrol atlanir (takim yine de eklenebilir).\r\n    zatenVar = False\r\n    On Error Resume Next\r\n    Err.Clear\r\n    If nHedef \u003e 0 And kaynakAdi \u003c\u003e \"(okunamadi)\" Then\r\n        For k = 1 To nHedef\r\n            ad = \"\"\r\n            Set oTmpParams = oHedefRes.Item(k).Parameters\r\n            If Err.Number = 0 Then\r\n                If IsObject(oTmpParams) Then\r\n                    Err.Clear\r\n                    Err.Clear\r\n                    Set oPrm = oTmpParams.Item(\"Name\")\r\n                    If Err.Number = 0 Then\r\n                        ad = oPrm.ValueAsString\r\n                    Else\r\n                        Err.Clear\r\n                    End If\r\n                End If\r\n            End If\r\n            If Err.Number = 0 Then\r\n                If ad = kaynakAdi Then\r\n                    zatenVar = True\r\n                    Exit For\r\n                End If\r\n            End If\r\n            Err.Clear\r\n        Next\r\n    End If\r\n    On Error GoTo 0\r\n    rep = rep \u0026 \"Ayni isimli takim var mi: \" \u0026 zatenVar \u0026 vbCrLf\r\n\r\n    \u0027---------------- CAST (asType) ------------------------\r\n    \u0027 🔴 ASIL KÖK NEDEN (rapor kanıtı):\r\n    \u0027   Koleksiyon tipi: PPRProducts   /   Hedef Resources.Count = -1\r\n    \u0027   ADD HATASI: 424 - Nesne gerekli\r\n    \u0027\r\n    \u0027 Python\u0027da ekle() nesneyi CAST EDEN asType\u0027i kullanir\r\n    \u0027 (IFikomObject.py:271-282):\r\n    \u0027     Dim myManufacturingTool As \"Reference\"\r\n    \u0027     Set myManufacturingTool = Process\r\n    \u0027 VBScript\u0027te \"As \u003ctip\u003e\" YOKTUR; CAST\u0027in yerine Evaluate kullanilir\r\n    \u0027 (makro motoru ayni Evaluate\u0027i calistirir).\r\n    \u0027\r\n    \u0027 O yuzden kaynagi Oncelikle \"Reference\" tipine CAST ediyoruz,\r\n    \u0027 cast edilemezse ham nesneyi deneriz.\r\n    Dim oCast\r\n    Dim castSonuc\r\n    castSonuc = \"\"\r\n    Set oCast = Nothing\r\n    On Error Resume Next\r\n    Err.Clear\r\n    Set oCast = oApp.SystemService.Evaluate( _\r\n        \"Function CATMain(o)\" \u0026 vbCrLf \u0026 _\r\n        \"  Dim r As Reference\" \u0026 vbCrLf \u0026 _\r\n        \"  Set r = o\" \u0026 vbCrLf \u0026 _\r\n        \"  CATMain = r\" \u0026 vbCrLf \u0026 _\r\n        \"End Function\", 0, \"CATMain\", oT)\r\n    If Err.Number \u003c\u003e 0 Then\r\n        Err.Clear\r\n        Set oCast = Nothing\r\n    End If\r\n    On Error GoTo 0\r\n\r\n    If IsObject(oCast) Then\r\n        rep = rep \u0026 \"CAST Reference: BASARILI\" \u0026 vbCrLf\r\n    Else\r\n        rep = rep \u0026 \"CAST Reference: BASARISIZ (ham nesne denenecek)\" \u0026 vbCrLf\r\n    End If\r\n\r\n    \u0027---------------- ADD --------------------------------\r\n    \u0027 ⚠️ IsObject(Nothing) = TRUE oldugu icin burada da BAYRAK kullanilir.\r\n    If TypeName(oCast) = \"Nothing\" Then\r\n        rep = rep \u0026 \"CAST bos -\u003e ham kaynak deneniyor\" \u0026 vbCrLf\r\n    End If\r\n    Set oYeni = Nothing\r\n    On Error Resume Next\r\n    Err.Clear\r\n    If TypeName(oCast) \u003c\u003e \"Nothing\" Then\r\n        Set oYeni = oHedefRes.Add(oCast)\r\n    Else\r\n        Set oYeni = oHedefRes.Add(oT)\r\n    End If\r\n    If Err.Number \u003c\u003e 0 Then\r\n        \u0027 🔴 CATIA\u0027nin GERCEK sebebi Err.Description\u0027da. Once onu al,\r\n        \u0027 sonra temizle (yoksa asagida bosa yaziyoruz).\r\n        hataMetni = Err.Description\r\n        hataNo = Err.Number\r\n        Err.Clear\r\n        On Error GoTo 0\r\n        rep = rep \u0026 \"ADD HATASI: \" \u0026 hataNo \u0026 \" - \" \u0026 hataMetni \u0026 vbCrLf\r\n        \u0027 raporu yaz\r\n        On Error Resume Next\r\n        Err.Clear\r\n        tmpDir = \"\"\r\n        tmpDir = oApp.SystemService.Environ(\"TEMP\")\r\n        If Err.Number \u003c\u003e 0 Then\r\n            Err.Clear\r\n            tmpDir = \"C:\\Temp\\\"\r\n        End If\r\n        If Len(tmpDir) = 0 Then tmpDir = \"C:\\Temp\\\"\r\n        If Right(tmpDir, 1) \u003c\u003e \"\\\" Then tmpDir = tmpDir \u0026 \"\\\"\r\n        Err.Clear\r\n        Set fso = CreateObject(\"Scripting.FileSystemObject\")\r\n        Set fh = fso.OpenTextFile(tmpDir \u0026 \"fiko_takim_rapor.txt\", 2, True)\r\n        fh.WriteLine rep\r\n        fh.Close\r\n        CATMain = \"ADD HATASI: \" \u0026 hataMetni\r\n        Exit Function\r\n    End If\r\n    On Error GoTo 0\r\n    made = True\r\n    rep = rep \u0026 \"Takim process\u0027e eklendi.\" \u0026 vbCrLf\r\n\r\n    \u0027 Kutuphaneyi kapat (Python: __toolDoc.kapat())\r\n    On Error Resume Next\r\n    oToolDoc.Close\r\n    Err.Clear\r\n    On Error GoTo 0\r\n\r\n    \u0027================ 5) MFG_* PARAMETRELERINI YAZ ========\r\n    \u0027 Python: _rslt.parametreler.altParametreler(...)[...].degeriStr = X\r\n    \u0027 IParametre.py:91-93 -\u003e catNesne.ValuateFromString(value)\r\n    \u0027\r\n    \u0027 DÜZELTME: once .ValueString = X yaziyorduk; IParametre.py\u0027de gecerli\r\n    \u0027 metot .ValuateFromString (ValueString yazan metot DEGIL, okuyan\r\n    \u0027 taraf .ValueAsString). Deger BIRIMLI metin: \"30mm\".\r\n    \u0027 Ondalik ayraci VIRGULdur (\"4,665mm\") - kodunuzdaki gibi.\r\n    \u0027 DÜZELTME (0/7 yazan hatasi): once \"MFG_NAME\" gibi isimler\r\n    \u0027 kullaniliyordu. Bunlar PYTHON DEGISKEN ADLARI, CATIA parametre\r\n    \u0027 adlari DEGIL. Python\u0027da gercek adlar uc tane \"\u003e\u003e\u003e\" ile bitiyor\r\n    \u0027 (IPPRProductlar.py:643-650):\r\n    \u0027   __tkmPrm[\"Name\u003e\u003e\u003e\"].degeriStr = MFG_NAME\r\n    \u0027   __tkmPrm[\"Ball down length\u003e\u003e\u003e\"].degeriStr = MFG_BALL_LENGTH_DOWN\r\n    prm = Array( _\r\n        \"Name\u003e\u003e\u003e\", T_NAME, _\r\n        \"Tool number\u003e\u003e\u003e\", T_NUMBER, _\r\n        \"Nominal diameter\u003e\u003e\u003e\", D_CAP, _\r\n        \"Overall length\u003e\u003e\u003e\", D_OVERALL, _\r\n        \"Length\u003e\u003e\u003e\", D_LENGTH, _\r\n        \"Ball down length\u003e\u003e\u003e\", D_BALLDOW, _\r\n        \"Body diameter\u003e\u003e\u003e\", D_BODYD)\r\n    yazilan = 0\r\n    yazilamayan = \"\"\r\n    \u0027 DÜZELTME: oYeni.GetAttribute(...) yerine oYeniParameters.GetAttribute(...)\r\n    \u0027 KAYNAK: IProduct.py:111-112  -\u003e  self.catNesne.Parameters\r\n    \u0027         IParametre.py:91-93   -\u003e  .ValuateFromString(value)\r\n    \u0027 (Once oYeni uzerinden dogrudan GetAttribute deneniyordu; kaynakta da\r\n    \u0027  ayni sekilde basarisiz oldu — ikisi de .Parameters uzerinden)\r\n    \u0027 🔴 SIRA HATASI: bu blok (Add dondurmediyse Item(n+1) almak)\r\n    \u0027 ONCEDEN .Parameters okumasINDAN SONRA geliyordu. Yani\r\n    \u0027 oYeni henuz Nothing iken \".Parameters\" cagriliyordu -\u003e 424.\r\n    \u0027 DUZELTME: once oYeni\u0027yi kesinlestir, SONRA .Parameters al.\r\n    On Error Resume Next\r\n    Err.Clear\r\n    \u0027 Add() dondurdugu nesne bazen Nothing olabiliyor. Python\u0027da da\r\n    \u0027 (IPPRProductlar.py:41) \"self.item(self.sayisi - 1)\" ile AYNI\r\n    \u0027 sekilde son eklenen oge geri aliniyor. Biz de aynisini yapiyoruz:\r\n    \u0027 eklemeden sonraki Count indeksinden Item() ile aliyoruz.\r\n    If TypeName(oYeni) = \"Nothing\" And nHedef \u003e 0 Then\r\n        Set oYeni = oHedefRes.Item(nHedef + 1)\r\n        Err.Clear\r\n        rep = rep \u0026 \"(Add dondurmedi; Item(\" \u0026 (nHedef + 1) \u0026 \") ile alindi)\" \u0026 vbCrLf\r\n    End If\r\n    Err.Clear\r\n    On Error GoTo 0\r\n\r\n    On Error Resume Next\r\n    Err.Clear\r\n    Set oYeniParams = Nothing\r\n    Set oYeniParams = oYeni.Parameters\r\n    If Err.Number \u003c\u003e 0 Then\r\n        Err.Clear\r\n        Set oYeniParams = Nothing\r\n    End If\r\n    On Error GoTo 0\r\n\r\n    \u0027 TEŞHİS: oYeni ve oYeniParams gerçekten nesne mi? 424 buradan geliyor.\r\n    rep = rep \u0026 \"oYeni tipi: \" \u0026 TypeName(oYeni) \u0026 vbCrLf\r\n    rep = rep \u0026 \"oYeniParams tipi: \" \u0026 TypeName(oYeniParams) \u0026 vbCrLf\r\n\r\n    If TypeName(oYeniParams) = \"Nothing\" Then\r\n        rep = rep \u0026 \"(oYeni.Parameters alinamadi - parametreler yazilamadi)\" \u0026 vbCrLf\r\n    End If\r\n\r\n    yazilan = 0\r\n    yazilamayan = \"\"\r\n    Dim oAltParams, oRef, oPrm\r\n    Dim hedefAd, parcalar, sonParca\r\n    Dim nAlt\r\n    \u0027 RESMI DOKUMAN: Parameters koleksiyonunda GetAttribute YOKTUR,\r\n    \u0027 yalnizca Item(index)/Item(name) vardir. Once GetAttribute ile\r\n    \u0027 cagriliyorduk -\u003e 424 \"Nesne gerekli\".\r\n    \u0027 PYTHON YOLU (IPPRProductlar.py:641-642): once Reference\u0027a cast\r\n    \u0027 edilip SubList(reference, True) ile alt-koleksiyona daraltiliyor\r\n    \u0027 (IParametreler.py:33). \"\u003e\u003e\u003e\" isareti duz ad degil; parametre adinin\r\n    \u0027 BACKSLASH\u0027tan sonraki son parcasiyla karsilastirilir ve parametreler\r\n    \u0027 TERSTEN taranir (IParametreler.py:49-57).\r\n    Set oRef = Nothing\r\n    On Error Resume Next\r\n    Err.Clear\r\n    Set oRef = oCast\r\n    Err.Clear\r\n    Set oAltParams = Nothing\r\n    If TypeName(oRef) \u003c\u003e \"Nothing\" Then\r\n        Set oAltParams = oYeniParams.SubList(oRef, True)\r\n    End If\r\n    If TypeName(oAltParams) = \"Nothing\" Then\r\n        Err.Clear\r\n        Set oAltParams = oYeniParams\r\n        rep = rep \u0026 \"SubList kullanilamadi; tum parametreler taraniyor\" \u0026 vbCrLf\r\n    End If\r\n    nAlt = -1\r\n    Err.Clear\r\n    nAlt = oAltParams.Count\r\n    If Err.Number \u003c\u003e 0 Then\r\n        Err.Clear\r\n        nAlt = -1\r\n    End If\r\n    On Error GoTo 0\r\n    rep = rep \u0026 \"Alt parametre sayisi: \" \u0026 nAlt \u0026 vbCrLf\r\n\r\n    If nAlt \u003e 0 Then\r\n        rep = rep \u0026 \"--- ALTTAKI PARAMETRE ADLARI ---\" \u0026 vbCrLf\r\n        For k = 1 To nAlt\r\n            On Error Resume Next\r\n            Err.Clear\r\n            Set oPrm = oAltParams.Item(k)\r\n            If Err.Number = 0 Then\r\n                rep = rep \u0026 \"   \" \u0026 k \u0026 \") \" \u0026 oPrm.Name \u0026 vbCrLf\r\n            Else\r\n                Err.Clear\r\n                rep = rep \u0026 \"   \" \u0026 k \u0026 \") (okunamadi)\" \u0026 vbCrLf\r\n            End If\r\n            Err.Clear\r\n            On Error GoTo 0\r\n        Next\r\n    End If\r\n\r\n    For i = 0 To UBound(prm) Step 2\r\n        hedefAd = prm(i)\r\n        If InStr(hedefAd, \"\u003e\u003e\u003e\") \u003e 0 Then\r\n            hedefAd = Split(hedefAd, \"\u003e\u003e\u003e\")(0)\r\n        End If\r\n        On Error Resume Next\r\n        Err.Clear\r\n        Set oPrm = Nothing\r\n        If nAlt \u003e 0 Then\r\n            For k = nAlt To 1 Step -1\r\n                Err.Clear\r\n                Set oPrm = oAltParams.Item(k)\r\n                If Err.Number = 0 Then\r\n                    parcalar = Split(oPrm.Name, \"\\\")\r\n                    sonParca = parcalar(UBound(parcalar))\r\n                    If sonParca = hedefAd Then Exit For\r\n                Else\r\n                    Err.Clear\r\n                    Set oPrm = Nothing\r\n                End If\r\n            Next\r\n        End If\r\n        Err.Clear\r\n        If TypeName(oPrm) = \"Nothing\" Then\r\n            Err.Clear\r\n            Set oPrm = oAltParams.Item(hedefAd)\r\n            If Err.Number \u003c\u003e 0 Then\r\n                Err.Clear\r\n                Set oPrm = Nothing\r\n            End If\r\n        End If\r\n        Err.Clear\r\n        If TypeName(oPrm) \u003c\u003e \"Nothing\" Then\r\n            oPrm.ValuateFromString prm(i + 1)\r\n            If Err.Number = 0 Then\r\n                yazilan = yazilan + 1\r\n                rep = rep \u0026 \"  OK   \" \u0026 hedefAd \u0026 \" = \" \u0026 prm(i + 1) \u0026 vbCrLf\r\n            Else\r\n                hataNo = Err.Number\r\n                hataMetni = Err.Description\r\n                Err.Clear\r\n                yazilamayan = yazilamayan \u0026 \" \" \u0026 hedefAd \u0026 _\r\n                              \"(\" \u0026 hataNo \u0026 \":\" \u0026 hataMetni \u0026 \")\"\r\n                rep = rep \u0026 \"  HATA \" \u0026 hedefAd \u0026 \" = \" \u0026 prm(i + 1) \u0026 _\r\n                      \"  [\" \u0026 hataNo \u0026 \" \" \u0026 hataMetni \u0026 \"]\" \u0026 vbCrLf\r\n            End If\r\n        Else\r\n            yazilamayan = yazilamayan \u0026 \" \" \u0026 hedefAd \u0026 \"(bulunamadi)\"\r\n            rep = rep \u0026 \"  YOK  \" \u0026 hedefAd \u0026 \" = \" \u0026 prm(i + 1) \u0026 _\r\n                  \"  (koleksiyonda yok)\" \u0026 vbCrLf\r\n        End If\r\n        Err.Clear\r\n        Set oPrm = Nothing\r\n        On Error GoTo 0\r\n    Next\r\n\r\n    rep = rep \u0026 \"Yazilan parametre: \" \u0026 yazilan \u0026 \"/\" \u0026 (UBound(prm) \\ 2 + 1) \u0026 vbCrLf\r\n    If Len(yazilamayan) \u003e 0 Then\r\n        rep = rep \u0026 \"Yazilamayan:\" \u0026 yazilamayan \u0026 vbCrLf\r\n    End If\r\n\r\n    \u0027================ 6) RAPOR + SONUC ====================\r\n    On Error Resume Next\r\n    Err.Clear\r\n    tmpDir = \"\"\r\n    tmpDir = oApp.SystemService.Environ(\"TEMP\")\r\n    If Err.Number \u003c\u003e 0 Then\r\n        Err.Clear\r\n        tmpDir = \"C:\\Temp\\\"\r\n    End If\r\n    If Len(tmpDir) = 0 Then tmpDir = \"C:\\Temp\\\"\r\n    If Right(tmpDir, 1) \u003c\u003e \"\\\" Then tmpDir = tmpDir \u0026 \"\\\"\r\n    Err.Clear\r\n    Err.Clear\r\n    Set fso = CreateObject(\"Scripting.FileSystemObject\")\r\n    Set fh = fso.OpenTextFile(tmpDir \u0026 \"fiko_takim_rapor.txt\", 2, True)\r\n    fh.WriteLine rep\r\n    fh.Close\r\n    On Error GoTo 0\r\n\r\n    If made And yazilan \u003e 0 Then\r\n        CATMain = \"TAMAM: \" \u0026 T_NAME \u0026 \" (D\" \u0026 D_CAP \u0026 \" kuresel top) eklendi.\"\r\n    ElseIf made Then\r\n        CATMain = \"EKLENDI ama parametre yazilamadi. Rapor: \" \u0026 tmpDir \u0026 \"\\fiko_takim_rapor.txt\"\r\n    Else\r\n        CATMain = \"BASARISIZ. Rapor: \" \u0026 tmpDir \u0026 \"\\fiko_takim_rapor.txt\"\r\n    End If\r\n\r\nEnd Function\r\n",
                       "language":  0,
                       "emoji":  "🔨",
                       "inPalette":  true,
                       "paletteDocKinds":  [
                                               "catprocess"
                                           ]
                   }
               ]
}