1372826956:AAFe2Py65GSQkfGiRnXuOQ-eD9yXcwMv988

AutoLISP Öğreticisi-Sistem Değişkenleri ve COND İfadesi

Sekil-01

Önceki AutoLISP Alıştırması- Blokları ve IF İfadesini Kullanma isimli makalemizde IF ifadesinin kullanımını öğrenmiştik. AutoLISP’te AutoCAD bloklarını kullanmanın faydaları çoktur. AutoLISP programımızı daha az karmaşık yapmak için, bloklar gibi tekrar kullanılabilir içeriklerimizi kullanabilir ve AutoCAD’de kendi çizim standardımızı oluşturabiliriz. Bu makalemizde diğer bir şartlı ifade olan COND ifadesinin kullanımını öğreneceğiz. Ayrıca AutoLISP’te en önemli konulardan biri olan AutoCAD sistem değişkenlerine de değineceğiz.

Bu AutoLISP öğreticisindeki programımızda bir etiket çizgisi çizecek ve bu çizginin ucuna etiketimizi otomatik olarak yerleştireceğiz.

Başlamadan önce, kullanacağımız bu dosyayı indirin. Rar dosyasının içerisinde dört adet AutoCAD DWG dosyası vardır; her bir dosya (sağdan, soldan, yukardan ve aşağıdan olmak üzere) dört farklı yönden etiketleme yapmak içindir. Hangi AutoCAD bloğunu kullanmamız gerektiğini seçmek için COND ifadesini kullanacağız. Bu öğreticide anlattıklarımı tam olarak kavrayabilmeniz için, önceki öğreticimizde ne yaptığımızı öğrenmiş olmalısınız. Yani henüz okumadıysanız ya da hafızanızı tazelemek istiyorsanız, AutoLISP Alıştırması- Blokları ve IF İfadesini Kullanma isimli önceki öğreticimizi mutlaka okumalısınız.

Sekil-02

COND İfadesini Kullanma

COND ifadesi IF ifadesinden biraz farklıdır. IF İfadesini kullandığınız zaman, AutoCAD’e şart sağlandığında A işlemini yapmasını; şart sağlanmadığında ise, B işlemini yapmasını söyleyebiliyordunuz. COND ifadesi ise sadece şart sağlandığı zaman bazı işlemleri yapmasını söyleyecektir.

COND İfadesinin Temel Kullanımı

COND ifadesinin temel kullanımı şöyledir:

((COND şart a) (şart a sağlandığında işlemi yap)

((COND şart b) (şart b sağlandığında işlemi yap)

((COND şart c) (şart c sağlandığında işlemi yap)

ve bunun gibi…

)

Şimdi bizim örneğimizde COND ifadesi ile neler yapabileceğimize bakalım.

(cond
((AND (= pt1x pt2x) (> pt1y pt2y)) (setq gridblockname “vgridbottom”)) ;şart sağlandığında, blok ismini değiştir
((AND (= pt1x pt2x) (< pt1y pt2y)) (setq gridblockname “vgridtop”))

((AND (> pt1x pt2x) (= pt1y pt2y)) (setq gridblockname “hgridleft”))
)

Önce, blok ismini HGRIDRIGHT olarak ayarlayalım. Bu bloğu etiket çizgisini yatay doğru çizdiğimiz zaman, kullanacağız. Fakat etiket çizgisini düşey olarak çizdiğimiz zaman, VGRIDBOTTOM isimli bloğu kullanmalıyız.

etiket çizgisini düşey olarak çizdiğimiz zaman, sağlanan iki şart olabilir:

  1. X1 ve X2 aynıdır.
  2. Y2 Y1 den daha büyüktür.

(X1,Y1) kullanıcı tarafından tıklanan ilk nokta ve (X2,Y2) kullanıcı tarafından tıklanan ikinci noktadır. Programımızda üç şartı tanımlayacağız. Sağ yön için, bloğun ismini HGRIDRIGHT olarak tanımladığımız için, sağ yön için tanımlama yapmak zorunda değiliz.

AutoCAD Sistem Değişkeni Değiştirme

Yapmamız gereken diğer bir şey bir AutoCAD sistem değişkenini geçici olarak değiştirmektir. AutoLISP’te bunu setvar fonksiyonunu kullanarak yaparız. Etiketin çizgisini yatay veya düşey olarak çizmek istediğimiz için, Diklik “Ortho” modunu aktifleştirmeliyiz.

Bu davranış ORTHOMODE sistem değişkeni tarafından kontrol edilmektedir. Diklik “Ortho” modunu açık duruma getirmek için, ORTHOMODE sistem değişkeninin değerini 1 olarak değiştirmeliyiz. Fakat bu değişikliği yapmadan önce sistem değişkeninin o anki orijinal değerini kaydetmek iyi olacaktır. Böylece programımız çalışmasını tamamladıktan sonra bu değişkeni eski değerine getirebiliriz. Herhangi bir programın kendi AutoCAD ayarlarımızı değiştirmesini ve programı her kullandığımızda ayarımızın değişmesini istemeyiz.

Öncelikle o anki geçerli (aktif) Diklik “Ortho” modunu geçici bir değişkene kaydetmeliyiz. Sistem değişkenini getvar fonksiyonunu kullanarak alabilir ve bunu AutoLISP içerisinde bir kullanıcı değişkenine kaydedebiliriz.

(setq CurrentOrthomode (getvar “orthomode”))
(setvar “orthomode” 1)

Yukarıdaki ilk satır sistem değişkenin değerini alır ve CurrentOrthomode isimli değişkene kaydeder. OK, şayet değişken isminin çok uzun olduğunu düşünüyorsanız, kendi değişken isminizi kullanabilirsiniz :)

İkinci satır, ORTHOMODE sistem değişkeni değeri 1 olarak ayarlar.

Böylece AutoLISP programımız çalışmayı tamamladıktan sonra sistem değişkeni orijinal değerine geri getirebiliriz.

(setvar “orthomode” CurrentOrthomode)

AutoLISP programının Tamamlanması

Artık ihtiyacımız olan her şeye sahibiz. AutoLISP programı aşağıdaki sırayla çalışacaktır:

  1. Çizimin ölçeğini kontrol edecek.
  2. O anki geçerli (Aktif) Diklik “Ortho” modu değerini kaydedecek ve Diklik “Ortho” modu değerini 1 olarak değiştirecek.
  3. Etiketin çizgisi için, kullanıcıdan iki nokta tıklamasını isteyecek.
  4. Hangi etiketi kullanması gerektiğini kontrol edecek.
  5. Etiket çizgisini çizecek ve bloğu yerleştirecek.
  6. Orijinal Diklik “Ortho” modu değerini geri ayarlayacak.

AutoLISP kodumuz aşağıdaki gibi olacaktır:
(defun c:cngrid (/ pt1)
(if (= cnglobalscale nil)
(c:cnannoscale)
) ; end if

(setq CurrentOrthomode (getvar “orthomode”))
(setvar “orthomode” 1)
(setq pt1 (getpoint ”
Pick Grid Start Point: “))
(setq pt2 (getpoint pt1 “nPick Grid Last Point: “))
(setq pt1x (car pt1))(setq pt1y (cadr pt1))
(setq pt2x (car pt2))(setq pt2y (cadr pt2))
(setq gridblockname “hgridright”) ;set default grid name
(cond
((AND (= pt1x pt2x) (> pt1y pt2y)) (setq gridblockname “vgridbottom”)) ;change grid name when meet the condition
((AND (= pt1x pt2x) (< pt1y pt2y)) (setq gridblockname “vgridtop”)) ((AND (> pt1x pt2x) (= pt1y pt2y)) (setq gridblockname “hgridleft”))
)

(setq gridnumber (getstring ”
Enter Grid Number: “))
(command “_line” pt1 pt2 “”)
(command “_-insert” gridblockname pt2 cnglobalscale cnglobalscale 0 gridnumber)
(setvar “orthomode” CurrentOrthomode)
(princ)
)

(defun c:cnannoscale () ; Kullanıcının ölçeği daha sonra değiştirebilmesini sağlayan fonksiyon
(setq cnglobalscale (getreal ”
Set Global Scale for CN Annotation <1/1>: “))
(if (= cnglobalscale nil) ; Kullanıcının ön tanımlı değeri seçip seçmediğini kontrol eden fonksiyon
(setq cnglobalscale 1)
) ; end if
)

Hata Ayıklama

AutoLISP programını tamamlamak için, hata ayıklama işlemi yapmamız gerekir. Örneğimizde, AutoCAD’in ORTHOMODE sistem değişkenini değiştirdik; programın sonunda bu sistem değişkenini eski haline geri getirdik. Şayet programımız sona gelmeden hata verecek olursa, bu sistem değişkenini eski haline geri getirilemez ve bu bizim için problem oluşturur. Ayrıca şayet kullanıcı programın çalışması esnasında Esc tuşuna basarsa da bu sistem değişkenini eski haline geri getirilmemiş olacaktır!

İşte bu sebeple AutoLISP program kodunu yazdıktan sonra, muhakkak test etmeli ve hataları ayıklamalıyız!

 

 

Hakkında Sertan Türkan

AutoCAD Beyni

Bunu da Kontrol edin

Revitte Plan Bölgelerinin “Plan Regions“ Görünürlüğünü Kontrol Etme

Revit’te bir Plan bölgesi “Plan region“ oluşturduktan sonra, plan görünüşünde onu görünür yapabilir veya gizleyebilirsiniz. …

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.