1372826956:AAFe2Py65GSQkfGiRnXuOQ-eD9yXcwMv988

AutoLISP Dersleri #4 – Programın Biçimi “Format”

sekil-01

AutoLISP programı birçok şekilde yazılabilir; fakat tüm programlarda ortak olan belirli yapısal noktalar vardır. Bu makalemde sizlere geçerli uygulamanızda programınızı en iyi şekilde nasıl yapılandıracağınızı anlatacağım.

AutoLISP’te programlama ile diğer programlama dilleri arasındaki ana farklardan bir tanesi, AutoLISP’in yorumlanabilen bir dil olmasıdır. Bu AutoLISP’in her seferinde kodun bir satırını alıp o satırı değerlendireceği anlamına gelir. Sizin için anlamlı olması için, AutoLISP’te tam bir program yazmak zorunluluğunuz yoktur.

AutoLISP bir programın alabileceği üç farklı forma sahiptir.

  • İfade: kodun değerlendirilen ve bir değer döndüren satırıdır.
  • Fonksiyon: bir ifade içinde gerçek iş yapan kısımdır.
  • Komut Fonksiyonu: AutoCAD’in komut satırından çağrılabilen fonksiyondur. Bir AutoLISP programı yazmayı düşündüğümüz zaman, düşünmemiz gereken ilk şeylerden bir tanesidir.

AutoLISP içerisinde yazacağınız her kod satırı bir liste olacaktır. Tüm listelerde ortak olan tek şey parantezler arasına ( (…….) ) yazılmalarıdır. Bu AutoLISP’te program yazmanın en önemli noktasıdır. Her şeyi parantezlerin arasına koymak zorundasınız ve her bir aç parantez (() için muhakkak bir kapat parantez ()) olmak zorundadır. Yani başka bir deyişle açılan her parantez kapatılmak zorundadır.

İfade


İfade listedeki birinci öğe olarak bir fonksiyon ile başlayan bir listedir ve listedeki diğer geri kalan öğeler argümanlar olarak bu fonksiyon tarafından kullanılırlar. İfadede kullanılan fonksiyon AutoLISP tarafından önceden tanımlanmış olabileceği gibi, kendinizin tanımladığı bir fonksiyon da olabilir. Listenin geri kalanı doğru sayıda argümanı fonksiyona aktarmak zorundadır; aksi durumda fonksiyon çalışmayacaktır.

Örnek:

(/ 50 25.4)

Yukarıdaki örnek kod 50 inçi standart metrik (mm) birime çevirir. Bu kod satırı komut satırından girilebileceği gibi daha büyük bir programın bir parçası olarak ta kullanılabilir.

Şayet yukarıdaki örnek kod satırında / fonksiyonuna argüman olarak sadece tek bir değer göndermiş olsaydık, kod hata vereceği için doğru sonucu geri döndüremezdi. Aynı kural daha sonra yazacağınız tüm fonksiyonlar için de geçerli olacak olup; fonksiyona doğru sayıda argüman göndermek zorundasınız.

Fonksiyon


Fonksiyon yapılacak işleri bir form içerisinde toplayan bir veya daha fazla sayıda ifadedir. Fonksiyon kullanılmadan önce tanımlanmak zorundadır. AutoLISP’te fonksiyon DEFUN bildirisi kullanılarak tanımlanır.

Örnek:

(defun m ( / )(/ 50 25.4))

Yukarıdaki örnek fonksiyonların tanımlanması için yazım biçimini “format” göstermektedir. Liste işi yapacak fonksiyon olan DEFUN ifadesi ile bağlamaktadır. DEFUN fonksiyonu üç veya daha fazla sayıda argümana ihtiyaç duyar. Birinci argüman tanımlayacağınız fonksiyon için bir isimdir. Yukarıdaki örneğimizde bu isim “m” idi. İkinci argüman parametre listesi olup; örneğimizde herhangi bir parametre yoktu. Parametre listesindeki bölü (/) işretine dikkat etmelisiniz. Bu karakter argümanlar ile fonksiyonu ayırmak için kullanılır. Bölü (/) işaretinin sol tarafında fonksiyon ismi sağ tarafında ise, yerel değişkenler yer alır. Üçüncü ve sırlı tüm argümanlar fonksiyon çalıştığı zaman, fonksiyon tarafından işleme alınacak ifadelerdir. Yukarıdaki örnekte fonksiyon her zaman 50 sayısının 25.4 sayısına bölüm sonucunu geri döndürecektir.

