|
Orhan Toker |
| UYGULAMA.1 "BALON.LSP" Aksların ucuna balon çizen AutoLISP programı Seviye: Orta Kaynaklar: Autodesk, VisualLISP IDE Help file |
|
|
Merhabalar, Bu uygulamada seçtiğiniz bir çizgi (LINE) objesinin ucuna, çizginin açısını takip eden bir aks balonu yerleştirmek ve ortasına etiketini yazdırma işini yapacağız. Önce kodu tam olarak görün. Kodu indirmek için tıklayınız. DOWNLOAD CODE |
Şekil.1 Balon.lsp kodunun tam görünümü. |
|
| Öncelikle hemen kodu yükleyip çalıştırmayın. Kodu yukarıdaki linkten tıklayıp indirebilirsiniz ancak ben kodu kopyalamanız için değil kendi yazdığınız ile karşılaştırmanız için veriyorum. Eğer bu işi öğrenmek istiyorsanız kodu bir güzel print edin ve oturun ordan baka baka yeniden yazın. Ben de siz onu yazarken satır satır size açıklayayım: | |
| Bu iki satırda sonradan değerlerini değiştireceğimiz CMDECHO ve CLAYER değişkenlerinin mevcut değerlerini saklıyoruz. | |
| Bu satırlarda ise, önce balonumuzun ve içine yazacağımız balon etiketi yazısının yaratılacağı layeri yapıp güncelliyoruz. Daha sonra yazdığımız komut makroları Autocad iletileri ile birlikte çifter satır (echo) çıkmasın diye komut ekolarını kapatıyoruz. | |
| Komut tanımlama fonksiyonu sadece Autocad komut satırından balon yazdığınızda diğer fonksiyonları otomatik olarak çağırması için hazırlanmıştır. Bu fonksiyonun içinde kullanıcının balon çapının değerini girmesi sağlanmıştır. Balon çapının değerinin neden çizim esnasında sorulmadığını şöyle açıklayabilirim. c:balon komutunun, asıl işi yapan balon_ciz çizim fonksiyonunu çağırdığı kısmı kullanıcı ESC tuşuna basana kadar sonsuz döngüye sokarak yapabilirdik. Böyle bir tercihte kullanıcının sürekli çap girmesi gereksiz olacağından bu işi döngüden önce bitirdik. | |
| balon_ciz fonksiyonunun tanım satırında argüman tanımının yapıldığı parantezden sonra / işareti koydum ve arkasına tüm lokal değişkenleri tanımladım. Bunun nedeni fonksiyon içinde kullanacağım değişkenlerin diğer fonksiyonlarınız içinde karışıklık yaratmasını önlemek ve programın işleyişini hızlandırmaktır. İlderide fonksiyon tanımları ve argümanlar dersimde bu konuyu detaylandıracağım. | |
Burada tek bir (setq eşitleme fonksiyonu ile aksa ait dört değeri birden eşitlemiş oluyoruz. Nasıl?
|
|
| Bu kısım seçtiğiniz nesne LINE değilse fonksiyonun icrasını bitirecektir. Çünkü biz hesaplarımızı LINE için yapacağız. if konksiyonu ve operatörlerin kullanımını ileride göstereceğim. Burada sadece işleyişini gözlemleyebilirsiniz. | |
| Bu satırlarda seçtiğiniz aksın başlangıç ve bitiş noktalarını DXF kod listesinde 10 ve 11 değerlerinden yakalıyoruz. Şu ana kadar DXF kodlarında 0=Nesne ismi, 10 = başlangıç noktası ve 11 = bitiş noktası değerlerini öğrenmiş olduk. Daha sonraki satırlarda, (angle p1 p2) Autolisp fonksiyonunu kullanarak iki noktanın teşkil ettiği açıyı hesapladık ve (dist p1 p2) fonksiyonunun da iki nokta arasındaki mesafeyi hesapladığını öğrendik. | |
| Evet bu kısımda seçim noktamız aksın hangi ucuna yakınsa çizdireceğimiz çemberin merkez noktasını ana göre hesaplatıyoruz. Burada basit bir hesap yapabiliriz. Çizgiyi çizerken işaretlerdiğiniz ilk nokta p1 olsun ikinci nokta p2 olsun. Bu değerleri yukarıda aks_p1 ve aks_p2 olarak hesapladık. p1 - p2 noktalarının oluşturduğu açıyı da biliyoruz. Eğer kullanıcı p1'e yakın tıklama yapmışsa çember p2 - p1 vektörünün uzantısına (yani p1'in ucuna), değilse p1 - p2 vektörünün uzantısına (yani p2 nin ucuna) çember çizmeliyiz. (polar nokta açı mesafe) fonksiyonu ile bu noktayı hesaplatırız. Noktanın başlangıç noktasına yakın olduğu konumda vektörün normalini ters çevirmek için hesapladığımız aks açısına 180 derece (yani radyan olarak pi) ekliyoruz. | |
| Bundan sonra çemberimizi çizdiriyoruz ve ortasına balon etiketini yazdırıyoruz. Son satırlarda yaptığımız sistem değişkenleri ayarlarının eskisini yerine koyup bitiriyoruz. | |
| Bu bizim ilk AutoLISP uygulamamızdı. Programı yazıp çalıştırmak için VisualLISP editörü ile program geliştirmek başlıklı dersimi okumalısınız. Oradaki adımları takip ederek kodu oluşturabilirsiniz. | |
| (c) Copyright 2006 Taliasoft, by Orhan Toker |