Orhan Toker
Y. Mimar (İTÜ)
Autodesk Yetkili Danışmanı
Programcı

  DERS.7 Kendi fonksiyonlarımızı tanımlamak ve fonksiyonları etkili kullanmak.
Seviye: Orta Kaynaklar: Autodesk, VisualLISP IDE Help file [4.Nisan.2006]
 

 

Merhaba,

Bu dersimizde AutoLISP projelerimiz içinde kendi fonksiyonlarımızı tanımlamayı öğreneceğiz. Daha önceki derslerimizde farkına varmış olabilirsiniz, uygulamalarımız ve örneklerimizin içinde zaten fonksiyonlar tanımladık. Ancak bu derste sizlere vermek istediğim şey, her programlama dilinde olduğu gibi fonksiyon tanımalamanın önemini kavratmak ve bu işi profesyonel projeleri yapabilecek düzeyde anlatmak. Ayrıca fonksiyonları etkili kullanım tekniklerini de bu derste bulacaksınız.

AutoLISP içinde kendi fonksiyonlarımızı (defun) fonksiyonu ile tanımlarız. Bir kez kendi fonksiyonumuzu tanımladıysak, Autocad komut satırından, VisualLISP konsolundan ya da kendi projelerimiz içinden bu fonksiyona rahatlıkla erişebiliriz. Kendi tanımladığımız fonksiyonlar da tıpkı AutoLISP fonksiyonları gibi birer fonksiyon olurlar. (defun) fonksiyonunu kullanarak kendi komutlarımızı da yaratabildiğimizi unutmayın.

 

Yeni fonksiyon yaratmak (defun fonksiyon adı (argümanlar / lokal değişkenler))

 

(defun) fonksiyonu, bir grup eşitliği ve AutoLISP fonsiyonunu arka arkaya çalışacak şekilde bir araya getirip fonksiyon ya da komut yapar. Defun fonksiyonu en azından 3 tane argümana ihtiyaç duyar. Bunlardan birincisi yeni tanımlayacağınız fonksiyonun ismidir.
Not: Fonksiyonlarınıza isim verirken her ne kadar yeni programlama ortamları izin veriyorsa da Türkçe karakterler kullanmayın. Bu ileride geniş anlamda kullanımı kısıtlayabilir. Ayrıca fonksiyon isimlerinizi mantıklı verin. En güzel örnek (defun) dur. Yani "DEfine FUNciton" kelimelerinin kısaltılmışı. Her programlama dilinin kendine özgü isimlendirme matnığı vardır. LISP dili yapay zeka programlama dili olduğundan fonksiyon isimleri yaptığı işi daha çok çağrıştırır. Siz de buna özen gösterin.

Defun fonsiyonunun ikinci argümanı fonsiyon çağrıldığında ihtiyaç duyulacak argümanların listesidir. BU boş da olabilir birden fazla argüman da olabilir. Üçüncü ve son argüman ise fonksiyon içinde kullanılacak lokal değişkenlerin listesidir. Şimdi basit bir fonksiyon tanımlayalım:

$_(defun merhaba_dunya () (princ "\nMerhaba dünya!"))
merhaba_dunya

Artık fonksiyonunuz tanımlandı. Aşağıdaki gibi kullanılır

$_(merhaba_dunya)
Merhaba Dünya!

Komut tanımlama için

$_(defun c:md () (merhaba_dunya))
c:md

Merhaba dünya fonksiyonunu çağıran md komutunu yarattık.

  Argümanlı fonksiyonlar tanımlamak ve kullanmak
 

AutoLISP içinde argümanla çağrılan fonksiyonlar tanımlayabilirsiniz. Yerlerşik AutoLISP fonksiyonlarının aksine, opsiyonel argümanlı fonksiyon tanımı yapamazsınız. Yani tanımladığınız argümanlı fonksiyonu çağırırken tüm argümanlarını pas etmelisiniz.

_$ (defun karesi (sayi) (* sayi sayi))
KARESI
_$ (karesi 3)
9

Yukarıdaki örnekte bir sayını karesini alan fonksiyon yaptık ve denedik. Tanımladığımız karesi fonksiyonu sayi argümanını kullanıyor ve dönüş değeri olarak kensisiyle çarpım sonucunu veriyor. Bu fonksiyonu başka bir fonksiyon içinde çağırabiliriz.

