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

  DERS.5 Kullanıcı giriş fonksiyonları
Seviye: Orta Kaynaklar: Autodesk, VisualLISP IDE Help file

 


 

Merhabalar,

Bu dersimizde kullanıcıdan veri toplamanın yollarını öğreneceğiz. Autocad ile çizim yaparken kullandığımız komutlar bizden çeşitli verileri girmemizi ister. Örneğin bir çember çizerken AutoCAD sizden merkez noktasını ve yarıçapı soracaktır. Siz de AutoLISP ile program geliştirirken kullanıcıdan bir çok kez veri girmesini isteyeceksiniz. Aşağıda kullanıcıdan girmesini isteyebileceğiniz veri tiplerini ve hangi fonksiyonla bu veririn toplanacağını gösteren tabloyu göreceksiniz.

İstenen Veri Tipi
Açıklama
Giriş Fonksiyonu
Sayısal değer Herhangi bir reel ya da tamsayı sayısal değer. (getint [mesaj])
(getreal [mesaj])
Açı Autocad açı değeri almak için. (getangle [nokta] [mesaj])
Diğer köşe Bir noktadan referans alarak diğer bir köşe almak için kullanılır. Dönüş değeri nokta listesidir (getcorner nokta [mesaj])
Mesafe Bir uzaklık değeri girişi için kullanılır (getdist [nokta] [mesaj])
Seçenek Kullanıcıdan bir seçenek girmesi için kullanılır. (getkword [mesaj])
Nokta Kullanıcıdan nokta girişi istemek (getpoint [nokta] [mesaj])
Dize Kullanıcıdan alfanümerik bir giriş istendiğinde kullanılır (getstring [cr] [mesaj])
Tablo.1 Kullanıcı giriş fonksiyonları

Şimdi bu fonksiyonları birer örnekle kısaca inceleyeceğiz.

  (getint) ve (getreal) fonksiyonları
 

Bu fonksiyonlar kullanıcıdan reel ya da tamsayı girişi istendiği zaman kullanılır. Örnekle

(setq (getint "\nKaç adet kat kopyalayacaksınız?:"))

(setq a (getint "\nKaresini almak istediğiniz sayı?:"))
(princ (* a a))

(setq kot (getreal "\nLütfen 1.Kat kotunu girin:"))

Gördüğünüz gibi (getint) ve (getreal) fonksiyonları ile birlikte kullanıcıdan veri girişi istemek için bir açıklama mesajı da girebiliyoruz.

Önemli: AutoLISP programlarınızda kullanıcıdan veri girişi esnasında yazacağınız mesaj kullanıcıyı yönlendireceği için çok önemlidir. Eğer kullanıcıdan, nokta, açı, mesafe gibi standart Autocad verileri istiyorsanız mesajınızın da Autocad mesaj standardında olması gerekir. Elbette tüm veri girişi mesajlarınızın da belli bir uslüpta olması tercih edilir. Mesajın başına koyduğunuz "\n" kodu mesajınızın yeni satırda çıkmasını sağlar.

  (getangle) ile açı girişi
 

Kullanıcıdan açı girmesini istiyorsanız bu fonksiyonu kullanırsınız. (getangle) fonksiyonu isteğe bağlı iki adet argüman kullanır:

(getangle [nokta] [mesaj])

Nokta argümanını girerseniz girdiğiniz nokta referans alınarak açı girişi yaptırırsınız. Bu fazlaca kullanılam bir metot değildir. Biz ikisine de örnek verelim.

(setq aci (getangle "\nAçıyı girin:"))

Kullanıcının yaptığı açı girişini aci değişkenine radyan olarak girer. Radyanı dereceye çevirmek için

(* 180.0 (/ aci pi))

(setq aci (getangle (getvar "LASTPOINT")) "\nYönü girin: "))

İkinci örneğimiz girilen son noktadan yön tayini istiyor.

  (getcorner) ile diğer köşeyi tayin etmek
 

Bazı durumlarda kullanıcıdan bir çerçeve tayin etmesini isteyebilirsiniz. Örneğin kendi dikdörtgen rutininizi yazıyorsunuz ya da seçim penceresini önceden tayin ettirmek istediniz. İşte böyle durumlarda (getcorner) çok yararlıdır. Lafı uzatmayalım kendi dikdörtgen rutinimizi yazalım.


Resmin üzerine tıklayarak dortgen.lsp dosyasını indirebilirsiniz.

