1372826956:AAFe2Py65GSQkfGiRnXuOQ-eD9yXcwMv988

AutoLISP Dersleri #6 – Sayılar

sekil-01

 

Matematiksel İfade Biçimi “Format”


AutoLISP matematik ifadelerini değerlendirmek için bir önek gösterimi kullanır. Eşitlik yazmanın normal yolu bir alt gösterim kullanmaktır. Matematik işlemlerinde normalde şayet iki sayıyı toplamak isterseniz, aşağıdaki gibi yazmanız gerekir:

1 + 2 = X

AutoLISP‘te bu ifadeyi aşağıdaki şekilde yazmalısınız:

(+ 1 2) ; bu ifade 3 olarak geri dönecektir

Bu andan itibaren bilmeniz gereken şey, AutoLISP‘te tüm listelerin bir fonksiyon ile başladığı ve listenin geri kalan elemanlarının bu fonksiyonun argümanları olduğudur. AutoLISP‘te matematik farklı değildir. Şayet iki sayıyı toplamak istiyorsanız, önce “+” olan fonksiyon ismini verirsiniz ve sonrasında toplamak istediğiniz sayıları verirsiniz ve matematiksel işlemler aynı şekilde gerçekleşir.

(/ 4 2) ; 2 olarak döner(* 4 2) ;8 olarak döner(- 4 2) ;2 olarak döner

Bu ifade tarzı ilk etapta kafa karıştırıcı gelse de zaman içerisinde kolaylıkla alışırsınız.

AutoLISP sayıları ve dizgeleri kullanan birçok yerleşik fonksiyona sahiptir. Rakamları & dizgeleri kullanmayı öğrenme AutoLISP‘te üretkenliğinizi arttırmaya yarayan en önemli şeylerden bir tanesidir. Yazacağınız programların birçoğu sayıları hesaplayacak ve kullanıcıya hesaplama sonucunu söyleyecektir.

Rakamlarla uğraşan AutoLISP fonksiyonları aşağıda listelenmiştir:

Ön tanımlı Matematiksel Fonksiyonlar


+ Toplama işlemcisi.

(+ 2 4) ; 6 olarak döner

Çıkartma işlemcisi.

(- 4 2) ; 2 olarak döner* Çarpma işlemcisi.(* 4 2) ; 8 olarak döner

/ Bölme işlemcisi.

(/ 4 2) ; 2 olarak döner

1+ Bir sayıya 1 ekler.

(1+ 2.0) ; 3 olarak döner

1- Bir sayıdan 1 çıkartır.

(1- 2.0) ; 1 olarak döner

min Verilen listedeki sayıların en küçüğünü elde eder.

(min 3 2 6 8) ; 2 olarak döner

max Verilen listedeki sayıların en büyüğünü elde eder.

(max 3 2 6 8) ; 8 olarak döner

abs Sayının mutlak değerini geri döndürür.

(abs 1) ; 1 olarak döner(abs -1) ; 1 olarak döner

sqrt Sayının karekökünü geri döndürür.

(sqrt 9) ; 3 olarak döner

exp değeri 2.71828 olan e sabitinin verilen üssünü hesaplar.

(exp 1.0) ; 2.71828 olarak döner(exp 2.0) ; 7.38905 olarak döner

expt Verilen sayının verilen üssünü hesaplar.

(expt 2 3) ; 8 olarak döner(expt 2 4) ; 16 olarak döner

log Verilen sayının doğal logaritmasını hesaplar.

(log 10) ; 2.30259 olarak döner(log 20) ; 2.99573 olarak döner

gcd Verilen iki tam sayının ortak bölenlerinin en büyüğünü (OBEB) bulur.

(gcd 12 24) ; 6 olarak döner

rem Verilen iki sayının bölümünden kalanı geri döndürür.

(rem 10 3) ; 1 olarak döner

sin Verilen sayının sinüs değerini radyan olarak geri döndürür.

(sin 90) ; 0.893997 olarak döner

cos Verilen sayının kosinüs değerini radyan olarak geri döndürür.

(cos 45) ; 0.525322 olarak döner

atan Verilen sayının arktanjant değerini radyan olarak geri döndürür.

(atan 45) ; 1.548578 olarak döner

Sayılar


Özel sayılar

