1372826956:AAFe2Py65GSQkfGiRnXuOQ-eD9yXcwMv988

AutoLISP Dersleri #7- Program Kontrolü

sekil-01

AutoLISP yazacağınız programlarınızı kontrol edebilmeniz için, birçok ön tanımlı fonksiyona sahiptir. Bu fonksiyonların bir kısmı ilişkisel işlemciler olarak adlandırılırken; bazıları da şartlı işlemciler olarak adlandırılırlar.

İlişkisel İşlemciler


Not: Köşeli parantezler ( […] ) arasındaki argümanlar isteğe bağlıdırlar.

=(= atom atom …)(= 3 2) ; Hiç bir şey geri dönmez

(= 3 3) ; Doğru “True” (T) olarak döner

(= 3 3 3) ; Doğru “True” (T) olarak döner

Atomlar listesinin sayısal olarak birbirlerine eşit olduklarını kontrol eder. Bu işlemci sayıların yanı sıra dizgeler için de çalışacaktır. Şayet eşit olduğunu bildiğiniz iki değerin herhangi bir fonksiyona girip sonucun eşit olarak dönüp dönmeyeceği konusunda kararsızlığa düşerseniz, “eq” veya “equal” fonksiyonunu kullanabilirsiniz.

/=(/= atom …)

(/= 3 2) ; Doğru “True” (T) olarak döner

(/= 3 3) ; Hiç bir şey geri dönmez

İki atomun sayısal olarak birbirlerine eşit olmadıklarını kontrol eder. Bu işlemci sayıların yanı sıra dizgeler için de çalışacaktır. Şayet “/=” işlemcisine ikiden fazla sayıda argüman verilirse, fonksiyon tanımsız olur.

(< atom atom …)

(< 3 2) ; Hiç bir şey geri dönmez

(< 2 3) ; Doğru “True” (T) olarak döner

(< 2 3 4) ; Doğru “True” (T) olarak döner

Atomlar listesinin sayısal olarak birbirlerinden küçük olduklarını kontrol eder. Şayet her bir atom sol tarafındaki atomdan küçük ise, bu fonksiyon Doğru “True” (T) olarak döner.

<=(<= atom atom …)

(<= 3 2) ; Hiç bir şey geri dönmez

(<= 2 3) ; Doğru “True” (T) olarak döner

(<= 3 3) ; Doğru “True” (T) olarak döner (> atom atom …)

(> 3 2) ; Doğru “True” (T) olarak döner

(> 2 3) ; Hiç bir şey geri dönmez

(> 3 3) ; Hiç bir şey geri dönmez

Atomlar listesinin sayısal olarak birbirlerinden büyük olduklarını kontrol eder. Şayet her bir atom sol tarafındaki atomdan büyük ise, bu fonksiyon Doğru “True” (T) olarak döner.

= (>= atom atom)

(>= 3 2) ; Doğru “True” (T) olarak döner

(>= 2 3) ; Hiç bir şey geri dönmez

(>= 3 3) ; Doğru “True” (T) olarak döner

eq (eq değer1 değer2)

İki ifadenin birbirlerine eş olduğunu kontrol eder. Bu fonksiyonun sonucunun Doğru “True” (T) olarak dönmesi için, her iki ifade aynı nesneye bağlı olmak zorundadır. Şayet ifadeler aynı nesneye bağlıysalar, fonksiyon Doğru “True” (T) olarak döner.

Örnekler:

(setq set1 ‘(a b c))

(setq set2 ‘(a b c))

(setq set3 set2)

Testler:

(eq set1 set3) ; Hiç bir şey geri dönmez.

;set1 ve set3 ;aynı listede değillerdir.

(eq set2 set3) ; Doğru “True” (T) olarak döner

;set2 ve set3 aynı listedelerdir.

equal

(equal değer1 değer2 [hassasiyet])

(equal 1.0000 1.0001) ; Hiç bir şey geri dönmez

(equal 1.0000 1.0001 0.001) ; Doğru “True” (T) olarak döner

equal fonksiyonu iki ifadenin aynı sonucu üretip üretmediğini belirler. Burada iki ifade birbirinin aynı olmak zorunda değildir. Önemli olan şey sonucun eş olup olmadığıdır.