(defun c:kare_al ()
(setq a (getreal "\nKaresini almak istediğiniz sayıyı girin:))
(princ "\nGirdiğiniz sayının karesi:")
(karesi a)
(princ)
)

Gördüğünüz gibi tanımladığımız kare_al komutunun içinden karesi fonksiyonunu çağırabiliyoruz.

  Fonksiyonların içinde kullanılan lokal değişkenler
 

Döngü sayaçları, nokta ve mesafe gibi kullanıcı giriş değerleri vb. değişkenler her fonksiyonun içinde kullanılır ve fonksiyon dışında işe yaramazlar. Fonksiyonların içinde kullanacağınız değişkenlerin, uygulamanız tarafından etkilenmesini önlemek için fonksiyon tanımında bunları deklare etmelisiniz. Böylece aynı değişkenleri bir başka fonksiyon içinde rahatlıkla kullanabilir ve karışıklıkları önlersiniz.
Sadece fonksiyonun içinde kullandığınız değişkenleri lokal olarak deklare etmemenizin tehlikesi şudur: Bu değişkenleri lokal değişken olarak deklare etmediğinizde global değişken olarak kabul edilirler. Eğer uygulamanızın diğer bölümlerinde bu değişkenleri unutup yeniden kullanırsanız, bulması çok zor olan hatalarla karşılaşırsınız. Bundan sakınmak için lokal değişkenleri deklare edin ve emin olun. Yukarıdaki örneği düzeltelim ve a değişkenini lokal oalrak tanımlayalım.

(defun c:kare_al (/ a)
(setq a (getreal "\nKaresini almak istediğiniz sayıyı girin:))
(princ "\nGirdiğiniz sayının karesi:")
(karesi a)
(princ)
)

Böylece a değişkeni başka bir yerde kullanılsa bile sizin için sakınca oluşturmaz. Lokal değişkenleri deklare etmenin bir başka avantajı da yorumlayıcı için ayrılan sistem hafızasını çok meşgul etmemektir.

  AutoCAD komutlarını değiştirmek. (redifining)
 

Her ne kadar benim hiç kullanmadığım bir yöntem olsa da Autocad komutlarını (defun) fonksiyonu kullanarak kendinize göre değiştirebilir, bir anlamda yeniden tanımlayabilirsiniz.

_$ (defun c:LINE()
(_> (princ "\nPLINE kullansnız daha iyi olmaz mı?")
(_> (command "._LINE")
(_> )
C:LINE

Autocad LINE komutunu yeniden tanımlamış olduk. Şimdi

_$ (command "undefine" "line")
nil

Bu küçük kodla Autocad LINE komutunu devre dışı bıraktık ve bizimkini kullanacağımızı belirttik. Tekrar eski duruma dönmek için:

$_(command "redefine" "line")

Dediğim gibi bu yeniden tanımlama işlemini sadece zorunlu durumlarda yapmanızı öneririrm.

  S::STARTUP fonksiyonu
 

Çizime başlamadan önce otomatik olarak yapılmasını istediğiniz işleri S::STARTUP fonksiyonu içinda tanımlayabilirsiniz. BU fonksiyonu Autocad çizimi açıldığında otomatik olarak yüklenmesi için "ACAD.LSP" "ACADDOC.LSP" ya da ilgili MNL dosyasının içine yazmalısınız. Ben örneğimde acad.lsp dosyasını düzenleyeceğim: (Bu dosyayı support dizininin altında bulacaksınız. Autocad 2006 için: \support\acad2006.lsp) Dosyayı açın ve en sonuna aşağıdaki kodu ekleyin.

(defun katmanlari_ac()
(command "._layer" "_new" "TAL_DUVAR" "")
(command "._layer" "_new" "TAL_DOSEME" "" )
(command "._layer" "_new" "TAL_3D" "" )
)

(defun-q S::STARTUP()
(katmanlari_ac)
)

Bu kodu acad.lsp dosyasının sonuna eklediğinizde S::STARTUP fonksiyonunun içine koyduğunuz tüm işleri yeni çizim açar açmaz icra edecektir. Biz örnekte otomatik olarak layer açtırdık.

Bu ders bu kadar. Hoşçakalın.

 

  (c) Copyright 2006 Taliasoft, by Orhan Toker