Giriş:
LISP
programlama dili nesneye dayalı olmayan, medya öğelerini çok
fazla kullanamayacağımız; Basic ve Pascal gibi makine dili
haricindeki programlama dillerinden biridir. AutoLISP modül
uygulamalarının AutoCAD ortamıyla bütünleştirilmesinin amacı;
AutoCAD'e yüksek seviyeli dillerde olduğu gibi makro düzeyde
program yazılmasına olanak sağlamaktır.
LISP programlama dili çok güçlü ve öğrenmesi çok kolay bir
programlama dilidir. Asıl anlamda LISP, yapay zeka çalışmalarında
kullanılan bir program dilidir. List Processing 'in (Liste
işleme) kısaltılmış ifadesidir. AutoLISP ise LISP'in AutoCAD
ile kullanılabilecek şekilde uyarlanmış halidir. AutoLISP
sayesinde kullanıcının AutoCAD'e yeni komutlar eklemesi kişiselleştirmesi
ve ondan artan bir verim elde etmesi mümkündür. Tabii ki yeni
komutlardan kastedilen, kullanıcının AutoLISP fonksiyonlarını
kullanarak hazırladığı program dosyalarını AutoCAD ortamından
çağırarak kullanmasıdır.
AutoLISP
dosyalarının ASCII dosyalar oluşturabilen bir kelime işlemcide
(text editor) hazırlanması ve uzantısının *.LSP olması bir
zorunluluktur.
AutoLISP
dosyaları aslında fonksiyonlardan meydana gelmektedir. Kullanıcı,
bir takım standart fonksiyonları kullanarak veya kendisi çeşitli
fonksiyonlar tanımlayarak yapmak istediklerini gerçekleştirir.
Gerek standart fonksiyonlar, gerekse kullanıcı tanımlı fonksiyonlar;
değişkenlere değerler atanması, bu değerlerin AutoLISP tarafından
değerlendirilerek sonuçlar elde edilmesi mantığına göre çalışır.
AutoLISP programlarda büyük küçük harf ayrımı yapmaz.
AutoLISP
Dosyalarının Yüklenmesi:
AutoCAD
ortamına herhangi bir daha önceden hazırladığımız AutoLISP
programını aktarmak için iki farklı yol takip edilebilir birincisi;
klavyeden Appload komutunu girilmesinin ardından çalıştırmak
istediğimiz dosyayı seçip Load butonunu tıklayarak daha önceden
hazırlanmış program AutoCAD ortamına aktarılabilir veya AutoCAD'de
menü çubuğunda menüde bulunan Tools sekmesine tıklayarak açılan
pulldown menüden Load Application sekmesine tıklayarak dosya
ekleme ekranına ulaşabiliriz buradan eklemek istediğimiz dosyayı
konum sekmesinin yardımıyla bulup Load butonunu kullanabiliriz.
(Bu yöntem aşağıda ekran görüntüsüyle açıklanmıştır)
Dialog
tablosundaki Save List kutucuğu seçilirse AutoCAD aktif directory'de
Appload.dfs adında bir dosya oluşturulur ve liste bu dosya
içinde saklanır. Listenin korunmasını istiyorsak. Save List
kutucuğunu seçin.
Eğer
herhangi bir AutoLISP dosyasının AutoCAD açılışında dosyamıza
eklenmesini istiyorsak Load Application ekranından sonra karşımıza
gelen pencerede bulunan Startup Suite kısmında yer alan Contents.
butonuna basarak karşımıza gelen önceden atadığımız AutoLISP
dosyalarını AutoCAD ile ilişkilendirebiliriz.
LISP
Dosyalarının Yapısı:
Bir
LISP dosyası içinde tüm fonksiyonlar bir sol parantez "("
ile başlar ve bir sağ parantez ")" ile biter. Parantezler
kuralına uyuldukça bir fonksiyon içinde başka alt fonksiyonlar
da bulunabilir. AutoLISP dosyalarının ilk satırları daima
"defun" ifadesiyle başlar. Bu AutoLISP'in en temel
fonksiyonudur. defun fonksiyonu kullanılmadan AutoLISP programı
yazılamaz.
Örnek:
(defun
fonk.adi ( )
(sub.fonk1 (sub.fonk2))
) ; parantez sayısına dikkat ediniz.
Yukarıdaki
örnekte görüldüğü gibi fonksiyon "defun"
ile başlamıştır. Sub.fonk olarak tanımlanan fonksiyonlar
ana fonksiyon içinde kullanılan ve işlemleri yapan alt fonksiyonlardır.
Bu alt fonksiyonlar genellikle, standart LISP fonksiyonları
veya kullanıcıların tanımladığı fonksiyonlardır. Daha önce
de belirtildiği gibi LISP dosyalarında dikkat edilmesi gereken
en önemli hususlardan bir tanesi parantezlerdir. Özetle şöyle
söyleyebiliriz; AutoLISP dosyasında açılmış olan parantez
kadar parantezin program akışına göre uygun yerlerde kapatılması
zorunludur. Yazılan AutoLISP dosyaları AutoCAD ortamına
çağrıldığında (bu işlem daha sonra detaylı olarak anlatılacaktır)
daha önce de belirtildiği gibi AutoLISP tarafından değerlendirmeye
alınır. Bu değerlendirme dosya AutoCAD ortamında çalıştırılmaya
başlanmadan hemen önce yapılır. AutoLISP değerlendiricisine
EVULATOR adı verilir. Değerlendirme esnasında ekranda Command:
alanında ; n> ifadesi görülürse (n bir tamsayıdır) n kadar
sağ parantezin eksik olduğu anlaşılır.Yani açılan sol parantezler
içinde n tanesi sağ parantez kullanılarak kapatılmamıştır.
Bu hatayı düzeltebilmek için LISP dosyanıza dönerek n tane
sağ parantezi uygun yerlere koymanız gerekir.
Bazen
programın başında açılmış olan bir sol parantez programın
sonlarına doğru kapatılabilir (Yukarıdaki örnekte olduğu gibi).
Tabii ki bu parantezlerin yeri fonksiyonun işlevi ile bağlantılıdır.Fonksiyonlar
içindeki ifadeler birden fazla satıra taşabilir; bu yazı bir
satırdan fazla olduğu için ikinci satıra da devam edebilir.
Önemli olan açılmış sol parantezlerin sağ parantezler ile
kapatılmasıdır.
Defun
fonksiyonu ile program yazımına başlandıktan hemen sonra bu
fonksiyon bir sağ parantez ile kapatılmaz. (defun ile başlayan
ve ardından fonksiyon adının yazıldığı bu fonksiyon içinde,
yapılacak işlemleri tanımlayan alt fonksiyonlar yer alır.
Örnek:
(defun
toplama ( )
(setq A (getint "BIRINCI SAYIYI GIRINIZ :"))
(setq B (getint "IKINCI SAYIYI GIRINIZ :"))
(setq C (+ A B))
princ "\nSONUC : ")
(princ C)
(princ)
Yukarıdaki
örnekte ilk satır fonksiyonun başlangıç satırıdır. İkinci
satır ile kullanıcıdan bir sayı girmesi istenir. Girilecek
sayı tamsayıdır. Bu sayı A değişkenine atanır. Üçüncü satırda
ikinci tamsayı istenir. Bu sayıda B değişkenine atanır. Dördüncü
satırda ise girilmiş olan iki tamsayı toplama işlemine sokulur
ve sonuç C değişkenine atanır. Beşinci satırda belirtilmiş
olan fonksiyon sayesinde üçüncü satırda elde edilmiş olan
sonuç ekranın komut alanına yazdırılır. Son satırdaki parantez
ile de ilk satırda açılmış olan parantez kapatılır. Bu örnekte
AutoLISP'in standart fonksiyonlarından olan setq ve
princ fonksiyonlarının nasıl kullanılabileceğini örneklenebilir.
Örnek Bir AutoLISP Programı ve Komut Açıklamaları:
Aşağıda
detaylı olarak verilen bu örnek programı bilgisayarınıza da
indirebilirsiniz: DELL.LSP
XY DÜZLEMİNDE BULUNAN BİR KATI CİSMİN ÜZERİNDE
İSTENİLEN ÇAPTA BİR SİLİNDİR AÇAN PROGRAM :
(defun
c:dell()
(setq p1(getpoint "\nDelinecek nesne dışında bir nokta
seçin:"))
(setq p2(getpoint "\nDelinecek nesne içinde bir nokta
seçin:"))
(setq nesne(ssget "c" p1 p2))
(setq yer(getpoint "\nMerkez noktası :"))
(setq r(getreal "\nYariçapı girin :"))
(setq h(getreal "\nYüksekliği Girin :"))
(command "ucs" "origin" yer)
(command "cylinder" "0,0,0" r h)
(command "subtract" nesne "" "last"
"")
(setq nh(* -1 h))
(command "cylinder" "0,0,0" r nh)
(command "subtract" nesne "" "last"
"")
(command "ucs" "world" "")
)
Programın
Açıklaması:
(defun c:dell() : Programı aktif etmek için kullanılacak
komutu belirtir .
(setq p1(getpoint "\nDelinecek nesne dışında bir nokta
seçin:"))
(setq p2(getpoint "\nDelinecek nesne içinde bir nokta
seçin:"))
Yukarıdaki satırlar şekil içinde ve dışında birer nokta seçtirerek
bu nokta koordinatlarını P1 ve P2 değişkenlerine aktarır.
(setq nesne(ssget "c" p1 p2)) : P1 ve P2
noktaları arasında nesneyi veya nesneleri seçerek bu nesneyi
"nesne" değişkenine atar. Bu iki nokta arasında
bulunan şekli seçmek için ise "c" parametresi kullanılmıştır.
(setq yer(getpoint "\nMerkez noktası :"))
: Çizilecek silindirin merkezini belirlemek için bir nokta
seçtirir ve yer değişkenine aktarır.
(setq r(getreal "\nYariçapı girin :")) :
Çizilecek silindirin yarıçapının girilmesi istenir ve bu değer
"r" değişkenine atanır.
(setq h(getreal "\nYüksekliği Girin :"))
: Çizilecek silindirin uzunluğunu ister ve bu değeri h değerine
atanırır.
(command "ucs" "origin" yer) :
UCS yer değişkeninde saklanan noktaya taşınır.
(command "cylinder" "0,0,0" r h)
: "0,0,0" noktası merkez olacak şekilde "r"
yarıçapında ve "h" yüksekliğinde bir silindir çizer.
(command "subtract" nesne "" "last"
"") : Son çizilen nesneyi yani silindiri "nesne"
değişkenine atanmış olan nesneden çıkarır.
(setq nh(* -1 h)) : "h" değerinin çarpmaya
göre tersini alır ve "nh" değişkenine atanır.
(command "cylinder" "0,0,0" r nh)
: "0,0,0" noktası merkez olacak şekilde "r"
yarıçapında ve "nh" yüksekliğinde bir silindir çizer.
Fakat bu yeni silindir diğer silindirin tersi yönünde uzanır.
(command "subtract" nesne "" "last"
"") : Son çizilen nesneyi yani silindiri "nesne"
değişkenine atanmış olan nesneden çıkarır.
(command "ucs" "world" "")
: UCS standart ayarına getirilir.
Kaynaklar:
1.
BAŞAK Hüdayim - AutoLISP - Pusula Yayıncılık, Eylül 2002
2. ŞEKERCİOĞLU Ahmet - Adım Adım AutoCAD - Bilim Teknik Yayınevi
3. ÇIKIŞ Ender - AutoLISP- Beta Yayınları
4. Visual LISP Developer's Guide - Autodesk Inc.
5. YALDIZ Süleyman - AutoCAD 2002 - İnci Ofset, Aralık 2002
*
Not: 01-01-2004 tarihinde bir soru üzerine ilk defa gruba
gönderdiği bu çalışmasından dolayı TurkCADCAM e-posta grubu
üyelerinden Murat Demirel'e teşekkür ederiz.
|