İki sayı veya nokta listesi eş gibi görünseler de eş sonuçlar üretebilirler de üretmeyebilirler de.

Şartlı İşlemciler


if if test ifadesi then şunu_yap [else bunu_yap])

If fonksiyonu şartlı ifadeleri kontrol eder. Şayet ” test ifadesi ” boş olarak geri dönmezse, fonksiyon “şunu_yap” ifadesini icra eder; aksi durumda “bunu_yap” ifadesini icra eder.

while

(while test ifadesi şunları_yap …)

While fonksiyonu “test ifadesi” doğru “true” iken “şunları_yap” ifadesinde belirtilen eylemleri yapar. While fonksiyonu “test ifadesi” içerisinde verilenleri kontrol eder ve şayet “test ifadesi” doğru “true” ise, döngü içerisinde tanımlanan eylemleri yapar. Daha sonra fonksiyon “test ifadesi” içerisinde verilenleri tekrar kontrol eder;  şayet “test ifadesi” hala doğru “true” ise, döngüyü tekrar uygular. Bu işlem “test ifadesi” yanlış “false” sonucu üretene dek devam eder. Fonksiyon “test ifadesi” içerisinde verilen ifadeler yanlış “false” sonucunu geri döndürdüğü zaman döngüden çıkar.

cond

(cond (kontrol1 sonuç1 …) …)

Cond fonksiyonu şayet fonksiyon argümanı olarak verilen “kontrol1” ifadesi doğru “true” olarak hesaplanırsa, “sonuç1” ifadesini uygular. Bu fonksiyon argüman olarak istenen sayıda listeyi kabul eder. Fonksiyon sonuç yanlış “false” dönene dek her listenin ilk öğesini işleme alır. Sonuç olarak yanlış “false” haricinde dönüş olduğu zaman, “sonuç1” argümanı olarak verilen ifadeler yapılır.

Tahminler


Ayrıca programlarınızı kontrol etmede size yardımcı olacak doğrulama işlemcileri olarak bilinen işlemciler de vardır.

and

(and değer1 değer2 …)

İfadeler listesinin mantıksal AND fonksiyonu Doğru “True” (T) olarak döner. Şayet argüman listesindeki herhangi bir ifade hiçbir şey geri döndürmezse, bu fonksiyonun işlemleri sona erer ve hiç bir şey geri dönmez.

or

(or değer1 değer2 …)

İfadeler listesinin mantıksal OR fonksiyonu Doğru “True” (T) olarak döner. Bu fonksiyon ifadeleri soldan sağa doğru işleme alır ve boş haricinde bir değer üreten ifadeyi bulduktan sonra, fonksiyon sona erer ve doğru “true” (T) değerini geri döndürür.

atom

(atom ‘sembol)

Şayet sembol değişkeni bir atomu işaret ediyorsa, doğru “true” (T) olarak döner; aksi durumda hiçbir şey geri dönmez. Bu fonksiyon yukarıdaki örnekte sembol olarak verilen argümanı değerlendirir ve şayet bu argüman fonksiyon tarafından bir liste yerine herhangi bir şey olarak değerlendirilirse, doğru “true” (T) olarak döner. Liste olmayan her şey bir atom dur.

boundp

(boundp ‘sembol)

Şayet sembol kendisine bağlı bir değere sahipse, Doğru “True” (T) olarak döner. Şayet sembole hiçbir değer bağlı değilse, değer otomatik olarak boş yaratılır ve sembole bağlanır.

listp

(listp sembol)

Şayet sembol bir liste hesaplıyorsa, Doğru “True” (T) olarak döner; aksi durumda hiç bir şey geri dönmez.

minusp

(minusp sembol)

Şayet sembol sıfırdan (0) küçük bir sayı ise, Doğru “True” (T) olarak döner; aksi durumda hiç bir şey geri dönmez.

not

(not sembol)

Şayet sembol boş ise, Doğru “True” (T) olarak döner; aksi durumda hiç bir şey geri dönmez.

null

(null sembol)

Şayet sembole boş değer bağlıysa, Doğru “True” (T) olarak döner; aksi durumda hiç bir şey geri dönmez.

numberp

