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

  DERS.6 AutoLISP'te Listelerin Yönetimi (List Handling) I
Seviye: Orta Kaynaklar: Autodesk, VisualLISP IDE Help file

 

 

AutoLISP projelerinin en önemli unsurlarından biri listelerdir. Çizimde kontrol etmeniz gereken, noktalar, nesneler, tablolar ve dosyalar gibi en önemli unsurlar listelere bağlıdır. Bir AutoLISP listesi, içinde birden fazla değerin aralarında boşuk bırakılarak saklandığı değişken dizisidir. Bunu diğer programlama dillerindeki tek boyutlu dizilere benzeştirebiliriz. Örneğin:

Dim a(5)

Satırı BASIC, Pascal gibi dillerde 5 bileşenli bir a değişkeni tanımlar. A değişkenine değer atamak için

a(0) = 5
a(1) = 8
a(2) = 3
a(3) = “Deneme”
a(4) = 6.8

Eşitlemelerini kullanırız. Bu eşitlikleri kullanırken de

yazi = a(3)

Eşitliğine ihtiyaç duyarız. Bu eşitlik yazi değişkenine “Deneme” değerini yükler. Aynı işlemin AutoLISP dilinde karşılığına gelince:

(setq a (list 5 8 3 “Deneme” 6.8))

eşitlemesi yeterlidir. Böylece a değişkenine 5 8 3 “Deneme” ve 6.8 değerlerini yüklemiş olursunuz. Kullanmasına gelince

(setq yazi (nth 3 a))

Şeklindedir. Görüldüğü gibi listelerin diğer programlama dillerindeki dizilerden farkı sadece tek boyutlu olmalarıdır. Ancak akıllıca davrandığınızda siz de iç içe (nested) listeler oluşturabilirsiniz.

$_(setq b (list 3 “İki” a 1 4 “Bir”))
(3 “İki” (5 8 3 “Deneme” 6.8) 1 4 “Bir”)

Görüldüğü gibi b 3. elemanı bir başka liste içeren listedir.
 

Nokta Listeleri (Point Lists)

 

AutoLISP, grafik koordinatları yönetmeniz için içinde 2 ya da 3 değer bulunan listeler sunar. Bu listelere nokta listesi deriz.

2B Nokta listesi:

(34.5 27.3 ) ; x=34.5 ve Y=27.3 olan koordinatı temsil eder.

3B Nokta listesi:

(34.5 27.3 0.0) ; x=34.5, Y=27.3 ve Z=0.0 olan koordinatı temsil eder.

Herhangi bir Autocad nesnesini oluşturmak istediğinizde nokta listeleri oldukça işinize yarayacaktır.

(setq p1 (list 40 40))
(setq p2 (list 100 60))
(command “_.line” p1 p2 “”)

Bu örnek 40,40 noktasından 100,60 noktasına uzanan bir çizgi oluşturmak için kullanılır. Bu örnekteki gibi basit işler için şu ana kadar öğrendikleriniz yeterlidir. Ancak biraz daha karmaşık örnek yapmaya kalkarsak liste yönetmeyi bilmemiz gerekecektir. Örneğin kendi dörtgen çizme komutumuzu yapalım. Kullanıcıdan dörtgenin iki köşesini isteyebiliriz. Bunu (getpoint) ve (getcorner) fonksiyonları ile yaparız. Ancak bu iki fonksiyondan dörtgenimizin sadece çapraz iki köşesini elde edebiliyoruz. Bu değerler bize diğer iki noktayı hesaplamak için yeterlidir. Bu hesabı da liste yönetim fonksiyonları ile yapabiliriz. Şeklimize bir göz atalım:
 
  Şekil.1 Dörtgenin yapısı
 

Şekildeki p1 ve p3 noktasını kullanıcıdan alabiliyoruz. Diğer p2 ve p4 noktaları ise esasında:

p2(x) = p3(x), p2(y) = p1(y)

p4(x) = p1(x), p4(y) = p3(y)

düzenindedir. AutoLISP nokta listelerinin x, y ve z değerlerini (nth) fonksiyonu ile yakalayabileceğiniz gibi (car) (cadr) ve (caddr) fonksiyonları ile de yakalayabilirsiniz. Örneğin:

(car p1) p1 noktasının x değerini verir. Aynı işi (nth 0 p1) de görür.

