Ana sayfa
         
     
Rapor - Makale > CAD/CAM/CAE > AutoLISP Programı Tanıtımı*:

Murat Demirel, Mersin, Aralık 2003
Danışman: Yrd. Doç. Dr. M. Kemal Külekçi

Mersin Üniv. Tarsus Teknik Eğ. Fak.
Tasarım ve Konstrüksiyon Öğretmenliği Böl.

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.

         
     
TurkCADCAM.net > Türkiye'nin yeni ürün tasarım, geliştirme, CAD/CAM/CAE, CNC, kalıp ve imalat teknolojileri portalı
***** Sektörün profesyonel bilgi ve işbirliği platformu *****
© 2002-2017  Sinerji Yayıncılık, Tanıtım ve Danışmanlık Hizmetleri
Bu portaldaki içerik, ancak kaynak belirtilmesi ve izin alınması şartıyla yayınlanabilir.