AutoLİSP NUTSHELL’in Temelleri – Kısım-4

AutoCAD‘deki Snap ayarları AutoLisp rutini ile hasara neden olabilir.

Bu nedenle, herhangi bir AutoLisp rutininin başında çıtçılanmayı kapatmanız ve yalnızca gerektiğinde açmanız çok iyi bir fikirdir.

Ekrandaki tıklama noktası izleri “blip” de çok sinir bozucudurlar; bu yüzden onları kapatın.

Lütfen, değiştirdiğiniz AutoCAD ayarlarını, rutinden çıkmadan önce orijinal durumlarına geri döndürmeyi unutmayın.

Haydi şimdi 3. Kısımda yazdığımız rutine bunları da ekleyelim:

(defun c: testbeam ()     ;fonksiyonu tanımlar

;***********************************************************************

;Sistem Değişkenlerini Kaydetme

(setq oldsnap (getvar “osmode”))     ; çıtçıt ayarlarını kaydetme

(setq oldblipmode (getvar “blipmode”))     ;tıklama izi “blipmode” ayarlarını kaydetme

;***********************************************************************

               ; Sistem Değişkenlerini KAPALI duruma Getirme

(setvar “osmode” 0)       ;Çıtçılanmayı KAPALI duruma getirme

(setvar “blipmode” 0)     ;Tıklama izi “blip” modunu KAPALI duruma getirme

;*********************************************************************************************************************************************** 

              ; Kullanıcı Verilerini Elde Etme

(setq lb (getdist “\nKiriş Boyu : “))        ;kirişin boyunu (uzunluğunu) elde etme

(setq hb (getdist “\nKiriş Yüksekliği : “))        ;kirişin yüksekliğini elde etme

(setq wt (getdist “\nGövde Kalınlığı : “))      ;kirişin gövde kalınlığını elde etme

(setq ep (getdist “\nUç plakası Kalınlığı : “))  ;uç plakanın kalınlığını elde etme

(setq nl (getdist “\nDiş Boyu : “))         ;diş boyunu elde etme

(setq nd (getdist “\nDiş Derinliği : “))         ;diş derinliğini elde etme

; Kullanıcı Verilerinin Sonu;*********************************************************************************************************************

               ;Yerleştirme Noktasını Elde etme

(setvar “osmode” 32)            ;Çıtçılanmayı AÇIK duruma getirme

(setq ip (getpoint “\nYerleştirme Noktası : “))     ;yerleştirme noktasını elde etme

(setvar “osmode” 0)              ; Çıtçılanmayı KAPALI duruma getirme

;**************************************************************************************

; Açısal (Kutupsal) Hesaplamaların Başlangıcı

(setq p2  (polar ip (dtr 180.0) (- (/ lb 2) nl)))

(setq p3  (polar p2 (dtr 270.0) wt))

(setq p4  (polar p2 (dtr 270.0) nd))

(setq p5  (polar p4 (dtr 180.0) nl))

(setq p6  (polar p5 (dtr 180.0) ep))

(setq p7  (polar p6 (dtr 270.0) (- hb nd)))

(setq p8  (polar p7 (dtr 0.0) ep))

(setq p9  (polar p8 (dtr 90.0) wt))

(setq p10 (polar p9 (dtr 0.0) lb))

(setq p11 (polar p8 (dtr 0.0) lb))

(setq p12 (polar p11 (dtr 0.0) ep))

(setq p13 (polar p12 (dtr 90.0) (- hb nd)))

(setq p14 (polar p13 (dtr 180.0) ep))

(setq p15 (polar p14 (dtr 180.0) nl))

(setq p16 (polar p15 (dtr 90.0) (- nd wt)))

(setq p17 (polar p16 (dtr 90.0) wt))

;Açısal (Kutupsal) Hesaplamaların Sonu

;**********************************************************

;Command Fonksiyonunun Başlangıcı

(command “Line” ip p2 p4 p6 p7 p12 p13 p15 p17 “c”

“Line” p3 p16 “”

“Line” p9 p10 “”

“Line” p5 p8 “”

“Line” p11 p14 “”

)        ;Command fonksiyonunu bitirme

;Command Fonksiyonunun Sonu

;**********************************************************               ; Sistem Değişkenini Sıfırlama

(setvar “osmode” oldsnap)                   ;çıtçılanmayı sıfırlama

(setvar “blipmode” oldblipmode)        ;tıklama izi “blip” modunu sıfırlama

;*********************************************************

(princ)     ;ekran temizlik işlemi

)              ; defun fonksiyonunu bitirme

