12 Eylül 2007 Çarşamba

tüm çizgileri POLYLINE yapma




; /////////////////////////////////////////////////////////////////
; ///
; /// Birleşebilen tüm çizgileri POLYLINE haline getirir
; ///
; /////////////////////////////////////////////////////////////////

(defun C:make_pl( / )
(princ "nElemanlari seciniz: ")
(setq sset (ssget))
; (setq sset (ssget "X" (list (cons 0 "LINE"))))
(setq adet (sslength sset))
(setq syc 0)
(repeat adet
(setq eleman (ssname sset syc))
(setq elmBlg (entget eleman))
(if (= (cdr(assoc 0 elmBlg)) "LINE")
(progn
(command "_PEDIT" eleman "Y" "JOIN" "ALL" "" "X")
)
)
(setq syc (1+ syc))
)
(princ)
)
(PRINC " --> 'http://cadlisp.blogspot.com/' Çizim yardımları yüklendi !")
Bu kodları nasıl kullanacağınızı bilmiyorsanız aşağıdaki linkten;
Mevcut kodlardan lisp dosyası oluşturmak
konusunu inceleyiniz.

Harita ve pafta koordinatları için karelaj yapan lisp




örnek :Harita ve pafta koordinatları için karelaj yapan lisp
Bu yazılımı denemek için önce bir dikdörtgen çiziniz.
Sonra yazılımı calıştırınız.