(numberp sembol)

 Şayet sembol bir tam sayı veya reel sayı ise, Doğru “True” (T) olarak döner; aksi durumda hiç bir şey geri dönmez.

zerop

(zerop sembol)

Şayet sembol bir tam sayı veya reel sayı ise ve sıfır (0) geri döndürüyorsa,  Doğru “True” (T) olarak döner; aksi durumda hiç bir şey geri dönmez.

IF Fonksiyonunu Kullanma


Programlamada en çok kullanılan kontrol ifadesi muhtemelen IF fonksiyonudur. IF fonksiyonu kafa karıştırıcı da olabilmektedir; ancak doğru kullanıldığında programlamayı çok daha kolay hale getirebilir. Programınız içerisinde IF şartlı ifadesini kullanırken uymanız gereken bazı kurallar vardır. Bu kuralların bir kısmı programınızı iyileştirmek için; bir kısmı da kodun mantığını daha kolay takip etmek içindir.

Bir IF şartlı ifadesi yazarken yapmanız gereken ilk şey, programınızda önce normal işleyişi yazmaktır. Şayet önce programın normal akışını yazar ve sonrasında kural dışı durumları kodlarsanız, kodunuzu daha sonra okuyanlar için programınız daha açık ve anlaşılır olacaktır.

(if (= kontrol1 doğruysa1)(bunu_yap1))

(if (= test2 doğruysa2)

(bunu_yap2))

Önce normal işleyişi yazarak ne yaptığımızı bilerek programın normal akışını okuyabiliriz. Daha sonra programın nasıl işleyeceğini bilerek, düşündüklerimizi kod olarak yazmamız daha kolay olacak ve istisna durumları kodumuzda belirtmek kolaylaşacaktır.

(if (= kontrol1 doğruysa1)

(bunu_yap1)

(değilse_bunu_yap1))

(if (= test2 doğruysa2)(bunu_yap2)

(değilse_bunu_yap2))

Program akışı için normal durum her zaman IF şartlı ifadesini takip etmelidir; şayet değilse “else” ifadesi sadece normal durum doğru “true” değilse, çalışmalıdır. Bu şekilde, programımız aslında gerçekleşmesini istediğimiz şeylere ulaşmak için istisna durumları kontrol etmek zorunda kalmaz.

Program yazarken izlememiz gereken diğer bir şey eşitlik kontrollerinde “If” ifadelerini doğru olarak kullanmaktır. Karşılaştırma yapmak için gerekli olan  <, >, <=, ve >= ifadelerini kullanırken dikkatli olmalısınız. Aslında <= ifadesini kullanmanız gereken yerde < ifadesini kullanmamalısınız. Bazen iki ifade arasındaki fark çok kolay gözden kaçabilir. Birçok “if” ifadesi değilse “else” argümanına ihtiyaç duyar; yani şayet bir “if” ifadesi yazar ve değilse “else” argümanına ihtiyaç olmadığını düşünürseniz, dikkatlice bir kez daha düşünün; değilse “else” argümanına ihtiyacınız olduğunu fark edebilirsiniz.

If & Boolean Fonksiyonları


Bazen test ifadesi olarak boolean fonksiyonu kullanılarak  “If” fonksiyonu basitleştirilebilmektedir. Boolean fonksiyonu ya doğru “true” (T) ya da yanlış “false” olarak dönen bir fonksiyondur. Şayet boolean fonksiyonu hiç bir şey geri döndürmezse, bu durum yanlış “false” olarak kabul edilir.

“and” ve “or” fonksiyonları haricindeki yukarıda verilen fonksiyonlar boolean tip fonksiyonlardır. Ayrıca, şayet ihtiyaç duyduğunuz boolean fonksiyon yerleşik olarak yok ise, kendi kendi boolean fonksiyonunuzu da yaratabilirsiniz.

Örneğin, şayet a & d harfleri arasında bir harf görmek istersem bu harfin büyük veya küçük harf olması önemli değilse, “if” ifadesini aşağıdaki gibi yazabilirim:

(if (or (and (< (ascii sembol) 69)(> (ascii sembol) 64))

(and (< (ascii sembol) 101))

(> (ascii sembol) 96)))

(bunu_yap))