;**********************************************************

;Bu fonksiyon derece birimlerini Radyan birimine çevirir.

(defun dtr (x)         ;fonksiyonu tanımlama

(* pi (/ x 180.0))    ;açıyı 180’ebölüp sonucu PI sabiti ile çarpma)             

;fonksiyonu bitirme

;**********************************************************

(princ)     ;ekranı temizleme

;**********************************************************

Programı yükleyin ve çalıştırın. Eğer daha önce sorun yaşadıysanız, şimdi sorunlar çözülmüş olmalılar. (Öyle olmasını umuyorum!!). Yerleştirme Noktası istemeden önce çıtçıtlanmayı nasıl açtığımızı fark ettiniz mi?Bu tabii ki, kullanıcının Yerleştirme Noktasına çıtçıtlanmasına izin vermeliyiz.Yine de başka bir sorunumuz var. Kullanıcı sıfır veya negatif bir sayı gibi geçersiz bir değer girerse, ne olur? Bu çok garip sonuçlar doğurabilir. Bunun için, (initget) fonksiyonunu kullanacağız.

(initget) fonksiyonunu şu şekilde çalışır:

(initget (+ 1 2 4))

(setq lb (getdist “\nKiriş Boyu : “))

Bu fonksiyon, “bitlerin toplamı” sistemi prensibi ile çalışır.

  • 1 = Kullanıcının “Enter” a basmasına izin vermez.
  • 2 = Kullanıcının “Sıfır” girmesini engeller.
  • 4 = Kullanıcının bir “Negatif Sayı” girmesini engeller.

Aynı fonksiyon aşağıdaki şekilde de yazılabilir:

(initget 7)

(setq lb (getdist “\Kiriş Boyu : “))        ;kirişin boyunu (uzunluğunu) elde etme

Şimdi bu fonksiyonu rutinimize ekleyelim:

(defun c:testbeam ()              ;fonksiyonu tanımlama

;********************************************************

               ;Sistem Değişkenlerini Kaydetme

(setq oldsnap (getvar “osmode”))         ; çıtçıt ayarlarını kaydetme

(setq oldblipmode (getvar “blipmode”))             ; tıklama izi “blipmode” ayarlarını kaydetme

;********************************************************

; Sistem Değişkenlerini KAPALI duruma Getirme 

(setvar “osmode” 0)              ;Çıtçıtlanmayı KAPALI duruma getirme

(setvar “blipmode” 0)           ;Tıklama izleri “Blip” modunu KAPALI duruma getirme

;********************************************************

               ; Kullanıcı Verileri ni Elde Etme

(initget (+ 1 2 4))                                                 ;kullanıcı verilerini kontrol etme

(setq lb (getdist “\nKiriş Boyu : “))                 ;kirişin boyunu (uzunluğunu) elde etme

(initget (+ 1 2 4))                                                 ;kullanıcı verilerini kontrol etme

(setq hb (getdist “\Kiriş Yüksekliği : “))         ;kirişin yüksekliğini elde etme

(initget (+ 1 2 4))                                                 ; kullanıcı verilerini kontrol etme

(setq wt (getdist “\nKiriş Gövde Kalınlığı : “))   ;kirişin gövde kalınlığını elde etme

(initget (+ 1 2 4))                                                 ;kullanıcı verilerini kontrol etme

(setq ep (getdist “\nUç plaka Kalınlığı : “))        ;uç plaka kalınlığını elde etme

(initget (+ 1 2 4))                                                 ;kullanıcı verilerini kontrol etme

(setq nl (getdist “\nDiş Boyu : “))                       ;diş boyunu elde etme

(initget (+ 1 2 4))                                                 ;kullanıcı verilerini kontrol etme

(setq nd (getdist “\nDiş Derinliği : “))                 ;diş derinliğini elde etme                               

;Kullanıcı Verileri Sonu

;*********************************************************************

               ; Yerleştirme Noktasını Elde Etme

(setvar “osmode” 32)            ;çıtçıtlanmayı AÇIK duruma getirme

(setq ip (getpoint “\nYerleştirme Noktası : “))    ;yerleştirme Noktasını elde etme

(setvar “osmode” 0)              ; çıtçıtlanmayı KAPALI duruma getirme

;********************************************************

               ;Açısal (Kutupsal) Hesaplamaların Başlangıcı

(setq p2  (polar ip (dtr 180.0) (- (/ lb 2) nl)))

(setq p3  (polar p2 (dtr 270.0) wt))

(setq p4  (polar p2 (dtr 270.0) nd))

(setq p5  (polar p4 (dtr 180.0) nl))

(setq p6  (polar p5 (dtr 180.0) ep))

(setq p7  (polar p6 (dtr 270.0) (- hb nd)))

(setq p8  (polar p7 (dtr 0.0) ep))

(setq p9  (polar p8 (dtr 90.0) wt))

(setq p10 (polar p9 (dtr 0.0) lb))

(setq p11 (polar p8 (dtr 0.0) lb))

(setq p12 (polar p11 (dtr 0.0) ep))

(setq p13 (polar p12 (dtr 90.0) (- hb nd)))

(setq p14 (polar p13 (dtr 180.0) ep))

(setq p15 (polar p14 (dtr 180.0) nl))

(setq p16 (polar p15 (dtr 90.0) (- nd wt)))

(setq p17 (polar p16 (dtr 90.0) wt))

;Açısal (Kutupsal) Hesaplamaların Sonu

;**********************************************************

               ; Command Fonksiyonu Başlangıcı

(command “Line” ip p2 p4 p6 p7 p12 p13 p15 p17 “c”

                  “Line” p3 p16 “”

                  “Line” p9 p10 “”

                  “Line” p5 p8 “”

                  “Line” p11 p14 “”

)        ;Command fonksiyonun bitişi               

; Command Fonksiyonu Sonu

;**********************************************************

; Sistem Değişkenlerini Sıfırlama

(setvar “osmode” oldsnap)    ;Çıtçıtlanmayı sıfırlama

(setvar “blipmode” oldblipmode)        ;Tıklama “blip” izlerini sıfırlama

;*********************************************************

(princ)     ;ekran temizlik işlemi)           