(DEFUN C:kare ( )
;;;;;;;;;;;;;;;;;;;;;;;AYARLAR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq a 2) ;koordinat yazısı büyüklüğü
(setq ax (* 2 a))
(setq ay (* 4 a))
(setq b 1) ;koordinat yazısının karelaj cizgisinden uzaklığı
(setq c 0) ;yazılacak yazının acısı
(setq d "red") ;renk
(setq e 5) ;karelaj cizgi uzunluğu
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,
(setq f (getdist "n karelaj yapılacak pafta boyutlarını (x yonün deki uzunlugu yazınız): "))
(setq g (getdist "n karelaj yapılacak pafta boyutlarını (y yonün deki uzunlugu yazınız): "))
(setq h (getdist "n karelaj aralığını yazınız: "))
(setq xyz (getpoint "cizimin sol alt köşesini tıklayınız"))
(setq x (car xyz))
(setq y (cadr xyz))
(setq z (caddr xyz))
(command "zoom" "w" (list (- x 10) (- y 10) 0) (list (+ x 10) (+ y 10) 0))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(command "layer" "m" "koordinat" "c" d "" "")
(setq i 0)
(setq j 0)
;;;;;;y yonu yazı;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(While (<>
(setq xay (- x ay))
(setq xyzyyonu (list xay (+ y i) 0))
(setq ykoor (cadr xyzyyonu))
(setq yazıy (rtos ykoor))

(command "text" "j" "mc" xyzyyonu a c yazıy)
(setq i (+ i h))
)
;;;;;;x yonu yazı;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(While (<>
(setq yax (- y ax))
(setq xyzxyonu (list (+ x j) yax 0))
(setq xkoor (car xyzxyonu))
(setq yazıx (rtos xkoor))

(command "text" "j" "mc" xyzxyonu a c yazıx)
(setq j (+ j h))
)
;;;;;;karelaj;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(command "layer" "m" "karelaj" "c" d "" "")
(setq i 0)
(setq j 0)
(While (<>
(While (<>
(setq karx (+ x j))
(setq kary (+ y i))
(setq karxy1 (list (- karx (/ e 2)) kary 0))

(setq karxy2 (list (+ karx (/ e 2)) kary 0))

(setq karxy3 (list karx (- kary (/ e 2)) 0))

(setq karxy4 (list karx (+ kary (/ e 2)) 0))

(command "line" karxy1 karxy2 "")

(command "line" karxy3 karxy4 "")
(setq j (+ j h))
)
(setq i (+ i h))
(setq j 0)
)
(command "layer" "m" "0" "")
(command "zoom" "p")
)
(PRINC " --> 'http://cadlisp.blogspot.com/' Çizim yardımları yüklendi !")
Bu kodları nasıl kullanacağınızı bilmiyorsanız aşağıdaki linkten;
Mevcut kodlardan lisp dosyası oluşturmak
konusunu inceleyiniz.

Mevcut kodlardan lisp dosyası oluşturmak

Bu sayfa AutoCAD 2002 ve daha üst versiyonlarda uygulanacak şekilde düzenlenmiştir.

Eğer lisp kodunu herhangi bir yerden kopyala yapıştır yöntemi ile almanız gerekiyorsa: önce kopyaladığınız kodu not defterinde yeni bir sayfa açarak bu sayfanın içine yapıştırın. Sonra bu sayfayı LSP uzantılı bir dosya adı vererek kaydediniz. (örnek: xxx.lsp) Sonra bu lispi uygun bir yere koyun. (örnek: C:/Lispler/xxx.lsp)

Oluşturduğunuz ve yerini bildiğiniz bu dosyayı AutoCAD in tanıması ve yüklemesi için:

Klavyeden "Appload" komutunu çalıştırarak veya PullDown menüden (Çekme menü) Tools > Autolisp > Load... 'ı seçerek Load/Unload Applications dialog kutusunu ekrana getirin.

Yüklemek istediğiniz AutoLISP dosyasını bulun, (örnek: C:/Lispler/xxx.lsp) Dosyanın üzerine tıklayarak etkkin (işaretlenmiş) hale getirin sonra Load butonuna tıklayarak dosyanın yüklenmesini sağlayın.

Yukarıda anlatılan yöntemle seçtiğiniz lisp bir defaya mahsus yüklenir. AutoCAD yeniden açıldığında bu lisp çalışmayacaktır.

Eğer lispi sürekli kullanmak istiyorsanız appload komutu ile yükleme yaparken farklı bir yol izlemeniz gerekir.

Lispi yükleyip sürekli kullanmak

Klavyeden "Appload" komutunu çalıştırarak veya PullDown menüden (Çekme menü) Tools > Autolisp > Load... 'ı seçerek Load/Unload Applications dialog kutusunu ekrana getirin.

Startup Suite bölümündeki Contents... butonunu tıklayın. Açılan Startup Suite penceresi AutoCAD in başlangıçta yükleyeceği uygulamaları gösterir. Bu pencereye dosyanızı eklemek için Add... butonuna tıklayın ve açılan Add File to Startup Suite penceresinde dosyanızı bulun (örnek: C:/Lispler/xxx.lsp) ve Add butonuna tıklayın. Dosyanız artık listede görünmektedir. Close butonuna tıklayarak Startup Suite penceresini kapatın. Load/Unload Applications dialog kutusunu kapatmak içinde Close a tıklayın. Eğer lisp bir açıklama içeriyorsa command satırında bu açıklama görünür. Eğer Lisp içinde bir hata varsa ; error: ile başlayan ve devamında lispteki hatayı açıklayan bir uyarı görürsünüz. Böyle bir uyarı çıkmazsa lispte hata yoktur.

Lispin sorunsuz yüklendiğini gösteren xxx.lsp successfully loaded. iletisi çıkarsa sorunsuz çalışan bir lispi hatasız yüklediniz demektir.

Artık lisp dosyanızın (Defun c:/yyy ( ) ile başlayan satırındaki yyy harf veya rakamlarını komut satırına yazarak lisp kodunu herhangi bir AutoCAD komutu gibi çalıştırabilirsiniz.

Yukarıda bahsedilen yyy 'yi lisp dosyasını çalıştıracak komut olarak düşünürsek, bunun sizin komut kısaltmalarınızla çakışmaması gerekmektedir. Eğer muhtemel bir çakışmaya neden olacaksa Lisp dosyasından c:yyy örneğindeki yyy kısmını türkçe karakter kullanmamak şartı ile değiştirebilirsiniz. Ve bu değiştirme işleminden sonra AutoCAD in komut satırına oraya yazdığınız komutu girmelisiniz.

Liste Fonksiyonları

;asagidaki kod 'lisp puzzle contest' odulunu alan Serge Volkov'a aittir.
(defun remove (expr lst)
(apply 'append (subst nil (list expr) (mapcar 'list lst))))
;Örnek :
(setq alist (list 1 2 3 4 5))
(remove 3 alist)
;Sonuc :
(1 2 4 5)

;;;çizimdeki layer'ların bir listesini verir.
;;;sonuç : ((açık layer listesi) (OFF layer listesi) (FROZEN layer listesi))
(defun layer_listesi( / elist OPEN_list OFF_list FROZEN_list durum)
(setq elist (tblnext "LAYER" T))
(while elist
(setq durum (cdr (assoc 70 elist)))
(cond
((or (= 1 durum) (= 2 durum)) (setq FROZEN_list (append FROZEN_list (list (cdr (assoc 2 elist))))))
((minusp (cdr (assoc 62 elist))) (setq OFF_list (append OFF_list (list (cdr (assoc 2 elist))))))
(t (setq OPEN_list (append OPEN_list (list (cdr (assoc 2 elist))))))
)
(setq elist (tblnext "LAYER" nil))
)
(list OPEN_list OFF_list FROZEN_list)
);_layer_listesi
; Örnek Kullanım:
(layer_listesi)
(("0" "layer1" "layer2") ("layer3") ("layer4" "layer5))
; layer_listesi fonksiyonunu çalıştırdığımızda elde edilen sonuca göre; "0","layer" ve "layer2" isimli layer'lar açık (OPEN), "layer3" isimli layer OFF, "layer4" isimli layer ise FREEZE durumundadir.

Visual Lisp'te listelerde siralama fonksiyonu olarak vl-sort kullanilir.
Örnek :
(setq liste1 (list 5 2 7 3 8))
(vl-sort liste1 '<)
Sonuc :
(2 3 5 7 8)
Burada vl-sort fonksiyonuna verdigimiz 1. parametre siralamak istedigimiz liste, 2. parametre de karşılaştırma fonksiyonudur. Burada karşılaştırma fonksiyonu olarak <> fonksiyonunu ya da kendi tanımladığımız başka bir karşılaştırma fonksiyonunu kullanabiliriz.

Ancak; elimizde, sayı çiftlerini içeren şöyle bir liste olsun:
(setq liste2 (list (list 15 7) (list 9 12) (list 38 4)))
((15 7) (9 12) (38 4))
Biz bu listeyi, sayi ciftlerinden 1.sine göre sıralamak isteyelim. Bunu vl-sort fonksiyonu ile yapmak istersek:
(vl-sort liste2 '<)
; error: bad argument type for compare: (38 4) (9 12)
gibi bir hata ile karşılaşırız. Çünkü karşılaştırma fonksiyonu olarak verilen < fonksiyonu; (38 4) ve (9 12) gibi bir yapıyı karşılaştırmak istemiş ve bunun mümkün olmadığını bildiren bir hata mesajını bildirmiştir.

Bunu aşmak için kendi karşılaştırma fonksiyonumuzu tanımlamamız gereklidir.
(defun karsilastir(a b)
(< (car a) (car b))
)
sonra yazdığımız fonksiyonu kullanarak vl-sort ile sıralayalım:
(vl-sort liste2 'karsilastir)
((9 12) (15 7) (38 4))

Aynı şeyi, yeni bir fonksiyon tanımlamak yerine lambda fonksiyonu ile yapabiliriz.
(vl-sort liste2
(function (lambda (a b)
(< (car a) (car b))
)
)
)
((9 12) (15 7) (38 4))
aynı sonucu elde ettik.
Burada; daha önce karsilastir ismiyle tanımladığımız fonksiyonu vl-sort içinde lambda fonksiyonu olarak tanımladık. Lambda fonksiyonunu kullanarak, bir daha işimize yaramayacak bir fonksiyonu (karsilastir fonk.) ayrıca tanımlamaktan kurtulduk ve yazdığımız kod daha okunur/anlaşılır bir kod oldu.
Lambda fonksiyonları Lisp programlama dilinin en güzel özelliklerinden biridir ve burada yalnızca basit bir kullanım örneği verilmiştir.

entmake fonksiyonu

;entmake ile line cizen fonksiyon..
(defun line_ciz (_bas _son _layer)
(entmake (list (cons 0 "LINE")
(cons 8 _layer)
(cons 10 _bas)
(cons 11 _son)))
)
Kullanımı :
(setq p1 (list 10.0 20.0 0.0)
p2 (list 30.0 40.0 0.0)
)
(line_ciz p1 p2 "deneme")

Yukaridaki kod, line_ciz() fonksiyonunu kullanarak (10,20,0) noktasindan (30,40,0) noktasina 'deneme' isimli layer'de bir çizgi çizer. Eger çizimde 'deneme' isimli bir layer yoksa otomatik olarak oluşturulur. Bu fonksiyon asagidaki kodla ayni isi yapar.
(command "LAYER" "M" "deneme" "")
(command "LINE" p1 p2 "")
Goruldugu gibi entmake fonksiyonunu kullanan line_ciz fonksiyonu cok daha kullanisli। Ayni zamanda entmake ile cizim yaparken layer degistirmeye gerek kalmiyor। Yani mesela "0" layer'indayken "deneme" layer'ina bir cizgi ekleyebiliyoruz. Cizgi cizmek icin "deneme" layer'ina gecip cizgiyi cizip tekrar "0" layer'ina donmemize gerek kalmiyor ve (command) fonksiyonundan daha hizli calisan bir kod elde etmis oluyoruz. Entmake ile yapilabilecekler line cizmekten ibaret degil elbette, bu fonksiyonla autocad'deki herhangi bir objeyi olusturabiliriz (layer, block, text, point , polyline vs.)

; entmake ile POINT çizen fonksiyon..
(defun point_ciz (_n _lyr)
(entmake (list (cons 0 "POINT")
(cons 10 _n)
(cons 8 _lyr)
)
)
)
Kullanimi :
(point_ciz (list 10,20,30) "deneme")
Sonuc : (10,20,30) noktasina "deneme" layr'inda bir POINT çizer।
;entmake ile ARC fonksiyon..

(defun arc_ciz(_merkez _ycap _to _tf _lyr)
(entmake (list (cons 0 "ARC")
(cons 8 _lyr)
(cons 10 _merkez)
(cons 40 _ycap)
(cons 50 (angle _merkez _tf))
(cons 51 (angle _merkez _to))
) )
);_arc_ciz
;Kullanımı :
(setq m (list 10 20 0) ;merkez noktasi
r 14.14 ; yaricap
bas (list 20 30) ;başlangıç noktası
son (list 24.14 20) ; bitiş noktası
)
(arc_ciz m r bas son "deneme")
;Sonuc :
;merkezi (10,20) baslangici (20,30) bitisi (24।14,20) noktalari olan 14.14 yaricapinda bir ARC'ı "deneme" isimli layer'da çizer.

;Fonksiyon Tanımı
(defun circle_ciz(_cm _cr _clyr)
(entmake (list (cons 0 "CIRCLE")
(cons 8 _clyr)
(cons 10 _cm)
(cons 40 _cr)
)
)
)
;Kullanımı :
(setq merkez (list 10 20)
ycap 5
)
(circle_ciz merkez ycap "deneme")
;Açıklama :
;Yukarıdaki kod, merkezi (10,20) noktası olan, 5 birim yarıçapında bir 'CIRCLE' nesnesini 'deneme' isimli layer'da olusturur.
;Not : nesneleri entmake fonksiyonunu kullanarak oluşturmak programa kolaylık ve hız katttğı gibi, örneğin 'OSMODE', 'CLAYER' 'CMDECHO' gibi sistem değişkenlerinden etkilenmediginden, nesneyi cizmeden once bunları ayarlayıp nesneyi çizdikten sonra tekrar eski haline getirmek gibi angaryaları ortadan kaldırır।

;Fonksiyon Tanımı:
;;;**********************************************
(defun layer-ekle(_ad _renk _cizgitipi _cizgikalinligi)
(if (null _renk) (setq _renk 7))
(if (null _cizgitipi) (setq _cizgitipi "Continuous"))
(if (null _cizgikalinligi) (setq _cizgikalinligi -3))
(if (not (tblobjname "LAYER" _ad))
(entmake (list (cons 0 "LAYER")
(cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbLayerTableRecord")
(cons 2 _ad)
(cons 6 _cizgitipi)
(cons 62 _renk)
(cons 70 0) ;_ layer state
(cons 290 1) ;_ plot flag
(cons 370 _cizgikalinligi) ;_ (enum) -3: Default, 0: 0.00 5: 0.05, 9:0.09,...
) )
);_if
);_layer-ekle
;;;**********************************************
;Kullanımı :
;;;**********************************************
(layer-ekle "deneme" 1 nil nil)
;;;**********************************************
;Açıklama :
; Yukarıdaki kod "deneme" isimli kırmızı renkli bir layer oluşturur. Oluşan layer'in çizgitipi default yani 'continuous', çizgi kalınlığı da default'tur.
; (cons 70 0) satırındaki değer oluşacak layer'in durumunu belirler (ON/OFF, FREEZE/THAW). bu değer ayarlanabilir hale getirilebilir. Ancak layer-ekle fonksiyonunda bu deger default, yani 0 olarak alınmıştır.
;Aynı şekilde (cons 290 1) satırı da Layer'in plot işlemine girip girmeyecegini belirler. Bu fonksiyonda bu deger de default olarak 1 alınmıştır. Yani Layer 'çizilecek'.
;çizgi kalınlığı parametresi de 'nil' olarak verilirse fonksiyon içinde default dğere ayarlanır (-3). 0.00 için 0, 0.05 için 5, 0.09 için 9,... verilir.
;Oluşturulmak istenen layer'in zaten mevcut olup olmadığı fonksiyon içinde kontrol edilir। Varsa bir işlem yapılmaz, yoksa oluşturulur.

entmake ile text yazdırmak
;;;Fonksiyon tanımı:
(defun text_ekle (_yazi _nokta _yuk _aci _yaslama _layer / _g72 _g73)
(setq CTEXTSTYLE (getvar "TEXTSTYLE"))
(cond ((= _yaslama "MR") (setq _g73 2 _g72 2))
((= _yaslama "ML") (setq _g73 2 _g72 0))
((= _yaslama "BC") (setq _g73 1 _g72 1))
((= _yaslama "TC") (setq _g73 3 _g72 1))
((= _yaslama "MC") (setq _g73 2 _g72 1))
((= _yaslama "C") (setq _g73 0 _g72 1))
((= _yaslama "BR") (setq _g73 1 _g72 2))
((= _yaslama "BL") (setq _g73 1 _g72 0))
((= _yaslama "TL") (setq _g73 3 _g72 0))
((= _yaslama "TR") (setq _g73 3 _g72 2))
(T (setq _g73 0 _g72 0))
) ;_ end of cond
(entmake (list (cons 0 "TEXT")
(cons 1 _yazi)
(cons 7 CTEXTSTYLE)
(cons 8 _layer)
(cons 10 _nokta)
(cons 11 _nokta)
(cons 40 _yuk)
(cons 50 (/ (* _aci PI) 180.0))
(cons 72 _g72)
(cons 73 _g73)
)
)
) ;_text_ekle
;;; Kullanımı :
(text_ekle "tolga" (list 10 20) 2.5 45.0 "BC" "deneme")
;;; Açıklama :
Yukarıdaki komut ; (10,20) noktasına, yuksekligi 2.5, açısı 45 birim olan 'Bottom Center' noktasına yaslamalı (Justified), 'deneme' layer'inda, 'tolga' yazısını yazar.

entmake ile LWPOLYLINE çizmek
;;;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;;; Fonksiyon Tanımı:
(defun lwpolyline_ciz(_noklist _kalinlik _acikkapali _lyr / _nvert _opts _ele)
(setq _nvert (length _noklist)
_opts (list (cons 0 "LWPOLYLINE")
(cons 8 _lyr)
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 _nvert)
(cons 70 _acikkapali)
(cons 43 _kalinlik))
)
(foreach _ele _noklist (setq _opts (append _opts (list (cons 10 _ele)))))
(entmake _opts)
);_lwpolyline_ciz
;;;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;;; Kullanım :
(setq plist (list (list 10 20) (list 30 40) (list 50 60)))
(lwpolyline_ciz plist 0.0 T "deneme")
;;; Sonuç :
ekrana (10,20) (30,40) ve (50,60) noktalarından geçen 0.0 kalınlıklı, kapalı ve "deneme" isimli layer'da bir lwpolyline çizer.

Autolisp'te tip dönüşümleri;

tamsayıdan yazıya dönüşüm için itoa kullanılır
(itoa 57) 57
(itoa i) i tamsayısını katara çevirir

yazıdan tamsayıya dönüşüm için atoi kullanılır
(atoi s) s katarını tamsayıya çevirir

yazıdan gerçel sayıya dönüşüm için atof kullanılır
(atof s) s katarını gerçel sayıya çevirir
(rtos x mod k) x gerçel değerini katara çevirir

mod değeri 1 ise sonuç E formatında
2 ise F formatında
k: desimal hane sayısı (tamsayı)
(rtos 314.567 2 1) 314.6
(rtos 314.567 1 3) 3.146E+02

Çok kullanılan autolisp komutları:

(prompt);
ekranın mesaj kısmına yazı yazmak için kullanılır. İfade formatı şu şekildedir:

(prompt) "yazı") örneğin (prompt "Bir nokta seç")

(prompt) fonksiyonu ile ayni işlem gören yani ekrana yazı yaıan (princ), (prin1) ve (print) fonksiyonları vardır. (princ) ve (prin1), yazıları tırnak içine alırlar; (print) ise yazıdan sonra boşluk bırakmaktadır.

(getpoint);
bir nokta seçilmesini ister. Nokta seçilinceye kadar ekranda hiç bir şey olmaz. Ancak Ekranda bir nokta gösterildiğinde, noktanın koordinatları mesaj bölgesinde görülür. Komut (setq) ile kullandığında, seçilen noktanın koordinatları (setq) ile belirlenen değişkene atanır; ayrıca ifadeye bir de mesaj eklenebilir. Örneğin:

(setq a (getpoint "Birinci noktayı seç"))

ifadede Birinci noktayı seç mesajı komut bölgesinde görülür ve nokta seçildikten sonra, noktanın koordinatları a değişkenine atanır. Bu şekilde noktanın koordinatları a değişkeninde saklanmış olur. Şöyleki Command: mesajına !a ile yanıt verilirse, noktanın koordinatları mesaj bölgesinde görünür.

(command);
tüm AutoCAD komutlarının kullanma imkanını sağlar; ayrıca takip eden değişkenler komuta aittir. Örneğin yukarıda b maddesindeki ifade ile Birinci noktanın koordinatları a değişkeninde saklanmış olsun. ikinci noktanın koordinatları aşağıdaki ifadeyle:

(setq b (getpoint "İkinci noktayı seç"))

b değişkenine saklansın. Bu durumda:

(command "line" a b)

ifadesi ile yukardaki mesajlarla koordinatları belli olan a ve b noktaları arasında bir çizgi çizilir. Çizgi çizildikten sonra line (çizgi) komutu geçerli kalır. Bu komutu bitirmek için son noktadan sonra, örneğin (command "line" a b "") şeklinde iki çift tırnak yazılır. Çizgi sadece iki nokta arasında değil, koordinaları bilinen bir çok nokta arasında çizilebilir; ayrıca "c" ile çizgi kapatılabilir. Örneğin:

(command "line" a b c d "c")

ifadeyle dört kenarlı bir çizim oluşturulur.

(getcorner);
(getpoint) fonksiyonuna benzemekle beraber esasen seçilen iki nokta arasında bir dikdörtgen oluşturur. Burada ilk nokta daha önce seçilir veya bir değişkene atanır ve ancak ikinci noktanın seçiminde (getcorner) kullanılır; bu durumda kursor ikinci noktaya hareket ettirildiğinde dikdörtgen lastik band şeklinde görünür. İfadeler şöyledir:

(setq pt1 (getpoint "Bir nokta seç"))
(setq pt2 (getcorner pt1 "başka bir nokta seç"))

(getreal);
bir a değişkenine klavyeden gerçek sayı bir değer atanmasını sağlar. İfade:

(setq a (getreal "Bir sayı gir"))

olup, Bir sayı gir mesajı göründükten sonra sayı girilir.

(getdist);
bir uzaklığı sayı olarak girmek veya ekranda iki nokta göstererek, verme imkanını sağlar. İfade şöyledir:

(setq a (getdist "Yükseklik gir"))

(getstring);
bir yazı girilmesini sağlar. İfade:

(setq a (getstring T "Yazı gir"))
şeklindedir. Burada Yazı gir mesajına bir yazı girilir ve daha sonra !a ile yazı tekrar mesaj bölümünde görülür. Buradaki T , dizgi içinde boşluk kullanılabileceği anlamına gelir. T yazılmadığı zaman girilen yazı içinde boşluk kullanılamaz.

(angle);
iki nokta arasındaki açı değerini ölçer. Burada önce noktalar belirlenir ve sonra açı ölçme ifadesi yazılır. İfadeler şöyledir:

(setq pnt1 (getpoint "Bir nokta seç"))
(setq pnt2 (getpoint "İkinci noktayı seç"))
(setq a (angle pnt1 pnt2))
(dtr a)

Burada pnt1 ile pnt2 noktalar arasındaki açı radyan olarak a değişkenine atanır; son ifadede, (dtr) programı yüklü ise, açıyı radyandan dereceye çevirir. Açının değerini görmek için !a girilir.

(distance);
iki nokta arasında uzaklığı ölçer; burada da ilkin noktaların belirlenmesi gerekir. Uzaklık ölçme ifadesi şöyledir:

(setq d (distance pnt1 pnt2))

(polar);
bir noktanın polar olarak, yani uzunluk ve açıya bağlı olarak koordinatlarının verilmesini sağlar. İfade şöyledir:

(setq a (polar pnt1 ang1 dst1))

(getangle), (getorient);
her iki fonksiyon iki nokta göstererek bir açının bulunmasını sağlarlar. İfade:

(setq a (getangle "Açıyı seç"))

şeklindedir. (getorient) her zaman 0 derece olarak East (Doğu); (getangle) ise 0 olarak güncel yönünü kabul etmektedir. Örneğin 0‘ın güncel yönü North (Kuzey) ise bunu alır. Bu fonksiyonda açılar klavyeden de girilebilir. Ancak açı derece olarak belirlenmişse, bu otomatik şekilde radyan olarak saklanır

(setvar);
AutoCAD'in Setvar komutu içinde bulunan sistem değişikliklerini ayarlar. İfade şöyledir:

(setvar "orthomode 1")

Kenetleme oluşturmak için:

(setvar "osmode" n)

ifadesi kullanılır. Burada n kenetleme şekline bağlı olan ve aşağıda verilen bir sayıdır.

Center 4 Endpoint 1 İnsert 64 Intersection 32
Midpoint 2 Nearest 512 Node 8 Perpend 128
Quadrant 16 Tangent 256 None 0

(ssget),
(entsel) fonksiyonları nesnelerin seçmesini sağlar. (entsel) bir defada bir tek nesne seçer; (ssget), Window (pencere) ve Crossing (kesişme) dahil olmak üzere çeşitli seçme yöntemlerini kullanarak bir defada bir nesne kümesi seçebilir. Pencere için ifade:

(setq a (ssget "W" pnt1 pnt2))

şeklindedir; kesişme kullanıldığı durumda W yerine C yazılır. Bu şekilde a değişkenine atanan ve adı olan bir seçim kümesi meydana getirilmiş olur. Bundan sonra bu kümeye nesne ile ilgili veriler dahil edilebilir. Bilindiği gibi AutoCAD'de her nesnenin entity type (nesne tipi), layer (tabaka), color (renk) vb. gibi oldukça geniş bir veri tabanı vardır. Bu veri tabanlarına birer kod verilmiştir şöyleki;

(ssget "x" ' ((0. "text")))

ifadesiyle seçilen nesnelerle ilgili tüm yazı veri tabanı seçim kümesine dahil edilmiş olur. Nesnelerle ilgili veri tabanı kodları şu şekilde tertiplenmiştir.

Entity type 0 Block 2 Line type 6 Text style 7 Color 62
Elevation 38 Layer 8 Thickness 39 Attributes 66
İf
(Koşul) olarak da bilinen bu ifadeler if-then-else üçlüsüne dayanmaktadır. AutoLisp'te bir if’e bir then karşılık gelmektedir. ifadenin formatı şu şeklindedir:

(if (xxx1 ) (xxx2) (xxx3))

Burada if’ten sonra xxx1 kontrol edilmesi gereken deyimdir; örneğin (= a b) şeklinde ifade edilen a=b eşitliği gibi. Eğer bu deyim doğru ise o zaman (then) xxx2 deyimi işlem görür; değilse (else) xxx3 deyimi işlem görür. Örneğin:

(setq a 6)
(setq b 9)
(if (= a b) (setq b "eşit") (setq b "eşit değil"))

programı yazılıp işleme konulursa, !b girildiğinde "eşit değil" sonucu görünür. if ifadesine (progn) fonksiyonu kullanılarak bir çok then (o zaman) atanabilir. Bu fonksiyon xxx1'den
sonra parantezsiz yazılır; eğer if ifadesi sona ererse (progn) parantez içine yazılır. (= a b) 'in yanısıra, şu lojik fonksiyonlar vardır.

(> a b) a b'den daha büyük
(<>= a b) a b'den büyük veya eşit
(and a b) a ve b; lojik bağlaç ve
(or a b) a veya b; lojik bağlaç veya
(not ..) lojik hayır
(listp a) a bir liste ise
(null a) a nil ise

Örneğin: (if (> (getvar "FILLETRAD") 0.25) (setvar "GRİDMODE" 0))
ifadesi, eğer getvar fonksiyonunun yuvarlatma yarıçapı (Filletrad) 0.25 ten daha büyükse, ızgara modunu (Gridmode) 0'a eşitle anlamına gelir. Burada aksine yani yuvarlatma çapı 0.25'ten daha küçük olduğu durumda ne yapılacağını belirtilmediği için, hiç bir işlem yapılmaz.

AutoLISP Dosyalarının Yapısı:

Bir LISP dosyası içinde tüm fonksiyonlar bir sol parantez " ( " ile başlar ve bir sağ parantez " )" ile biter. Parantezler kuralına uyuldukça bir fonksiyon içinde başka alt fonksiyonlar da bulunabilir. AutoLISP dosyalarının ilk satırları daima (defun ifadesiyle başlar. Bu AutoLISP'in en temel fonksiyonudur. Defun fonksiyonu kullanılmadan AutoLISP programı yazılamaz. AutoLISP, fonksiyonların veya değişkenlerinin yazılması veya derlenmesi sırasında büyük küçük harf ayrımı yapmaz.

Örnek:
(defun fonk.adı ( )
(sub.fonk1 (sub.fonk2))
) ; parantez sayısına dikkat ediniz.

Yukandaki örnekte görüldüğü gibi fonksiyon (defun ile başlamıştır. Sub.fonk olarak tanımlanan fonksiyonlar ana fonksiyon içinde kullanılan ve işlemleri yapan alt fonksiyonlardır. Bu alt fonksiyonlar genellikle, standart LISP fonksiyonları veya kullanıcıların tanımladığı fonksiyonlardır. Daha önce de belirtildiği gibi LISP dosyalarında dikkat edilmesi gereken en önemli hususlardan bir tanesi parantezlerdir. Özetle diyebilirim ki AutoLISP dosyasında "AÇILMIŞ OLAN PARANTEZ KADAR PARANTEZİN PROGRAM AKIŞINA GÖRE UYGUN YERLERDE KAPATILMASI ZORUNLUDUR."

Yazılan AutoLISP dosyaları AutoCAD ortamına çağrıldığında (bu işlem daha sonra detaylı olarak anlatılacaktır) daha önce de belirtildiği gibi AutoLISP tarafından değerlendirneye alınır. Bu değerlendirme dosya AutoCAD ortamında çalıştırılmaya başlanmadan hemen önce yapılır. AutoLISP değerlendiricisine EVULATOR adı verilir. Değerlendirme esnasında ekranda Command: alanında ; n> ifadesi görülürse (n bir tamsayıdır) n kadar sağ parantezin eksik olduğu anlaşılır.Yani açılan sol parantezler içinde n tanesi sağ parantez kullanılarak kapatılmamıştır. Bu hatayı düzeltebilmek için LISP dosyanıza dönerek n tane sağ parantezi uygun yerlere koymanız gerekir.

Bazen programın başında açılmış olan bir sol parantez programın sonlarına doğru kapatılabilir (Yukarıdaki örnekte olduğu gibi). Tabii ki bu parantezlerin yeri fonksiyonun işlevi ile bağlantılıdır.Fonksiyonlar içindeki ifadeler birden fazla satıra taşabilir ;

(prompt "BU YAZI BIR SATIRDAN FAZLA OLDUĞU İÇİN İKİNCİ SATIRA DA DEVAM EDEBİLİR. ÖNEMLİ OLAN AÇILMIŞ SOL PARANTEZLERİN SAĞ PARANTEZLER İLE KAPATILMASIDIR" )

Defun fonksiyonu ile program yazımına başlandıktan hemen sonra bu fonksiyon bir sağ parantez ile kapatılmaz. (defun ile başlayan ve ardından fonksiyon adının yazıldığı bu fonksiyon içinde, yapılacak işlemleri tanımlayan alt fonksiyonlar yer alır.

Örnek:
(defun toplama ( )
(setq A (getint "BİRİNCİ SAYIYI GİRİNİZ :" ))
(setq B (getint "İKİNCİ SAYIYI GİRİNİZ :" ))
(setq C (+ A B))
princ "nSONUÇ : " )
(princ C)
(princ)

Yukarıdaki örnekte ilk satır fonksiyonun başlangıç satırıdır. İkinci satır ile kullanıcıdan bir sayı girmesi istenir. Girilecek sayı tamsayıdır. Bu sayı A değişkenine atanır. Üçüncü satırda ikinci tamsayı istenir. Bu sayıda B değişkenine atanır. Dördüncü satırda ise girilmiş olan iki tamsayı toplama işlemine sokulur ve sonuç C değişkenine atanır. Beşinci satırda belirtilmiş olan fonksiyon sayesinde üçüncü satırda elde edilmiş olan sonuç ekranın komut alanına yazdırılır. Son satırdaki parantez ile de ilk satırda açılmış olan parantez kapatılır. Bu örnekte AutoLISP'in standart fonksiyonlarından olan setq ve princ fonksiyonlarının nasıl kullanılabileceğini görmüş olduk.

AutoLISP Nedir?

Asıl anlamda LISP, yapay zeka çalışmalarında kullanılan bir program dilidir. List Processing 'in (Liste işleme) kısaltılmış ifadesidir. AutoLISP ise LISP'in AutoCAD ile kullanılabilecek şekilde uyarlanmış halidir. AutoLISP sayesinde kullanıcının AutoCAD'e yeni komutlar eklemesi kişiselleştirmesi ve ondan artan bir verim elde etmesi mümkündür. Tabii ki yeni komutlar'dan kastedilen, kullanıcının AutoLISP fonksiyonlarını kullanarak hazırladığı program dosyalarını AutoCAD ortamından çağırarak kullanmasıdır.

AutoLISP dosyalarının ASCII dosyalar yaratabilen bir kelime işlemcide (text editor) hazırlanması ve uzantısının *.LSP olması bir zorunluluktur.

AutoLISP dosyaları aslında fonksiyonlardan meydana gelmektedir. Kullanıcı, bir takım standart fonksiyonları kullanarak veya kendisi çeşitli fonksiyonlar tanımlayarak yapmak istediklerini gerçekleştirir. Gerek standart fonksiyonlar gerekse kullanıcı tanımlı fonksiyonlar, değişkenlere değerler atanması, bu değerlerin AutoLISP tarafından değerlendirilerek sonuçlar elde edilmesi mantığına göre çalışır. AutoLISP programlarda büyük küçük harf ayrımı yapmaz.

Burada < > işaretleri arasında yer alanlar fonksiyona yazılacak değişkenleri .... ise ardışık girişleri temsil eder. , fonksiyona gerekli olan bir değer veya değeri önceden atanmış bir değişken olabilir.