Özel sayıların kullanımından mümkün olduğunca kaçınmak gerekir. Aslında özel sayıların diğer sayılardan bir farkları yoktur. İşin sıkıntılı kısmı düzgün çalışan bir programda daha sonra revizyonlar yapacağınız zaman ortaya çıkar ve kodun içerisinde her yerde ne oldukları hakkında bir fikrinizin olmadığı bir sürü rakam görürsünüz. Şayet sabitler için rakamlar yerine GÜZEL isimler kullanırsanız, bu sorun çözümlenmiş olacaktır. Sabitlerinize onları tanımlayan isimler vermenin önemli olduğunu unutmayın. Bu konuda PI güzel bir sabit isimlendirme örneği olup; size bu sabitin ne olduğunu tam olarak söyler.

Açılarda işlem yaparken sıkça kullanıldığı için, PI değeri AutoLISP‘te sabit bir sayıya karşılık gelmektedir. PI sayısının değerini elde etmek için, tek yapmanız gereken şey, formüllerinizin içerisine PI yazmaktır.

Tip Dönüşümleri

AutoLISP tam sayılar ve reel sayılar olmak üzere iki tip sayıya sahiptir. Tam sayı isminden de anlaşıldığı gibi tam olan sayılar olup; reel sayı ondalık kısmı olabilen sayılardır.

Bir tam sayı -2147483648 ile +2147483647 arasında herhangi bir sayı olabilir. Artı (+) işareti isteğe bağlı olup; önünde eksi (-) işareti olmayan her sayı pozitif olarak değerlendirilir.

Reel sayılar veya gerçel sayılar virgülden sonra 14 basamağa kadar olabilirler. Şayet reel sayı 1 den küçük ise, önüne sıfır (0) konarak yazılmalıdır. AutoLISP işlemcisi .4 şeklindeki yazımı kabul etmeyecektir. Bu yüzden 0.4 şeklinde yazılmalıdır.

Eşitliğinizde her iki tipi karışık olarak kullandığınız zaman, AutoLISP tipleri sizin için otomatik olarak dönüştürecektir. Ön tanımlı bir fonksiyon olan FIX fonksiyonu ondalık sayıyı bir tam sayıya çevirir. Bir tamamlayıcı fonksiyon olan FLOAT fonksiyonu ise, tam sayıyı ondalık sayıya çevirir.

Program yazarken genellikle ondalık sayılarla uğraşırsınız. Nokta verileri ondalık sayı olarak geri dönerler ve bu da dikkat etmemizi gerektirir. Sayıları kullanırken asıl problem sayıların tiplerinden emin olunmadığı zaman ve iki tam sayının işlem sonucunun tam sayı çıkmadığı durumlarda ortaya çıkar.

Şayet bölen bir tam sayı ise, sonuç tam sayı olarak geri döner. Fakat şayet bölen bir reel sayı olursa, sonuç ta reel sayı olarak dönecektir.

(/ 1 2) ; 0 olarak döner(/ 1 2.0) ; 0.5 olarak döner

Yukarıdaki örneklerde de görüldüğü üzere, tam sayı bölen bölüm sonucunun tam kısmını geri döndürür ve virgülden sonraki ondalık kısmı dikkate almaz. Bu bazen kullanışlı olsa da, bazen de aklınıza bile gelmeyecek sorunlara sebep olabilir. Bu tarz sorunları yaşamak için, en iyi yol tür dönüşümlerini kendinizin yapmasıdır.

Dizgeler


Dizge çift tırnak işaretleri (” “) arasındaki ASCII karakterleri grubudur. Dizgeler için bellek dinamik olarak ayrıldığı için, bir dizge en fazla bilgisayarın hafızası büyüklüğünde olmak üzere herhangi bir büyüklükte olabilir. Dizgelerdeki tek kısıtlama dizge sabitinin uzunluk olarak en fazla 132 karakter uzunlukta olabilmesidir. Daha sonra göreceğimiz STRCAT fonksiyonu kullanılarak daha uzun dizgeler birbirlerine bağlanabilirler. Dizgelerle çalışmak için, çok sayıda ön tanımlı fonksiyon vardır. Bunlar:

Ön tanımlı Dizge Fonksiyonları

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

angtof (angtof dizge [mod])(angtof “45.00” 0) ; 0.785398 olarak döner