Fonksiyon (m) yazılarak çağrılabilir.

Komut Fonksiyonu


Komut fonksiyonu için fonksiyon tanımı sadece bir istisna dışında normal bir fonksiyon tanımı ile aynı forma sahiptir. Komut fonksiyonu tanımlanırken, komut ismi argümanının ön tarafına “c:” karakterleri konulur.

Örnek:

(defun c:m ( / )(/ 50 25.4))

Bu tip fonksiyonları çağıracağınız zaman, fonksiyon ismini fonksiyon tanımı içerisinde yazıldığı şekli ile çağırmak zorundasınız.

Örnek:

(c:m)

Komut fonksiyonu lisp işlemcisi içerisinden çağırılacağı zaman, komut fonksiyonu diğer fonksiyonlar gibi düşünülmelidir. Komut fonksiyonunun asıl gücü komut satırından çağırıldığı zaman, ortaya çıkmaktadır. Tüm fonksiyonlar komut satırından çağırılabilirler; fakat komut fonksiyonu komut satırından çağırılacağı zaman, parantezlere gerek yoktur.

Örnek:

  • Normal bir fonksiyonun komut satırından çağırılışı:

Command: (m)

  • Komut fonksiyonunun komut satırından çağırılışı:

Command: m

Sizin de gördüğünüz gibi, kullanıcı için komut fonksiyonu ile çalışmak normal fonksiyonlarla çalışmaktan daha kolaydır. İlerde programlarımızı oluşturmak için, komut fonksiyonlarını kullanacağız.

AutoLISP Programları


Şimdi buraya kadar tüm anlattıklarımızı bir araya getirelim ve gerçek bir programın nasıl göründüğünü inceleyelim. Yazdığınız her program temel olarak aynı görünümde olmalıdır. Tüm programlarınız belirli ortak bileşenler içereceklerdir.

Yapmamız gereken ilk iş programımızın başlık açıklamasını yaratmaktır; böylece programımızı daha sonra inceleyecek olanlar programımızın ne üzerine çalıştığını anlayabilirler ve daha da önemlisi, programımızda değişiklikler (revizyonlar) yapacağımız zaman, geri döndüğümüzde ne üzerinde çalıştığımızı kolayca anlayabiliriz. İhtiyacımız olan sonraki şey, program tanımıdır.

Örnek:

;; Başlık: Program

;; Amaç: Bir şeyler yapmak için program

;; Yazan: S.T.

;; Tarih: 6-11-2016(defun c:prog ( / )(yapılacak_iş))

Yukarıdaki örnek programda dikkatinizi çeken ilk şey, bir komut fonksiyonu tanımlamış olduğum olmalıdır. Lisp’in dosya ismi tanımlanan komut ismi ile aynı olmalıdır. Yani yukarıdaki örneğimiz için dosya ismi PROG.LSP olmalıdır. Dikkatinizi çeken sonraki şey, parametre listesi olmalıdır. Bu örneğimizde, bu kısmı (yapılacak_iş) olarak şimdilik boş bıraktım.

Daha sonra kodda ileride tanımlayacağımız yapılacak iş kısmını görürsünüz.

Daha sonra son olarak kodun başlangıcında açtığımız parantezi kapatarak programı kapatıyoruz.

İlave olarak düşünmemiz gereken bir şey de bir şekilde bir hata tespit yordamı eklemektir. Böylece programımızda ön göremediğimiz bir şeyler olursa, tüm program kullanıcının ekranında yanıp sönmeyecek ve böylelikle kullanıcının kafası karışmayacaktır. Hata tespit yordamı eklendikten sonra programımız aşağıdaki gibi görünecektir:

(defun c:prog ( / )

(yapılacak_iş)

(defun *ERROR* (ErrStr)

(print ErrStr)

)

)

Artık oldukça basit olsa da bir hata kontrol yordamına sahibiz. Oldukça basit olsa bile şimdilik işimizi görecektir. Bu yordam bir hata meydana geldiği zaman, AutoLISP ‘den gönderilen hata dizgesini yakalayacak ve bu hata dizgesini komut satırına yazdıracaktır.

Yukarıda görünen program listesi komut satırında kullanılan basit bir program yapmak için, yeterlidir. Programlar karmaşıklaştıkça, işlemleri sıralı tutmak için, küçük bir ilave iş yapmanın gerekli olduğunu anlayacaksınız. Örneğin,  şayet programımıza bazı parametreler göndermek ve bu parametreleri esas alarak bazı mantık işlemleri yapmak istersek, program daha karmaşık hale gelecektir. Bizim işimiz program içerisinde neler olduğunu anlayamayacak hale gelmemesi için, kodumuzu olabildiğince basit tutmaktır.

(defun c:prog ( Param1 Param2 / )

(if (= Param1 Param2)

(progn

(bu_işi_yap)

(şu_işi_yap))

(progn

(diğer_bu_işi_yap)

(diğer_şu_işi_yap)))

(defun *ERROR* (ErrStr)(print ErrStr)

)

)

Sizin de yukarıdaki kodda gördüğünüz üzere, birbirleri ile karşılaştıracağım iki adet parametreye (Param1 ve Param2) sahibim. Şayet bu karşılaştırma işleminin sonucu benim şartlarımı sağlıyorsa, birçok işlem yaptıracağım. Ya da başka bir değişle işlemleri yapıp yapmayacağıma bu karşılaştırma işleminin sonucuna göre karar vereceğiz.

Bundan sonra başlayacağımız şey biraz daha zor olup; şayet kodumuzun içerisindeki fonksiyonlar çalışmazsa, neler olup bittiğini anlamamızda bize çok yardımcı olacaktır. Yapacağımız ilk şey, bir ana fonksiyon yaratmak olacak; böylece tüm mantıksal işlemleri aynı kısımda toplamış olacağız. Ana fonksiyonumuzdan isteyeceğimiz şey programımızın sadece mantıksal işlemler yapan kısmını görmek olacak; programımızın yapmasını istediğimiz işlemleri diğer fonksiyonlara bırakacağız.

(defun c:prog ( Param1 Param2 /ana_program parametreleri_kontrol_et yapılacak_iş diğer_işi_yap *error* )

(defun ana_program ( / )

(if (parametreleri_kontrol_et Param1 Param2)

(yapılacak_iş)

(diğer_işi_yap)))

(defun parametreleri_kontrol_et ( Item1 Item2 / )

(= Item1 Item2))(defun yapılacak_iş ( / )

(bu_işi_yap)(şu_işi_yap))

(defun diğer_işi_yap ( / )

(diğer_bu_işi_yap)(diğer_şu_işi_yap))

(defun *ERROR* (ErrStr)

(print ErrStr))

(ana_program)

)

Sizin de fark ettiğiniz gibi programımız büyüyor olsa da birkaç kod satırı ile yarattığımız mantıksal işlemleri yapan ana fonksiyon kısmını yarattığımız için, çok ta karmaşık hale gelmedi. Programın tamamının ne yaptığının detaylarını anlamadan mantıksal kısmı kolaylıkla takip edebilirsiniz. Bir program ne kadar büyürse, detaylar o kadar gizli kalacak ve sadece programın mantıksal kısmı göz önünde kalacaktır. Artık programımızın parametre listesinde da yerel değişkenlerimiz de olduğuna göre, artık fonksiyon isimlerini parametre listesine yazabiliriz. Şayet fonksiyonlarımızı parametre listesine dahil etmezsek, programımız sonlandıktan sonra bile bilgisayarımızın hafızasında yer işgal etmeye devam edecektir. Programımız sonlandığı zaman, hafızayı mümkün olduğunca temizlemek zorundayız ve hafızayı temiz tutmanın en kolay yolu program içerisinde parametre listelerini kullanmaktır.