Bu kodu Autocad vlisp komutu ile açtığınız VisualLISP editöründe oluşturun ve dortgen.lsp diye kaydedin. Sonra CTRL+ALT+E tuşlarına basarak projeyi Autocad'e yükleyin. komut satırından dortgen yazdığınızda dikdörtgen çizen komutunuz işlemiş olacaktır. Bu projede kullandığım car, cadr ve list fonksiyonlarını ileriki derslerimde açıklayacağım. Burada mühüm olan (getpoint) ve (getcorner) fonksiyonlarını nasıl kullandığımıza dikkat etmenizdir.

Önemli:Dikkat ederseniz aynı (setq) eşitleme fonksiyonu içerisinde dikdörtgenimizin her iki köşesini de kullanıcıdan almış oldum. Yani (setq) eşitleme fonksiyonunu aynı anda birden fazla değişkenin değerini eşitlemek için kullanabilirsiniz. Kodlama sırasında hizalamaya dikkat edin yeter.

Ayrıca c:dortgen fonksiyonumu tarif ederken başına koyduğum "c:" öneki bunun bir Autocad komutu gibi çalışasını sağlayacaktır. Bu ön eki koymadığınızda komut satırından diğer lisp fonksiyonlarını çağırdığınız gibi çağırırsınız.

Command:(dortgen)

Fonksiyon tanımında (/) işaretinden sonra tanımladığım değişkenler sadece fonksiyon içinde lokal olarak tanımlandıklarını gösterir.

  (getdist) ile mesafe girişi yaptırmak
 

(getdist) fonksiyonunu kullandığınızda, kullanıcı direkt bir değer girerek, iki nokta belirleyerek, ya da bir noktadan referans alarak mesafe girebilir. (getdist) fonsiyonu ilk girilen noktadan sonra, Autocad'in her türlü nokta belirleme yöntemini kullarak diğer bir nokta girmenizi bekler. Bu bekleme esnasında 1. noktadan kursörünüzün ucuna bir ipcik çizecektir.

(setq mesafe (getdist "\nMesafeyi girin:"))

  (getkword) ile kullanıcıdan seçenek belirlemesini istemek.
 

Bazı durumlarda kullanıcıdan komut satırı aracılığı ile seçenek isteyebilirsiniz. Buna örnek olarak Autocad CIRCLE komutunu verebiliriz.

Command: circle
Specify center point for circle or [3P/2P/Ttr (tan tan radius)]:

 

Yukarıdaki örnekte [3P/2P/Ttr (tan tan radius)]: birer seçenektir. Kendimiz bir örnek yapalım. Sorduğumuz soruya sadece "Evet" ya da "Hayır" yanıtını giriş olarak kabul eden kod:

(initget 1 "Evet Hayır")
(setq cevap (getkword "\nKomut çizimdeki tüm nesneleri silsin mi? [Evet Hayır] : "))

Yukarıdaki kod kullanıcıdan sadece "Evet" ve "Hayır" yanıtlarını kabul edecektir. (initget) fonksiyonu veri girişlerini önceden koşullandırmaya yarar. Bu fonksiyonu gelişmiş derslerimizde daha ayrıntılı ele alacağım.

  (getpoint) ile kullanıcıdan nokta istemek
 

Kullanıcının tek bir nokta girmesini istediğinizde (getpoint) fonksiyonunu kullanabilirsiniz. Kullanıcının vereceği nokta yanıtı tüm Autocad nokta tayin etme yöntemleri olabilir.

(setq pt1 (getpoint "\nDörtgenin 1.köşesini tıklayın:"))

Yukarıdaki dortgen.lsp örneğimizde bu fonksiyonu zaten kullanmıştık.

  (getstring) ile kullanıcıdan dize girişi istemek.
 

Özellikle etiket ya da mahal adları dolduran rutinlerinizde sıklıkla kullanacağınız bir fonksiyondur. Kullanımı:

(getstring [cr] [mesaj])

cr argümanı ENTER ya da boşluk karakterini kabul edip etmeyeceğinizi belirler. nil ise boşluk karakteri giremezsiniz.

(setq mahalAdi (getstring "\nMahal adını girin:"))
(setq mahalAciklamasi (getstring T "\nMahal açıklamasını girin:"))

Örnekte görüldüğü gibi, isimde boşluk kabul etmezken, açıklamada boşluklara müsade ediyoruz.

  Alıştırmalar
 

Kendi kendinize yapabileceğiniz alıştırmalar:

  • (getpoint) kullanarak Autocad çizgi komutunu taklit edin.
  • (getdist) ve (getangle) kullanarak polar koordinat sistemi ile çizgi çizdirin. @mesafe<açı
  • (getpoint) ve (getdist) kullanarak merkez/yarıçap çember çizdirin.

 

  (c) Copyright 2006 Taliasoft, by Orhan Toker