SolidWorks Makro Nedir? Kaydetmekten Yazmaya Giriş
Makro kaydediciyle üretilen kod neden doğrudan kullanılamaz? Kaydetmeden sağlam makro yazmaya, hata ayıklamadan butona atamaya uygulamalı bir giriş.
Bu Yazıda
SolidWorks makrosu, SolidWorks içinde çalışan ve elle yaptığınız bir dizi adımı tek komuta indiren küçük bir programdır. Genellikle VBA ile yazılır, .swp uzantısıyla saklanır ve çalıştırıldığında işini yapıp sonlanır. Makro yazarken SolidWorks API'sini kullanırsınız — ikisi rakip değil, biri diğerinin üzerinde durur.
Bu yazının asıl konusu tanım değil, uygulama. Çünkü makroya başlayan hemen herkes aynı yerde takılıyor: makro kaydedici (Macro Recorder) ile bir işlemi kaydediyor, üretilen kodu çalıştırıyor ve kod ya hiçbir şey yapmıyor ya da yanlış şeyi yapıyor. Bunun nedeni kaydedicinin bozuk olması değil — kaydedilen kodun tasarımı gereği o anki ekran durumuna bağımlı olması. Aşağıda önce nasıl kaydedeceğinizi, sonra o bağımlılığı nasıl söküp atacağınızı anlatıyorum.
Makronun işe yaradığı yer bellidir: kurala bağlanabilen ve tekrarlanan işler. Teknik resme standart görünüşleri yerleştirmek, antet alanlarını doldurmak, bir klasördeki tüm parçalardan STEP çıktısı almak, özel özellikleri (Custom Properties) toplu doldurmak, dosya adını revizyon kuralına göre üretmek.
İşin tekrar sayısı burada belirleyicidir. Ayda bir yapılan bir işi makroya dökmek çoğu zaman elle yapmaktan pahalıdır; günde on kez yapılan bir işi kabaca otomatikleştirmek bile kazandırır. Hangi işin bu eşiği geçtiğini tahmin etmek yerine ölçmek gerekir — yöntemini otomasyon projesine nasıl başlanır yazısında adım adım anlattım.
Makronun teknik olarak nerede durduğunu, API ve eklenti (add-in) mimarisiyle ilişkisini merak ediyorsanız makro, API ve add-in arasındaki farkı ayrı bir yazıda ele aldım. Burada odak tamamen pratikte: nasıl kaydedilir, nasıl düzeltilir, nasıl çalıştırılır.
Kaydedici, API'yi öğrenmenin en hızlı yoludur. Bir işlemi elle yaparsınız, SolidWorks o işlemin karşılığı olan API çağrılarını koda döker. Hangi arayüzün hangi metodunu çağırmanız gerektiğini dokümantasyonda aramak yerine doğrudan görürsünüz.
Akış şöyle işler:
- Kaydı başlatın. Kaydet, duraklat ve durdur komutları
Araçlar > Makro(Tools > Macro) menüsü altındadır; ayrıca ayrı bir Makro araç çubuğu olarak da açılabilir. Menü yerleşimi sürümden sürüme değişebildiği için, bulamazsanız komut arama kutusundan "makro" yazmak en hızlı yol. - İşlemi normal hızınızda yapın. Kaydedici fare hareketini değil, SolidWorks'ün gerçekleştirdiği komutları kaydeder. Yavaş yapmanın veya "temiz" yapmanın bir faydası yok.
- Kaydı durdurun. Durdurduğunuzda SolidWorks makroyu kaydetmenizi ister. Anlamlı bir ad verin ve nerede tuttuğunuzu unutmayın.
- Kodu açın.
Araçlar > Makro > Düzenle(Edit) makroyu VBA düzenleyicisinde açar.
Küçük bir alışkanlık: kaydı gerçek işinizin ortasında değil, temiz bir belgede ve tek bir işlem için alın. Beş işlemi birlikte kaydederseniz üretilen kodun hangi satırının hangi işleme ait olduğunu ayıklamakla uğraşırsınız.
Neyin kaydedildiği, neyin kaydedilmediği
Kaydedici her şeyi yakalamaz. Yakaladığı şey, SolidWorks'ün belge üzerinde gerçekleştirdiği komutlardır. Yakalayamadıkları arasında şunlar var:
- Görünüm işlemleri (döndürme, yakınlaştırma) — çoğu zaman kayda girmez, girse de işlevsel bir karşılığı yoktur
- Diyalog kutularında yaptığınız bazı ayarlar — sonuçları koda yansır, ara adımlar yansımaz
- Sürümünüze özgü bazı komutlar — her komutun kaydedici karşılığı bulunmayabilir
Bu yüzden kaydedilen kod, yaptığınız işin eksiksiz bir kopyası değil, iskeletidir. Onu bir tarif değil, bir ipucu listesi olarak okumak gerekir.
Bu, Türkçe kaynaklarda en çok atlanan konu ve makroya başlayanların en çok vakit kaybettiği yer. Kaydedilen kod çoğu zaman çalışır ama güvenilmez. Üç ayrı bağımlılık yüzünden:
1. Seçime bağımlılık
Kaydedici, "şu yüzeyi seç" işlemini genellikle şuna benzer bir satıra çevirir:
Kaydedilen kodda bunu şöyle görürsünüz: "belgedeki şu adı taşıyan özelliği seç" diyen tek satırlık bir seçim komutu. O ad — Boss-Extrude1 gibi — kayıt yaptığınız modele aittir.
Bu satır, o modeldeki o ada sahip özelliği arar. Başka bir modelde o ad yoksa seçim başarısız olur — ve SelectByID2 hata fırlatmaz, sadece False döner. Kod çalışmaya devam eder, bir sonraki satır "seçili olan şey" üzerinde işlem yapmaya kalkar ve ya patlar ya da yanlış nesneyi işler.
Bazı durumlarda kaydedici, ada değil koordinata dayalı seçim üretir. O koordinat, kaydı aldığınız modeldeki noktadır. Model değişince o noktada artık başka bir şey vardır.
2. Aktif belgeye bağımlılık
Kaydedilen kodun başında hemen her zaman şu vardır:
Kaydedilen kodun ilk satırlarından biri hep aynıdır: "aktif belgeyi al". Yani o an ön planda hangi dosya varsa onunla çalışılacaktır.
ActiveDoc, o an ön planda olan belgeyi verir. Hiç belge açık değilse Nothing döner. Makro bunu kontrol etmezse ilk kullanımda "Object variable not set" hatasıyla durur. Daha kötüsü: yanlış türde bir belge açıksa hata bile vermeyebilir. Parça için yazılmış bir makro teknik resim açıkken çalıştırıldığında sessizce hiçbir şey yapmaz — ve kullanıcı makronun çalıştığını sanır.
3. Ekran ve oturum durumuna bağımlılık
Kaydedilen kod, kaydı aldığınız andaki bağlamı varsayar: hangi konfigürasyon aktifti, hangi sayfa açıktı, hangi nesneler zaten seçiliydi, hangi belge birim sistemi kullanılıyordu. Bunların hiçbiri kodda yazmaz — kod bunları "böyleydi" diye kabul eder.
Sağlamlaştırma dört hamleden ibaret: aktif belgeyi kontrollü almak, tür kontrolü yapmak, seçime bağımlılığı kaldırmak, sonucu kontrol etmek.
Aktif belgeyi al ve türünü doğrula
Her makro bu kontrolle başlamalı. Bu kısa blok, sahada karşılaşacağınız hataların büyük kısmını baştan keser:
Her makronun ilk işi iki soruyu sormak olmalı: belge var mı ve doğru türde mi? Yani önce aktif belgeyi alırsınız, bu boş dönerse kullanıcıya "önce bir parça belgesi açın" diyip çıkarsınız. Sonra belgenin türünü kontrol edersiniz; parça bekliyorsanız ve montaj açıksa "bu makro yalnızca parça dosyalarında çalışır" deyip yine çıkarsınız.
Bu kısacık blok, sahada karşılaşacağınız hataların büyük kısmını daha ortaya çıkmadan keser. Ve en önemlisi, sessiz başarısızlığı gürültülü hataya çevirir: kullanıcı artık makronun neden bir şey yapmadığını biliyor.
Seçime bağımlılığı kaldır
Kaydedilen SelectByID2 satırını, nesneyi doğrudan modelden alan bir çağrıyla değiştirin. Seçim kullanıcı arayüzünün bir kavramıdır; kodun ona ihtiyacı yoktur:
Sağlam hâli şöyle çalışır: seçim komutunu tamamen kaldırırsınız ve nesneyi doğrudan modelden istersiniz — "bana şu adı taşıyan özelliği ver". Dönen şey boşsa, yani o özellik bu modelde yoksa, makro durur ve kullanıcıya söyler: "beklenen özellik bu modelde yok".
Fark ince ama önemli: birincisinde makro yanlış nesne üzerinde çalışmaya devam ediyordu, ikincisinde durup haber veriyor.
Seçimi gerçekten kullanmanız gereken durumlar da vardır — örneğin makro, kullanıcının o an seçtiği nesne üzerinde çalışacaksa. O zaman kural şu olur: seçimi varsayma, oku ve doğrula. Kaç nesne seçili, doğru türde mi, değilse kullanıcıya söyle.
Sonucu kontrol et
API metotlarının büyük kısmı bir dönüş değeri verir ve bu değer çoğu zaman göz ardı edilir. Kaydedici bile boolstatus değişkenine atar ama hiç kontrol etmez:
Somut bir örnek: bir özel özelliği (Custom Property) yazan çağrı bir sonuç kodu döndürür. Kaydedici bu kodu bir değişkene atar ama hiç bakmaz. Siz bakın — dönen değer beklediğiniz gibi değilse kullanıcıya "özellik yazılamadı" deyin. Dönen kodun tam anlamı sürüme göre değişebildiği için, kullandığınız sürümün dokümantasyonundan doğrulamakta fayda var.
Bir uyarı: SolidWorks API'si uzunlukları sistem birimiyle işler — belgeniz milimetre gösterse de koda yazdığınız sayı metre olarak yorumlanır. Kaydedilen kodda göreceğiniz 0.05 gibi değerler bu yüzdendir. Elle sayı yazarken bu dönüşümü unutmak, makronun en sık ve en sinsi hatasıdır.
Çalıştırma ve düzenleme komutları da Araçlar > Makro menüsünde durur: Çalıştır (Run) makroyu doğrudan yürütür, Düzenle (Edit) VBA düzenleyicisinde açar. Düzenleyici içinden de çalıştırabilirsiniz — hata ayıklarken zaten oradan çalıştırırsınız.
Bir makro günlük kullanıma girdiğinde menüden çağırmak yorucu olur. SolidWorks, makroları klavye kısayoluna veya araç çubuğu butonuna bağlamanıza izin verir; bu ayar özelleştirme (Customize) ekranındaki makro sekmesinden yapılır. Butona bir simge ve açıklama da verebilirsiniz.
Buradaki pratik nokta şu: butona bağlanan makronun dosya yolu sabittir. Makroyu başka bir klasöre taşırsanız buton çalışmaz. Ekipçe kullanılacak makroları herkesin erişebildiği ortak bir ağ klasöründe tutmak, sonradan çıkacak "bende çalışmıyor" sorularının çoğunu önler.
VBA makroları .swp uzantısıyla saklanır. Bu dosyanın önemli bir özelliği var: hem çalıştırılabilir program hem de kaynak kodun kendisidir. Ayrı bir derleme adımı yoktur; dosyayı verdiğiniz kişi hem makroyu çalıştırabilir hem de içindeki kodu açıp okuyabilir, değiştirebilir.
Bunun pratik sonuçları:
- Paylaşım kolaydır. Tek dosya kopyalarsınız, karşı taraf çalıştırır. Kurulum yok.
- Kod açıktır. Makroyu paylaşmak, kodunuzu paylaşmaktır. Kısıtlamak istediğiniz bir mantık varsa makro doğru kap değildir.
- Sürüm takibi zordur. İkili bir dosya olduğu için Git gibi araçlarda satır bazlı fark göremezsiniz. Kim ne değiştirdi sorusunun cevabı yoktur.
- Kimin hangi kopyayı kullandığı bilinmez. On kişiye dağıttığınız makronun üçüncü revizyonunda kimin hangi sürümde olduğunu takip edemezsiniz.
Son iki madde, makronun sınırının nerede başladığını gösterir. O eşiğe geldiğinizde tartışma "makro mu başka bir şey mi" değil, mimari bir karara dönüşür — bunu VBA makrodan eklenti mimarisine geçiş yazısında ayrıntılandırdım.
SolidWorks ayrıca .NET tabanlı makroları da destekler. Bu, makro ile eklenti arasında bir ara basamaktır ve ayrı bir konudur.
VBA düzenleyicisi tam bir hata ayıklama (debug) ortamı sunar ve bunu kullanmamak, makro yazarken yapılabilecek en büyük zaman kaybıdır.
Kesme noktası (breakpoint). Bir satırın soluna tıklayarak makroyu o satırda durdurursunuz. Durduğunda değişkenlerin üzerine geldiğinizde değerlerini görürsünüz.
Adım adım çalıştırma (step). Makroyu satır satır ilerletirsiniz. Hangi If bloğuna girdiğini, döngünün kaç kez döndüğünü doğrudan görürsünüz. Kaydedilen bir kodu anlamaya çalışırken en verimli yöntem budur.
Immediate penceresi. Çalışma sırasında bir ifadenin değerini sorabilir veya koddan Debug.Print ile bu pencereye yazdırabilirsiniz. MsgBox ile akışı durdurmadan izlemenin yolu budur — özellikle döngü içinde.
En sık karşılaşacağınız hatalar ve nedenleri:
| Belirti | Muhtemel neden |
|---|---|
| "Object variable or With block variable not set" | ActiveDoc Nothing döndü ya da bir nesne çağrısı boş sonuç verdi |
| Makro hiç hata vermiyor ama hiçbir şey de yapmıyor | Yanlış belge türü açık, ya da seçim başarısız olup kod sessizce devam etti |
| İlk çalıştırmada doğru, ikincide yanlış sonuç | Önceki seçim temizlenmedi; makro artık başka bir nesne üzerinde işlem yapıyor |
| Ölçüler bin kat sapıyor | Birim karışıklığı — API metre bekliyor, koda milimetre yazılmış |
| Başka bilgisayarda çalışmıyor | Sabit dosya yolu veya o makinede bulunmayan bir referans |
Bu tablodaki ikinci satır, en pahalı olanıdır. Çıktı üretildi sanılır, üretilmez; hata üretimde fark edilir.
1. Adlandırmayı baştan disipline edin. Makro1, Makro1_son, Makro1_son_v2 üç hafta sonra işe yaramaz. Dosya adı ne yaptığını söylesin: TeknikResim_PDF_Disa_Aktar. Kod içindeki değişkenler için de aynısı geçerli; kaydedicinin ürettiği Part, boolstatus gibi adları ilk iş olarak değiştirin.
2. Her adımda hata kontrolü yapın. Belge var mı, tür doğru mu, nesne bulundu mu, metot başarılı döndü mü. Kural basit: sessiz geçme. Bir kontrolü atlamanın bedeli, o kontrolü yazmanın on katıdır.
3. Geri alma (undo) davranışını düşünün. Makro modelde çok sayıda değişiklik yapıyorsa, kullanıcı bunları tek Ctrl+Z ile geri alamayabilir. SolidWorks API'si birden fazla işlemi tek geri alma adımında toplamaya izin verir; hangi metotların bu işi yaptığı sürümünüze göre değişebilir, dokümantasyondan doğrulayın. Yapamıyorsanız en azından kullanıcıya baştan söyleyin.
4. Kullanıcıya geri bildirim verin. Makro bittiğinde ne yaptığını söylesin: kaç dosya işlendi, kaç tanesi atlandı, çıktılar nereye yazıldı. Geri bildirimsiz makro, her çalıştırıldığında elle kontrol edilir — yani kazandırdığı süreyi geri alır. Bu, otomasyon kazancının nerede eridiğini anlatan dört adımlı ölçüm çerçevesinin doğrulama kalemine karşılık gelir.
5. Dosya yolu varsayımı yapmayın. C:\Users\... ile başlayan sabit bir yol, sizin makinenizde çalışır. Yolu belgeden türetin (modelin bulunduğu klasör), kullanıcıya sorun ya da en azından klasörün var olup olmadığını yazmadan önce kontrol edin.
SolidWorks makro yazmak için programlama bilmek gerekir mi? Başlamak için gerekmez; kaydedici çalışan bir kod üretir. Ama o kodu güvenilir hâle getirmek için temel VBA bilgisi — değişken, koşul, döngü, hata kontrolü — gerekir. Öğrenmenin en hızlı yolu, kaydedilen kodu satır satır adımlayarak okumaktır.
Kaydedilen makro neden başka bir modelde çalışmıyor? Neredeyse her zaman seçime bağımlılık yüzünden. Kaydedici, nesneleri ada veya koordinata göre seçen kod üretir; o ad veya koordinat başka modelde farklıdır. Çözüm, seçim satırlarını nesneyi doğrudan modelden alan çağrılarla değiştirmektir.
Makro dosyası hangi uzantıya sahiptir? VBA makroları .swp uzantısını kullanır. Bu dosya hem çalıştırılabilir hem de kaynak kodun kendisidir; ayrı bir derleme adımı yoktur.
Makroyu araç çubuğuna nasıl eklerim? Özelleştirme (Customize) ekranındaki makro sekmesinden makro dosyasını seçip bir buton ve simge tanımlarsınız; aynı yerden klavye kısayolu da atanabilir. Ekranın tam yeri sürümünüze göre değişebilir.
Makro ile API farklı şeyler mi? Hayır, rakip değiller. Makro yazdığınızda zaten API'yi çağırırsınız; API erişim katmanı, makro ise o katmanı kullanan biçimlerden biridir. Ayrımı makro, API ve add-in rehberinde ayrıntılı anlattım.
Makro çalışıyor ama sonuç yanlış. Nereden başlamalıyım? VBA düzenleyicisinde ilk şüphelendiğiniz satıra kesme noktası koyup adım adım ilerleyin. Değişkenlerin gerçekten beklediğiniz değeri taşıyıp taşımadığını Immediate penceresinden doğrulayın. Yanlış sonuçların çoğu, başarısız olmuş ama hata vermemiş bir seçim veya birim dönüşümünden çıkar.
Makro öğrenmenin sırası şu: kaydet, oku, sağlamlaştır.
Kaydedici size API'nin hangi metodunu çağıracağınızı gösterir — bu, dokümantasyonda aramaktan çok daha hızlıdır. Ama ürettiği kod, o anki seçime, açık belgeye ve ekran durumuna bağımlıdır. Kullanılabilir bir makro, o bağımlılıkları tek tek sökmekle ortaya çıkar: aktif belgeyi kontrollü al, türü doğrula, seçimi varsayma, her dönüş değerini kontrol et, kullanıcıya ne yaptığını söyle.
Bu beş alışkanlığı baştan kurarsanız üçüncü makronuz birinciden çok daha hızlı yazılır — çünkü artık her seferinde aynı iskeletle başlıyor olursunuz. Makro seviyesinden başlayıp süreçle birlikte büyüyen bir otomasyonun somut karşılığını SolidWorks CAD otomasyonu vaka çalışmasında görebilirsiniz.