Yukarıdaki örnek kodumuzda Param1 ve Param2 parametrelerinin parametre listesine dahil edilmediğini fark etmiş olduğunuzu umuyorum. Bunu Param1 ve Param2 parametreleri fonksiyona aktarılacak ve fonksiyon son bulduğu zaman, bu parametrelerin işlevleri son bulacağı için, bu şekilde yaptık; böylece hafızada herhangi bir temizleme işlemi yapmamıza gerek kalmayacaktır. Ayrıca Param1 ve Param2 parametreleri parametreleri_kontrol_et fonksiyonuna geçtiği zaman, parametreleri_kontrol_et fonksiyon tanımı içerisinde bu parametrelere farklı isimler verdik. Değişkenler bir fonksiyona geçtikleri zaman, fonksiyon içerisinde farklı isimler kullanmalısınız; böylece fonksiyonun hangi değişken üzerinde çalıştığı ile ilgili kafa karışıklığı yaşamazsınız.

Parametre listesinde isimlendirilen değişken fonksiyon dışında mevcut olan değişken değildir. Hatta bu değişkenler aynı isme sahip olsalar bile aynı değişken değillerdir. Parametre listesindeki değişken kendisini çağıran fonksiyona özel olup; sadece fonksiyona geçen değişkenin bir kopyasıdır. Bu şayet fonksiyon içerisindeki fonksiyonu değiştirirseniz, fonksiyona geçen değişkenin değişmeyeceği anlamına gelmektedir. Bir fonksiyona geçirilmiş değişkenler üzerinde çalışma fikri iyi bir fikir olmadığı için, bu gerçekten sorun değildir. Fonksiyona geçirilmiş değişkenler sadece fonksiyondan elde edilmek istenen değer üzerinde çalışmak için, kullanılmalıdır.

IF ifadesi içerisindeki kontrolü kendi fonksiyonu olarak verdiğimizi fark etmişsinizdir. Bu ana_program fonksiyonu içerisindeki mantığın daha kolay takip edilmesini sağlar. Bu yazım şekli ile neyin kontrol edildiğini bilmek zorunda değilimdir ve sadece kontrol sonucunun doğru veya yanlış olduğunu bilmem yeterlidir.

Özet


Bu makalemde anlattıklarım sonucunda artık bir AutoLISP programımın ana yerleşimini öğrenmiş olduğunuz. Programlarımızı niçin belirli bir yapıda oluşturmamız gerektiğinin sebepleri değişmekle birlikte; ana sebepler aşağıda listelenmiştir:

  1. Değişme olasılığı olan Alanlar.
  2. Karmaşık Veriler
  3. Karmaşık Mantık

Karmaşık olarak görünen herhangi bir alan fonksiyonun ara yüzünü kontrol edebileceğiniz yer olan kendi fonksiyonu içerisine taşınmalıdır.

Programınız bilgisayar hafızasını temizlemelidir. Fonksiyonlar programın o fonksiyona ihtiyaç duyduğu alanlarında olmalıdırlar. Değişkenler kendilerini kullanan fonksiyona özel olmalıdırlar. Şayet mümkünse, genel değişkenlerin kullanımından kaçınılmalıdır.

Programın tüm kısımlarını açıkça açıklamak için, uygun açıklamalar kullanılmalıdır. Şayet fonksiyonlarınızı ve değişkenlerinizi doğru olarak isimlendirirseniz, programın içerisinde açıklama yapmanızı gerektirecek kısımlar azalacaktır.

Hakkında Sertan Türkan

AutoCAD Beyni

Bunu da Kontrol edin

Revitte Bir Plan Görünüşü Oluşturma

Revit’te projenize başka bir görünüş ekleyebilir veya mevcut bir görünüşü çoğaltabilirsiniz. Bunun için: Görünüş “View” …

Bir cevap yazın

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Yardıma mı ihtiyacınız var? Chat with us
Bir görüşme başlatmak için lütfen önce gizlilik politikamızı kabul edin.