ANGTOF fonksiyonu görüntülenme biçimlendirmesinde “format” bir açıyı gösteren dizgeyi belirlenmiş moda göre gerçel sayı “float” değerine çevirir. Geri dönen değer radyan olarak dönecektir. Mod argümanı dizgenin biçimlendirilmiş olduğu birimleri belirlemektedir.  Değer AUNITS sistem değişkeni tarafından kullanılan değerlerle uyumlu olmalıdır. Şayet mod argümanı kullanılmazsa, ANGTOF fonksiyonu AUNITS sistem değişkeninin o anki geçerli (aktif) ayarını kullanır. ANGTOF fonksiyonu ile kullanılması olası değerler aşağıda listelenmiştir:

Mod Değeri Dizge Biçimlendirmesi “Format”

0 Derece

1 Derece/Dakika/Saniye

2 Grad

3 Radyan

4 Saha birimi

ANGTOF fonksiyonu için veri girişi bir AutoCAD komutu için verilerin girildiği biçimde olmak zorundadır.

angtos (angtos açı [mod [hassasiyet]])(angtos 0.785398 0 4) ; “45.0000” olarak döner(angtos -0.785398 0 4) ; “315.0000” olarak döner

Radyan (reel sayı) birimindeki bir açı “mod” ve “hassasiyet” argümanlarında tanımlanan değerlere göre dizgeye çevrilir. ANGTOF fonksiyonuna uygulanan mod ve hassasiyet aynı kuralları takip eder. Yukarıda görünen mod tablosu kullanılabilir.

Şayet “mod” veya “hassasiyet” argümanı verilmezse, AutoLISP dizgeyi biçimlendirmek için, AUNITS ve AUPREC sistem değişkenlerinin o anki geçerli (aktif) değerlerini kullanacaktır.

Örneklerde sizin de gördüğünüz gibi, negatif değerler girilebilir ve pozitif açılara çevrilebilir. Açı çevirmelerinin (dönüşümlerinin) Temel açı “Angbase” ile ilişkili olduğunu unutmayın; yani şayet açıları çevirmeyi (dönüştürmeyi) denerseniz, açıyı doğru olarak çevirmek dönüştürmek için, Temel açı “Angbase” ile açınız arasına bir açı eklemek zorundasınız.

Şayet 4 numaralı modu (aha birimi) seçerseniz, UNITMODE değişkeni dizgeye çevirme (dönüştürme) işlemini etkileyecektir. Şayet UNITMODE değişkeni değeri 0 ise, (“N 45d E”) örneğinde olduğu gibi boşluklar dizgeye dahil edilecektir; şayet UNITMODE değişkeni değeri 1 ise, (“N45dE”) örneğinde olduğu gibi dizgede boşluk olmayacaktır.

read (read “sertan”) ; sertan dizgeleri olarak döner(read “(a b c)”) ; (a b c) listesi olarak döner(read “(a b c) (d)”) ; (a b c) listesi olarak döner(read “25.4”) ; 25.4 reel sayısı olarak döner(read “4”) ; 4 tam sayısı olarak döner(read “4 12.5”) ; 4 tam sayısı olarak döner

read fonksiyonu dizgeden elde edilen ilk listeyi veya atomu geri döndürür. Dizge liste içerisinde hariç olmak kaydıyla boşluk içeremez. Read fonksiyonu dizgeyi en yakın veri tipine dönüştürmeyi dener. Şayet hangi veri tipinde olduğunu belirleyemezse, fonksiyon hiçbir şey geri döndürmez.

strcase(strcase “dizge” [nasıl]) ; Şayet [nasıl] boş ise,;DİZGE;şayet [nasıl] boş değil ise, dizge olarak döner.(strcase “Dizge”) ; “DİZGE” olarak döner(strcase “Dizge”) ; “dizge” olarak döner

Yukarıdaki örnek kodlarda da görüldüğü üzere, dizge tüm karakterleri büyük veya küçük harfe dönüştürülerek döner. Şayet ” nasıl ” argümanı atlanırsa, tüm karakterler büyük harfe dönüştürülür. Şayet “nasıl” argümanı verilir ve boş olmayan bir şey olursa, STRCASE fonksiyonu karakterleri küçük harfe dönüştürür.

strcat (strcase “dizge1” “dizge2”); “dizge1dizge2” olarak döner

