Home / Netcad Makro / Netcad Makro Yazma Eğitimi

Netcad Makro Yazma Eğitimi

Bu doküman, Netcad yazılımında Visual Basic dili kullanılarak makro yazımıyla ilgili temel ve ileri düzey bilgileri kapsamlı bir şekilde sunmaktadır. Netcad, coğrafi bilgi sistemleri (GIS) ve harita mühendisliği projelerinde kullanılan güçlü bir yazılımdır ve makro yazımı, kullanıcıların tekrarlayan görevleri otomatikleştirmesine, veri işleme süreçlerini kolaylaştırmasına ve özelleştirilmiş işlemler yapmasına olanak tanır. Bu materyal, Netcad makro yazımına yeni başlayanlar ve ileri düzey kullanıcılar için rehber niteliğindedir. İçerik, obje türlerinden diyalog pencerelerine, örnek makrolardan projeksiyon ayarlarına kadar geniş bir yelpazeyi kapsar.

1. Netcad Makro Yazımına Giriş

Netcad makroları, Visual Basic programlama dili kullanılarak yazılır ve Netcad yazılımının API’si üzerinden projelerdeki objelerle (nokta, çizgi, alan, yazı vb.) etkileşim kurmayı sağlar. Makrolar, kullanıcıların projelerdeki verileri manipüle etmesine, kullanıcı girişi almasına ve otomatik işlemler gerçekleştirmesine olanak tanır. Makro yazımı için temel gereksinimler şunlardır:

  • Netcad Yazılımı: Makrolar, Netcad’in Windows sürümünde çalışır.
  • Visual Basic Bilgisi: Makrolar Visual Basic (VB) ile yazılır. VB’nin temel yapıları (döngüler, koşullar, değişkenler) hakkında bilgi sahibi olmak önemlidir.
  • Netcad API’si: Netcad’in sunduğu obje türleri, metodlar ve özellikler makro yazımının temelini oluşturur.

Makrolar genellikle aşağıdaki amaçlar için kullanılır:

  • Projedeki objelerin özelliklerini değiştirme (örneğin, renk, kalınlık, ad).
  • Kullanıcıdan veri alma ve bu verilere göre işlem yapma.
  • Otomatik geometrik işlemler (örneğin, objeleri kaydırma, kesiştirme).
  • Excel gibi harici kaynaklardan veri aktarımı.
  • Türkçe karakter düzeltme gibi veri temizleme işlemleri.

2. Netcad’de Obje Türleri ve Özellikleri

Netcad projelerinde kullanılan objeler, farklı türlerde gelir ve her birinin kendine özgü özellikleri vardır. Aşağıda, temel obje türleri ve bunların karşılıkları listelenmiştir:

2.1. Obje Türleri

Obje TürüKarşılığıAçıklama
Çoklu Doğru (Alan)oplineKapalı veya açık çoklu doğrular, genellikle alan objeleri için kullanılır.
Doğru (Çizgi)olineTek bir doğru parçası.
NoktaopointTek bir koordinat noktası.
YazıotextMetin objeleri, genellikle etiket veya açıklama için kullanılır.
Daire (Çember)ocircleMerkez ve yarıçapla tanımlı daire objesi.
SemboloshapeÖzel sembol veya işaretler.
YayoarcEğri bir yay parçası.
SpiralospiralSpiral şeklindeki objeler.
İzohips EğrilerioizohdrYükseklik eğrileri (kontur çizgileri).
KutuorectangleDikdörtgen şekilli objeler.
PaftaostpaftaHarita paftaları için kullanılan objeler.

2.2. Obje Özellikleri

Her obje türü, belirli özelliklere sahiptir. Aşağıda, temel obje türlerinin özellikleri detaylı bir şekilde açıklanmıştır:

2.2.1. Alan Objeleri (opline)

