{
    "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 Item(18) SABIT ILE SECILIYORDU. Bu kırılgan: kutuphanede\r\n    \u0027 sira degisirse (veya takim sayisi degisirse) yanlis takim eklenir.\r\n    \u0027 2026-09-29 23:54 calistirmasinda Item(18) dogru cikti ve\r\n    \u0027 \"MfgBallStylusTool\" bulundu, ama bu bir tesaduf.\r\n    \u0027 COZUM: Tum kaynaklarin Name parametresi okunup, istenen takim\r\n    \u0027 adi ile birebir eslesen secilir. IPPRProductlar.py:67-68 de\r\n    \u0027 ayni sekilde kutuphaneden adla secim yapar.\r\n    Dim oSrcP, oSrcParams2, bulunduAd\r\n    Dim istenenTip\r\n    istenenTip = \"MfgBallStylusTool\"\r\n    bulunduAd = 0\r\n    Set oT = Nothing\r\n    On Error Resume Next\r\n    Err.Clear\r\n    If nSrc \u003e 0 Then\r\n        For k = 1 To nSrc\r\n            Set oSrcP = Nothing\r\n            Err.Clear\r\n            Set oSrcP = oKaynaklar.Item(k)\r\n            If Err.Number = 0 Then\r\n                If IsObject(oSrcP) Then\r\n                    Set oSrcParams2 = Nothing\r\n                    Err.Clear\r\n                    Set oSrcParams2 = oSrcP.Parameters\r\n                    If Err.Number = 0 Then\r\n                        If IsObject(oSrcParams2) Then\r\n                            Err.Clear\r\n                            Set oSrcP = oSrcParams2.Item(\"Name\")\r\n                            If Err.Number = 0 Then\r\n                                If InStr(1, oSrcP.ValueAsString, istenenTip, vbTextCompare) \u003e 0 Then\r\n                                    Set oT = oKaynaklar.Item(k)\r\n                                    bulunduAd = k\r\n                                    Exit For\r\n                                End If\r\n                            Else\r\n                                Err.Clear\r\n                            End If\r\n                        End If\r\n                    End If\r\n                    Err.Clear\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\r\n    If bulunduAd \u003e 0 Then\r\n        rep = rep \u0026 \"Kaynak secimi: \u0027\" \u0026 istenenTip \u0026 \"\u0027 ADIYLA bulundu, index=\" \u0026 _\r\n              bulunduAd \u0026 \" (Item(18) yerine)\" \u0026 vbCrLf\r\n    Else\r\n        rep = rep \u0026 \"UYARI: \u0027\" \u0026 istenenTip \u0026 \"\u0027 adiyla kaynak bulunamadi; \" \u0026 _\r\n              \"Item(18) denenecek\" \u0026 vbCrLf\r\n        Set oT = Nothing\r\n    End If\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    \u0027 ONCE kapatilir: acik kutuphane belgesi aktif pencereyi tutuyor ve\r\n    \u0027 oTargetDoc.Activate ise yaramiyordu.\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================ 5b) CATIA GORUNUMUNU YENILE + KAYDET =====\r\n    \u0027 Kullanicinin belirttigi: takim ekleniyor ama CATIA agacinda\r\n    \u0027 \"endmill ballend\" olarak GORUNMUYOR. Eklenen kaynak agacta ancak\r\n    \u0027 CATIA penceresi yeniden cizilip belge kaydedilirse gorunur.\r\n    On Error Resume Next\r\n    Err.Clear\r\n    oTargetDoc.Activate\r\n    Err.Clear\r\n    oApp.Windows.Refresh\r\n    Err.Clear\r\n    oTargetDoc.Save\r\n    Err.Clear\r\n    On Error GoTo 0\r\n    rep = rep \u0026 \"Gorusum yenilendi, belge kaydedildi.\" \u0026 vbCrLf\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"
                                           ]
                   }
               ]
}