strcat fonksiyonu bir veya daha fazla dizgeyi birleştirerek geri döndürür. Birleştirmenin “Concatenation” ne olduğunu bilmeyenler için belirtelim; en basit anlamında birleştirme “concatenation” iki veya daha fazla sayıda dizgenin tek bir dizge olarak uç uca eklenmesidir.

strlen (strlen “dizge”) ; 5 olarak döner(strlen “dizge1” “dizge2”); 12 olarak döner

strlen fonksiyonu dizgenin karakter sayısını geri döndürür. Şayet birden fazla sayıda dizge verilirse, fonksiyon tüm dizgelerin karakter sayıları toplamını geri döndürür.

substr (substr “dizge” [başlangıç] [uzunluk])(substr “sertan” 4 3) ; tan olarak geri döner(substr “sertan” 3) ; rtan olarak geri döner

substr fonksiyonu bir dizgenin alt dizgelerini geri döndürür. [başlangıç] argümanı olarak tanımlanan karakterden başlar ve [uzunluk] argümanında tanımlanan sayıda devam eder. Şayet [uzunluk] argümanı tanımlanmazsa, fonksiyon [başlangıç] argümanında tanımlanan karakterden başlayarak dizgenin geri kalanını geri döndürür.

ascii(ascii “abc”) ; 97 olarak döner(ascii “ABC”) ; 65 olarak döner(ascii “a”) ; 97 olarak döner(ascii “A”) ; 65 olarak döner(ascii “Bite”) ; 66 olarak döner

ascii fonksiyonu dizgenin birinci karakterini ASCII karakter kodu karşılığına çevirerek geri döndürür.

atof(atof “25.4”) ; 25.4 reel sayısı olarak döner(atof “4”) ; 4.0 reel sayısı olarak döner

atof fonksiyonu dizgeyi reel sayı değerine dönüştürerek geri döndürür.

atoi(atoi “25.4”) ; 25 tam sayısı olarak döner(atoi “12.8”) ; 12 tam sayısı olarak döner

atoi fonksiyonu dizgeyi tam sayı değerine dönüştürerek geri döndürür.

chr(chr 66) ; “B” olarak döner(chr 65) ; “A” olarak döner

chr fonksiyonu ASCII karakter kodu ile belirtilen tam sayıyı tek karakterlik bir dizgeye dönüştürerek geri döndürür.

itoa(itoa 65) ; “65” olarak döner(itoa -23) ; “-23” olarak döner

itoa fonksiyonu bir tam sayıyı dizgeye dönüştürerek geri döndürür.

rtos(rtos sayı [mod] [hassasiyet])(rtos 24.375621 2 3) ; “24.375” olarak döner

rtos fonksiyonu bir reel sayıyı dizgeye dönüştürerek geri döndürür. Mod argümanı AutoCAD’deki LUNITS sistem değişkenine karşılık gelir. Hassasiyet argümanı ise, LUPREC sistem değişkenine karşılık gelir. Birim mod değerleri aşağıdaki gibi ayarlanabilir:

Mod Değeri Dizge Biçimlendirmesi “Format”

1 Bilimsel

2 Ondalık

3 Mühendislik (tam kısım fit ve ondalık kısım inç)

4 Mimari (tam kısım fit ve ondalık kısım kesir)

5 Kesir

Şayet birimleri atlarsanız, RTOS fonksiyonu dizgeyi biçimlendirmek için, LUNITS ve LUPREC sistem değişkenlerinin o anki geçerli (aktif) ayarlarını kullanır.

Dizge Düşünceleri

Dizgeler ile çalışmanızı biraz daha kolaylaştırmak için, bilmeniz gereken birkaç şey daha vardır:

  • AutoLISP içerisinde tanımlanan özel karakterler bulunmaktadır; bunlar dizgelerinizi daha iyi biçimlendirmede “format” kullanılırlar.
  • Bazı programcılar bunları “kontrol” karakterleri veya “kaçış” kodları olarak adlandırmaktadırlar. Bu “kontrol” karakterleri veya “kaçış” kodları dizge içerisinde herhangi bir karakter gibi kullanılabilirler; fakat bu özel karakterler iki karakterin birleşiminden oluşmaktadır.

Bunlar aşağıda listelenmişler:

\\ Ters-bölü karakteri

\” Çift tırnak karakteri

\e Escape ESC karakteri

\n Yeni satır karakteri

\r Satır başı karakteri

\t Tab karakteri