Veya bu kodu aşağıdaki gibi de yazabilirim.

(if (btwn_a_d)

(bunu_yap))

Daha sonra dizgede a & d harfleri arasında bir (küçük veya büyük) harf olup olmadığını kontrol eden bir boolean tip fonksiyon yazabilirim. Sizin de gördüğünüz gibi, fonksiyonu ikinci şekilde yazmak çok daha açık ve anlaşılırdır. Ayrıca fonksiyonumu bu şekilde yazdığım zaman, veri girişinin başka bir veri tipi değilde bir karakter olduğundan emin olmak için fonksiyonu kontrol etmek için, bir kod da ekleyebilirim.

Şartlı İfadeler


AutoLISP’te şartlı fonksiyon temel ifadedir. Durum ifadesi bir satırdaki tüm “if” ifadelerini üst üste dizmek gibi olmalıdır. Aslında kodunuzu bu şekilde yazma sayesinde kodunuza göz kulak olmuş da olursunuz. Şayet kontrol modülünüz bir “if” ifadeleri bütününe dönüşmeye başlıyorsa, her şeyi bir şartlı ifadeye dönüştürme zamanı gelmiş demektir.

Yukarıda açıkladığım boolean ifadeleri hakkındaki tüm durumlar aynı şekilde şartlı ifadelere de uygulanabilir. Kodunuzda her zaman doğru “true” veya yanlış “false” olan kontrol ifadeleri oluşturmaya çalışmalısınız. Şayet ifade kolayca doğru “true” veya yanlış “false” olarak değerlendirilebilen bir ifadeyse, bunu kontrol etmek için, bir boolean fonksiyon yazılabilir. Böylece kodunuzun okunması daha kolaylaşır ve kodunuz daha anlaşılır olur.

Bir şartlı ifadeyi açık tutmanın en iyi yolu durumları basit tutmaktır. Bununla kontroller için, boolean fonksiyonları kullanmanız gerektiğini kastediyorum.

(cond

((karakter sembolü) (print sembol))

((sayısal sembol) (* sembol 2)))

Yukarıdaki örnek çok kısa olsa da boolean fonksiyonların nerede kullanılması gerektiği ile ilgili fikir verdiğini düşünüyorum. Yukarıdaki kod çok açık olup; okunup anlaşılması kolaydır.

Şartlı ifadenin sonuna tüm diğer durumların yanlış olması durumunda işleme alınacak olan bir ön tanımlı durum koyabilirsiniz. Buraya hata yakalama işlemini başlatacak olan istediğiniz herhangi bir kodu koyabilirsiniz. Genelde, hiçbir durum çalışmazsa, bir şeyler yanlış demektir ve bunu düzeltmek için, bir şeyler yapılmalıdır. Şartlı ifadenin son listesinin çalışmasını zorlayarak şartlı ifadenin doğru “true” (T) sonucunu döndürmesi için, ön tanımlı bir ifade yaratabilirsiniz. Aşağıdaki örneği inceleyin:

(cond

((karakter sembolü)

(print sembol))((sayısal sembol)

(* sembol 2))

(T (fix_error))

Çok fazla sayıda şartlı ifade kullanmamaya çalışın; bunlar kodunuzda gerçekten karışıklık yaratabilirler. Değişken değerlerini depolamak ve şartlı ifadenin doğru “true” (T) olması halinde durum değerlendirmesinden sonra bu değerleri atamak için listeleri kullanmalısınız. Hangi durum gerçekleştikten sonra fonksiyonun çalışacağını belirlemek için, şartlı ifadeler kullanın. Değişkenlere atanmayan durumları kontrol etmek için, şartlı ifadeler kullanılmalıdır.

Hakkında Sertan Türkan

AutoCAD Beyni

Bunu da Kontrol edin

Revitte Plan Görünüşünün Derinliğini Ayarlama Hakkında

Revit’te bir modelin parçalarını kesme düzleminin altında görüntülemek için, Derinlik Kırpma “Depth Clipping“ parametresini kullanın. …

Bir cevap yazın

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Yardıma mı ihtiyacınız var? Chat with us
Bir görüşme başlatmak için lütfen önce gizlilik politikamızı kabul edin.