(cadr p1) p1 noktasının y değerini verir. Aynı işi (nth 1 p1) de görür.

(caddr p1) p1 noktasının z değerini verir. Aynı işi (nth 2 p1) de görür.

Buna göre dörtgen çizen foksiyonumuz şöyle olacaktır:
 
  Kod.1 Dörtgen.lsp İndirmek için resme tıklayın
   
  Noktalı Çiftler (Dotted Pairs)
 

AutoLISP'te oluşturacağınız listeleri daha iyi organize etmenin bir diğer yolu da noktalı çiftler oluşturmaktır. BU aslında birbirinden nokta (.) ile ayrılmış liste çiftleridir. Soldaki elemanı çiftin adı, sağdakini de değeri olarak düşünebiliriz.

Örneğin;

((katmanAdi . “TAL_DUVAR” ) (cizgiKal . 0.5))

Listesi bir elemanın katman ve çizgi kalınlığı değerlerini saklar. Bir noktalı çirft oluşturmak için (cons) fonksiyonunu kullanmalısınız:

$_(cons ‘katmanAdi “TAL_DUVAR”)
(katmanAdi . “TAL_DUVAR”)

(cons) fonksiyonunu her kullandığınızda listenin sonuna bir noktalı çift daha ekler:

$_(setq a (cons ‘adi “Orhan”))
(adi . “Orhan”)
$_(setq a (list a (cons ‘soyadi “Toker”) (cons ‘yasi 35)))
((adi . “Orhan”) (soyadi . “Toker”) (yazi . 35))

Noktalı çiftlerin bir önemi de, Autocad nesnelerinin veri tabanına bu listelerle ulaşabilmenizdir. Autocad çizimdeki elemanlarının her birine bir ad <entity name> verir ve bu ada bağlı bir noktalı çift listesinde DXF kodlarıyla saklar. Örneğin bir çizgi elemanını (entget) fonksiyonu ile aldığınızda (nesne yönetimini daha ileride ele alacağız) aşağıdaki liste dönecektir.

((-1 . <Entity name: 7ef5efa0>) (0 . "LINE") (330 . <Entity name: 7ef5ecf8>) (5 . "EC") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 525.388 306.622 0.0) (11 865.626 500.565 0.0) (210 0.0 0.0 1.0))

   
  Noktalı Çift listelerinin içinde veri arama
 

Orta seviye ilk uygulamamızda ( UYGULAMA.1 ) bu nesne verisinden nasıl bilgi çektiğimizi inceleyebilirsiniz. Şimdi yukarıdaki noktalı çift listesinin ”el” değişkenine yüklü olduğunu düşünelim ve içindeki verilere ulaşmayı öğrenelim. Noktalı çiftlerden oluşan listelerde veri aramak, sıralamasını bilmediğimiz listelerde veri aramaktan daha kolaydır. (assoc) fonksiyonu bu işe yarar:

(setq nesneAdi (cdr (assoc 0 el)))

Yukarıdaki satır, “el” listesinin içinde soldaki değeri 0 olan çiftin sağdaki elemanının içeriğini sorgular. DXF kodlarında 0'ın nesne adını temsil ettiğini bilmeniz gerekir. DXF kodları da bu dersin konusu olmadığından daha fazla girmeyeceğim.
  (mapcar) kullanarak liste elemanlarını işleme tabi tutmak
 

(mapcar) fonksiyonu belirlediğiniz bir eşitliği tüm liste fonksiyonlarına uygular. Örneğin (1 2 3 4) diye bir listeniz var.

$_(mapcar ‘1+ ‘(1 2 3 4))
(2 4 5 6)

(mapcar) tüm liste elemanlarına (1+) fonksiyonunu uygulayarak tümünün değerini 1'er artırdı. Ya da yine (mapcar) ile: (T nil T T (= 3 3.0)) diye bir listeyi

$_(mapcat ‘null (T nil T T (= 3 3.0)))
(nil T nil nil nil)

ters çevirebilirsiniz.
 

Bu dersimde liste kontrol etmei ve bunun için kullanılan fonksiyonları ele almaya çalıştım. Fonksiyonlar için kullandığım örnekler en yaygın kullanımlarını açıklar. İleri seviye derslere geçtikçe bahsi geçen fonksiyonları çok daha etkili kullanacağız.

 

  (c) Copyright 2006 Taliasoft, by Orhan Toker