AUTOLISP 7 Dakikada AutoLisp Öğreniyorum El Kitabı Hazırlayan: Gemi İnş. ve Gemi Mak.Müh.Ali ÖZEN aliozen@gmail.com
1. AutoLisp Giriş Sayfa No. 1 1.1 Programlama Diline Genel Bakış AutoLisp programlama dili, AutoCAD yazılımının bünyesinde çalışan bir programlama dilidir. Bu dil yardımıyla AutoCAD programında tanımlı olmayan bazı komutlar oluşturabilir ve bu sayede sürekli yapılması gereken çoklu işlemleri kolaylaştırarak önemli zaman kazanabilirsiniz. Bu kitapta AutoLisp programı hakkında temel bilgiler ve dilin kullanımının rahat anlaşılması için örnek kodların adım adım oluşturulmasını bulabilirsiniz. 1.2 AutoLisp Kodlarının AutoCAD de kullanımı AutoLisp dilinde yazılan kodlar, LSP uzantılı dosyalar içine not defteri vb. metin düzenleme programı ile kaydedilir. Daha sonra AutoCAD programında, Tools/AutoLisp/Load... menüsünden veya APPLOAD komutunun komut satırına yazılmasıyla karşınıza gelecek aşağıdaki ekrandan çalıştırılır. Seçilen LSP uzantılı AutoLisp kodu Load a tıklanarak çalıştırılır. Kodun daha sonra her AutoCAD açılışında tekrar tekrar APPLOAD yapmadan kendiliğinden yüklenmesi istendiği takdirde, bir defaya mahsus kod dosyası alt tarafta görülen Evrak Çantası nın üzerine sürüklenip bırakılır.
2. AutoLisp Dilinin Temelleri Sayfa No. 2 2.1 Komutlar ve Değişkenler AutoLisp dilinde her komut iki parantez içerisinde tanımlanır. Bir komut tamamlanmadan başka bir komuta başlanabilir veya komutlar arka arkaya yazılabilir. Bir komut, diğeri bitmeden başlıyorsa, her iki komutun da bitişlerinin parantezi kapatmak suretiyle ayrı ayrı yapılarak unutulmaması önemlidir. (DEFUN C:ALI( (SETQ A 3 (PRINC A (PRINC En temel üç komuttan biri olan DEFUN, yeni bir fonksiyon tanımlamaya yarar. C: ve ( arasında yazılan kısım bu fonksiyonun AutoCAD de çalıştırılması gerektiğinde AutoCAD komut satırına nasıl yazılarak çalıştırılacağını gösterir. Örneğin yukarıdaki kodu AutoCAD de çalıştırmak için APPLOAD ile LSP dosyası yüklendikten sonra ALI yazmak gerekecektir. Yeni fonksiyonu DEFUN ile tanımlarken, bu fonksiyonun AutoCAD de neler yapacağını anlattığımız kısım, halen DEFUN komutunun içerisinde sayılacağı için dikkat edilirse (DEFUN ile başlayan parantezin en sonda kapandığı görülecektir. İkinci komut SETQ, bir değişkene bir değer atamaya yarar. Yukarıdaki örnekte A adını verdiğimiz değişkene 3 sayısını atamış oluyoruz. Değişkenler en genel kullanımda üç şekildedir: Tamsayı (INTEGER, gerçek sayı (REAL veya metin (STRING. Diğer programlama dillerinden farklı olarak, AutoLisp te değişkenin hangi tür olacağı daha önce bir yerde tanımlanma zorunluluğu yoktur. O değişkene atanacak ilk değer bunu belirler. Örneğin A değişkeni 3 tamsayısının atanmasıyla bir tamsayı olmuştur. Son komut PRINC, AutoCAD ekranında bir metin görüntülenmesini sağlayan komuttur. (PRINC Goruntulenecek Metin şeklinde kullanılabildiği gibi, doğrudan bir değişkenin içeriği de tırnak işaretleri olmadan (PRINC A şeklinde görüntülenebilir. AutoLisp dilinde görüntülenen bir metnin çift görüntülenmesini önlemek üzere kod içerisine bir defaya mahsus tüm PRINC komutlarından sonra içeriği boş bir (PRINC konmalıdır. Bu (PRINC konmadığı takdirde kod yine çalışır vaziyette olacak ancak görüntülenen tüm metinler çifter kez görüntülenecektir. Bu bilgiler ışığında, yukarıda yazan dört satırlık kodun ne işe yaradığını özetlersek, öncelikle ALI yazarak çalıştırılacak bir fonksiyon tanımlıyor, bu fonksiyon kapsamında A değişkenine 3 sayısını atıyor ve son olarak ekranda A değişkeninin görüntülenmesini sağlayıp, fonksiyonu tamamlıyor.
Sayfa No. 3 2.2 Kullanıcıdan Veri Alınması ve COMMAND Komutunun Kullanılması Kodun gereği olarak bazı değerler kullanıcı tarafından girilecek şekilde olacaktır. Halihazırda AutoCAD fonksiyonlarından örneğin LINE fonksiyonunda çalışırken ilk nokta, uzunluk veya ikinci nokta gibi veriler kullanıcının yazması veya tıklamasına bırakılıyor. Bunun gibi AutoLisp dilinde yazacağımız kodlarda kullanıcıdan veri istemek için aşağıdaki kodları kullanacağız. (defun C:RR( (setq MYSET(ssget (setq PP1(GETPOINT (setq PP2(GETPOINT (command "ROTATE" MYSET "" PP1 "R" PP1 PP2 "0" "" Yukarıdaki kodun yazılmasındaki amaç AutoCAD de seçilecek nesnelerin tıklanacak ilk nokta etrafında, ikinci nokta doğrultusunu 0 dereceye getirecek şekilde döndürülmesi (ROTATE dir. Nesneleri gruplar halinde belirli alanlara dizmek, düzenlemek vb. görevler yapılacağında, hiç bir parçanın açılı durmuyor olması gerekebilir. Parçaları seçip ROTATE ile önce ilk noktasına tıklayıp, R (REFERENCE ile rölatif döndürmeye ayarlayıp sonra tekrar ilk nokta ve ikinci noktaya tıklayıp, 0 yazıp komutu tamamlamak yerine, RR yazıp ilk ve ikinci noktaya basarak işlemi kısaltmış oluyoruz. Bu işlemi onlarca, yüzlerce nesneye yapacak olduğunuzu düşünürseniz, kazanacağınız zaman için bu kodu yazmak değerli hale geliyor. Bu kod kapsamında kullanıcıdan istenen üç veri bulunuyor. Bunlar seçilecek nesne grubu (örnekte MYSET, ilk nokta (örnekte PP1 ve ikinci nokta (örnekte PP2 dir. (SSGET komutu, Seçim grubu (Selection Set nun kullanıcıdan talep edilmesini sağlamakta, (GETPOINT komutu ise tek bir noktanın kullanıcıdan talep edilmesini sağlamaktadır. Bu örnekte mevcut olmayan bir diğer veri girişi ise bir değişkene kullanıcıdan değer talep eden (GETINT komutu tamsayılar için, (GETREAL komutu gerçek sayılar için ve (GETSTRING komutu metin isteği içindir. Örneğin A değişkenine kullanıcıdan bir tam sayı atamasını istemek için gerekli kod: (SETQ A (GETINT şeklinde olacaktır. (COMMAND komutu AutoCAD içerisinde komut satırına bir şey yazar gibi bir AutoCAD komutunun çalıştırılmasına yaramaktadır. Kodun amacında tarif ettiğim gereği sağlamak için AutoCAD komut satırına yazı yazmaya başlıyoruz. Öncelikle ROTATE yazarak döndürme fonksiyonunu başlatıyoruz. AutoCAD ROTATE komutu yazılınca ilk olarak neyi döndürmek istediğini kullanıcıya sorar. Kod da bunu sağlamak için daha önce kullanıcıdan SSGET ile talep ettiği MYSET değişkenine yönlendiriyor bu isteği. Daha sonra seçimin tamamlandığını AutoCAD e belirtmek amacıyla Enter/Space tuşuna basmak anlamına gelen boş tırnak işaretlerini ( kullanıyor. Sonra AutoCAD kullanıcıdan başlangıç noktası isteyeceği için bu isteği de daha önce GETPOINT yoluyla kullanıcıdan istediğimiz PP1 noktasına yönlendiriyor. Daha sonra AutoCAD de çalışıyor olsaydık ilk noktayı seçtikten sonra R (REFERENCE i seçeceğimizi bildiğimiz için koda R ekleyerek bu görevi gerçekleştiriyoruz. Daha sonra bir ve ikinci noktaları benzer şekilde PP1 ve PP2 ye yönlendirdikten sonra referans açısını 0 olarak tanımlayıp Enter/Space anlamına gelen ile komutu tamamlıyoruz.
Sayfa No. 4 Bu fonksiyonun çalışması için yukarıdaki kodu bir LSP dosyası içerisine kaydedip AutoCAD de APPLOAD komutuyla aktif hale getirmek gerekmektedir. Daha sonra komut AutoCAD komut satırına RR yazarak çalıştırılabilecektir. Dosya adının fonksiyon ile aynı ada sahip olması şartı yoktur, herhangi bir dosya adı seçilebilir. (defun C:KK( (PRINC "\n Lutfen Parcalari Seciniz: \n" (setq myset(ssget (COMMAND "CHANGE" myset "" P "C" 1 "" (PRINC "\n Renk Kirmiziya Degistirildi \n" (princ Yukarıdaki örneğin, DEFUN komutuyla fonksiyona KK şeklinde çalışacağını tanımladığını, SSGET komutu ile myset değişkenine bir nesne grubu ekleyip, daha sonra COMMAND komutu ile CHPROP AutoCAD komutunu çalıştırıp, myset değişkenine P ve sonra C ile renk değiştireceğini belirtip sonra değişecek olan rengi 1 (kırmızı olarak seçip sonra ile fonksiyonu bitirdiğini göreceksiniz. Bu fonksiyon sayesinde nesneleri seçtikten sonra fare vasıtasıyla renklerini kırmızıya ayarlamak yerine tekrarlanabilir (Enter/Space e tekrar basmak suretiyle bir komut ile KK yazarak hızlıca renklerini kırmızıya ayarlayabileceğimizi ve bunun sık kullanılan bir durumda ne kadar zaman kazandıracağını düşünebilirsiniz. 2.3 WHILE Döngüleri, IF Şartları ve Dört İşlem Komutları Diğer programlama dillerindekine benzer döngü ve şartlandırmalar AutoLisp te de mevcuttur. Döngüler (WHILE -döngü şartı- -olay- şeklinde -döngü şartı- sağlandığı sürece -olay- ı gerçekleştirmeye programın devam etmesi şeklindedir. Döngü şartı, (WHILE (= A B -olay-, A değişkeni B değişkenine eşit olduğu sürece -olay- devam eder şeklinde veya (WHILE (> A B -olay-, A değişkeni B değişkenden büyük olduğu (< işaretiyle küçük olarak da ayarlanabilir. sürece -olay- devam eder şeklinde belirlenir. Şartlandırma (IF -şart- -olay1- -olay2- şeklinde, -şart- sağlanıyorsa -olay1-, sağlanmıyorsa -olay2- yi gerçekleştirir. Dört işlem, diğer programlama dillerinde olduğu gibi bildiğimiz matematik yazım şekliyle gerçekleşmiyor, her bir işlem bir komutmuş gibi (-işlem- -sayı1- -sayı2-... -sayı n- şeklinde yazılarak yapılıyor. Örnek vermek gerekirse (SETQ A 5 yazıp A değişkenini doğrudan 5 e eşitlemek yerine (SETQ A (+ 3 2 şeklinde yazarak A değişkenini 3 ile 2 nin toplamına eşitlemek mümkün. Bunun yanısıra daha önce tanımlanmış bir değişkeni dört işlem komutları içerisinde kullanabiliriz: (SETQ A (- B 3 şeklinde yazacağımız kod ile A değişkenini, B değişkeninden 3 çıkarma işlemi sonucuna eşitlemiş oluyoruz. Bir değişkeni tanımlarken, o değişkenin o anki değerini yine işlem içerisinde kullanabilir. Örneğin, (SET A (* A 3, A değişkenini, A değişkeninin mevcut değerinin 3 katına eşitle anlamına gelmektedir.
(DEFUN C:BUL( (SETQ AA (GETINT \n Lutfen 1 ile 10 arasinda bir tamsayi giriniz: \n (SETQ BB 1 (WHILE (< BB 11 (PRINC BB sayisinin su anki degeri: (PRINC BB (IF (= AA BB (PRINC BB su an el ile girdiginiz sayiya esit. (PRINC BB su an el ile girdiginiz sayiya esit degil. (PRINC \n (SETQ BB (+ BB 1 (PRINC \n BB 10 sayisina ulasti. Program kapatilacak. (PRINC Sayfa No. 5 Örnek kod incelendiğinde, AutoCAD de BUL komutuyla çalışan, kullanıcıdan bir AA sayısı tanımlaması istendiği, BB sayısının program tarafından 1 olarak belirlediği ve 11 den küçük olduğu sürece çalışmaya devam edecek bir döngüye sokulduğu görülmektedir. Döngü içerisinde kullanıcıya BB sayısının kaç olduğu gösteriliyor, daha sonra bir şartlandırmayla BB sayısının o anki değerinin kullanıcı tarafından girilen AA ile aynı olup olmadığının kontrolü yapılıyor ve son olarak BB sayısı olduğu sayıdan 1 artırılarak döngü tamamlanıyor. Bu sayede BB sayısı her döngüde bir artıyor ve en sonunda döngü şartı olan 11 den küçük olma özelliğini kaybedince döngü tamamen bitiyor. Program kullanıcıya BB sayısının 10 a ulaştığını belirten bir metin görüntüleyip programı kapatıyor. 3. AutoLisp İçin Daha Fazla Kaynak 3.1 İnternet Kaynakları Bu kitaptaki temel bilgiler ile AutoLisp programlama diline yaptığınız başlangıcı ilerletmek ve uzmanlaşmak istediğiniz takdirde internette çok çeşitli kaynaklar bulabilirsiniz. Bu kaynakların arasında diğerlerine nazaran kolay anlatımı ile www.jefferypsanders.com/autolisp.html adresinde konumlanmış olan J. P. Sanders a ait ders notlarını takip edebilirsiniz. Bir kodu yazmaya başlamadan önce kısmen veya tamamıyla aynı olan bir kod daha önce yazılmış mıdır diye kod kaynaklarını kontrol etmekte fayda olacaktır. Hali hazırda kodlanmış AutoLisp kodları aradığınız takdirde, yine J. P. Sanders in AutoLisp sayfasına yönlenebileceğiniz gibi http://www.simplecad.com/lisp/lisp.htm adresinde konumlanmış olan lisp kaynakları bağlantılarını takip edebilirsiniz.
3.2 AutoCAD Yardım Dosyaları Sayfa No. 6 AutoLisp programlama dili, resmi olarak Autodesk firmasının AutoCAD programının içeriğine dahil olduğu için AutoCAD programı yardım dosyası içeriğinde ana sayfada aşağıdaki görünen ekranda olduğu gibi sol menüden AutoLISP, Visual LISP and DXF seçeneği seçilerek programlama diline ait gerekli bütün açıklamaları elde edebilirsiniz. Önemli Not: Bu kitapta anlatılan kodlar ve AutoCAD komutları AutoCAD 2004 sürümünde hatasız çalışacak şekilde düzenlenmiştir. AutoCAD komutları ve komutların kullanıcıdan beklediği değişkenler farklılıklar gösterebilir. Kitapta örnek verilen tüm kodlar CD de mevcuttur. Bu notlar amatörce hazırlanmış olup, izinsizce kullanımı, kopyalanması, hatta içinden bilgi araklanıp, kaynak göstermeden kullanılmasında hiçbir sakınca yoktur. Faydalı olması dileğiyle.