\nnn oktal kodu nnn olan karakter

Sizin de fark ettiğiniz gibi, tüm “kaçış” kodları ilk karakter olarak bir ters bölü (\) kullanır. Bu AutoLISP’te ters bölü (\) karakterini tek başına kullanamayacağınız anlamına gelmektedir. Şayet klasör yolları gibi bir dizgede ters bölü (\) karakterini kullanırsanız, ters bölü (\) karakteri dikkate alınmaz ve dizgedeki tüm karakterler bir araya getirilerek geri döndürülür. Aşağıdaki örnek bu durumu göstermektedir:

(setq path “c:\acad\lisp”) ; “c:acadlisp” olarak döner

AutoLISP programınız içerisinde bunu yapmamaya dikkat edin. Klasör yollarını girerken normal bölü (/) karakterini kullanın.

Uyarılar


Veri istemleri (Uyarılar) için dizgeleri kullanılacağı zaman, kodunuzu daha okunabilir yapmak için, yapabileceğiniz birkaç şey vardır. Veri istemlerinin (Uyarıların) biçimlendirmesi “format” birkaç şekilde yapılabilir.

Bu yolların tümü aynı çıktıyı verirler.  Bu yüzden kodunuzu kodun gerçek çıktısını mümkün olduğunca okunabilir yapacak şekilde yazmalısınız.

Şayet kullanıcıya bir veri isteminde (uyarıda) iki farklı eylem arasında seçim yapma hakkı tanıdı ve seçimin çıktısını iki farklı komut satırına koyduysanız, ekranınızda aşağıdaki gibi bir şeyler görürsünüz.

(prompt “\nLütfen yerleştirme noktasını tıklayarak seçin…\nveya çıkmak için Enter tuşuna basın.”)

Bu AutoLISP işlemcisi tarafından kabul edilebilir olacaktır; çünkü AutoLISP işlemcisi kodu ekrana görüntületecektir. Ekran aşağıdakine benzer şekilde görünecektir.

Command: Lütfen yerleştirme noktasını tıklayarak seçin…Command: veya çıkmak için Enter tuşuna basın.Command:

Bir satırı ekrana yazdırmanın daha iyi iki yolu aşağıdaki gibidir:

  • Ya:

(prompt “\nLütfen yerleştirme noktasını tıklayarak seçin…”)(prompt “\nveya çıkmak için Enter tuşuna basın.”)

  • Ya da:

(prompt (strcat “\nLütfen yerleştirme noktasını tıklayarak seçin…””\nveya çıkmak için Enter tuşuna basın.”))

Yukarıdaki her iki program kodu da ekrana aynı çıktıyı getirecek olup; ikinci program kodu daha okunabilir haldedir. Programınızın bilgi amaçlı veri istemlerini (uyarılarını) yazarken, dizge ve bilgileri çıktı olarak ekrana getirmek için, STRCAT fonksiyonunu birçok kez kullanmanız gerekecektir. Şayet nasıl kodladığınıza yeterince dikkat etmezseniz, STRCAT fonksiyonunu birçok kez kullanımı kafa karışıklığı yaratabilir.

(setq Val1 “Sertan”)(prompt (strcat “\n ” Val1 “isimli kişinin harika bir beyin olduğunu düşünüyorum!”))

Yukarıdaki örnek veri istemini (uyarıyı) kodlamanın bir şeklini göstermektedir. Fakat tekrar söylüyorum; siz daha iyi ve farklı yollar düşünebilirsiniz.

(prompt (strcat “\n Val1″isimli kişinin harika birisi olduğunu düşünüyorum!”))

 

İkinci yol daha fazla yazım gerektirmekte olup; şayet bu tarz veri istemlerini (uyarıları) çok fazla sayıda yapıyorsanız, hangi dizgelerin bir araya getirildiğini görmeniz açısından bu yöntemi daha kolay bulabilirsiniz. Dizgelerin içerisine daha fazla sayıda değişken getirdikçe bu yöntem daha da önem kazanacaktır.

Hakkında Sertan Türkan

AutoCAD Beyni

Bunu da Kontrol edin

Revitte Görüş Aralığını Kullanma (Video)

Revit’te bir modeldeki öğeleri düzgün şekilde görüntülemek için, Görüş Aralığının “View Range“ düzlemlerini ayarlayın. Bu …

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.