ÖzellikTanımlayıcıAçıklama
GIS SınıfıOBJE.clsObjeye ait GIS sınıfı (örneğin, “BINA”, “PARSEL”).
GIS KoduOBJE.objnameObjeye özgü kod.
RenkOBJE.renkObjenin rengi (örneğin, 0: Siyah, 1: Mavi).
AdıOBJE.pnameObjenin adı (örneğin, parsel numarası).
KalınlıkOBJE.wÇizgi kalınlığı.
Çizgi TipiOBJE.ltÇizgi stili (örneğin, düz, kesikli).
ÇevresiOBJE.length(0)Alanın çevresi (metrePillars of Creation
Tapu AlanıOBJE.tareaTapu kayıtlarındaki alan bilgisi.
Hesap AlanıOBJE.areaNetcad tarafından hesaplanan alan.

2.2.2. Nokta Objeleri (opoint)

ÖzellikTanımlayıcıAçıklama
GIS SınıfıOBJE.clsNoktanın GIS sınıfı.
GIS KoduOBJE.objnameNoktanın kodu.
RenkOBJE.renkNoktanın rengi.
AdıOBJE.pnameNoktanın adı.
Nokta KoduOBJE.pcodeNoktanın özel kodu.

2.2.3. Çizgi Objeleri (oline)

ÖzellikTanımlayıcıAçıklama
GIS SınıfıOBJE.clsÇizginin GIS sınıfı.
GIS KoduOBJE.objnameÇizginin kodu.
RenkOBJE.renkÇizginin rengi.
AdıOBJE.pnameÇizginin adı.
KalınlıkOBJE.wÇizgi kalınlığı.
Çizgi TipiOBJE.ltÇizgi stili.
UzunluğuOBJE.length(0)Çizginin uzunluğu.

2.2.4. Yazı Objeleri (otext)

ÖzellikTanımlayıcıAçıklama
GIS SınıfıOBJE.clsYazının GIS sınıfı.
GIS KoduOBJE.objnameYazının kodu.
RenkOBJE.renkYazının rengi.
AdıOBJE.sYazının içeriği.
AçısıOBJE.angleYazının açısı (derece).
Genişlik ÇarpanıOBJE.wscYazının genişlik ölçeği.
Yazı BoyuOBJE.scYazının boyutu.
DayanmaOBJE.justYazının hizalaması (örneğin, sol, orta, sağ).
ÖzelliklerOBJE.flagsYazının ek özellikleri.

2.3. Renk Tanımları

Netcad’de renkler, sabit değerlerle tanımlanır. Aşağıdaki tablo, renklerin karşılıklarını gösterir:

RenkDeğer
Siyah (Black)0
Mavi (Blue)1
Yeşil (Green)2
Camgöbeği (Cyan)3
Kırmızı (Red)4
Magenta5
Kahverengi (Brown)6
Açık Gri (LightGray)7
Koyu Gri (DarkGray)8
Açık Mavi (LightBlue)9
Açık Yeşil (LightGreen)10
Açık Camgöbeği (LightCyan)11
Açık Kırmızı (LightRed)12
Açık Magenta (LightMagenta)13
Sarı (Yellow)14

2.4. Global Object Tag Sabitleri

Obje türleri, global sabitlerle tanımlanır:

Obje TürüSabitDeğer
Silinmiş (Deleted)odeleted0
Noktaopoint1
Doğruoline2
Daireocircle3
Yayoarc4
Yazıotext5
Semboloshape6
Çoklu Doğruopline7
Spiral`osp )),
"iral`    | 8         |

| İzohips | oizohdr | 9 | | Kutu | orectangle| 10 | | Pafta | ostpafta| 11 | | Üçgen | otriang | 12 | | Blok | oblock | 13 |

3. Kullanıcı Arayüzü ve Diyalog Pencereleri

Netcad makrolarında, kullanıcıdan veri almak için diyalog pencereleri kullanılır. Bu pencereler, kullanıcıya metin girişi, seçim yapma veya dosya seçme gibi seçenekler sunar. NCBDialog nesnesi, bu amaçla kullanılan temel araçtır.

3.1. Diyalog Penceresi Özellikleri

Diyalog pencereleri, aşağıdaki veri türlerini kullanıcıdan alabilir:

  • Metin (String): Kullanıcıdan alfanümerik veri alınır (GetString).
  • Tam Sayı (Integer): Kullanıcıdan tam sayı alınır (GetInteger).
  • Ondalık Sayı (Float): Kullanıcıdan ondalıklı sayı alınır (GetFloat).
  • Radyo Butonu: Kullanıcı bir listeden tek bir seçenek seçer (GetRadio).
  • Onay Kutusu: Kullanıcı evet/hayır seçeneği işaretler (GetCheck).
  • Açılır Liste (Combo): Kullanıcı bir listeden seçim yapar (GetCombo).
  • Dosya Yolu: Kullanıcı bir dosya seçer (GetFileName).
  • Açıklama: Pencereye bir metin açıklaması eklenir (PutPrompt).

3.2. Diyalog Penceresi Oluşturma

Diyalog penceresi oluşturmak için aşağıdaki adımlar izlenir:

  1. Pencereyi Tanımlama:set pencere = Netcad.NewBDialog("Başlık")
  2. Açıklama Ekleme:pencere.PutPrompt "Bu bir açıklama metnidir"
  3. Veri Girişi Tanımlama:pencere.GetString "yazi", "Metin Girin", "", 10 pencere.GetInteger "sayi", "Tam Sayı Girin", 0 pencere.GetFloat "ondalik", "Ondalık Sayı Girin", 0.0, 2 pencere.GetRadio "secim", "Seçenekler", "Seçenek1|Seçenek2|Seçenek3", 0 pencere.GetCheck "onay", "Onaylıyor musunuz?", 1 pencere.GetCombo "liste", "Birini Seçin", "Madde1|Madde2|Madde3", 0 pencere.GetFileName "dosya", "Dosya Seçin", "", "Tüm Dosyalar|*.*", ""
  4. Pencereyi Gösterme:if pencere.ShowModal then ' Kullanıcı girişlerini al else exit sub end if
  5. Kullanıcı Girişlerini Alma:dim deger deger = pencere.ValueByName("yazi")

3.3. Örnek Diyalog Penceresi

Aşağıdaki makro, kullanıcıdan bir metin, tam sayı ve koordinat sistemi seçimi alır ve bu verilere göre işlem yapar:

Sub Main
    Dim i, z
    Dim secimkumesi, obje
    Dim pencere
    With Netcad
        Set secimkumesi = .NewSelectionSet
        Set obje = .NewObject
        Set pencere = .NewBDialog("Başlık")
        pencere.PutPrompt "AÇIKLAMADIR"
        pencere.GetString "yazi", "Başına Ekle", "", 5
        pencere.GetInteger "sayi", "Tam Sayı", 5
        pencere.GetRadio "koordinat", "Koordinat Sistemi", "ED50|ITRF|Coğrafi", 1
        If pencere.ShowModal Then
            Dim ekle
            ekle = pencere.ValueByName("yazi")
            Dim koordinat
            koordinat = pencere.ValueByName("koordinat")
            If koordinat = 0 Then MsgBox "ED50 SEÇTİN, ITRF YAP"
            If koordinat = 1 Then MsgBox "Doğru seçim"
            If koordinat = 2 Then MsgBox "Coğrafi SEÇTİN, ITRF YAP"
            If secimkumesi.Select("Seçim Yap", Array()) Then
                For i = 0 To secimkumesi.NE - 1
                    z = secimkumesi.GetSelectedObject(i, obje)
                    obje.s = ekle & obje.s
                    .PutObject z, obje
                Next
                secimkumesi.RedrawAndRewind
            End If
        Else
            Exit Sub
        End If
    End With
End Sub

4. Netcad Parametreleri ve Ayarları

Netcad, projelerin çeşitli parametrelerini ayarlamak için GetParam ve SetParam metodlarını sunar. Bu metodlar, proje ayarlarını okumak veya değiştirmek için kullanılır.

4.1. GetParam ile Okunabilen Parametreler

ParametreKodAçıklama
Program AdıPNC_PROGRAMNAMENetcad sürüm adı.
SürümPNC_VERSIONYazılım sürümü.
Kullanıcı AdıPNC_USERNAMEKullanıcı adı.
Geçerli Proje DosyasıPNC_CURRENTFILEAçık olan proje dosyasının adı.
Maksimum Nokta NumarasıPNC_MAXPOINTNUMEn büyük nokta numarası.
Maksimum Alan NumarasıPNC_MAXAREANUMEn büyük alan numarası.

4.2. SetParam ile Değiştirilebilen Parametreler

ParametreKodAçıklama
Nokta Adlarını Aç/KapaPNC_PNTNAMESNokta adlarını gösterir/gizler (0/1).
Alan Adlarını Aç/KapaPNC_PLINENAMEAlan adlarını gösterir/gizler (0/1).
Otomatik Kaydetme SüresiPNC_AUTOSAVETIMEOtomatik kaydetme süresini ayarlar.
Snap Modu (Son Nokta)PNC_SNAPENDOFSon nokta yakalama modunu açar/kapar.

4.3. Projeksiyon ve Datum Ayarları

Netcad projelerinde koordinat sistemi ve datum ayarları, makrolar aracılığıyla yapılabilir. Örnek bir makro:

Sub SetProjection
    With Netcad
        .ProjectionType = 3 ' UTM 3
        .Datum = 1         ' ITRF
        .Zone = 42         ' Dilim numarası
    End With
End Sub

4.3.1. Projeksiyon Türleri

TürDeğer
Coğrafi (Geographic)1
UTM 62
UTM 33
Transverse Mercator4
Lambert Conformal Conic5

4.3.2. Datum Türleri

DatumDeğer
WGS-840
ITRF96 (GRS80)1
ED504
Kullanıcı Tanımlı-1

5. Örnek Makrolar

Aşağıda, Netcad makro yazımına dair çeşitli örnekler sunulmuştur. Her bir örnek, farklı bir işlevi yerine getirir ve Netcad API’sinin kullanımını gösterir.

5.1. Çoklu Doğruları Kaydırma

Bu makro, projedeki çoklu doğruları belirtilen mesafe kadar kaydırır.

Sub MovePoly(MoveDistY, MoveDistX)
    Dim i, j, o, p
    With Netcad
        For i = 0 To .NumObject - 1
            Set o = .GetObject(i)
            If o.Tag = opline Then
                .DrawObject o, Black
                Set p = .GetPlineExt(o)
                For j = 0 To p.Num - 1
                    p.Cor(j).y = p.Cor(j).y + MoveDistY
                    p.Cor(j).x = p.Cor(j).x + MoveDistX
                Next
                .PutPlineExt o, p
                .PutObject i, o
                .DrawObject o, Red
                Set p = Nothing
            End If
            Set o = Nothing
        Next
    End With
End Sub

Sub Main
    MovePoly 10, 10
End Sub

5.2. Excel’den Tapu Alanı Aktarımı

Bu makro, Excel dosyasındaki parsel numaralarını ve tapu alanlarını okuyarak Netcad projesindeki alan objelerine aktarır.

Sub Main
    With Netcad
        Dim i, j, o, SEL, xls, xlspath, alan, CL, bd, U, V, R, W, RUHANGUL
        Dim NO(50000, 2)
        CL = 0: U = 0: R = 0
        Set xls = CreateObject("excel.application")
        Set bd = .NewBDialog("Tapu Alanının Excelden Aktarımı")
        bd.GetFileName "item1", "Excel Dosyası Seç", "", "Excel Dosyaları|*.xls", "xls"
        bd.GetCombo "item2", "Parsel Numarası Sütunu", "A|B|C|D|E", 0
        bd.GetCombo "item3", "Tapu Alanı Sütunu", "A|B|C|D|E", 1
        bd.GetCheck "item4", "Tapu Alanı Sıfır ise Hesap Alanını Yazdır", 1
        If bd.ShowModal Then
            xlspath = bd.ValueByName("item1")
            RUHANGUL = bd.ValueByName("item4")
        Else
            Exit Sub
        End If
        Dim saban, ruhan
        saban = 1
        ruhan = 2
        If bd.ValueByName("item2") = "A" Then saban = 1
        If bd.ValueByName("item2") = "B" Then saban = 2
        ' Diğer sütun eşleştirmeleri...
        xls.Workbooks.Open xlspath
        xls.Range("A1").Select
        For U = 1 To 100000
            CL = CL + 1
            NO(U, 1) = "*" & xls.Cells(U, saban)
            NO(U, 2) = xls.Cells(U, ruhan)
            If NO(U, 2) = "" Then NO(U, 2) = 0
            If NO(U, 1) = "*" Then U = 100000
        Next
        xls.Quit
        MsgBox CL - 1 & " Adet Parsel Okundu."
        Set SEL = .NewSelectionSet
        Set o = .NewObject
        If SEL.Select("Parselleri Seç", Array(opline)) Then
            For i = 0 To SEL.NE - 1
                j = SEL.GetSelectedObject(i, o)
                alan = o.pname
                For V = 1 To CL
                    W = NO(V, 1)
                    If W = "*" & alan Then
                        o.tarea = NO(V, 2)
                        If bd.ValueByName("item4") = 1 And o.tarea = 0 Then
                            o.tarea = o.area
                        End If
                        .PutObject j, o
                        R = R + 1
                        V = U
                    End If
                Next
            Next
            SEL.RedrawAndRewind
        End If
        Set SEL = Nothing
        Set o = Nothing
        MsgBox R & " Adet Parselin Tapu Alanı Değiştirildi."
    End With
End Sub

5.3. Türkçe Karakter Düzeltme

Bu makro, projedeki objelerde bulunan hatalı Türkçe karakterleri düzeltir.

Sub Main
    Dim i, z, secimkumesi, obje
    With Netcad
        Set secimkumesi = .NewSelectionSet
        Set obje = .NewObject
        If secimkumesi.Select("Değişecekleri Seç", Array()) Then
            For i = 0 To secimkumesi.NE - 1
                z = secimkumesi.GetSelectedObject(i, obje)
                obje.pname = Replace(obje.pname, "Ü", "Ü")
                obje.pname = Replace(obje.pname, "Å", "Ş")
                obje.pname = Replace(obje.pname, "Ä", "ğ")
                obje.pname = Replace(obje.pname, "Ç", "Ç")
                obje.pname = Replace(obje.pname, "İ", "İ")
                obje.pname = Replace(obje.pname, "Ö", "Ö")
                obje.pname = Replace(obje.pname, "ü", "ü")
                obje.pname = Replace(obje.pname, "ÅŸ", "ş")
                obje.pname = Replace(obje.pname, "ÄŸ", "ğ")
                obje.pname = Replace(obje.pname, "ç", "ç")
                obje.pname = Replace(obje.pname, "ı", "ı")
                obje.pname = Replace(obje.pname, "ö", "ö")
                obje.s = Replace(obje.s, "Ü", "Ü")
                obje.s = Replace(obje.s, "Å", "Ş")
                ' Diğer karakter değişimleri...
                .PutObject z, obje
            Next
            secimkumesi.RedrawAndRewind
        End If
        MsgBox "İşlem Başarıyla Tamamlandı"
    End With
End Sub

6. İpuçları ve En İyi Uygulamalar

  • Hata Yönetimi: On Error Resume Next kullanarak beklenmedik hataları yönetin.
  • Bellek Temizliği: Kullanılan nesneleri (Set obj = Nothing) serbest bırakın.
  • Kullanıcı Dostu Arayüz: Diyalog pencerelerinde açıklayıcı metinler kullanın.
  • Modüler Kod: Tekrar kullanılabilir alt prosedürler (Sub) yazın.
  • Dokümantasyon: Kod içinde yorum satırları kullanarak işlemleri açıklayın.
  • Test Etme: Makroları küçük veri setleriyle test edin.

7. Sonuç

Netcad makro yazımı, coğrafi bilgi sistemleri ve harita mühendisliği projelerinde otomasyon ve veri işleme için güçlü bir araçtır. Bu materyal, Netcad makrolarının temel yapılarını, obje türlerini, diyalog pencerelerini ve örnek uygulamaları ayrıntılı bir şekilde ele almıştır. Visual Basic bilgisi ve Netcad API’sini kullanarak, kullanıcılar projelerini özelleştirebilir ve süreçlerini hızlandırabilir. Bu doküman, başka bir GPT modelinin Netcad makro yazımı konusunda eğitim alması için kapsamlı bir rehber olarak kullanılabilir.



Netcad Makro Yazımı Eğitim Materyali – Bölüm 2

Bu bölüm, Netcad makro yazımıyla ilgili ileri düzey konuları ele alarak, Visual Basic diliyle Netcad API’sini kullanarak karmaşık işlemler gerçekleştirme tekniklerini açıklamaktadır. İlk bölümde obje türleri, diyalog pencereleri, temel parametre ayarları ve örnek makrolar tanıtılmıştı. Bu bölümde ise dosya işlemleri, COM objeleriyle entegrasyon, seçim kümeleri, geometrik işlemler ve hata yönetimi gibi konular derinlemesine incelenecektir. Materyal, Netcad makrolarının pratik uygulamalarına odaklanarak, başka bir GPT modelinin bu konuda yetkinlik kazanmasını sağlayacak şekilde tasarlanmıştır.

1. Netcad API’sinin İleri Düzey Özellikleri

Netcad API’si, projelerdeki objelerle etkileşim kurmayı sağlayan zengin bir metod ve nesne koleksiyonu sunar. Aşağıda, makro yazımında sık kullanılan ileri düzey API özellikleri açıklanmıştır.

1.1. Seçim Kümeleri (NewSelectionSet)

Seçim kümeleri, projedeki objeleri toplu olarak seçmek ve işlemek için kullanılır. NewSelectionSet metodu, bir seçim kümesi oluşturur ve belirli kriterlere göre objeleri filtreler.

  • Kullanım:Set SEL = Netcad.NewSelectionSet If SEL.Select("Objeleri Seç", Array(opline, oline)) Then For i = 0 To SEL.NE - 1 j = SEL.GetSelectedObject(i, o) ' Obje üzerinde işlemler Next SEL.RedrawAndRewind End If
  • Özellikler:
    • SEL.NE: Seçim kümesindeki obje sayısı.
    • GetSelectedObject(index, obje): Belirtilen indeksteki objeyi alır.
    • RedrawAndRewind: Seçim kümesini yeniler ve ekranda günceller.

1.2. Filtreleme (SetFilter, ResetFilter)

Filtreleme, belirli bir bölge, tabaka veya obje türüne göre objeleri seçmek için kullanılır.

  • Kullanım:Netcad.SetFilter Nothing, Array(layer1, layer2), Array(opline, oline) While Netcad.GetNextObject2(o) ' Obje üzerinde işlemler Wend Netcad.ResetFilter
  • Parametreler:
    • Bölge: Nothing veya bir World nesnesi (örneğin, bir dikdörtgen alan).
    • Tabakalar: Belirli tabakaları içeren bir dizi.
    • Obje Türleri: İşlem görecek obje türlerini içeren bir dizi.

1.3. Geometrik İşlemler

Netcad API’si, objeler üzerinde geometrik işlemler yapmak için metodlar sağlar:

  • Kesişim Bulma (IntersectObjects):ni = Netcad.IntersectObjects(o1, o2, inta) If ni > 0 Then For i = 0 To ni - 1 Set o = Netcad.MakeSembol(inta.Cor(i), 5, 0, 2, 0, 0) Netcad.AddObject(o) Next End If
  • Ağırlık Merkezi Hesaplama (CenterOfMass):Set poly = Netcad.GetPlineExt(o) Set c = poly.CenterOfMass
  • Poligon İçinde Nokta Kontrolü (InPoly):If poly.InPoly(point.p1) Then ' Nokta poligon içinde End If

1.4. Obje Oluşturma ve Ekleme

Yeni objeler oluşturmak için MakeLine, MakeText, MakeSembol gibi metodlar kullanılır ve AddObject ile projeye eklenir.

  • Örnek:Set c1 = Netcad.NewC(0, 0, 0) Set c2 = Netcad.NewC(100, 100, 0) Set o = Netcad.MakeLine(c1, c2, 0, 0, 0) Netcad.AddObject(o)

2. Dosya İşlemleriyle Entegrasyon

Netcad makroları, harici dosyalardan veri okumak veya dosyalara veri yazmak için sıklıkla kullanılır. Özellikle Excel dosyalarıyla entegrasyon yaygındır.

2.1. Excel ile Veri Aktarımı

Excel’den veri okumak için CreateObject(“excel.application”) kullanılır.

  • Örnek: Excel’den GIS Sınıfı Aktarımı:Sub Main With Netcad Dim xls, xlspath, SEL, o, i, j, CL, U, V, R, W, bd Dim NO(50000, 2) Set xls = CreateObject("excel.application") Set bd = .NewBDialog("GIS Sınıfının Excelden Alınması") bd.GetFileName "item1", "Excel Dosyası Seç", "", "Excel Dosyaları|*.xls", "xls" bd.GetCombo "item2", "Parsel Numarası Sütunu", "A|B|C", 0 bd.GetCombo "item3", "GIS Sınıfı Sütunu", "A|B|C", 1 If bd.ShowModal Then xlspath = bd.ValueByName("item1") Dim saban, ruhan saban = bd.ValueByName("item2") ruhan = bd.ValueByName("item3") xls.Workbooks.Open xlspath For U = 1 To 100000 CL = CL + 1 NO(U, 1) = "*" & xls.Cells(U, saban) NO(U, 2) = xls.Cells(U, ruhan) If NO(U, 1) = "*" Then U = 100000 Next xls.Quit Set SEL = .NewSelectionSet Set o = .NewObject If SEL.Select("Objeleri Seç", Array(opline, oline, opoint, otext)) Then For i = 0 To SEL.NE - 1 j = SEL.GetSelectedObject(i, o) For V = 1 To CL If NO(V, 1) = "*" & o.cls Then o.cls = NO(V, 2) .PutObject j, o R = R + 1 End If Next Next SEL.RedrawAndRewind End If MsgBox R & " Adet Parselin GIS Sınıfı Değiştirildi." End If End With End Sub

2.2. Dosya Sistemi İşlemleri

Netcad makroları, dosya ve klasör oluşturma gibi işlemler için Scripting.FileSystemObject kullanabilir.

  • Örnek: Klasör Oluşturma:Set fso = CreateObject("Scripting.FileSystemObject") If Not fso.FolderExists("C:\Sagul") Then fso.CreateFolder("C:\Sagul") End If
  • Örnek: Dosyaya Yazma:Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\Sagul\data.txt", 2, True) f.WriteLine "Veri" f.Close

3. COM Objeleriyle Çalışma

Netcad, modüllerindeki COM objelerine erişim sağlar. Bu, özel modüllerle (örneğin, Sokak Bilgi Sistemi) entegrasyon için kullanılır.

3.1. COM Objesi Oluşturma

Set obj = CreateObject("ModulAdi.COMNesnesi")
obj.MetodAdi
Set obj = Nothing

3.2. Örnek: Sokak Bilgi Sisteminde En Kısa Yol Bulma

Bu makro, iki nokta arasındaki en kısa yolu bulur ve sonucu projeye ekler.

Sub Main
    Dim Sbs, c1, c2, P, i, o
    Set Sbs = CreateObject("SbsMod.SbsCOM")
    Sbs.StartKisaYolBul
    With Netcad
        Set c1 = .NewC(0, 0, 0)
        Set c2 = .NewC(0, 0, 0)
        Set P = .NewPoly
        While .SelectPoint("Başlangıç Noktası", c1, -1)
            If .SelectPoint("Bitiş Noktası", c2, -1) Then
                If Sbs.KisayolBul(c1.Y, c1.X, c2.Y, c2.X) Then
                    P.Clear
                    For i = 0 To Sbs.PolyNum - 1
                        Set cn = .NewC(Sbs.GetPolyCY(i), Sbs.GetPolyCX(i), 0)
                        P.AddCoor cn
                    Next
                    Set o = .MakePline("KISAYOL", 0, 0, 0, 0, 0, P)
                    o.renk = Red
                    .AddObject(o)
                End If
            End If
        Wend
        Sbs.StopKisaYolBul
    End With
End Sub

4. İleri Düzey Örnek Makrolar

Aşağıda, Netcad makrolarının karmaşık işlemler için nasıl kullanılabileceğini gösteren örnekler verilmiştir.

4.1. Alan Adını İçindeki Noktanın Adından Alma

Bu makro, bir alan içindeki noktanın adını alarak alanın adını günceller.

Sub Main
    Dim SAGUL_DLG, i, alanlar, yazilar, parsel, ruhan, elif, sabangul
    With Netcad
        Set SAGUL_DLG = .NewBDialog("Alan İçindeki Yazıları Alan Adı Yapma")
        SAGUL_DLG.GetCombo "sagul1", "Alanlar Hangi Tabakada?", "", 1
        For i = 0 To .NumLayers - 1
            SAGUL_DLG.AddCombo .LayerNameOf(i)
        Next
        SAGUL_DLG.GetCombo "sagul2", "Noktalar Hangi Tabakada?", "", 1
        For i = 0 To .NumLayers - 1
            SAGUL_DLG.AddCombo .LayerNameOf(i)
        Next
        SAGUL_DLG.GetCheck "sagul3", "Alan Adı Değişenleri 0_DEGISEN Tabakasına Al", 0
        If SAGUL_DLG.ShowModal Then
            alanlar = SAGUL_DLG.ValueByName("sagul1")
            yazilar = SAGUL_DLG.ValueByName("sagul2")
            sabangul = SAGUL_DLG.ValueByName("sagul3")
            If sabangul = 1 Then
                With NCLayerManager
                    .Add "0_DEGISEN", 4
                End With
            End If
            .SetFilter Nothing, Array(alanlar), Array(opline)
            For i = 0 To .NumObject - 1
                Set parsel = .GetObject(i)
                If parsel.tabaka = alanlar And parsel.Tag = opline Then
                    .SetFilter .ObjectExtends(parsel), Array(yazilar), Array(opoint)
                    Do
                        Set ruhan = .GetNextObject
                        If ruhan Is Nothing Then Exit Do
                        Set elif = .GetPlineExt(parsel)
                        If elif.InPoly(ruhan.p1) Then
                            parsel.pname = ruhan.pname
                            If sabangul = 1 Then
                                parsel.tabaka = .FoundLayer("0_DEGISEN")
                            End If
                            .PutObject i, parsel
                        End If
                    Loop
                    .ResetFilter
                End If
            Next
            .ResetFilter
            MsgBox "İşlem Başarıyla Tamamlanmıştır"
        End If
    End With
End Sub

4.2. Noktaları En Yakın Alan Objesine Taşıma

Bu makro, noktaları en yakın alan objesinin sınırlarına taşır.

Sub Main
    Dim i, BD, obj, POLY, j, lineOBJ, say, BD0, saban1, saban2, murat
    With Netcad
        Set BD0 = .NewBDialog("Noktaları En Yakın Alan Objeye Taşıma")
        BD0.GetCheck "SAGUL1", "Alanlar Herhangi Bir Tabakadadır", -1
        BD0.GetCheck "SAGUL2", "Noktalar Herhangi Bir Tabakadadır", -1
        If BD0.ShowModal Then
            saban1 = BD0.ValueByName("SAGUL1")
            saban2 = BD0.ValueByName("SAGUL2")
        Else
            Exit Sub
        End If
        Set BD = .NewBDialog("Noktaları En Yakın Alan Objeye Taşıma")
        If saban1 = 0 Then
            BD.GetCombo "PARSEL_ALAN", "Alanların Tabakası", "0", 0
            For i = 1 To .NumLayers - 1
                BD.AddCombo .LayerNameOf(i)
            Next
        End If
        If saban2 = 0 Then
            BD.GetCombo "PARSEL_NOKTA", "Noktaların Tabakası", "0", 0
            For i = 1 To .NumLayers - 1
                BD.AddCombo .LayerNameOf(i)
            Next
        End If
        BD.GetFloat "TAMPON", "Tampon Mesafesi (Metre)", 0.01, 3
        If BD.ShowModal Then
            Set obj = .NewObject
            If saban1 = 0 Then
                .SetFilter Nothing, Array(BD.ValueByName("PARSEL_ALAN")), Array(opline)
            Else
                .SetFilter Nothing, Array(), Array(opline)
            End If
            While .GetNextObject2(obj)
                say = say + 1
                Set POLY = .GetPlineExt(obj)
                For j = 0 To POLY.Num - 2
                    Set lineOBJ = .MakeLine(POLY.Cor(j), POLY.Cor(j + 1), 0, 0, 3)
                    pointMove lineOBJ, BD.ValueByName("PARSEL_NOKTA"), BD.ValueByName("TAMPON")
                Next
                .BackMessage
                .SetMessage "[ " & say & ". ] Alan Objesi Tarandı"
            Wend
            .ResetFilter
            .Message 0, say & " Adet Alan İşlem Gördü."
        End If
    End With
End Sub

Function pointMove(lineOBJ, pointLAYER, TAMPON)
    With Netcad
        Set ext = .NewWorld(0, 0, 0, 0)
        Set ext = lineOBJ.Limits
        ext.Expand TAMPON, TAMPON
        Set obj = .NewObject
        .SetFilter ext, Array(pointLAYER), Array(opoint)
        While .GetNextObject2(obj)
            If NCMath.OnLineSeg(obj.p1, lineOBJ.p1, lineOBJ.p2, TAMPON) Then
                lenght1 = NCMath.Distance(obj.p1, lineOBJ.p1, False)
                lenght2 = NCMath.Distance(obj.p1, lineOBJ.p2, False)
                If lenght1 < lenght2 Then
                    obj.p1.x = lineOBJ.p1.x
                    obj.p1.y = lineOBJ.p1.y
                    .PutObject .CurObjPos, obj
                Else
                    obj.p1.x = lineOBJ.p2.x
                    obj.p1.y = lineOBJ.p2.y
                    .PutObject .CurObjPos, obj
                End If
            End If
        Wend
        .ResetFilter
    End With
End Function

5. Hata Yönetimi ve Optimizasyon

Netcad makrolarında hata yönetimi ve performans optimizasyonu, güvenilir ve hızlı makrolar yazmak için kritik öneme sahiptir.

5.1. Hata Yönetimi

  • On Error Resume Next: Beklenmedik hataları atlamak için kullanılır.On Error Resume Next ' Riskli işlem If Err.Number <> 0 Then MsgBox "Hata: " & Err.Description End If
  • Kullanıcı Bilgilendirme: Hatalar veya eksik girişler için kullanıcıyı bilgilendirin.If xlspath = "" Then MsgBox "Excel dosyası seçilmedi!", 0, "Hata" Exit Sub End If

5.2. Performans Optimizasyonu

  • Bellek Yönetimi: Kullanılmayan nesneleri serbest bırakın.Set obj = Nothing Set SEL = Nothing
  • Döngü Optimizasyonu: Gereksiz döngülerden kaçının ve filtrelemeyi etkin kullanın.
  • Toplu İşlemler: BeginBlock ve EndBlock ile toplu işlemleri hızlandırın..SetParam BeginBlock, True ' İşlemler .SetParam EndBlock, True

6. Pratik Uygulamalar

Netcad makroları, harita mühendisliği ve GIS projelerinde çeşitli pratik uygulamalar için kullanılır. Örnek senaryolar:

  • Veri Temizleme: Türkçe karakter düzeltme, hatalı veri formatlarını onarma.
  • Otomasyon: Parsel alanlarını Excel’den aktarma, koordinat yuvarlama.
  • Analiz: Alanların ağırlık merkezini bulma, objeler arası kesişim analizi.
  • Görselleştirme: Alan adlarını yazı olarak ekleme, sembollerle işaretleme.

7. Sonuç ve Eğitim için Öneriler

Bu materyal, Netcad makro yazımının ileri düzey özelliklerini ve pratik uygulamalarını kapsamlı bir şekilde ele almıştır. Netcad API’si, Visual Basic ile birleştiğinde, kullanıcıların projelerini özelleştirmesine ve karmaşık işlemleri otomatikleştirmesine olanak tanır. Başka bir GPT modelini eğitmek için aşağıdaki öneriler dikkate alınabilir:

  • Veri Seti Oluşturma: Örnek makrolardan oluşan bir veri seti hazırlayın ve her makronun işlevini açıklayın.
  • Sorular ve Cevaplar: Netcad makro yazımıyla ilgili sık sorulan soruları ve çözümlerini ekleyin.
  • Pratik Örnekler: Gerçek dünya projelerinden senaryolar oluşturun ve makrolarla nasıl çözüleceğini gösterin.
  • Hata Senaryoları: Yaygın hataları ve çözümlerini modelin öğrenmesi için ekleyin.

Bu doküman, Netcad makro yazımı konusunda kapsamlı bir rehber olarak kullanılabilir ve başka bir GPT modelinin bu alanda yetkinlik kazanmasına yardımcı olabilir.

Netcad Makro Yazımı Eğitim Materyali – Bölüm 3

Bu bölüm, Netcad makro yazımıyla ilgili ileri düzey teknikleri ve pratik uygulamaları ele alarak, Visual Basic diliyle Netcad API’sini kullanarak karmaşık GIS işlemlerini gerçekleştirme yöntemlerini açıklamaktadır. Önceki bölümlerde obje türleri, diyalog pencereleri, dosya işlemleri, COM objeleri ve geometrik işlemler tanıtılmıştı. Bu bölümde, veri analizi, raporlama, gelişmiş geometrik işlemler, modül entegrasyonları, hata ayıklama ve test stratejileri gibi konular derinlemesine incelenecektir. Materyal, Netcad makrolarının gerçek dünya projelerindeki uygulamalarına odaklanarak, başka bir GPT modelinin bu alanda uzmanlaşmasını sağlayacak şekilde hazırlanmıştır.

1. Veri Analizi ve Raporlama

Netcad makroları, projelerdeki objelerin özelliklerini analiz ederek raporlar oluşturmak için güçlü bir araçtır. Bu, özellikle GIS projelerinde veri özetleri, istatistikler veya özel raporlar üretmek için kullanışlıdır.

1.1. Veri Analizi Teknikleri

Netcad projelerindeki objeler üzerinde analiz yapmak için aşağıdaki metodlar kullanılır:

  • Obje Özelliklerini Toplama:Dim i, alanToplam, objeSayisi With Netcad For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then alanToplam = alanToplam + o.area objeSayisi = objeSayisi + 1 End If Next End With
  • Filtreleme ile Analiz:Dim alanToplam, objeSayisi With Netcad .SetFilter Nothing, Array("PARSEL"), Array(opline) While .GetNextObject2(o) alanToplam = alanToplam + o.area objeSayisi = objeSayisi + 1 Wend .ResetFilter End With

1.2. Raporlama

Analiz sonuçlarını kullanıcıya sunmak için dosyalara yazma veya diyalog pencereleri kullanılır.

  • Text Dosyasına Rapor Yazma:Sub Main Dim i, alanToplam, objeSayisi, fso, f With Netcad For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then alanToplam = alanToplam + o.area objeSayisi = objeSayisi + 1 End If Next Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\Rapor\alan_raporu.txt", 2, True) f.WriteLine "Netcad Alan Raporu" f.WriteLine "-----------------" f.WriteLine "Toplam Alan: " & alanToplam & " m²" f.WriteLine "Obje Sayısı: " & objeSayisi f.Close MsgBox "Rapor oluşturuldu: C:\Rapor\alan_raporu.txt" End With End Sub
  • Excel’e Rapor Yazma:Sub Main Dim i, xls, wb, ws, alanToplam, objeSayisi With Netcad Set xls = CreateObject("excel.application") Set wb = xls.Workbooks.Add Set ws = wb.Sheets(1) ws.Cells(1, 1).Value = "Netcad Alan Raporu" ws.Cells(2, 1).Value = "Toplam Alan (m²)" ws.Cells(2, 2).Value = "Obje Sayısı" For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then alanToplam = alanToplam + o.area objeSayisi = objeSayisi + 1 End If Next ws.Cells(3, 1).Value = alanToplam ws.Cells(3, 2).Value = objeSayisi wb.SaveAs "C:\Rapor\alan_raporu.xlsx" xls.Quit MsgBox "Excel raporu oluşturuldu: C:\Rapor\alan_raporu.xlsx" End With End Sub

1.3. Örnek: Parsel Alanlarına Göre Sınıflandırma

Bu makro, parsel alanlarını sınıflandırarak bir rapor üretir (örneğin, küçük, orta, büyük parseller).

Sub Main
    Dim i, kucuk, orta, buyuk, alanToplam, objeSayisi
    With Netcad
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set f = fso.OpenTextFile("C:\Rapor\parsel_raporu.txt", 2, True)
        f.WriteLine "Parsel Sınıflandırma Raporu"
        f.WriteLine "-------------------------"
        For i = 0 To .NumObject - 1
            Set o = .GetObject(i)
            If o.Tag = opline And o.tabaka = "PARSEL" Then
                alanToplam = alanToplam + o.area
                objeSayisi = objeSayisi + 1
                If o.area < 500 Then
                    kucuk = kucuk + 1
                ElseIf o.area < 2000 Then
                    orta = orta + 1
                Else
                    buyuk = buyuk + 1
                End If
            End If
        Next
        f.WriteLine "Küçük Parseller (<500 m²): " & kucuk
        f.WriteLine "Orta Parseller (500-2000 m²): " & orta
        f.WriteLine "Büyük Parseller (>2000 m²): " & buyuk
        f.WriteLine "Toplam Alan: " & alanToplam & " m²"
        f.WriteLine "Toplam Parsel Sayısı: " & objeSayisi
        f.Close
        MsgBox "Rapor oluşturuldu: C:\Rapor\parsel_raporu.txt"
    End With
End Sub

2. Gelişmiş Geometrik İşlemler

Netcad makroları, poligon bölme, tampon oluşturma ve kesişim analizi gibi gelişmiş geometrik işlemler için kullanılabilir.

2.1. Poligon Bölme

Bu makro, bir poligonu iki eşit alana böler.

Sub Main
    Dim SEL, o, poly, newPoly1, newPoly2, i, midPoint, splitLine
    With Netcad
        Set SEL = .NewSelectionSet
        Set o = .NewObject
        If SEL.Select("Bölünecek Poligonu Seç", Array(opline)) Then
            SEL.GetSelectedObject(0, o)
            Set poly = .GetPlineExt(o)
            ' Ağırlık merkezini bul
            Set midPoint = poly.CenterOfMass
            ' Poligonu ikiye bölen bir çizgi oluştur
            Set splitLine = .NewPoly
            splitLine.AddCoor .NewC(midPoint.x - 1000, midPoint.y, 0)
            splitLine.AddCoor .NewC(midPoint.x + 1000, midPoint.y, 0)
            ' Poligonu böl
            Set newPoly1 = .NewPoly
            Set newPoly2 = .NewPoly
            If poly.SplitByLine(splitLine, newPoly1, newPoly2) Then
                Set o1 = .MakePline("BÖLÜM1", 0, 0, 0, 0, 0, newPoly1)
                Set o2 = .MakePline("BÖLÜM2", 0, 0, 0, 0, 0, newPoly2)
                o1.renk = Red
                o2.renk = Blue
                .AddObject(o1)
                .AddObject(o2)
                .DeleteObject SEL.GetSelectedObjectIndex(0)
                SEL.RedrawAndRewind
                MsgBox "Poligon iki eşit alana bölündü."
            Else
                MsgBox "Poligon bölünemedi."
            End If
        End If
    End With
End Sub

2.2. Tampon Oluşturma

Bu makro, seçilen bir poligon etrafında belirtilen mesafede bir tampon alanı oluşturur.

Sub Main
    Dim SEL, o, poly, bufferPoly, bufferDist, bd
    With Netcad
        Set bd = .NewBDialog("Tampon Oluşturma")
        bd.GetFloat "dist", "Tampon Mesafesi (Metre)", 10, 2
        If bd.ShowModal Then
            bufferDist = bd.ValueByName("dist")
            Set SEL = .NewSelectionSet
            Set o = .NewObject
            If SEL.Select("Tampon Oluşturulacak Poligonu Seç", Array(opline)) Then
                SEL.GetSelectedObject(0, o)
                Set poly = .GetPlineExt(o)
                Set bufferPoly = poly.Buffer(bufferDist)
                Set newObj = .MakePline("TAMPON", 0, 0, 0, 0, 0, bufferPoly)
                newObj.renk = Green
                .AddObject(newObj)
                SEL.RedrawAndRewind
                MsgBox "Tampon alanı oluşturuldu."
            End If
        End If
    End With
End Sub

3. Netcad Modülleriyle Entegrasyon

Netcad, GIS, 3D, Yol, Kamulaştırma gibi çeşitli modüller sunar. Makrolar, bu modüllerle entegre çalışabilir.

3.1. Netcad GIS ile Entegrasyon

Netcad GIS modülü, veri tabanı entegrasyonu ve sorgulama için kullanılır.

  • Örnek: GIS Veritabanından Sorgulama:Sub Main Dim db, rs, SEL, o, i With Netcad Set db = CreateObject("NetcadGIS.Database") Set rs = db.ExecuteQuery("SELECT * FROM PARSEL WHERE ALAN > 1000") Set SEL = .NewSelectionSet Set o = .NewObject For i = 0 To rs.RecordCount - 1 Set o = .GetObjectByName(rs.Fields("PARSEL_NO")) SEL.AddObject o rs.MoveNext Next SEL.RedrawAndRewind MsgBox "1000 m²'den büyük parseller seçildi." End With End Sub

3.2. Netcad 3D ile Entegrasyon

Netcad 3D modülü, yükseklik verileriyle çalışmak için kullanılır.

  • Örnek: Noktalara Yükseklik Atama:Sub Main Dim i, o, zValue With Netcad For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opoint Then zValue = .GetZValue(o.p1.x, o.p1.y) o.p1.z = zValue .PutObject i, o End If Next MsgBox "Noktalara yükseklik değerleri atandı." End With End Sub

4. Hata Ayıklama ve Test Stratejileri

Netcad makrolarını geliştirirken hata ayıklama ve test süreçleri, güvenilir kod yazmak için kritik öneme sahiptir.

4.1. Hata Ayıklama Teknikleri

  • Mesaj Kutuları: Kodun hangi noktada çalıştığını görmek için MsgBox kullanın.MsgBox "Döngü başladı: " & i
  • Log Dosyaları: İşlemleri bir log dosyasına kaydedin.Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\Log\debug.log", 8, True) f.WriteLine "Obje " & i & " işlendi." f.Close
  • Hata Kontrolü:On Error Resume Next Set o = Netcad.GetObject(i) If Err.Number <> 0 Then LogError "Obje alınamadı: " & Err.Description End If

4.2. Test Stratejileri

  • Küçük Veri Setleriyle Test: Makroyu büyük bir proje yerine küçük bir veri setiyle test edin.
  • Farklı Senaryolar: Farklı obje türleri, tabakalar ve girişlerle test edin.
  • Otomatik Testler: Test makroları yazarak tekrar eden testleri otomatikleştirin.Sub TestMakro Dim testProj, o With Netcad Set testProj = .OpenProject("C:\Test\test.ncp") Set o = .MakePoint(.NewC(100, 100, 0), 0, 0, 0) .AddObject(o) Call Main ' Asıl makroyu çağır MsgBox "Test tamamlandı." End With End Sub

5. Pratik Örnek: Koordinat Yuvarlama

Bu makro, projedeki noktaların koordinatlarını belirtilen hassasiyete yuvarlar.

Sub Main
    Dim bd, hassasiyet, i, o
    With Netcad
        Set bd = .NewBDialog("Koordinat Yuvarlama")
        bd.GetInteger "hassasiyet", "Ondalık Hassasiyet (Basamak)", 2
        If bd.ShowModal Then
            hassasiyet = bd.ValueByName("hassasiyet")
            For i = 0 To .NumObject - 1
                Set o = .GetObject(i)
                If o.Tag = opoint Then
                    o.p1.x = Round(o.p1.x, hassasiyet)
                    o.p1.y = Round(o.p1.y, hassasiyet)
                    o.p1.z = Round(o.p1.z, hassasiyet)
                    .PutObject i, o
                End If
            Next
            MsgBox "Koordinatlar yuvarlandı."
        End If
    End With
End Sub

6. Sonuç ve Eğitim için İleri Öneriler

Bu materyal, Netcad makro yazımının ileri düzey tekniklerini ve pratik uygulamalarını kapsamlı bir şekilde ele alarak, Visual Basic ile Netcad API’sinin gücünü ortaya koymuştur. Veri analizi, raporlama, geometrik işlemler, modül entegrasyonları ve hata ayıklama gibi konular, Netcad makrolarının GIS ve harita mühendisliği projelerindeki potansiyelini göstermektedir.

Başka bir GPT modelini eğitmek için şu ileri öneriler dikkate alınabilir:

  • Etkileşimli Eğitim: Netcad makrolarıyla ilgili interaktif bir eğitim platformu oluşturun, örneğin, kullanıcıların makroları test edebileceği bir sandbox ortamı.
  • Senaryo Tabanlı Öğrenme: Gerçek dünya GIS projelerinden senaryolar sunarak, modelin problem çözme becerilerini geliştirin.
  • Kod Kütüphanesi: Yaygın kullanılan makrolardan oluşan bir kütüphane oluşturun ve her makronun kullanımını açıklayın.
  • Hata Simülasyonu: Modelin hata ayıklama yeteneklerini geliştirmek için kasıtlı hatalı makrolar sunun ve düzeltmelerini isteyin.

Bu doküman, Netcad makro yazımı konusunda eksiksiz bir rehber olarak kullanılabilir ve başka bir GPT modelinin bu alanda uzmanlaşmasına olanak tanır.

Netcad Makro Yazımı Eğitim Materyali – Bölüm 4

Bu bölüm, Netcad makro yazımıyla ilgili ileri düzey uygulamaları ve pratik senaryoları ele alarak, Visual Basic diliyle Netcad API’sini kullanarak karmaşık GIS işlemlerini gerçekleştirme tekniklerini derinlemesine açıklamaktadır. Önceki bölümlerde obje türleri, diyalog pencereleri, dosya işlemleri, geometrik işlemler, modül entegrasyonları, veri analizi ve hata ayıklama gibi konular kapsamlı bir şekilde işlenmişti. Bu bölümde, veri görselleştirme, otomasyon, performans optimizasyonu, açık kaynak GIS araçlarıyla entegrasyon ve eğitim için pratik projeler gibi konulara odaklanılacaktır. Materyal, Netcad makrolarının gerçek dünya GIS projelerindeki ileri düzey uygulamalarını vurgulayarak, başka bir GPT modelinin bu alanda uzmanlaşmasını sağlayacak şekilde hazırlanmıştır.

1. Veri Görselleştirme ve Harita Çıktıları

Netcad makroları, projelerdeki verileri görselleştirmek ve profesyonel harita çıktıları üretmek için kullanılabilir. Bu, GIS projelerinde veri sunumu ve raporlama için kritik bir özelliktir.

1.1. Obje Görselleştirme

Objelerin renk, çizgi tipi veya sembol gibi özelliklerini değiştirerek görsel vurgular oluşturulabilir.

  • Örnek: Alan Objelerini Alana Göre Renklendirme:Sub Main Dim i, o, maxArea, minArea With Netcad ' Maksimum ve minimum alanı bul maxArea = 0 minArea = 999999999 For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then If o.area > maxArea Then maxArea = o.area If o.area < minArea Then minArea = o.area End If Next ' Alanlara göre renklendirme For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then If o.area < (minArea + (maxArea - minArea) / 3) Then o.renk = Blue ' Küçük alanlar ElseIf o.area < (minArea + 2 * (maxArea - minArea) / 3) Then o.renk = Green ' Orta alanlar Else o.renk = Red ' Büyük alanlar End If .PutObject i, o End If Next .Redraw MsgBox "Alanlar renklendirildi." End With End Sub

1.2. Harita Çıktıları Oluşturma

Netcad, harita çıktılarını PDF veya görüntü formatında dışa aktarmak için PrintToFile metodunu destekler.

  • Örnek: Harita Çıktısını PDF Olarak Kaydetme:Sub Main Dim bd, dosyaYolu With Netcad Set bd = .NewBDialog("Harita Çıktısı") bd.GetFileName "dosya", "PDF Dosyası Seç", "", "PDF Dosyaları|*.pdf", "pdf" If bd.ShowModal Then dosyaYolu = bd.ValueByName("dosya") .SetParam PNC_PRINTMODE, 1 ' PDF çıktısı .PrintToFile dosyaYolu MsgBox "Harita PDF olarak kaydedildi: " & dosyaYolu End If End With End Sub

1.3. Etiketleme ve Açıklama Ekleme

Projeye otomatik etiketler veya açıklamalar eklemek için MakeText kullanılır.

  • Örnek: Alan Objelerine Alan Değerlerini Etiketleme:Sub Main Dim i, o, textObj, center With Netcad For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then Set poly = .GetPlineExt(o) Set center = poly.CenterOfMass Set textObj = .MakeText(Format(o.area, "0.00") & " m²", center, 0, 0, 2, 0, 0) textObj.renk = Black .AddObject textObj End If Next .Redraw MsgBox "Alan etiketleri eklendi." End With End Sub

2. Otomasyon için İleri Düzey Makro Örnekleri

Netcad makroları, toplu veri işleme, pafta oluşturma ve diğer tekrarlayan görevleri otomatikleştirmek için idealdir.

2.1. Toplu Veri İşleme

Bu makro, projedeki tüm noktaların koordinatlarını bir Excel dosyasına aktarır.

Sub Main
    Dim i, xls, wb, ws, row
    With Netcad
        Set xls = CreateObject("excel.application")
        Set wb = xls.Workbooks.Add
        Set ws = wb.Sheets(1)
        ws.Cells(1, 1).Value = "Nokta Adı"
        ws.Cells(1, 2).Value = "X Koordinatı"
        ws.Cells(1, 3).Value = "Y Koordinatı"
        ws.Cells(1, 4).Value = "Z Koordinatı"
        row = 2
        For i = 0 To .NumObject - 1
            Set o = .GetObject(i)
            If o.Tag = opoint Then
                ws.Cells(row, 1).Value = o.pname
                ws.Cells(row, 2).Value = o.p1.x
                ws.Cells(row, 3).Value = o.p1.y
                ws.Cells(row, 4).Value = o.p1.z
                row = row + 1
            End If
        Next
        wb.SaveAs "C:\Rapor\nokta_koordinatlari.xlsx"
        xls.Quit
        MsgBox "Koordinatlar Excel'e aktarıldı: C:\Rapor\nokta_koordinatlari.xlsx"
    End With
End Sub

2.2. Otomatik Pafta Oluşturma

Bu makro, projeyi düzenli paftalara böler ve her paftayı ayrı bir obje olarak ekler.

Sub Main
    Dim bd, paftaGenislik, paftaYukseklik, x, y, paftaObj
    With Netcad
        Set bd = .NewBDialog("Pafta Oluşturma")
        bd.GetFloat "genislik", "Pafta Genişliği (Metre)", 1000, 2
        bd.GetFloat "yukseklik", "Pafta Yüksekliği (Metre)", 1000, 2
        If bd.ShowModal Then
            paftaGenislik = bd.ValueByName("genislik")
            paftaYukseklik = bd.ValueByName("yukseklik")
            ' Proje sınırlarını al
            Set bounds = .GetProjectBounds
            For x = bounds.xmin To bounds.xmax Step paftaGenislik
                For y = bounds.ymin To bounds.ymax Step paftaYukseklik
                    Set paftaObj = .MakeRectangle(.NewC(x, y, 0), .NewC(x + paftaGenislik, y + paftaYukseklik, 0), 0, 0, 0)
                    paftaObj.renk = Cyan
                    .AddObject paftaObj
                Next
            Next
            .Redraw
            MsgBox "Paftalar oluşturuldu."
        End If
    End With
End Sub

3. Performans Optimizasyonu ve Ölçeklenebilirlik

Büyük projelerde Netcad makrolarının performansını artırmak için aşağıdaki teknikler kullanılabilir.

3.1. Toplu İşlemler

BeginBlock ve EndBlock metodları, birden fazla objeyi aynı anda güncelleyerek performansı artırır.

Sub Main
    Dim i, o
    With Netcad
        .SetParam BeginBlock, True
        For i = 0 To .NumObject - 1
            Set o = .GetObject(i)
            If o.Tag = opline Then
                o.renk = Red
                .PutObject i, o
            End If
        Next
        .SetParam EndBlock, True
        .Redraw
        MsgBox "Tüm alanlar kırmızıya boyandı."
    End With
End Sub

3.2. Filtreleme ile Optimizasyon

Büyük projelerde yalnızca gerekli objeleri işlemek için filtreleme kullanılır.

Sub Main
    Dim o
    With Netcad
        .SetFilter Nothing, Array("PARSEL"), Array(opline)
        While .GetNextObject2(o)
            o.renk = Green
            .PutObject .CurObjPos, o
        Wend
        .ResetFilter
        .Redraw
        MsgBox "Parseller yeşile boyandı."
    End With
End Sub

3.3. Bellek Yönetimi

Kullanılmayan nesneleri serbest bırakmak, bellek kullanımını azaltır.

Sub Main
    Dim i, o, SEL
    With Netcad
        Set SEL = .NewSelectionSet
        If SEL.Select("Objeleri Seç", Array(opline)) Then
            For i = 0 To SEL.NE - 1
                Set o = SEL.GetSelectedObject(i)
                o.renk = Blue
                .PutObject SEL.GetSelectedObjectIndex(i), o
                Set o = Nothing
            Next
            SEL.RedrawAndRewind
        End If
        Set SEL = Nothing
        MsgBox "Seçilen objeler maviye boyandı."
    End With
End Sub

4. Açık Kaynak GIS Araçlarıyla Entegrasyon

Netcad makroları, açık kaynak GIS araçlarıyla (örneğin, QGIS, PostGIS) veri alışverişi için kullanılabilir. Bu, Netcad projelerini daha geniş bir ekosistemle entegre eder.

4.1. QGIS ile Veri Aktarımı

Netcad projesindeki veriler, CSV dosyaları aracılığıyla QGIS’e aktarılabilir.

  • Örnek: Nokta Verilerini CSV’ye Aktarma:Sub Main Dim i, o, fso, f With Netcad Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\Export\noktalar.csv", 2, True) f.WriteLine "Ad,X,Y,Z" For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opoint Then f.WriteLine o.pname & "," & o.p1.x & "," & o.p1.y & "," & o.p1.z End If Next f.Close MsgBox "Nokta verileri CSV'ye aktarıldı: C:\Export\noktalar.csv" End With End Sub

4.2. PostGIS ile Entegrasyon

Netcad verileri, PostGIS veritabanına aktarılmak için SQL dosyalarına dönüştürülebilir.

  • Örnek: Alan Verilerini SQL Insert Komutlarına Dönüştürme:Sub Main Dim i, o, fso, f, wkt With Netcad Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\Export\alanlar.sql", 2, True) For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then Set poly = .GetPlineExt(o) wkt = "POLYGON((" For j = 0 To poly.Num - 1 wkt = wkt & poly.Cor(j).x & " " & poly.Cor(j).y If j < poly.Num - 1 Then wkt = wkt & "," Next wkt = wkt & "))" f.WriteLine "INSERT INTO alanlar (ad, geom) VALUES ('" & o.pname & "', ST_GeomFromText('" & wkt & "'));" End If Next f.Close MsgBox "SQL dosyası oluşturuldu: C:\Export\alanlar.sql" End With End Sub

5. Eğitim için Pratik Projeler ve Vaka Çalışmaları

Başka bir GPT modelinin Netcad makro yazımı konusunda pratik deneyim kazanması için aşağıdaki projeler önerilir.

5.1. Proje 1: Kadastro Verilerinin Temizlenmesi

  • Amaç: Bir kadastro projesindeki Türkçe karakter hatalarını düzeltmek ve parsel alanlarını yuvarlamak.
  • Makro Örneği:Sub Main Dim i, o, bd, hassasiyet With Netcad Set bd = .NewBDialog("Kadastro Verisi Temizleme") bd.GetInteger "hassasiyet", "Alan Hassasiyeti (Basamak)", 2 If bd.ShowModal Then hassasiyet = bd.ValueByName("hassasiyet") For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then o.pname = Replace(o.pname, "Ü", "Ü") o.pname = Replace(o.pname, "Å", "Ş") o.tarea = Round(o.area, hassasiyet) .PutObject i, o End If Next .Redraw MsgBox "Kadastro verileri temizlendi." End If End With End Sub

5.2. Proje 2: Arazi Kullanım Analizi

  • Amaç: Bir bölgedeki arazi kullanım türlerini (tarım, orman, yerleşim) analiz ederek bir rapor üretmek.
  • Makro Örneği:Sub Main Dim i, o, tarim, orman, yerlesim, fso, f With Netcad Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\Rapor\arazi_kullanim.txt", 2, True) f.WriteLine "Arazi Kullanım Analizi" f.WriteLine "---------------------" For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then If o.cls = "TARIM" Then tarim = tarim + o.area ElseIf o.cls = "ORMAN" Then orman = orman + o.area ElseIf o.cls = "YERLESIM" Then yerlesim = yerlesim + o.area End If End If Next f.WriteLine "Tarım Alanı: " & tarim & " m²" f.WriteLine "Orman Alanı: " & orman & " m²" f.WriteLine "Yerleşim Alanı: " & yerlesim & " m²" f.Close MsgBox "Rapor oluşturuldu: C:\Rapor\arazi_kullanim.txt" End With End Sub

5.3. Vaka Çalışması: Şehir Planlama için Otomatik Pafta ve Etiketleme

  • Senaryo: Bir şehir planlama projesinde, her parsele alan etiketleri eklenmeli ve proje 500×500 metrelik paftalara bölünmelidir.
  • Çözüm: Yukarıdaki “Otomatik Pafta Oluşturma” ve “Alan Objelerine Etiketleme” makroları birleştirilerek kullanılabilir.

6. Sonuç ve Eğitim için İleri Öneriler

Bu materyal, Netcad makro yazımının veri görselleştirme, otomasyon, performans optimizasyonu, açık kaynak GIS araçlarıyla entegrasyon ve pratik projeler gibi ileri düzey uygulamalarını kapsamlı bir şekilde ele aldı. Netcad API’si, Visual Basic ile birleştiğinde, GIS ve harita mühendisliği projelerinde güçlü bir otomasyon ve analiz aracı sunar.

Başka bir GPT modelini eğitmek için şu ileri öneriler dikkate alınabilir:

  • Etkileşimli Simülasyonlar: Netcad projelerini simüle eden bir sanal ortam oluşturarak, modelin makroları test etmesini sağlayın.
  • Veri Setleri: Çeşitli Netcad proje dosyaları (örneğin, kadastro, arazi kullanım, altyapı) sağlayarak, modelin farklı senaryolar üzerinde çalışmasını teşvik edin.
  • Topluluk Katılımı: Netcad kullanıcı topluluklarından (örneğin, forumlar, X platformu) gerçek dünya sorunlarını toplayarak, modelin problem çözme becerilerini geliştirin.
  • Sertifikasyon Programı: Netcad makro yazımı için bir eğitim müfredatı oluşturarak, modelin öğrenme sürecini yapılandırın.

Bu doküman, Netcad makro yazımı konusunda eksiksiz bir rehber olarak kullanılabilir ve başka bir GPT modelinin bu alanda tam bir uzman haline gelmesine olanak tanır.

Netcad Makro Yazımı Eğitim Materyali – Bölüm 5

Bu bölüm, Netcad makro yazımıyla ilgili yenilikçi ve ileri düzey uygulamaları ele alarak, Visual Basic diliyle Netcad API’sini kullanarak karmaşık ve modern GIS işlemlerini gerçekleştirme tekniklerini derinlemesine açıklamaktadır. Önceki bölümlerde obje türleri, diyalog pencereleri, dosya işlemleri, geometrik işlemler, modül entegrasyonları, veri analizi, veri görselleştirme, otomasyon, performans optimizasyonu ve açık kaynak GIS araçlarıyla entegrasyon gibi konular kapsamlı bir şekilde işlenmişti. Bu bölümde, yapay zeka destekli analizler, zaman serisi verileriyle çalışma, çok kullanıcılı iş birliği, modüler kod yapıları ve interaktif vaka çalışmaları gibi konulara odaklanılacaktır. Materyal, Netcad makrolarının modern GIS projelerindeki yenilikçi potansiyelini ortaya koyarak, başka bir GPT modelinin bu alanda tam bir uzman haline gelmesini sağlayacak şekilde hazırlanmıştır.

1. Netcad Makrolarıyla Yapay Zeka Destekli GIS Analizleri

Netcad makroları, yapay zeka (AI) algoritmalarıyla entegre edilerek GIS verilerinden anlamlı içgörüler çıkarabilir. Örneğin, sınıflandırma, kümeleme veya öngörü modelleri için Netcad verileri hazırlanabilir ve harici AI araçlarıyla işlenebilir.

1.1. Veri Hazırlığı için Makrolar

Netcad projelerindeki veriler, AI modellerine uygun formatta dışa aktarılabilir (örneğin, CSV veya JSON).

  • Örnek: Parsel Verilerini AI Modeli için Hazırlama:Sub Main Dim i, o, fso, f With Netcad Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\AI_Data\parsel_verileri.csv", 2, True) f.WriteLine "ParselNo,Alan,Perimetre,GISSinifi" For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then f.WriteLine o.pname & "," & o.area & "," & o.length(0) & "," & o.cls End If Next f.Close MsgBox "AI modeli için veri hazırlandı: C:\AI_Data\parsel_verileri.csv" End With End Sub

1.2. AI Çıktılarını Netcad’e Aktarma

AI modellerinden elde edilen sonuçlar (örneğin, sınıflandırma etiketleri) Netcad projesine geri aktarılabilir.

  • Örnek: AI Sınıflandırma Sonuçlarını Objelerde Güncelleme:Sub Main Dim xls, wb, ws, i, j, o, SEL, bd, xlspath With Netcad Set bd = .NewBDialog("AI Sonuçlarını Aktarma") bd.GetFileName "dosya", "Excel Dosyası Seç", "", "Excel Dosyaları|*.xlsx", "xlsx" If bd.ShowModal Then xlspath = bd.ValueByName("dosya") Set xls = CreateObject("excel.application") Set wb = xls.Workbooks.Open(xlspath) Set ws = wb.Sheets(1) Set SEL = .NewSelectionSet Set o = .NewObject For i = 2 To ws.UsedRange.Rows.Count parselNo = ws.Cells(i, 1).Value yeniSinif = ws.Cells(i, 2).Value For j = 0 To .NumObject - 1 Set o = .GetObject(j) If o.Tag = opline And o.pname = parselNo Then o.cls = yeniSinif .PutObject j, o Exit For End If Next Next wb.Close xls.Quit .Redraw MsgBox "AI sınıflandırma sonuçları aktarıldı." End If End With End Sub

1.3. Örnek Senaryo: Arazi Kullanım Tahmini

Bir makro, parsel verilerini bir AI modeline (örneğin, Python’da scikit-learn ile eğitilmiş bir model) uygun şekilde hazırlar, model çıktısını alır ve Netcad projesinde görselleştirir.

2. Zaman Serisi Verileriyle Çalışma ve Dinamik Haritalar

Netcad makroları, zaman serisi verilerini işleyerek dinamik haritalar oluşturabilir. Örneğin, bir bölgedeki arazi kullanım değişiklikleri veya altyapı gelişimi zaman içinde analiz edilebilir.

2.1. Zaman Serisi Verilerini İşleme

Birden fazla Netcad projesinden (örneğin, farklı yıllara ait projeler) veri toplanabilir.

  • Örnek: Yıllara Göre Alan Değişim Analizi:Sub Main Dim bd, dosyaListesi, i, j, o, fso, f, alanlar With Netcad Set bd = .NewBDialog("Zaman Serisi Analizi") bd.GetFileName "dosyalar", "Proje Dosyalarını Seç", "", "Netcad Projeleri|*.ncp", "ncp", True If bd.ShowModal Then dosyaListesi = Split(bd.ValueByName("dosyalar"), "|") Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\Rapor\zaman_serisi.txt", 2, True) f.WriteLine "Zaman Serisi Alan Analizi" f.WriteLine "------------------------" For Each dosya In dosyaListesi .OpenProject dosya alanToplam = 0 For j = 0 To .NumObject - 1 Set o = .GetObject(j) If o.Tag = opline And o.tabaka = "PARSEL" Then alanToplam = alanToplam + o.area End If Next f.WriteLine "Proje: " & dosya & " - Toplam Alan: " & alanToplam & " m²" Next f.Close MsgBox "Analiz tamamlandı: C:\Rapor\zaman_serisi.txt" End If End With End Sub

2.2. Dinamik Haritalar Oluşturma

Zaman serisi verilerini görselleştirmek için objelere renk veya etiket atamaları yapılabilir.

  • Örnek: Yıllara Göre Parsel Değişimlerini Renklendirme:Sub Main Dim i, o, bd, eskiProje, yeniProje With Netcad Set bd = .NewBDialog("Parsel Değişim Görselleştirme") bd.GetFileName "eski", "Eski Proje Dosyası", "", "Netcad Projeleri|*.ncp", "ncp" bd.GetFileName "yeni", "Yeni Proje Dosyası", "", "Netcad Projeleri|*.ncp", "ncp" If bd.ShowModal Then eskiProje = bd.ValueByName("eski") yeniProje = bd.ValueByName("yeni") .OpenProject yeniProje For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then Set eskiO = .GetObjectByNameFromProject(eskiProje, o.pname) If Not eskiO Is Nothing Then If Abs(o.area - eskiO.area) > 100 Then o.renk = Red ' Değişen parseller kırmızı Else o.renk = Green ' Değişmeyen parseller yeşil End If .PutObject i, o End If End If Next .Redraw MsgBox "Değişimler görselleştirildi." End If End With End Sub

3. Çok Kullanıcılı Projeler için İş Birliği Araçları

Netcad makroları, çok kullanıcılı GIS projelerinde iş birliğini kolaylaştırmak için kullanılabilir. Örneğin, tabaka kilitleme, veri paylaşımı veya değişiklik takibi gibi özellikler eklenebilir.

3.1. Tabaka Kilitleme

Bir makro, belirli tabakaları kilit ederek diğer kullanıcıların değişiklik yapmasını engelleyebilir.

  • Örnek: Tabaka Kilitleme Makrosu:Sub Main Dim bd, tabaka With Netcad Set bd = .NewBDialog("Tabaka Kilitleme") bd.GetCombo "tabaka", "Kilitlenecek Tabaka", "", 0 For i = 0 To .NumLayers - 1 bd.AddCombo .LayerNameOf(i) Next If bd.ShowModal Then tabaka = bd.ValueByName("tabaka") .SetLayerLock tabaka, True MsgBox "Tabaka kilitlendi: " & tabaka End If End With End Sub

3.2. Değişiklik Takibi

Değişiklikleri bir log dosyasına kaydederek ekip üyeleri arasında şeffaflık sağlanabilir.

  • Örnek: Obje Değişikliklerini Loglama:Sub Main Dim i, o, fso, f With Netcad Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\Log\degisiklik_log.txt", 8, True) For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline And o.modified Then f.WriteLine Now & ": Parsel " & o.pname & " değiştirildi. Yeni alan: " & o.area o.renk = Yellow .PutObject i, o End If Next f.Close .Redraw MsgBox "Değişiklikler loglandı: C:\Log\degisiklik_log.txt" End With End Sub

4. Modüler ve Yeniden Kullanılabilir Kod Yapıları

Netcad makrolarını daha sürdürülebilir ve yeniden kullanılabilir hale getirmek için modüler bir yaklaşım benimsenmelidir.

4.1. Fonksiyon ve Prosedür Tanımlama

Ortak görevler için ayrı fonksiyonlar veya prosedürler yazılabilir.

  • Örnek: Koordinat Yuvarlama Fonksiyonu:Function YuvarlaKoordinat(koordinat As Double, hassasiyet As Integer) As Double YuvarlaKoordinat = Round(koordinat, hassasiyet) End Function Sub Main Dim i, o, bd, hassasiyet With Netcad Set bd = .NewBDialog("Koordinat Yuvarlama") bd.GetInteger "hassasiyet", "Ondalık Hassasiyet", 2 If bd.ShowModal Then hassasiyet = bd.ValueByName("hassasiyet") For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opoint Then o.p1.x = YuvarlaKoordinat(o.p1.x, hassasiyet) o.p1.y = YuvarlaKoordinat(o.p1.y, hassasiyet) o.p1.z = YuvarlaKoordinat(o.p1.z, hassasiyet) .PutObject i, o End If Next .Redraw MsgBox "Koordinatlar yuvarlandı." End If End With End Sub

4.2. Makro Kütüphanesi Oluşturma

Yaygın kullanılan makrolar bir kütüphanede toplanabilir ve diğer projelerde yeniden kullanılabilir.

  • Örnek: Genel Amaçlı Kütüphane:' NetcadMakroKutuphanesi.vbs Function YuvarlaKoordinat(koordinat As Double, hassasiyet As Integer) As Double YuvarlaKoordinat = Round(koordinat, hassasiyet) End Function Sub RenklendirByArea(o As Object, minArea As Double, maxArea As Double) If o.area < (minArea + (maxArea - minArea) / 3) Then o.renk = Blue ElseIf o.area < (minArea + 2 * (maxArea - minArea) / 3) Then o.renk = Green Else o.renk = Red End If End Sub Sub LogYaz(mesaj As String) Dim fso, f Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\Log\genel_log.txt", 8, True) f.WriteLine Now & ": " & mesaj f.Close End Sub
  • Kütüphaneyi Kullanma:Sub Main ' Kütüphaneyi dahil et (örneğin, dosya referansı ile) Dim i, o, minArea, maxArea With Netcad minArea = 999999999 maxArea = 0 For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then If o.area < minArea Then minArea = o.area If o.area > maxArea Then maxArea = o.area End If Next For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then Call RenklendirByArea(o, minArea, maxArea) .PutObject i, o Call LogYaz("Parsel " & o.pname & " renklendirildi.") End If Next .Redraw MsgBox "Renklendirme tamamlandı." End With End Sub

5. Eğitim için İnteraktif Vaka Çalışmaları

Başka bir GPT modelinin Netcad makro yazımı konusunda pratik deneyim kazanması için aşağıdaki interaktif vaka çalışmaları önerilir.

5.1. Vaka Çalışması 1: Altyapı Planlama için Otomatik Analiz

  • Senaryo: Bir şehirde su boru hatlarının yerleşim alanlarına olan mesafelerini analiz ederek, riskli bölgeleri tespit etmek.
  • Makro Örneği:Sub Main Dim i, j, o, poly, boru, mesafe, fso, f With Netcad Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("C:\Rapor\risk_analizi.txt", 2, True) f.WriteLine "Altyapı Risk Analizi" f.WriteLine "-------------------" .SetFilter Nothing, Array("BORU"), Array(oline) While .GetNextObject2(boru) .SetFilter Nothing, Array("YERLESIM"), Array(opline) While .GetNextObject2(o) Set poly = .GetPlineExt(o) mesafe = NCMath.DistanceToPoly(boru.p1, poly) If mesafe < 50 Then f.WriteLine "Yerleşim: " & o.pname & " - Boru Mesafesi: " & mesafe & " m (Riskli)" o.renk = Red .PutObject .CurObjPos, o End If Wend .ResetFilter Wend .ResetFilter f.Close .Redraw MsgBox "Analiz tamamlandı: C:\Rapor\risk_analizi.txt" End With End Sub

5.2. Vaka Çalışması 2: Dinamik Kadastro Güncelleme

  • Senaryo: Yeni ölçüm verilerini bir kadastro projesine entegre ederek, değişen parselleri işaretlemek.
  • Makro Örneği:Sub Main Dim bd, yeniVeri, i, o, yeniO, SEL With Netcad Set bd = .NewBDialog("Kadastro Güncelleme") bd.GetFileName "veri", "Yeni Ölçüm Dosyası", "", "Netcad Projeleri|*.ncp", "ncp" If bd.ShowModal Then yeniVeri = bd.ValueByName("veri") Set SEL = .NewSelectionSet For i = 0 To .NumObject - 1 Set o = .GetObject(i) If o.Tag = opline Then Set yeniO = .GetObjectByNameFromProject(yeniVeri, o.pname) If Not yeniO Is Nothing Then If Abs(o.area - yeniO.area) > 10 Then o.renk = Yellow o.tarea = yeniO.area .PutObject i, o SEL.AddObject o End If End If End If Next SEL.RedrawAndRewind MsgBox "Güncellenen parseller işaretlendi." End If End With End Sub

6. Netcad Makro Kütüphanesi Oluşturma

Eğitim sürecini desteklemek için, yaygın kullanılan makrolardan oluşan bir kütüphane oluşturmak faydalı olacaktır. Bu kütüphane, başka bir GPT modelinin Netcad makrolarını hızlıca öğrenmesini ve uygulamasını sağlar.

  • Kütüphane Yapısı:
    • Veri İşleme: Koordinat yuvarlama, Türkçe karakter düzeltme.
    • Görselleştirme: Renklendirme, etiketleme.
    • Analiz: Alan/perimetre hesaplama, mesafe analizi.
    • Otomasyon: Pafta oluşturma, toplu veri aktarımı.
    • Entegrasyon: Excel, QGIS, PostGIS ile veri alışverişi.
  • Örnek Kütüphane Dosyası:' NetcadMakroKutuphanesi.vbs Sub TurkceKarakterDuzelt(o As Object) o.pname = Replace(o.pname, "Ü", "Ü") o.pname = Replace(o.pname, "Å", "Ş") o.pname = Replace(o.pname, "Ä", "ğ") o.pname = Replace(o.pname, "Ç", "Ç") o.pname = Replace(o.pname, "İ", "İ") o.pname = Replace(o.pname, "Ö", "Ö") End Sub Sub EtiketEkle(o As Object, Netcad As Object) If o.Tag = opline Then Set poly = Netcad.GetPlineExt(o) Set center = poly.CenterOfMass Set textObj = Netcad.MakeText(Format(o.area, "0.00") & " m²", center, 0, 0, 2, 0, 0) textObj.renk = Black Netcad.AddObject textObj End If End Sub Function MesafeHesapla(p1 As Object, p2 As Object) As Double MesafeHesapla = Sqr((p2.x - p1.x) ^ 2 + (p2.y - p1.y) ^ 2) End Function

7. Sonuç ve Eğitim için İleri Öneriler

Bu materyal, Netcad makro yazımının yapay zeka entegrasyonu, zaman serisi analizi, çok kullanıcılı iş birliği, modüler kod yapıları ve interaktif vaka çalışmaları gibi yenilikçi uygulamalarını kapsamlı bir şekilde ele aldı. Netcad API’si, Visual Basic ile birleştiğinde, modern GIS projelerinde otomasyon, analiz ve görselleştirme için güçlü bir araç sunar.

Başka bir GPT modelini eğitmek için şu ileri öneriler dikkate alınabilir:

  • İnteraktif Eğitim Platformu: Netcad makrolarını test etmek için bir web tabanlı sandbox ortamı geliştirin.
  • Kapsamlı Veri Setleri: Farklı GIS senaryolarını kapsayan Netcad proje dosyaları (örneğin, kadastro, altyapı, çevre planlama) sağlayın.
  • Topluluk Odaklı Öğrenme: Netcad kullanıcı topluluklarından (örneğin, X platformu veya yerel GIS forumları) gerçek dünya sorunlarını toplayarak, modelin pratik problem çözme becerilerini geliştirin.
  • Sürekli Öğrenme: Netcad’in yeni sürümleri veya API güncellemeleriyle uyumlu olacak şekilde modelin eğitimini düzenli olarak güncelleyin.

Bu doküman, Netcad makro yazımı konusunda eksiksiz bir rehber olarak kullanılabilir ve başka bir GPT modelinin bu alanda tam bir uzman haline gelmesine olanak tanır.

‘ Profesyonel Netcad Makroları
‘ Bu dosya, Netcad platformunda Visual Basic ile yazılmış profesyonel makroları içerir.
‘ Her makro, modüler, hata yönetimine sahip ve kullanıcı dostu bir şekilde tasarlanmıştır.
‘ Tarih: 18 Mayıs 2025
‘ Yazar: Grok 3 (xAI)

Option Explicit

‘ Genel hata loglama fonksiyonu
Sub LogHata(mesaj As String)
Dim fso, f
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set f = fso.OpenTextFile(“C:\NetcadLog\makro_hata.log”, 8, True)
f.WriteLine Now & “: ” & mesaj
f.Close
End Sub

‘ Genel mesaj gösterme fonksiyonu
Sub GosterMesaj(baslik As String, mesaj As String, tip As Integer)
MsgBox mesaj, tip, baslik
End Sub

‘ === Makro 1: Kadastro Verisi Güncelleme ve Doğrulama ===
‘ Açıklama: Bu makro, yeni ölçüm verilerini mevcut bir kadastro projesine entegre eder,
‘ hatalı verileri tespit eder (örneğin, alan farkları, eksik parseller) ve bir rapor üretir.
Sub KadastroGuncelleme()
On Error Resume Next
Dim bd, yeniProje, raporDosya, hassasiyet, i, j, o, yeniO, SEL, fso, f
Dim degisenParseller, eksikParseller, hataSayisi
degisenParseller = 0
eksikParseller = 0
hataSayisi = 0

With Netcad
    ' Diyalog penceresi oluştur
    Set bd = .NewBDialog("Kadastro Verisi Güncelleme ve Doğrulama")
    bd.PutPrompt "Yeni ölçüm verilerini mevcut projeye entegre edin ve doğrulamaları yapın."
    bd.GetFileName "yeniProje", "Yeni Ölçüm Dosyası", "", "Netcad Projeleri|*.ncp", "ncp"
    bd.GetFileName "rapor", "Rapor Dosyası", "C:\Rapor\kadastro_rapor.txt", "Text Dosyaları|*.txt", "txt"
    bd.GetFloat "hassasiyet", "Alan Farkı Hassasiyeti (m²)", 10, 2
    bd.GetCheck "turkceDuzelt", "Türkçe Karakterleri Düzelt", 1
    If Not bd.ShowModal Then
        GosterMesaj "Bilgi", "İşlem iptal edildi.", 64
        Exit Sub
    End If

    ' Kullanıcı girişlerini al
    yeniProje = bd.ValueByName("yeniProje")
    raporDosya = bd.ValueByName("rapor")
    hassasiyet = bd.ValueByName("hassasiyet")
    Dim turkceDuzelt
    turkceDuzelt = bd.ValueByName("turkceDuzelt")

    ' Hata kontrolü
    If yeniProje = "" Then
        GosterMesaj "Hata", "Yeni proje dosyası seçilmedi.", 16
        Exit Sub
    End If

    ' Rapor dosyasını başlat
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(raporDosya, 2, True)
    f.WriteLine "Kadastro Güncelleme ve Doğrulama Raporu"
    f.WriteLine "Tarih: " & Now
    f.WriteLine "--------------------------------------"

    ' Mevcut projedeki parselleri tarama
    Set SEL = .NewSelectionSet
    Set o = .NewObject
    .SetFilter Nothing, Array("PARSEL"), Array(opline)
    While .GetNextObject2(o)
        ' Yeni projeden aynı parseli bul
        Set yeniO = .GetObjectByNameFromProject(yeniProje, o.pname)
        If yeniO Is Nothing Then
            eksikParseller = eksikParseller + 1
            f.WriteLine "Eksik Parsel: " & o.pname
        Else
            ' Alan farkını kontrol et
            If Abs(o.area - yeniO.area) > hassasiyet Then
                degisenParseller = degisenParseller + 1
                f.WriteLine "Değişen Parsel: " & o.pname & " - Eski Alan: " & o.area & " m², Yeni Alan: " & yeniO.area & " m²"
                o.tarea = yeniO.area
                o.renk = Yellow ' Değişenleri işaretle
                .PutObject .CurObjPos, o
                SEL.AddObject o
            End If
            ' Türkçe karakter düzeltme
            If turkceDuzelt = 1 Then
                Call TurkceKarakterDuzelt(o)
                .PutObject .CurObjPos, o
            End If
        End If
    Wend
    .ResetFilter

    ' Hata kontrolü
    If Err.Number <> 0 Then
        hataSayisi = hataSayisi + 1
        Call LogHata("Hata: " & Err.Description)
        f.WriteLine "Hata: " & Err.Description
    End If

    ' Raporu tamamla
    f.WriteLine "--------------------------------------"
    f.WriteLine "Toplam Değişen Parsel: " & degisenParseller
    f.WriteLine "Toplam Eksik Parsel: " & eksikParseller
    f.WriteLine "Toplam Hata: " & hataSayisi
    f.Close

    ' Ekranı güncelle
    SEL.RedrawAndRewind
    GosterMesaj "Bilgi", "Güncelleme tamamlandı. Rapor: " & raporDosya, 64
End With

' Belleği temizle
Set bd = Nothing
Set SEL = Nothing
Set o = Nothing
Set yeniO = Nothing
Set fso = Nothing
Set f = Nothing

End Sub

‘ Türkçe karakter düzeltme prosedürü
Sub TurkceKarakterDuzelt(o As Object)
o.pname = Replace(o.pname, “Ü”, “Ü”)
o.pname = Replace(o.pname, “Å”, “Ş”)
o.pname = Replace(o.pname, “Ä”, “ğ”)
o.pname = Replace(o.pname, “Ç”, “Ç”)
o.pname = Replace(o.pname, “İ”, “İ”)
o.pname = Replace(o.pname, “Ö”, “Ö”)
o.pname = Replace(o.pname, “ü”, “ü”)
o.pname = Replace(o.pname, “ÅŸ”, “ş”)
o.pname = Replace(o.pname, “ÄŸ”, “ğ”)
o.pname = Replace(o.pname, “ç”, “ç”)
o.pname = Replace(o.pname, “ı”, “ı”)
o.pname = Replace(o.pname, “ö”, “ö”)
End Sub

‘ === Makro 2: Otomatik Harita Çıktısı ve Pafta Yönetim ===
‘ Açıklama: Bu makro, proje alanını düzenli paftalara böler, her paftaya etiket ekler
‘ ve her pafta için ayrı PDF çıktıları üretir.
Sub PaftaYonetimi()
On Error Resume Next
Dim bd, paftaGenislik, paftaYukseklik, ciktiKlasor, x, y, paftaObj, textObj
Dim paftaSayisi, hataSayisi, bounds, center
paftaSayisi = 0
hataSayisi = 0

With Netcad
    ' Diyalog penceresi oluştur
    Set bd = .NewBDialog("Otomatik Pafta Yönetimi")
    bd.PutPrompt "Proje alanını paftalara bölün ve PDF çıktıları üretin."
    bd.GetFloat "genislik", "Pafta Genişliği (Metre)", 1000, 2
    bd.GetFloat "yukseklik", "Pafta Yüksekliği (Metre)", 1000, 2
    bd.GetFileName "klasor", "Çıktı Klasörü", "C:\PaftaCikti", "Klasör|*.*", ""
    If Not bd.ShowModal Then
        GosterMesaj "Bilgi", "İşlem iptal edildi.", 64
        Exit Sub
    End If

    ' Kullanıcı girişlerini al
    paftaGenislik = bd.ValueByName("genislik")
    paftaYukseklik = bd.ValueByName("yukseklik")
    ciktiKlasor = bd.ValueByName("klasor")

    ' Klasör kontrolü ve oluşturma
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Not fso.FolderExists(ciktiKlasor) Then
        fso.CreateFolder ciktiKlasor
    End If

    ' Proje sınırlarını al
    Set bounds = .GetProjectBounds
    If bounds Is Nothing Then
        GosterMesaj "Hata", "Proje sınırları alınamadı.", 16
        Call LogHata("Proje sınırları alınamadı.")
        Exit Sub
    End If

    ' Paftaları oluştur
    .SetParam BeginBlock, True
    For x = bounds.xmin To bounds.xmax Step paftaGenislik
        For y = bounds.ymin To bounds.ymax Step paftaYukseklik
            paftaSayisi = paftaSayisi + 1
            ' Pafta dikdörtgeni oluştur
            Set paftaObj = .MakeRectangle(.NewC(x, y, 0), .NewC(x + paftaGenislik, y + paftaYukseklik, 0), 0, 0, 0)
            paftaObj.renk = Cyan
            paftaObj.tabaka = "PAFTA"
            .AddObject paftaObj

            ' Pafta etiketi ekle
            Set center = .NewC(x + paftaGenislik / 2, y + paftaYukseklik / 2, 0)
            Set textObj = .MakeText("Pafta " & paftaSayisi, center, 0, 0, 2, 0, 0)
            textObj.renk = Black
            .AddObject textObj

            ' PDF çıktısı üret
            .ZoomToExtents x, y, x + paftaGenislik, y + paftaYukseklik
            .SetParam PNC_PRINTMODE, 1 ' PDF çıktısı
            .PrintToFile ciktiKlasor & "\Pafta_" & paftaSayisi & ".pdf"

            If Err.Number <> 0 Then
                hataSayisi = hataSayisi + 1
                Call LogHata("Pafta " & paftaSayisi & " çıktısı alınamadı: " & Err.Description)
            End If
        Next
    Next
    .SetParam EndBlock, True
    .Redraw

    ' Sonuç mesajı
    GosterMesaj "Bilgi", paftaSayisi & " pafta oluşturuldu. Çıktılar: " & ciktiKlasor, 64
    If hataSayisi > 0 Then
        GosterMesaj "Uyarı", hataSayisi & " hata oluştu. Detaylar için log dosyasını kontrol edin.", 48
    End If
End With

' Belleği temizle
Set bd = Nothing
Set paftaObj = Nothing
Set textObj = Nothing
Set bounds = Nothing
Set center = Nothing
Set fso = Nothing

End Sub

‘ === Makro 3: Arazi Kullanım Optimizasyon Analizi ===
‘ Açıklama: Bu makro, parsel verilerini analiz ederek arazi kullanımını optimize eder
‘ (örneğin, tarım, yerleşim, yeşil alan) ve sonuçları görselleştirir/raporlar.
Sub AraziKullanimOptimizasyonu()
On Error Resume Next
Dim bd, raporDosya, minAlan, maxMesafe, i, o, fso, f, SEL
Dim tarimAlan, yerlesimAlan, yesilAlan, hataSayisi
tarimAlan = 0
yerlesimAlan = 0
yesilAlan = 0
hataSayisi = 0

With Netcad
    ' Diyalog penceresi oluştur
    Set bd = .NewBDialog("Arazi Kullanım Optimizasyon Analizi")
    bd.PutPrompt "Parsel verilerini analiz ederek arazi kullanımını optimize edin."
    bd.GetFileName "rapor", "Rapor Dosyası", "C:\Rapor\arazi_optimizasyon.txt", "Text Dosyaları|*.txt", "txt"
    bd.GetFloat "minAlan", "Minimum Parsel Alanı (m²)", 500, 2
    bd.GetFloat "maxMesafe", "Yerleşime Maksimum Mesafe (Metre)", 1000, 2
    bd.GetCombo "siniflandirma", "Sınıflandırma Kriteri", "Alan|Mesafe|Karma", 0
    If Not bd.ShowModal Then
        GosterMesaj "Bilgi", "İşlem iptal edildi.", 64
        Exit Sub
    End If

    ' Kullanıcı girişlerini al
    raporDosya = bd.ValueByName("rapor")
    minAlan = bd.ValueByName("minAlan")
    maxMesafe = bd.ValueByName("maxMesafe")
    Dim siniflandirma
    siniflandirma = bd.ValueByName("siniflandirma")

    ' Rapor dosyasını başlat
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(raporDosya, 2, True)
    f.WriteLine "Arazi Kullanım Optimizasyon Raporu"
    f.WriteLine "Tarih: " & Now
    f.WriteLine "--------------------------------------"

    ' Yerleşim merkezini bul (örneğin, bir nokta objesi)
    Dim merkezNokta, bulundu
    bulundu = False
    For i = 0 To .NumObject - 1
        Set o = .GetObject(i)
        If o.Tag = opoint And o.cls = "MERKEZ" Then
            Set merkezNokta = o.p1
            bulundu = True
            Exit For
        End If
    Next
    If Not bulundu Then
        GosterMesaj "Hata", "Yerleşim merkezi noktası bulunamadı.", 16
        f.WriteLine "Hata: Yerleşim merkezi noktası bulunamadı."
        f.Close
        Exit Sub
    End If

    ' Parselleri analiz et
    Set SEL = .NewSelectionSet
    .SetParam BeginBlock, True
    For i = 0 To .NumObject - 1
        Set o = .GetObject(i)
        If o.Tag = opline And o.tabaka = "PARSEL" Then
            Dim mesafe, yeniSinif
            mesafe = NCMath.Distance(o.p1, merkezNokta, False)
            If siniflandirma = "Alan" Then
                If o.area < minAlan Then
                    yeniSinif = "YESIL"
                    yesilAlan = yesilAlan + o.area
                ElseIf o.area < minAlan * 3 Then
                    yeniSinif = "TARIM"
                    tarimAlan = tarimAlan + o.area
                Else
                    yeniSinif = "YERLESIM"
                    yerlesimAlan = yerlesimAlan + o.area
                End If
            ElseIf siniflandirma = "Mesafe" Then
                If mesafe < maxMesafe / 3 Then
                    yeniSinif = "YERLESIM"
                    yerlesimAlan = yerlesimAlan + o.area
                ElseIf mesafe < maxMesafe Then
                    yeniSinif = "TARIM"
                    tarimAlan = tarimAlan + o.area
                Else
                    yeniSinif = "YESIL"
                    yesilAlan = yesilAlan + o.area
                End If
            Else ' Karma
                If o.area < minAlan And mesafe > maxMesafe Then
                    yeniSinif = "YESIL"
                    yesilAlan = yesilAlan + o.area
                ElseIf o.area < minAlan * 3 Or mesafe < maxMesafe Then
                    yeniSinif = "TARIM"
                    tarimAlan = tarimAlan + o.area
                Else
                    yeniSinif = "YERLESIM"
                    yerlesimAlan = yerlesimAlan + o.area
                End If
            End If
            o.cls = yeniSinif
            If yeniSinif = "YESIL" Then
                o.renk = Green
            ElseIf yeniSinif = "TARIM" Then
                o.renk = Yellow
            Else
                o.renk = Red
            End If
            .PutObject i, o
            SEL.AddObject o
            f.WriteLine "Parsel: " & o.pname & " - Yeni Sınıf: " & yeniSinif & " - Alan: " & o.area & " m²"
        End If
        If Err.Number <> 0 Then
            hataSayisi = hataSayisi + 1
            Call LogHata("Parsel " & o.pname & " işlenirken hata: " & Err.Description)
            f.WriteLine "Hata: Parsel " & o.pname & " - " & Err.Description
        End If
    Next
    .SetParam EndBlock, True

    ' Raporu tamamla
    f.WriteLine "--------------------------------------"
    f.WriteLine "Toplam Tarım Alanı: " & tarimAlan & " m²"
    f.WriteLine "Toplam Yerleşim Alanı: " & yerlesimAlan & " m²"
    f.WriteLine "Toplam Yeşil Alan: " & yesilAlan & " m²"
    f.WriteLine "Toplam Hata: " & hataSayisi
    f.Close

    ' Ekranı güncelle
    SEL.RedrawAndRewind
    GosterMesaj "Bilgi", "Analiz tamamlandı. Rapor: " & raporDosya, 64
    If hataSayisi > 0 Then
        GosterMesaj "Uyarı", hataSayisi & " hata oluştu. Detaylar için log dosyasını kontrol edin.", 48
    End If
End With

' Belleği temizle
Set bd = Nothing
Set SEL = Nothing
Set o = Nothing
Set merkezNokta = Nothing
Set fso = Nothing
Set f = Nothing

End Sub

‘ Ana çalıştırma prosedürü (örnek bir menü)
Sub Main()
Dim bd
With Netcad
Set bd = .NewBDialog(“Profesyonel Netcad Makroları”)
bd.PutPrompt “Lütfen bir işlem seçin:”
bd.GetRadio “islem”, “Yapılacak İşlem”, “Kadastro Güncelleme|Pafta Yönetimi|Arazi Kullanım Analizi”, 0
If bd.ShowModal Then
Dim secim
secim = bd.ValueByName(“islem”)
If secim = 0 Then
Call KadastroGuncelleme
ElseIf secim = 1 Then
Call PaftaYonetimi
Else
Call AraziKullanimOptimizasyonu
End If
Else
GosterMesaj “Bilgi”, “İşlem iptal edildi.”, 64
End If
End With
Set bd = Nothing
End Sub

‘ Profesyonel Netcad Makroları – Bölüm 2
‘ Bu dosya, Netcad platformunda Visual Basic ile yazılmış ileri düzey profesyonel makroları içerir.
‘ Makrolar, modüler, hata yönetimine sahip, kullanıcı dostu ve ölçeklenebilir şekilde tasarlanmıştır.
‘ Tarih: 18 Mayıs 2025, 10:44
‘ Yazar: Grok 3 (xAI)

Option Explicit

‘ Genel hata loglama fonksiyonu
Sub LogHata(mesaj As String)
Dim fso, f
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(“C:\NetcadLog”) Then
fso.CreateFolder “C:\NetcadLog”
End If
Set f = fso.OpenTextFile(“C:\NetcadLog\makro_hata.log”, 8, True)
f.WriteLine FormatDateTime(Now, vbGeneralDate) & “: ” & mesaj
f.Close
Set f = Nothing
Set fso = Nothing
End Sub

‘ Genel mesaj gösterme fonksiyonu
Sub GosterMesaj(baslik As String, mesaj As String, tip As Integer)
MsgBox mesaj, tip, baslik
End Sub

‘ Türkçe karakter düzeltme prosedürü
Sub TurkceKarakterDuzelt(o As Object)
o.pname = Replace(o.pname, “Ü”, “Ü”)
o.pname = Replace(o.pname, “Å”, “Ş”)
o.pname = Replace(o.pname, “Ä”, “ğ”)
o.pname = Replace(o.pname, “Ç”, “Ç”)
o.pname = Replace(o.pname, “İ”, “İ”)
o.pname = Replace(o.pname, “Ö”, “Ö”)
o.pname = Replace(o.pname, “ü”, “ü”)
o.pname = Replace(o.pname, “ÅŸ”, “ş”)
o.pname = Replace(o.pname, “ÄŸ”, “ğ”)
o.pname = Replace(o.pname, “ç”, “ç”)
o.pname = Replace(o.pname, “ı”, “ı”)
o.pname = Replace(o.pname, “ö”, “ö”)
End Sub

‘ === Makro 1: Topografik Analiz ve Eğim Haritası Oluşturma ===
‘ Açıklama: Nokta verilerinden eğim analizi yapar, eğim sınıflarına göre renk kodlu bir harita üretir
‘ ve detaylı bir rapor oluşturur.
Sub TopografikEgimAnalizi()
On Error Resume Next
Dim bd, raporDosya, gridBoyut, i, o, SEL, fso, f, hataSayisi
Dim egimListesi, maxEgim, minEgim, noktaSayisi
ReDim egimListesi(0)
hataSayisi = 0
noktaSayisi = 0
maxEgim = 0
minEgim = 999999

With Netcad
    ' Diyalog penceresi oluştur
    Set bd = .NewBDialog("Topografik Eğim Analizi")
    bd.PutPrompt "Nokta verilerinden eğim analizi yaparak renk kodlu bir harita oluşturun."
    bd.GetFileName "rapor", "Rapor Dosyası", "C:\Rapor\egim_raporu.txt", "Text Dosyaları|*.txt", "txt"
    bd.GetFloat "grid", "Grid Boyutu (Metre)", 10, 2
    bd.GetCombo "tabaka", "Nokta Tabakası", "", 0
    For i = 0 To .NumLayers - 1
        bd.AddCombo .LayerNameOf(i)
    Next
    If Not bd.ShowModal Then
        GosterMesaj "Bilgi", "İşlem iptal edildi.", 64
        Exit Sub
    End If

    ' Kullanıcı girişlerini al
    raporDosya = bd.ValueByName("rapor")
    gridBoyut = bd.ValueByName("grid")
    Dim noktaTabaka
    noktaTabaka = bd.ValueByName("tabaka")

    ' Hata kontrolü
    If noktaTabaka = "" Then
        GosterMesaj "Hata", "Nokta tabakası seçilmedi.", 16
        Exit Sub
    End If

    ' Rapor dosyasını başlat
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(raporDosya, 2, True)
    f.WriteLine "Topografik Eğim Analizi Raporu"
    f.WriteLine "Tarih: " & FormatDateTime(Now, vbGeneralDate)
    f.WriteLine "Grid Boyutu: " & gridBoyut & " m"
    f.WriteLine "--------------------------------------"

    ' Nokta verilerini topla
    .SetFilter Nothing, Array(noktaTabaka), Array(opoint)
    Set SEL = .NewSelectionSet
    While .GetNextObject2(o)
        noktaSayisi = noktaSayisi + 1
        ReDim Preserve egimListesi(noktaSayisi - 1)
        egimListesi(noktaSayisi - 1) = Array(o.p1.x, o.p1.y, o.p1.z)
        SEL.AddObject o
    Wend
    .ResetFilter

    ' Eğim analizi
    Dim x, y, gridNoktalari, egim, gridObj
    Set gridNoktalari = CreateObject("Scripting.Dictionary")
    For i = 0 To noktaSayisi - 1
        x = Int(egimListesi(i)(0) / gridBoyut) * gridBoyut
        y = Int(egimListesi(i)(1) / gridBoyut) * gridBoyut
        If Not gridNoktalari.Exists(x & "," & y) Then
            gridNoktalari.Add x & "," & y, Array(0, 0, 0)
        End If
        Dim mevcut
        mevcut = gridNoktalari(x & "," & y)
        mevcut(0) = mevcut(0) + egimListesi(i)(2) ' Z toplamı
        mevcut(1) = mevcut(1) + 1 ' Nokta sayısı
        mevcut(2) = mevcut(0) / mevcut(1) ' Ortalama Z
        gridNoktalari(x & "," & y) = mevcut
    Next

    ' Grid noktaları için eğim hesapla ve görselleştir
    .SetParam BeginBlock, True
    For Each key In gridNoktalari.Keys
        Dim coords, zOrt, komsuZ, egimToplam, komsuSayisi
        coords = Split(key, ",")
        x = CDbl(coords(0))
        y = CDbl(coords(1))
        zOrt = gridNoktalari(key)(2)
        egimToplam = 0
        komsuSayisi = 0
        For dx = -gridBoyut To gridBoyut Step gridBoyut
            For dy = -gridBoyut To gridBoyut Step gridBoyut
                If dx = 0 And dy = 0 Then GoTo Continue
                If gridNoktalari.Exists((x + dx) & "," & (y + dy)) Then
                    komsuZ = gridNoktalari((x + dx) & "," & (y + dy))(2)
                    egim = Abs(zOrt - komsuZ) / Sqr(dx ^ 2 + dy ^ 2)
                    egimToplam = egimToplam + egim
                    komsuSayisi = komsuSayisi + 1
                End If

Continue:
Next
Next
If komsuSayisi > 0 Then
egim = egimToplam / komsuSayisi * 100 ‘ Yüzde eğim
If egim > maxEgim Then maxEgim = egim
If egim < minEgim Then minEgim = egim ‘ Grid karesini oluştur Set gridObj = .MakeRectangle(.NewC(x, y, 0), .NewC(x + gridBoyut, y + gridBoyut, 0), 0, 0, 0) If egim < 5 Then gridObj.renk = Green ‘ Düşük eğim ElseIf egim < 15 Then gridObj.renk = Yellow ‘ Orta eğim Else gridObj.renk = Red ‘ Yüksek eğim End If gridObj.tabaka = “EGIM_HARITASI” .AddObject gridObj f.WriteLine “Grid (” & x & “,” & y & “): Eğim = ” & Format(egim, “0.00”) & “%” End If If Err.Number <> 0 Then
hataSayisi = hataSayisi + 1
Call LogHata(“Grid ” & key & ” işlenirken hata: ” & Err.Description)
End If
Next
.SetParam EndBlock, True

    ' Raporu tamamla
    f.WriteLine "--------------------------------------"
    f.WriteLine "Nokta Sayısı: " & noktaSayisi
    f.WriteLine "Minimum Eğim: " & Format(minEgim, "0.00") & "%"
    f.WriteLine "Maksimum Eğim: " & Format(maxEgim, "0.00") & "%"
    f.WriteLine "Hata Sayısı: " & hataSayisi
    f.Close

    ' Ekranı güncelle
    SEL.RedrawAndRewind
    GosterMesaj "Bilgi", "Eğim analizi tamamlandı. Rapor: " & raporDosya, 64
    If hataSayisi > 0 Then
        GosterMesaj "Uyarı", hataSayisi & " hata oluştu. Detaylar için log dosyasını kontrol edin.", 48
    End If
End With

' Belleği temizle
Set bd = Nothing
Set SEL = Nothing
Set o = Nothing
Set gridObj = Nothing
Set fso = Nothing
Set f = Nothing
Set gridNoktalari = Nothing

End Sub

‘ === Makro 2: Altyapı Çakışma Tespiti ===
‘ Açıklama: Boru hatları, yollar ve parseller arasındaki çakışmaları tespit eder,
‘ çakışan objeleri işaretler ve bir rapor üretir.
Sub AltyapiCakismaTespiti()
On Error Resume Next
Dim bd, raporDosya, cakismaMesafe, i, j, boru, parsel, yol, fso, f, SEL
Dim cakismaSayisi, hataSayisi
cakismaSayisi = 0
hataSayisi = 0

With Netcad
    ' Diyalog penceresi oluştur
    Set bd = .NewBDialog("Altyapı Çakışma Tespiti")
    bd.PutPrompt "Boru hatları, yollar ve parseller arasındaki çakışmaları tespit edin."
    bd.GetFileName "rapor", "Rapor Dosyası", "C:\Rapor\cakisma_raporu.txt", "Text Dosyaları|*.txt", "txt"
    bd.GetFloat "mesafe", "Çakışma Mesafesi (Metre)", 5, 2
    bd.GetCombo "boruTabaka", "Boru Hatları Tabakası", "", 0
    bd.GetCombo "yolTabaka", "Yollar Tabakası", "", 0
    bd.GetCombo "parselTabaka", "Parseller Tabakası", "", 0
    For i = 0 To .NumLayers - 1
        bd.AddCombo .LayerNameOf(i)
    Next
    If Not bd.ShowModal Then
        GosterMesaj "Bilgi", "İşlem iptal edildi.", 64
        Exit Sub
    End If

    ' Kullanıcı girişlerini al
    raporDosya = bd.ValueByName("rapor")
    cakismaMesafe = bd.ValueByName("mesafe")
    Dim boruTabaka, yolTabaka, parselTabaka
    boruTabaka = bd.ValueByName("boruTabaka")
    yolTabaka = bd.ValueByName("yolTabaka")
    parselTabaka = bd.ValueByName("parselTabaka")

    ' Hata kontrolü
    If boruTabaka = "" Or yolTabaka = "" Or parselTabaka = "" Then
        GosterMesaj "Hata", "Tüm tabakalar seçilmelidir.", 16
        Exit Sub
    End If

    ' Rapor dosyasını başlat
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(raporDosya, 2, True)
    f.WriteLine "Altyapı Çakışma Tespiti Raporu"
    f.WriteLine "Tarih: " & FormatDateTime(Now, vbGeneralDate)
    f.WriteLine "Çakışma Mesafesi: " & cakismaMesafe & " m"
    f.WriteLine "--------------------------------------"

    ' Çakışma analizi
    Set SEL = .NewSelectionSet
    .SetFilter Nothing, Array(boruTabaka), Array(oline)
    While .GetNextObject2(boru)
        ' Parsellerle çakışma kontrolü
        .SetFilter Nothing, Array(parselTabaka), Array(opline)
        While .GetNextObject2(parsel)
            Dim poly, mesafe
            Set poly = .GetPlineExt(parsel)
            mesafe = NCMath.DistanceToPoly(boru.p1, poly)
            If mesafe < cakismaMesafe Then
                cakismaSayisi = cakismaSayisi + 1
                f.WriteLine "Çakışma: Boru (" & boru.pname & ") - Parsel (" & parsel.pname & ") - Mesafe: " & Format(mesafe, "0.00") & " m"
                parsel.renk = Red
                .PutObject .CurObjPos, parsel
                SEL.AddObject parsel
            End If
        Wend
        .ResetFilter

        ' Yollarla çakışma kontrolü
        .SetFilter Nothing, Array(yolTabaka), Array(oline)
        While .GetNextObject2(yol)
            mesafe = NCMath.Distance(boru.p1, yol.p1, False)
            If mesafe < cakismaMesafe Then
                cakismaSayisi = cakismaSayisi + 1
                f.WriteLine "Çakışma: Boru (" & boru.pname & ") - Yol (" & yol.pname & ") - Mesafe: " & Format(mesafe, "0.00") & " m"
                yol.renk = Red
                .PutObject .CurObjPos, yol
                SEL.AddObject yol
            End If
        Wend
        .ResetFilter

        If Err.Number <> 0 Then
            hataSayisi = hataSayisi + 1
            Call LogHata("Boru " & boru.pname & " işlenirken hata: " & Err.Description)
        End If
    Wend
    .ResetFilter

    ' Raporu tamamla
    f.WriteLine "--------------------------------------"
    f.WriteLine "Toplam Çakışma: " & cakismaSayisi
    f.WriteLine "Hata Sayısı: " & hataSayisi
    f.Close

    ' Ekranı güncelle
    SEL.RedrawAndRewind
    GosterMesaj "Bilgi", "Çakışma analizi tamamlandı. Rapor: " & raporDosya, 64
    If hataSayisi > 0 Then
        GosterMesaj "Uyarı", hataSayisi & " hata oluştu. Detaylar için log dosyasını kontrol edin.", 48
    End If
End With

' Belleği temizle
Set bd = Nothing
Set SEL = Nothing
Set boru = Nothing
Set parsel = Nothing
Set yol = Nothing
Set fso = Nothing
Set f = Nothing

End Sub

‘ === Makro 3: Otomatik Veri Standardizasyon ve Kalite Kontrol ===
‘ Açıklama: Projedeki verileri standart bir formata getirir (örneğin, koordinat yuvarlama,
‘ Türkçe karakter düzeltme), eksik veya hatalı verileri kontrol eder ve raporlar.
Sub VeriStandardizasyon()
On Error Resume Next
Dim bd, raporDosya, koordHassasiyet, i, o, SEL, fso, f
Dim hataSayisi, duzeltilenObjeler, eksikVeri
hataSayisi = 0
duzeltilenObjeler = 0
eksikVeri = 0

With Netcad
    ' Diyalog penceresi oluştur
    Set bd = .NewBDialog("Veri Standardizasyon ve Kalite Kontrol")
    bd.PutPrompt "Verileri standart bir formata getirin ve kalite kontrolü yapın."
    bd.GetFileName "rapor", "Rapor Dosyası", "C:\Rapor\standart_rapor.txt", "Text Dosyaları|*.txt", "txt"
    bd.GetInteger "hassasiyet", "Koordinat Hassasiyeti (Basamak)", 2
    bd.GetCheck "turkceDuzelt", "Türkçe Karakterleri Düzelt", 1
    bd.GetCheck "eksikKontrol", "Eksik Verileri Kontrol Et", 1
    If Not bd.ShowModal Then
        GosterMesaj "Bilgi", "İşlem iptal edildi.", 64
        Exit Sub
    End If

    ' Kullanıcı girişlerini al
    raporDosya = bd.ValueByName("rapor")
    koordHassasiyet = bd.ValueByName("hassasiyet")
    Dim turkceDuzelt, eksikKontrol
    turkceDuzelt = bd.ValueByName("turkceDuzelt")
    eksikKontrol = bd.ValueByName("eksikKontrol")

    ' Rapor dosyasını başlat
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(raporDosya, 2, True)
    f.WriteLine "Veri Standardizasyon ve Kalite Kontrol Raporu"
    f.WriteLine "Tarih: " & FormatDateTime(Now, vbGeneralDate)
    f.WriteLine "--------------------------------------"

    ' Verileri standartlaştır ve kontrol et
    Set SEL = .NewSelectionSet
    .SetParam BeginBlock, True
    For i = 0 To .NumObject - 1
        Set o = .GetObject(i)
        Dim degisti
        degisti = False

        ' Koordinat yuvarlama
        If o.Tag = opoint Then
            o.p1.x = Round(o.p1.x, koordHassasiyet)
            o.p1.y = Round(o.p1.y, koordHassasiyet)
            o.p1.z = Round(o.p1.z, koordHassasiyet)
            degisti = True
        End If

        ' Türkçe karakter düzeltme
        If turkceDuzelt = 1 Then
            Dim eskiAd
            eskiAd = o.pname
            Call TurkceKarakterDuzelt(o)
            If o.pname <> eskiAd Then
                degisti = True
            End If
        End If

        ' Eksik veri kontrolü
        If eksikKontrol = 1 Then
            If o.pname = "" Then
                eksikVeri = eksikVeri + 1
                f.WriteLine "Eksik Veri: Obje " & i & " - İsim eksik"
                o.renk = Red
                degisti = True
                SEL.AddObject o
            End If
            If o.Tag = opline And o.area <= 0 Then
                eksikVeri = eksikVeri + 1
                f.WriteLine "Eksik Veri: Obje " & o.pname & " - Geçersiz alan (" & o.area & " m²)"
                o.renk = Red
                degisti = True
                SEL.AddObject o
            End If
        End If

        ' Değişiklikleri kaydet
        If degisti Then
            duzeltilenObjeler = duzeltilenObjeler + 1
            .PutObject i, o
            f.WriteLine "Düzeltilen Obje: " & o.pname & " - Tür: " & o.Tag
        End If

        If Err.Number <> 0 Then
            hataSayisi = hataSayisi + 1
            Call LogHata("Obje " & i & " işlenirken hata: " & Err.Description)
            f.WriteLine "Hata: Obje " & i & " - " & Err.Description
        End If
    Next
    .SetParam EndBlock, True

    ' Raporu tamamla
    f.WriteLine "--------------------------------------"
    f.WriteLine "Düzeltilen Obje Sayısı: " & duzeltilenObjeler
    f.WriteLine "Eksik Veri Sayısı: " & eksikVeri
    f.WriteLine "Hata Sayısı: " & hataSayisi
    f.Close

    ' Ekranı güncelle
    SEL.RedrawAndRewind
    GosterMesaj "Bilgi", "Standardizasyon tamamlandı. Rapor: " & raporDosya, 64
    If hataSayisi > 0 Then
        GosterMesaj "Uyarı", hataSayisi & " hata oluştu. Detaylar için log dosyasını kontrol edin.", 48
    End If
End With

' Belleği temizle
Set bd = Nothing
Set SEL = Nothing
Set o = Nothing
Set fso = Nothing
Set f = Nothing

End Sub

‘ Ana çalıştırma prosedürü (menü)
Sub Main()
On Error Resume Next
Dim bd
With Netcad
Set bd = .NewBDialog(“Profesyonel Netcad Makroları – Menü”)
bd.PutPrompt “Lütfen bir işlem seçin:”
bd.GetRadio “islem”, “Yapılacak İşlem”, “Topografik Eğim Analizi|Altyapı Çakışma Tespiti|Veri Standardizasyon”, 0
If bd.ShowModal Then
Dim secim
secim = bd.ValueByName(“islem”)
If secim = 0 Then
Call TopografikEgimAnalizi
ElseIf secim = 1 Then
Call AltyapiCakismaTespiti
Else
Call VeriStandardizasyon
End If
Else
GosterMesaj “Bilgi”, “İşlem iptal edildi.”, 64
End If
If Err.Number <> 0 Then
Call LogHata(“Ana menüde hata: ” & Err.Description)
End If
End With
Set bd = Nothing
End Sub

‘ Profesyonel Netcad Makroları – Bölüm 3
‘ Bu dosya, Netcad platformunda Visual Basic ile yazılmış ileri düzey profesyonel makroları içerir.
‘ Makrolar, modüler, hata yönetimine sahip, kullanıcı dostu ve ölçeklenebilir şekilde tasarlanmıştır.
‘ Tarih: 18 Mayıs 2025, 11:31
‘ Yazar: Grok 3 (xAI)

Option Explicit

‘ Genel hata loglama fonksiyonu
Sub LogHata(mesaj As String)
Dim fso, f
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(“C:\NetcadLog”) Then
fso.CreateFolder “C:\NetcadLog”
End If
Set f = fso.OpenTextFile(“C:\NetcadLog\makro_hata.log”, 8, True)
f.WriteLine FormatDateTime(Now, vbGeneralDate) & “: ” & mesaj
f.Close
Set f = Nothing
Set fso = Nothing
End Sub

‘ Genel mesaj gösterme fonksiyonu
Sub GosterMesaj(baslik As String, mesaj As String, tip As Integer)
MsgBox mesaj, tip, baslik
End Sub

‘ Türkçe karakter düzeltme prosedürü
Sub TurkceKarakterDuzelt(o As Object)
o.pname = Replace(o.pname, “Ü”, “Ü”)
o.pname = Replace(o.pname, “Å”, “Ş”)
o.pname = Replace(o.pname, “Ä”, “ğ”)
o.pname = Replace(o.pname, “Ç”, “Ç”)
o.pname = Replace(o.pname, “İ”, “İ”)
o.pname = Replace(o.pname, “Ö”, “Ö”)
o.pname = Replace(o.pname, “ü”, “ü”)
o.pname = Replace(o.pname, “ÅŸ”, “ş”)
o.pname = Replace(o.pname, “ÄŸ”, “ğ”)
o.pname = Replace(o.pname, “ç”, “ç”)
o.pname = Replace(o.pname, “ı”, “ı”)
o.pname = Replace(o.pname, “ö”, “ö”)
End Sub

‘ Koordinat yuvarlama fonksiyonu
Function YuvarlaKoordinat(koordinat As Double, hassasiyet As Integer) As Double
YuvarlaKoordinat = Round(koordinat, hassasiyet)
End Function

‘ === Makro 1: Otomatik Kamulaştırma Analizi ===
‘ Açıklama: Kamulaştırma projelerinde parsellerin maliyet analizini yapar, etkilenen
‘ alanları işaretler ve detaylı bir rapor üretir.
Sub KamulastirmaAnalizi()
On Error Resume Next
Dim bd, raporDosya, maliyetTablosu, birimFiyat, i, o, kamulastirmaAlani, SEL, fso, f
Dim toplamMaliyet, etkilenenParselSayisi, hataSayisi
toplamMaliyet = 0
etkilenenParselSayisi = 0
hataSayisi = 0

With Netcad
    ' Diyalog penceresi oluştur
    Set bd = .NewBDialog("Otomatik Kamulaştırma Analizi")
    bd.PutPrompt "Kamulaştırma alanını ve maliyet parametrelerini belirleyin."
    bd.GetFileName "rapor", "Rapor Dosyası", "C:\Rapor\kamulastirma_raporu.txt", "Text Dosyaları|*.txt", "txt"
    bd.GetFileName "maliyet", "Maliyet Tablosu (Excel)", "", "Excel Dosyaları|*.xlsx", "xlsx"
    bd.GetFloat "birimFiyat", "Varsayılan Birim Fiyat (TL/m²)", 1000, 2
    If Not bd.ShowModal Then
        GosterMesaj "Bilgi", "İşlem iptal edildi.", 64
        Exit Sub
    End If

    ' Kullanıcı girişlerini al
    raporDosya = bd.ValueByName("rapor")
    maliyetTablosu = bd.ValueByName("maliyet")
    birimFiyat = bd.ValueByName("birimFiyat")

    ' Kamulaştırma alanını seç
    Set SEL = .NewSelectionSet
    Set kamulastirmaAlani = .NewObject
    If Not SEL.Select("Kamulaştırma Alanını Seçin", Array(opline)) Then
        GosterMesaj "Hata", "Kamulaştırma alanı seçilmedi.", 16
        Exit Sub
    End If
    SEL.GetSelectedObject 0, kamulastirmaAlani
    Dim kamulastirmaPoly
    Set kamulastirmaPoly = .GetPlineExt(kamulastirmaAlani)

    ' Maliyet tablosunu oku (opsiyonel)
    Dim maliyetDict, xls, wb, ws
    Set maliyetDict = CreateObject("Scripting.Dictionary")
    If maliyetTablosu <> "" Then
        Set xls = CreateObject("Excel.Application")
        Set wb = xls.Workbooks.Open(maliyetTablosu)
        Set ws = wb.Sheets(1)
        For i = 2 To ws.UsedRange.Rows.Count
            maliyetDict.Add ws.Cells(i, 1).Value, ws.Cells(i, 2).Value
        Next
        wb.Close
        xls.Quit
    End If

    ' Rapor dosyasını başlat
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(raporDosya, 2, True)
    f.WriteLine "Kamulaştırma Analizi Raporu"
    f.WriteLine "Tarih: " & FormatDateTime(Now, vbGeneralDate)
    f.WriteLine "--------------------------------------"

    ' Parselleri analiz et
    .SetFilter Nothing, Array("PARSEL"), Array(opline)
    While .GetNextObject2(o)
        Dim parselPoly, kesisimPoly, kesisimAlani, parselMaliyet
        Set parselPoly = .GetPlineExt(o)
        If parselPoly.Intersects(kamulastirmaPoly) Then
            Set kesisimPoly = parselPoly.Intersection(kamulastirmaPoly)
            If Not kesisimPoly Is Nothing Then
                kesisimAlani = kesisimPoly.Area
                If kesisimAlani > 0 Then
                    etkilenenParselSayisi = etkilenenParselSayisi + 1
                    ' Maliyet hesapla
                    If maliyetDict.Exists(o.cls) Then
                        parselMaliyet = kesisimAlani * maliyetDict(o.cls)
                    Else
                        parselMaliyet = kesisimAlani * birimFiyat
                    End If
                    toplamMaliyet = toplamMaliyet + parselMaliyet
                    ' Parseli işaretle
                    o.renk = Red
                    .PutObject .CurObjPos, o
                    SEL.AddObject o
                    ' Rapor yaz
                    f.WriteLine "Parsel: " & o.pname & " - Etkilenen Alan: " & Format(kesisimAlani, "0.00") & " m² - Maliyet: " & Format(parselMaliyet, "0.00") & " TL"
                End If
            End If
        End If
        If Err.Number <> 0 Then
            hataSayisi = hataSayisi + 1
            Call LogHata("Parsel " & o.pname & " işlenirken hata: " & Err.Description)
            f.WriteLine "Hata: Parsel " & o.pname & " - " & Err.Description
        End If
    Wend
    .ResetFilter

    ' Raporu tamamla
    f.WriteLine "--------------------------------------"
    f.WriteLine "Etkilenen Parsel Sayısı: " & etkilenenParselSayisi
    f.WriteLine "Toplam Maliyet: " & Format(toplamMaliyet, "0.00") & " TL"
    f.WriteLine "Hata Sayısı: " & hataSayisi
    f.Close

    ' Ekranı güncelle
    SEL.RedrawAndRewind
    GosterMesaj "Bilgi", "Kamulaştırma analizi tamamlandı. Rapor: " & raporDosya, 64
    If hataSayisi > 0 Then
        GosterMesaj "Uyarı", hataSayisi & " hata oluştu. Detaylar için log dosyasını kontrol edin.", 48
    End If
End With

' Belleği temizle
Set bd = Nothing
Set SEL = Nothing
Set o = Nothing
Set kamulastirmaAlani = Nothing
Set kamulastirmaPoly = Nothing
Set parselPoly = Nothing
Set kesisimPoly = Nothing
Set fso = Nothing
Set f = Nothing
Set maliyetDict = Nothing
Set xls = Nothing
Set wb = Nothing
Set ws = Nothing

End Sub

‘ === Makro 2: Hidrolojik Analiz ve Sel Risk Haritası ===
‘ Açıklama: Nokta ve poligon verilerinden sel riski analizi yapar, risk seviyelerine
‘ göre renk kodlu bir harita üretir ve raporlar.
Sub HidrolojikSelAnalizi()
On Error Resume Next
Dim bd, raporDosya, gridBoyut, suTabaka, i, o, SEL, fso, f, hataSayisi
Dim riskListesi, maxRisk, minRisk, analizSayisi
ReDim riskListesi(0)
hataSayisi = 0
analizSayisi = 0
maxRisk = 0
minRisk = 999999

With Netcad
    ' Diyalog penceresi oluştur
    Set bd = .NewBDialog("Hidrolojik Sel Risk Analizi")
    bd.PutPrompt "Nokta ve poligon verilerinden sel riski analizi yaparak harita oluşturun."
    bd.GetFileName "rapor", "Rapor Dosyası", "C:\Rapor\sel_risk_raporu.txt", "Text Dosyaları|*.txt", "txt"
    bd.GetFloat "grid", "Grid Boyutu (Metre)", 50, 2
    bd.GetCombo "suTabaka", "Su Alanları Tabakası", "", 0
    bd.GetCombo "noktaTabaka", "Yükseklik Noktaları Tabakası", "", 0
    For i = 0 To .NumLayers - 1
        bd.AddCombo .LayerNameOf(i)
    Next
    If Not bd.ShowModal Then
        GosterMesaj "Bilgi", "İşlem iptal edildi.", 64
        Exit Sub
    End If

    ' Kullanıcı girişlerini al
    raporDosya = bd.ValueByName("rapor")
    gridBoyut = bd.ValueByName("grid")
    Dim suTabaka, noktaTabaka
    suTabaka = bd.ValueByName("suTabaka")
    noktaTabaka = bd.ValueByName("noktaTabaka")

    ' Hata kontrolü
    If suTabaka = "" Or noktaTabaka = "" Then
        GosterMesaj "Hata", "Tüm tabakalar seçilmelidir.", 16
        Exit Sub
    End If

    ' Rapor dosyasını başlat
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(raporDosya, 2, True)
    f.WriteLine "Hidrolojik Sel Risk Analizi Raporu"
    f.WriteLine "Tarih: " & FormatDateTime(Now, vbGeneralDate)
    f.WriteLine "Grid Boyutu: " & gridBoyut & " m"
    f.WriteLine "--------------------------------------"

    ' Yükseklik verilerini topla
    Dim yukseklikDict
    Set yukseklikDict = CreateObject("Scripting.Dictionary")
    .SetFilter Nothing, Array(noktaTabaka), Array(opoint)
    While .GetNextObject2(o)
        Dim gridX, gridY
        gridX = Int(o.p1.x / gridBoyut) * gridBoyut
        gridY = Int(o.p1.y / gridBoyut) * gridBoyut
        If Not yukseklikDict.Exists(gridX & "," & gridY) Then
            yukseklikDict.Add gridX & "," & gridY, Array(0, 0, 0)
        End If
        Dim mevcut
        mevcut = yukseklikDict(gridX & "," & gridY)
        mevcut(0) = mevcut(0) + o.p1.z ' Z toplamı
        mevcut(1) = mevcut(1) + 1 ' Nokta sayısı
        mevcut(2) = mevcut(0) / mevcut(1) ' Ortalama Z
        yukseklikDict(gridX & "," & gridY) = mevcut
    Wend
    .ResetFilter

    ' Su alanlarını topla
    Dim suAlanlari
    Set suAlanlari = CreateObject("Scripting.Dictionary")
    .SetFilter Nothing, Array(suTabaka), Array(opline)
    While .GetNextObject2(o)
        suAlanlari.Add o.pname, .GetPlineExt(o)
    Wend
    .ResetFilter

    ' Sel risk analizi
    Set SEL = .NewSelectionSet
    .SetParam BeginBlock, True
    For Each key In yukseklikDict.Keys
        Dim coords, zOrt, riskSkoru, minMesafe, gridObj
        coords = Split(key, ",")
        Dim x, y
        x = CDbl(coords(0))
        y = CDbl(coords(1))
        zOrt = yukseklikDict(key)(2)
        minMesafe = 999999
        For Each suKey In suAlanlari.Keys
            Dim suPoly, mesafe
            Set suPoly = suAlanlari(suKey)
            mesafe = NCMath.DistanceToPoly(.NewC(x + gridBoyut / 2, y + gridBoyut / 2, 0), suPoly)
            If mesafe < minMesafe Then minMesafe = mesafe
        Next
        ' Risk skoru: Düşük yükseklik ve suya yakınlık yüksek risk
        riskSkoru = (1000 / (zOrt + 1)) * (1000 / (minMesafe + 1))
        If riskSkoru > maxRisk Then maxRisk = riskSkoru
        If riskSkoru < minRisk Then minRisk = riskSkoru
        analizSayisi = analizSayisi + 1
        ReDim Preserve riskListesi(analizSayisi - 1)
        riskListesi(analizSayisi - 1) = Array(x, y, riskSkoru)
        ' Grid karesini oluştur
        Set gridObj = .MakeRectangle(.NewC(x, y, 0), .NewC(x + gridBoyut, y + gridBoyut, 0), 0, 0, 0)
        If riskSkoru < (minRisk + (maxRisk - minRisk) / 3) Then
            gridObj.renk = Green ' Düşük risk
        ElseIf riskSkoru < (minRisk + 2 * (maxRisk - minRisk) / 3) Then
            gridObj.renk = Yellow ' Orta risk
        Else
            gridObj.renk = Red ' Yüksek risk
        End If
        gridObj.tabaka = "SEL_RISK_HARITASI"
        .AddObject gridObj
        f.WriteLine "Grid (" & x & "," & y & "): Risk Skoru = " & Format(riskSkoru, "0.00")
        If Err.Number <> 0 Then
            hataSayisi = hataSayisi + 1
            Call LogHata("Grid " & key & " işlenirken hata: " & Err.Description)
        End If
    Next
    .SetParam EndBlock, True

    ' Raporu tamamla
    f.WriteLine "--------------------------------------"
    f.WriteLine "Analiz Edilen Grid Sayısı: " & analizSayisi
    f.WriteLine "Minimum Risk Skoru: " & Format(minRisk, "0.00")
    f.WriteLine "Maksimum Risk Skoru: " & Format(maxRisk, "0.00")
    f.WriteLine "Hata Sayısı: " & hataSayisi
    f.Close

    ' Ekranı güncelle
    SEL.RedrawAndRewind
    GosterMesaj "Bilgi", "Sel risk analizi tamamlandı. Rapor: " & raporDosya, 64
    If hataSayisi > 0 Then
        GosterMesaj "Uyarı", hataSayisi & " hata oluştu. Detaylar için log dosyasını kontrol edin.", 48
    End If
End With

' Belleği temizle
Set bd = Nothing
Set SEL = Nothing
Set o = Nothing
Set gridObj = Nothing
Set fso = Nothing
Set f = Nothing
Set yukseklikDict = Nothing
Set suAlanlari = Nothing

End Sub

‘ === Makro 3: Çoklu Proje Veri Birleştirme ve Senkronizasyon ===
‘ Açıklama: Birden fazla Netcad projesini birleştirir, verileri senkronize eder,
‘ çelişkileri tespit eder ve raporlar.
Sub CokluProjeBirlestirme()
On Error Resume Next
Dim bd, raporDosya, projeListesi, anaProje, i, j, o, yeniO, SEL, fso, f
Dim birlestirilenObjeler, celiskiSayisi, hataSayisi
birlestirilenObjeler = 0
celiskiSayisi = 0
hataSayisi = 0

With Netcad
    ' Diyalog penceresi oluştur
    Set bd = .NewBDialog("Çoklu Proje Veri Birleştirme")
    bd.PutPrompt "Birden fazla Netcad projesini birleştirin ve çelişkileri kontrol edin."
    bd.GetFileName "rapor", "Rapor Dosyası", "C:\Rapor\birlestirme_raporu.txt", "Text Dosyaları|*.txt", "txt"
    bd.GetFileName "anaProje", "Ana Proje Dosyası", "", "Netcad Projeleri|*.ncp", "ncp"
    bd.GetFileName "projeler", "Birleştirilecek Projeler", "", "Netcad Projeleri|*.ncp", "ncp", True
    bd.GetCheck "turkceDuzelt", "Türkçe Karakterleri Düzelt", 1
    If Not bd.ShowModal Then
        GosterMesaj "Bilgi", "İşlem iptal edildi.", 64
        Exit Sub
    End If

    ' Kullanıcı girişlerini al
    raporDosya = bd.ValueByName("rapor")
    anaProje = bd.ValueByName("anaProje")
    projeListesi = Split(bd.ValueByName("projeler"), "|")
    Dim turkceDuzelt
    turkceDuzelt = bd.ValueByName("turkceDuzelt")

    ' Hata kontrolü
    If anaProje = "" Or UBound(projeListesi) < 0 Then
        GosterMesaj "Hata", "Ana proje veya birleştirilecek projeler seçilmedi.", 16
        Exit Sub
    End If

    ' Ana projeyi aç
    .OpenProject anaProje

    ' Rapor dosyasını başlat
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(raporDosya, 2, True)
    f.WriteLine "Çoklu Proje Birleştirme ve Senkronizasyon Raporu"
    f.WriteLine "Tarih: " & FormatDateTime(Now, vbGeneralDate)
    f.WriteLine "Ana Proje: " & anaProje
    f.WriteLine "--------------------------------------"

    ' Mevcut objeleri indeksle
    Dim mevcutObjeler
    Set mevcutObjeler = CreateObject("Scripting.Dictionary")
    For i = 0 To .NumObject - 1
        Set o = .GetObject(i)
        If Not mevcutObjeler.Exists(o.pname) Then
            mevcutObjeler.Add o.pname, i
        End If
    Next

    ' Diğer projeleri birleştir
    Set SEL = .NewSelectionSet
    .SetParam BeginBlock, True
    For Each proje In projeListesi
        f.WriteLine "Birleştirilen Proje: " & proje
        For j = 0 To .GetNumObjectFromProject(proje) - 1
            Set yeniO = .GetObjectFromProject(proje, j)
            If turkceDuzelt = 1 Then
                Call TurkceKarakterDuzelt(yeniO)
            End If
            If mevcutObjeler.Exists(yeniO.pname) Then
                ' Çelişki kontrolü
                Set o = .GetObject(mevcutObjeler(yeniO.pname))
                If o.Tag = yeniO.Tag Then
                    If o.Tag = opline And Abs(o.area - yeniO.area) > 0.1 Then
                        celiskiSayisi = celiskiSayisi + 1
                        f.WriteLine "Çelişki: Obje " & yeniO.pname & " - Alan Farkı: " & Format(Abs(o.area - yeniO.area), "0.00") & " m²"
                        o.renk = Yellow
                        .PutObject mevcutObjeler(yeniO.pname), o
                        SEL.AddObject o
                    End If
                End If
            Else
                ' Yeni objeyi ekle
                birlestirilenObjeler = birlestirilenObjeler + 1
                .AddObject yeniO
                SEL.AddObject yeniO
                mevcutObjeler.Add yeniO.pname, .NumObject - 1
            End If
            If Err.Number <> 0 Then
                hataSayisi = hataSayisi + 1
                Call LogHata("Proje " & proje & ", Obje " & yeniO.pname & " işlenirken hata: " & Err.Description)
                f.WriteLine "Hata: Proje " & proje & ", Obje " & yeniO.pname & " - " & Err.Description
            End If
        Next
    Next
    .SetParam EndBlock, True

    ' Raporu tamamla
    f.WriteLine "--------------------------------------"
    f.WriteLine "Birleştirilen Obje Sayısı: " & birlestirilenObjeler
    f.WriteLine "Çelişki Sayısı: " & celiskiSayisi
    f.WriteLine "Hata Sayısı: " & hataSayisi
    f.Close

    ' Ekranı güncelle
    SEL.RedrawAndRewind
    GosterMesaj "Bilgi", "Proje birleştirme tamamlandı. Rapor: " & raporDosya, 64
    If hataSayisi > 0 Then
        GosterMesaj "Uyarı", hataSayisi & " hata oluştu. Detaylar için log dosyasını kontrol edin.", 48
    End If
End With

' Belleği temizle
Set bd = Nothing
Set SEL = Nothing
Set o = Nothing
Set yeniO = Nothing
Set fso = Nothing
Set f = Nothing
Set mevcutObjeler = Nothing

End Sub

‘ Ana çalıştırma prosedürü (menü)
Sub Main()
On Error Resume Next
Dim bd
With Netcad
Set bd = .NewBDialog(“Profesyonel Netcad Makroları – Menü”)
bd.PutPrompt “Lütfen bir işlem seçin:”
bd.GetRadio “islem”, “Yapılacak İşlem”, “Kamulaştırma Analizi|Hidrolojik Sel Risk Analizi|Çoklu Proje Birleştirme”, 0
If bd.ShowModal Then
Dim secim
secim = bd.ValueByName(“islem”)
If secim = 0 Then
Call KamulastirmaAnalizi
ElseIf secim = 1 Then
Call HidrolojikSelAnalizi
Else
Call CokluProjeBirlestirme
End If
Else
GosterMesaj “Bilgi”, “İşlem iptal edildi.”, 64
End If
If Err.Number <> 0 Then
Call LogHata(“Ana menüde hata: ” & Err.Description)
End If
End With
Set bd = Nothing
End Sub

1. GIS Sınıfı – OBJE.cls

  • Ne Demek?: cls, bir objenin GIS sınıfını (kategorisini) tanımlar. Bu, objenin hangi tür veri veya nesneye ait olduğunu belirtir; örneğin, “PARSEL”, “YOL”, “BINA” gibi sınıflar olabilir. Netcad’de sınıflar, projedeki objeleri organize etmek ve anlamlandırmak için kullanılır.
  • Kullanım Alanı: Harita verilerini sınıflandırmak, filtrelemek veya analiz yapmak için. Örneğin, sadece “PARSEL” sınıfındaki objeleri seçmek isteyebilirsin.
  • Makrolarda Kullanımı:
    • OBJE.cls ile objenin sınıfını okuyabilir veya değiştirebilirsin.
    • Örnek: If OBJE.cls = “PARSEL” Then OBJE.renk = Red (Parsel sınıfındaki objeleri kırmızı yapar).
  • Örnek Senaryo: Kadastro projesinde, parsellerin sınıfı “PARSEL”, yolların sınıfı “YOL” olabilir. Makroda SetFilter ile sadece belirli sınıfları hedefleyebilirsin.
  • Not: Sınıf isimleri genellikle proje şablonuna bağlıdır ve kullanıcı tarafından tanımlanabilir.

2. GIS Kodu – OBJE.objname

  • Ne Demek?: objname, objenin benzersiz bir kimlik kodu veya tanımlayıcısıdır. Netcad’de her objeye bir GIS kodu atanabilir, bu da objeyi diğerlerinden ayırmak için kullanılır. pname’den farklı olarak, daha teknik bir tanımlayıcıdır.
  • Kullanım Alanı: Objeleri veritabanında eşleştirmek, referans vermek veya dış sistemlerle entegre etmek için. Örneğin, bir GIS kodunu harici bir Excel tablosuyla eşleştirebilirsin.
  • Makrolarda Kullanımı:
    • OBJE.objname ile objenin GIS kodunu okuyabilir veya atayabilirsin.
    • Örnek: If OBJE.objname = “P123” Then OBJE.cls = “PARSEL” (GIS kodu “P123” olan objeyi parsel sınıfına atar).
  • Örnek Senaryo: Bir altyapı projesinde, boru hatlarının GIS kodları “BORU001”, “BORU002” gibi olabilir. Makroda bu kodlarla belirli objeleri bulabilirsin.
  • Not: objname genellikle otomatik atanır, ama kullanıcı tarafından da düzenlenebilir.

3. Renk – OBJE.renk

  • Ne Demek?: renk, objenin görsel rengini belirler. Netcad’de renkler, genellikle numerik kodlarla (örneğin, Red = 255, Blue = 16711680) veya sabit isimlerle tanımlanır. Yazı objeleri için metnin rengini, diğer objeler için çizgi veya dolgu rengini ifade eder.
  • Kullanım Alanı: Haritada objeleri görsel olarak ayırt etmek, analiz sonuçlarını vurgulamak (örneğin, riskli alanları kırmızı yapmak).
  • Makrolarda Kullanımı:
    • OBJE.renk ile objenin rengini ayarlayabilir veya okuyabilirsin.
    • Örnek: OBJE.renk = Yellow (Objeyi sarı yapar).
  • Örnek Senaryo: Sel riski analizinde yüksek riskli alanları kırmızı (Red), düşük riskli alanları yeşil (Green) yapabilirsin.
  • Not: Netcad’in renk paleti, RGB kodlarını destekler. Sabit renkler (Red, Blue, Green, vb.) kullanmak daha yaygındır.

4. Adı – OBJE.s

  • Ne Demek?: s, yazı objeleri (otext) için metin içeriğini temsil eder. Yani, bir yazı objesinin haritada görünen metni (örneğin, “Ada 123”, “Yol A”) budur. Diğer obje türlerinde (opline, opoint) bu özellik genellikle kullanılmaz.
  • Kullanım Alanı: Etiketleme, açıklama veya bilgi gösterme. Örneğin, parsel numaralarını veya yol isimlerini yazmak için.
  • Makrolarda Kullanımı:
    • OBJE.s ile metni okuyabilir veya değiştirebilirsin.
    • Örnek: OBJE.s = Replace(OBJE.s, “/”, “”) (Metindeki “/” karakterini siler).
  • Örnek Senaryo: Bir kadastro projesinde, parsel numaralarını içeren yazı objelerinin metinlerini düzenlemek (örneğin, “123/45” → “12345”).
  • Not: s, sadece otext objeleri için geçerlidir. Diğer objelerde pname kullanılır.

5. Açısı – OBJE.angle

  • Ne Demek?: angle, yazı objesinin veya diğer objelerin haritadaki dönüş açısını derece cinsinden belirtir. Yazı objeleri için metnin eğimini (rotasyonunu), diğer objeler için yönelimini ifade eder.
  • Kullanım Alanı: Yazıların veya objelerin yönünü ayarlamak, örneğin, bir yol boyunca yatay yazılar oluşturmak.
  • Makrolarda Kullanımı:
    • OBJE.angle ile açıyı okuyabilir veya ayarlayabilirsin (0-360 derece).
    • Örnek: OBJE.angle = 45 (Yazıyı 45 derece döndürür).
  • Örnek Senaryo: Bir haritada yol isimlerini yolların eğimine paralel yapmak için yazıların açısını yolun açısına eşitleyebilirsin.
  • Not: Açı, saat yönünün tersine hesaplanır. 0 derece yataydır.

6. Genişlik Çarpanı – OBJE.wsc

  • Ne Demek?: wsc (width scale), yazı objelerinde metnin genişlik çarpanını belirler. Bu, metnin karakterlerinin en-boy oranını ayarlar (örneğin, daha geniş veya dar yazı).
  • Kullanım Alanı: Yazıların görsel stilini özelleştirmek, okunabilirliği artırmak veya estetik düzenlemeler yapmak.
  • Makrolarda Kullanımı:
    • OBJE.wsc ile genişlik çarpanını ayarlayabilirsin (varsayılan genellikle 1.0).
    • Örnek: OBJE.wsc = 1.5 (Yazıyı %50 daha geniş yapar).
  • Örnek Senaryo: Önemli etiketleri (örneğin, bölge isimleri) daha geniş yaparak vurgulamak.
  • Not: Çok yüksek veya düşük değerler metni bozabilir, genellikle 0.5-2.0 aralığı tercih edilir.

7. Yazı Boyu – OBJE.sc

  • Ne Demek?: sc (scale), yazı objelerinde metnin boyutunu (yüksekliğini) belirler. Birim genellikle metre cinsindedir ve harita ölçeğine bağlı olarak görünür boyutu etkiler.
  • Kullanım Alanı: Yazıların boyutunu ayarlayarak okunabilirliği veya görsel hiyerarşiyi kontrol etmek.
  • Makrolarda Kullanımı:
    • OBJE.sc ile yazı boyutunu ayarlayabilirsin.
    • Örnek: OBJE.sc = 2.0 (Yazı boyutunu 2 metre yapar).
  • Örnek Senaryo: Ana yol isimlerini büyük (sc = 3.0), ara sokak isimlerini küçük (sc = 1.0) yapmak.
  • Not: Yazı boyu, harita ölçeğiyle orantılıdır. Çok büyük değerler haritayı karmaşık hale getirebilir.

8. Dayanma – OBJE.just

  • Ne Demek?: just (justification), yazı objelerinin hizalama (dayanma) türünü belirtir. Metnin sol, orta veya sağ hizalı olup olmadığını tanımlar. Netcad’de genellikle:
    • 0: Sol hizalı
    • 1: Orta hizalı
    • 2: Sağ hizalı
  • Kullanım Alanı: Yazıların görsel yerleşimini düzenlemek, örneğin, etiketlerin objelere göre hizasını ayarlamak.
  • Makrolarda Kullanımı:
    • OBJE.just ile hizalamayı ayarlayabilirsin.
    • Örnek: OBJE.just = 1 (Yazıyı ortalar).
  • Örnek Senaryo: Parsel numaralarını parselin merkezine hizalamak için just = 1 kullanabilirsin.
  • Not: Hizalama, yazı objesinin referans noktasına (p1) göre hesaplanır.

9. Özellikler – OBJE.flags

  • Ne Demek?: flags, objenin ek özelliklerini veya durumlarını tanımlayan bir bit bayrağıdır. Bu, objenin özel durumlarını (örneğin, kilitli mi, görünmez mi) veya ek meta verilerini ifade eder. Netcad’de flags genellikle birden fazla özelliği bir arada tutar (bitwise).
  • Kullanım Alanı: Objelerin özel durumlarını kontrol etmek veya ayarlamak, örneğin, bir objeyi kilitli yapmak.
  • Makrolarda Kullanımı:
    • OBJE.flags ile bayrakları okuyabilir veya değiştirebilirsin.
    • Örnek: OBJE.flags = OBJE.flags Or 1 (Belirli bir bayrağı aktif eder, örneğin, kilitleme).
  • Örnek Senaryo: Analiz sonrası değiştirilmemesi gereken objeleri kilitli yapmak için flags kullanabilirsin.
  • Not: flags değerleri Netcad’in dokümantasyonuna bağlıdır ve her bit belirli bir özelliği temsil eder. Yaygın bayraklar kilitli, gizli veya seçili durumları içerir.

Flags Özelliği: Düzeltilmiş ve Detaylı Açıklama

Ne Demek?
flags, Netcad’de yazı objeleri (otext) için metnin stil özelliklerini (italik, altı çizili, arka fon) tanımlayan sayısal bir bit bayrağıdır. Her stil, bir bit ile temsil edilir ve bu bitlerin kombinasyonları farklı flags değerlerini oluşturur. Verdiğin bilgiye göre, flags şu şekilde çalışır:

  • Bit Tanımları:
    • 0: Normal (hiçbir stil yok).
    • 1: İtalik (bit 0 = 1).
    • 2: Altı çizili (bit 1 = 1).
    • 4: Arka fon (çerçeve/arka plan, bit 2 = 1).
  • Kombinasyonlar:
    • flags = 0: Normal (italik yok, altı çizili yok, arka fon yok).
    • flags = 1: Sadece italik.
    • flags = 2: Sadece altı çizili.
    • flags = 3: İtalik + altı çizili (1 + 2).
    • flags = 4: Sadece arka fon.
    • flags = 5: Arka fon + italik (4 + 1).
    • flags = 6: Arka fon + altı çizili (4 + 2).
    • flags = 7: Arka fon + italik + altı çizili (4 + 1 + 2).


Genel Notlar ve Makro Bağlamı

  • Yazı Objelerine Özel: s, angle, wsc, sc, just gibi özellikler genellikle yazı objeleri (otext) için geçerlidir. Diğer objelerde (opline, opoint) bu özellikler ya kullanılmaz ya da farklı anlamlar taşır.
  • Makro Yazarken Dikkat:
    • Her özelliği değiştirmeden önce objenin türünü kontrol et (If OBJE.Tag = otext Then).
    • SetFilter ile sadece belirli obje türlerini veya sınıfları hedefleyebilirsin.
    • Toplu işlemler için BeginBlock/EndBlock kullanarak performansı artır.
  • Pratik Örnek: Bir makroda, tüm “PARSEL” sınıfındaki yazı objelerinin boyutunu büyütmek (sc = 2.0), italik yapmak (fontstyle = 1) ve ortalamak (just = 1) için şu adımları izlersin:
    1. SetFilter ile otext ve “PARSEL” sınıfını seç.
    2. Objeleri döngüyle tara.
    3. Her yazı objesi için sc, fontstyle ve just özelliklerini güncelle.
    4. PutObject ile değişiklikleri kaydet.
⚠️ Dikkat! Netcad Makrosu Kullanımı Hakkında Bilgilendirme

Makroyu kullanmadan önce lütfen aşağıdaki uyarıları dikkatlice okuyunuz:

• Obje sayısı yüksekse işlem uzun sürebilir ve Netcad yazılımı yanıt veremez hale gelebilir.
• Bu nedenle tüm projelerinizi önceden yedeklemeniz önemle tavsiye edilir.
• Makro çalıştıktan sonra işlemi geri almak mümkün olmayabilir.
Makrolar periyodik olarak güncellenmektedir; sayfamızı takip ederek güncel sürümleri kullanmaya özen gösteriniz.

💾 Makrolar yalnızca Netcad yazılımında çalışır ve .nps formatında sunulur. Bu format düzenlenemez; özelleştirme talepleriniz için bizimle iletişime geçebilirsiniz.

✉️ Görüş, öneri ve hata bildirimleri için: sabangul67@gmail.com

⚙️ Bu makrolar Kadastro, 2B, Orman, Kamulaştırma, Değerleme, CBS, Halihazır Harita, İmar Planı, Etüt-Proje gibi birçok alanda kullanılabilir.

🔐 Makrolar e-posta eki veya sosyal medya üzerinden paylaşılmaz. Talepte bulunmanız durumunda yalnızca e-posta adresinize bilgilendirme yapılır. Makrolar yalnızca internet sitemiz üzerinden paylaşılır.

📥 Makroları indirerek kullanım sorumluluğunu kabul etmiş sayılırsınız. Oluşabilecek tüm sorunlar kullanıcı sorumluluğundadır.