; defun fonksiyonu sonu

;**********************************************************

;Bu fonksiyon derece birimlerini Radyan birimine çevirir.

(defun dtr (x)         ;fonksiyonu tanımlama

(* pi (/ x 180.0))    ;açıyı 180’e bölüp sonucu PI sabiti ile çarpma

)              ;fonksiyonu bitirme

;**********************************************************

(princ)     ;ekranı temizleme

;**********************************************************

Artık, bir şey dışında her şey yolunda olmalı.

Tam olarak aynı değerlere sahip iki kiriş çizmek istersek ne olacak? Aynı rutini tekrar girip tam olarak aynı girdileri girmek zorunda kalacağız. Elbette, her değişkeni kullanılan son değere varsayılan olarak ayarlayabiliriz, ancak yine de tüm rutini çalıştırmalıyız. İşte daha iyi bir yol; tüm rutini bir while döngüsü içine alacağız. Aşağıdaki kodu inceleyin:

(defun c:testbeam ()    ;fonksiyonu tanımlama

;********************************************************

; Sistem Değişkenlerini Kaydetme

(setq oldsnap (getvar “osmode”))       ;çıtçıt ayarlarını kaydetme

(setq oldblipmode (getvar “blipmode”))        ; tıklama izi “blipmode” ayarlarını kaydetme

;********************************************************

; Sistem Değişkenlerini KAPALI duruma getirme

(setvar “osmode” 0)                ;Çıtçılanmayı KAPALI duruma getirme

(setvar “blipmode” 0)             ; Tıklama izleri “Blip” modunu KAPALI duruma getirme

;********************************************************

; Kullanıcı Verilerini Elde Etme

(initget (+ 1 2 4))        ;kullanıcı verilerini kontrol etme

(setq lb (getdist “\nKiriş Boyu : “))    ;kiriş boyunu (uzunluğunu) elde etme

(initget (+ 1 2 4))        ;kullanıcı verilerini kontrol etme

(setq hb (getdist “\nKiriş Yüksekliği : “))      ;kiriş yüksekliğini elde etme

(initget (+ 1 2 4))      ;kullanıcı verilerini kontrol etme

(setq wt (getdist “\nGövde Kalınlığı : “))               ;gövde kalınlığını elde etme

(initget (+ 1 2 4))      ;kullanıcı verilerini kontrol etme

(setq ep (getdist “\nUç plakası Kalınlığı : “))         ;uç plakası kalınlığını elde etme

(initget (+ 1 2 4))      ;kullanıcı verilerini kontrol etme

(setq nl (getdist “\nDiş Boyu : “))                           ;diş boyunu elde etme

(initget (+ 1 2 4))      ;kullanıcı verilerini kontrol etme

(setq nd (getdist “\nDiş Derinliği : “))                  ;diş derinliğini elde etme   

; Kullanıcı Verileri Sonu

;****************************************************************************   

;Yerleştirme Noktasını Elde Etme

(setvar “osmode” 32)                ;çıtçıtlanmayı AÇIK duruma getirme

(while         ; while döngüsü başlangıcı

(setq ip (getpoint “\nYerleştirme Noktası : “))       ;yerleştirme noktasını elde etme

(setvar “osmode” 0)                                                ;çıtçıtlanmayı KAPALI duruma getirme

;************************************************************************

; Açısal (Kutupsal) Hesaplamaların Başlangıcı

(setq p2  (polar ip (dtr 180.0) (- (/ lb 2) nl)))

(setq p3  (polar p2 (dtr 270.0) wt))

(setq p4  (polar p2 (dtr 270.0) nd))

(setq p5  (polar p4 (dtr 180.0) nl))

(setq p6  (polar p5 (dtr 180.0) ep))

(setq p7  (polar p6 (dtr 270.0) (- hb nd)))

(setq p8  (polar p7 (dtr 0.0) ep))

(setq p9  (polar p8 (dtr 90.0) wt))

(setq p10 (polar p9 (dtr 0.0) lb))

(setq p11 (polar p8 (dtr 0.0) lb))

(setq p12 (polar p11 (dtr 0.0) ep))

(setq p13 (polar p12 (dtr 90.0) (- hb nd)))

(setq p14 (polar p13 (dtr 180.0) ep))

(setq p15 (polar p14 (dtr 180.0) nl))

(setq p16 (polar p15 (dtr 90.0) (- nd wt)))

(setq p17 (polar p16 (dtr 90.0) wt))

; Açısal (Kutupsal) Hesaplamaların Sonu

;**************************************************************              

; Command Fonksiyonu Başlangıcı

(command “Line” ip p2 p4 p6 p7 p12 p13 p15 p17 “c”

                  “Line” p3 p16 “”

                  “Line” p9 p10 “”

                  “”Line” p5 p8 “”

                  “Line” p11 p14 “”

; Command fonksiyonun bitimi              

; Command Fonksiyonunun Sonu

;**************************************************************

(setvar “osmode” 32)            ;Çıtçıtlanmayı AÇIK duruma getirme)

; while döngüsü sonu

;**************************************************************              

; Sistem Değişkenlerini Sıfırlama

(setvar “osmode” oldsnap)                   ;Çıtçıtlanmayı sıfırlama

(setvar “blipmode” oldblipmode)        ; Tıklama izi “blip” modunu sıfırlama

;**************************************************************

(princ)     ;ekranı temizleme )             

;defun fonksiyonu sonu

;**********************************************************

;Bu fonksiyon derece birimlerini Radyan birimine çevirir.

(defun dtr (x)         ;fonksiyonu tanımlama

(* pi (/ x 180.0))    ;açıyı 180’ebölüp sonucu PI sabiti ile çarpma)             

;fonksiyonu bitirme;*****************************************

(princ)     ;ekranı temizleme

;****************************************************************************** 

Kullanıcı artık Enter tuşuna basana dek program sürekli kendini tekrarlayacak; Yerleştirme Noktası isteyecek ve bir kiriş çizecektir. (While) fonksiyonunun çalışma şekli şu şekildedir:

ifadenin sonucu boş “nil” olarak değerlendirilene kadar ifadeyi değerlendirilmeye devam edecektir. Kullanıcı bir nokta seçtiği sürece ifade doğrudur.

Fakat, kullanıcı “Enter tuşuna basarsa, ifade boş “nil” döndürür ve program döngüden çıkar. (AutoLisp “Enter” öğesini boş “nil” olarak değerlendirir)

Umarım bu makalemde anlatmaya çalıştıklarımı anladınız ve AutoLisp hakkında biraz daha fazla bilgi sahibi olmuşsunuzdur.

Hakkında Sertan Türkan

AutoCAD Beyni

Bunu da Kontrol edin

Revitte Sınır Çizgisi Özellikleri ile Eğim Hakkında

Sınır çizgilerinin özelliklerini değiştirerek eğimli bir yüzey oluşturabilirsiniz. Bu yöntemi aşağıdaki öğeler için kullanabilirsiniz: Çatılar …

Bir cevap yazın

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.