|
Orhan Toker |
| 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:
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 Eşitlemelerini kullanırız. Bu eşitlikleri kullanırken de
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:
eşitlemesi yeterlidir. Böylece a değişkenine 5 8 3 “Deneme” ve 6.8 değerlerini yüklemiş olursunuz. Kullanmasına gelince
Ş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. 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:
3B Nokta listesi:
Herhangi bir Autocad nesnesini oluşturmak istediğinizde nokta listeleri oldukça işinize yarayacaktır. 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:
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: 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;
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) fonksiyonunu her kullandığınızda listenin sonuna bir noktalı çift daha ekler:
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.
|
|
| 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) 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 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 |