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

  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?

  • (entsel) fonksiyonu tek bir tıklamayla obje sçtirmek için kullanılır. Bu fonksiyondan geriye <entityName> ve <pickpoint> değerlerinin bulunduğu 2 elemanlı bir liste geriye döner. (<Entity name: 7ef72018> (769.977 792.846 0.0)) listenin birinci elemanı entity name, ikinci elemanı ise nesneyi seçtiğiniz noktanın kooardinat bilgisini içeren listedir. Aks değişkenine bu ikili listeyi yükledim
  • (setq pp (cadr aks)) ile listenin ikinci elemanı olan seçim noktasını pp değişkenine atamış oldum. Demekki (cadr) fonksiyonu listenin ikinci tekil elemanını seçmek için kullanılıyor.
  • (setq aks_el (entget (car aks))) satırında seçtiğim nesnenin DXF kod listesini aks_el değişkenine yüklüyorum. (entget) komutu tek argümanı olan entity name ile çağrıldığında o entity name etiketine sahip olan nesnenin DXF kod listesini dönüş değeri olarak verir. (car) fnksiyonunu da ikili listemin birinci elemanı olan entity name değerini çekmek için kullandım. Demekki (car) fonksiyonu da listenin birinci elemanını yalnız başına çekmek için kullanılıyor. Merak etmeyin (entget) (car) (cdr) gibi fonksiyonları ve DXF kodlarını ileride inceleyeceğiz.
  • Seçtiğimiz nesnenin ne olduğu DXF ikili kod listesinin (dotted pair) 0 bileşeninden öğrenebiliriz. Orda şöyle bir değer olur. (0 . "LINE") Bizde bu noktalı çiftin 0'a karşılık gelen değerinin ne olduğunu öğrenmek için (assoc) fonksiyonunu kullanırız. Pratikte (assoc) tek başına işe yaramaz. Listeden veri yakalamak için (cdr (assoc aranan_deger liste_adi)) şeklinde kullanılır. Biz 0 değerine ne karşılık geliyor diye bakmak için o satırı yazdık. Noktalı çiftler ve liste yönetimi için ileriki dersleri bekleyin.

 

 
  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