1372826956:AAFe2Py65GSQkfGiRnXuOQ-eD9yXcwMv988

AutoLisp Öğreticisi #3-Varlıklardan Veri Elde Etme ve Kullanma

Varlık Nedir?

AutoCAD varlıkları, AutoCAD‘de çizim yaparken kullandığımız temel nesnelerdir. Bunlar çizgileri, çemberleri, yayları, blokları, yazıları içerir. Autolisp’de program yaparken, tüm varlıklar ve bunları çiziminizde tanımlayan parametreler çizimdeki bir veri tabanında listelenir.

Gerçekten de, bir AutoCAD çizim dosyası çizimde bulunan varlıkların listesini içeren çok büyük bir büyük veri tabanı listesine sahiptir.

Autolisp kullanırken bir ÇİZGİ “LINE” öğesinin veri tabanında nasıl göründüğüne bir örnek aşağıdadır. İlk önce AutoCAD‘de bir çizgi çizin; daha sonra komut satırına aşağıdaki kodu yazıp Enter tuşuna basın:

Command: (entget (entlast))

İşte Autolisp’in geri döndürecekleri aşağıda:

((-1 . <Entity name: 7efa28f0>) (0 . “LINE”) (330 . <Entity name:
7ef5bcf8>) (5
. “57E”) (100 . “AcDbEntity”) (67 . 0) (410 . “Model”) (8 . “0”)
(100 .
“AcDbLine”) (10 -1.68423 46.3172 0.0) (11 5.40053 48.6858 0.0)
(210 0.0 0.0
1.0))

Bazı Genel Autolisp Grup Kodları

İlk bakışta, bu tam bir karışıklık gibi görünüyor. Biraz daha yakından bakarsanız, varlık verilerinin

LINE” varlığı için Autolisp dönüşleri, Autolisp’deki diğer tüm şeyler gibi, sadece bir liste olduğunu görürsünüz. Şayet onu öğelerine parçalarsak, listenin her bir bölümünü neyi temsil ettiğini söyleyebiliriz.

(

(-1 . <Entity name: 7efa28f0>)
(0 . “LINE”)
(330 . <Entity name: 7ef5bcf8>)
(5 . “57E”)
(100 . “AcDbEntity”)
(67 . 0)
(410 . “Model”)
(8 . “0”)
(100 . “AcDbLine”)
(10 -1.68423 46.3172 0.0)
(11 5.40053 48.6858 0.0)
(210 0.0 0.0 1.0)

)

Listenin başındaki sayıların her birine Grup Kodları adı verilir. Bunlar basitçe kodlar olup; her bir grup kodunu izleyen metin dizgesinin veya sayıların neyi gösterdiğini söyler. Bir önceki örnekte “0” grubu kodu ile çizgi, ne tür bir varlık aradığımız, bu durumda bir “LINE” olduğunu gösterir.

Bir önceki örnekte, 0 grup kodu aradığımız varlık tipinin ne olduğunu gösterir; ki örneğimiz için bu çizgi”line” dir. Tüm grup kodlarını ezberlemeniz gerekmez; ancak bunlardan birkaçı oldukça yaygındır ve bunlara aşina olmanız gerekir.

Grup Kodu Code Tanımı
0 (ÇİZGİ “LINE”, ÇEMBER “CIRCLE”, YAY “ARC”, ÇOKLU ÇİZGİ “PLINE” gibi) varlık tipi
8 Varlığın üzerinde olduğu tabaka “layer” ismi
10 (Hepsi olmasa da) hemen hemen tüm varlık türleri için, bir nokta listesini temsil eder.

ÇİZGİ “LINE” örneğimiz için, bu çizginin başlangıç noktasıdır (x y z)

11 Yine bir nokta listesi, ÇİZGİ “LINE” için çizginin bitiş noktası koordinatlarıdır. (x y z)

Yukarıdaki tabloda benim ezberlediğim grup kodlarını ve açıklamalarını görüyorsunuz. Şayet daha kapsamlı bir listeye ihtiyacınız varsa, AutoCAD‘in Geliştiriciler için Yardım dosyasına göz atın.

Autolisp Kullanarak Varlıkları Seçme

Artık grup kodlarının ne anlama geldiklerini biliyoruz; bu yüzden bu bilgilere kolaylıkla erişebiliriz. Yapmamız gereken ilk şey, varlıkları nasıl seçmek istediğimizi belirlemektir (AutoCAD ekranında onları tıklayarak seçin.)

AutoCAD, doğrudan AutoCAD veri tabanını sorgulayacaktır. Sorgulama işleminden sonra, aradığımız varlığı bulup; varlık verisini bir değişkene atarız ve sonrasında her bir varlık listesinde bulunan verilere erişebiliriz.

Şayet son örneğimize geri dönecek olursak, entlast fonksiyonunu kullanarak varlık verilerini AutoCAD‘de çizilen son öğeden başlayarak elde ederiz. Komut satırına aşağıdaki kodu yazın:

Command: (setq ent (entlast))

Command: (entlast)

Bu <Entity name: 7efa28f0> gibi bi şey geri döndürecektir.

Bu da bizim işimize yeteri kadar yaramıyor. Bu yüzden varlığın içinde hangi verinin olduğunu göstermek için, Autolisp’in entget fonksiyonunu kullanırız.

Varlıklarda Veri Elde Etme

Varlık verilerinden tabaka “layer” bilgisini çıkarıp almak için, Autolisp’in assoc fonksiyonunu kullanıyoruz.

assoc fonksiyonunu varlık adı ve ilgilendiğiniz grup kodunu assoc işlevine aşağıdaki gibi iletmek zorundasınız:

Command: (setq entdata (entget ent))
Command: (assoc 8 entdata)

Bu kod (8 . “0”) listesini geri döndürecektir.

Grup kodunu kaldırmak ve gerçek katman adını öğrenmek için cdr fonksiyonunu kullanarak kodumuza “8” grup kodunu kullandığımız için, “8” ve daha önce yazdıklarımıza ekledik:

Command: (cdr (assoc 8 entdata))

0” geri döndürür.

Çok iyi! Şimdi bunu aşağıdaki gibi, tabakayı “layer” temsil eeden lay_name ir değişkenine atayacağız:

Komut: (setq lay_name (cdr (assoc 8 entdata)))

Şimdi bizim lay_name değişkenimiz, çizginin üzerinde bulunduğu tabaka “layer” adını içeriyor.

Çizginin başlangıç noktasını bulmak için, bu kkodu genişleterek komut satırına aşağıdakileri yazın:

Command: (setq st_point (cdr (assoc 10 entdata)))

(-1.68423 46.3172 0.0) listesi geri dönecektir.

Farklı veriler geri döndü; çünkü şanslı değildik. Başlangıçta çizgimizi aynı başlangıç noktasından çizmeliydik.

Çizginin bitiş noktasını elde etmek için, aynı prosedürü uygulayın:

Command: (setq end_point (cdr (assoc 11 entdata)))

Bu kod, çizgininbitiş noktasını döndürecektir.

 

Böylece, bu noktada, AutoCAD‘deki herhangi bir varlıktan herhangi bir bilgiyi nasıl elde edebileceğinizi öğrenmiş oldunuz.

Hepsini Bir Araya Koyalım

Şu ana kadar AutoCAD komut satırına tek satırlık Autolisp program kodu girdik.

Bu bazen kullanışlı olabilir; ancak tek bir kod satırından daha fazla satıra sahip program yazdığınızda çok yararlı değildir.

Çizdiğimiz çizginin orta noktasını hesaplayan basit bir program yazalım. Aşağıdaki örnek size AutoCAD‘in bir çizginin orta noktasına çıtçıtlandığınız zaman, orta noktayı nasıl bulabileceğine dair küçük bir fikir verecektir.

İlk önce, verilen iki uç noktasını bildiğimiz bir çizginin orta noktasını hesaplamanın matematiksel bir yolunu bulmalıyız.

Bu gerçek kodlama aşaması olmayıp; sadece algoritmanın geliştirilmesi aşamasıdır. Çoğu zaman algoritmanın geliştirilmesi, programın yaratılma sürecinin en zor ve önemli kısmıdır.

Burası, iyi matematik becerileri ve gerçekten yaratıcı düşünme gerektirmektedir.

Şayet çizginin başlangıç ve bitiş noktalarının X değerlerini elde edersek, bu iki sayının ortalaması alınması bize çizginin X eksenindeki orta noktasını verir. Daha sonra, Y ve Z koordinatlarını elde edip; ortalamalarını alacağız. Sonra bu üç değeri bir listeye alıp böylece çizginin 3boyutlu 3B “3D” orta noktası elde edeceğiz. Şimdi kodlamaya başlıyoruz:

(defun c:3d_midpt ()

<Orta noktayı hesaplama kodu buraya gelecek>

) ;3d_midpt komutunun sonu.

İPUCU: Autolisp programlarını yazarken, yukarıdaki kod örneğinde olduğu gibi,  bunları ayrı ayrı olarak hazırlak ve sonra program içerisinde uygun yerlere koymak; parantezleri uygun yerlerde tutmanıza gerçekten yardımcı olacaktır.

Bu şekilde yapmak bana daha mantıklı geliyor. Şayet her aşamada kodu AutoCAD‘de test ederseniz, söz dizimi ve kodlama hatalarını bulmak ve düzeltmek daha kolay olacaktır.

Önce, önceki örnekteki yaptığımız gibi, varlık verisini elde edelim:

(defun c:3d_midpt ()

;Son varlığın varlık verisini elde etme
;Şayet son çizgi bir çizgi değilse, kod çökecektir.)
(setq ent (entlast))
(setq entdata (entget ent))

) ;3d_midpt komutunun sonu.

 

Sonra, başlangıç ve bitiş noktaları için X, Y ve Z verilerini alın.

(defun c:3d_midpt ()

;Son varlığın varlık verisini elde etme
;Şayet son çizgi bir çizgi değilse, kod çökecektir.)
(setq ent (entlast))
(setq entdata (entget ent))

;Çizginin başlangıç ve bitiş noktası verilerini elde etme
(setq st_pt (cdr (assoc 10 entdata)))
(setq end_pt (cdr (assoc 11 entdata)))

) ;3d_midpt komutunun sonu.

Şimdi X, Y ve Z ortalamalarını hesaplayın.

(defun c:3d_midpt ()

;Son varlığın varlık verisini elde etme
;Şayet son çizgi bir çizgi değilse, kod çökecektir.)
(setq ent (entlast))
(setq entdata (entget ent))

;Çizginin başlangıç ve bitiş noktası verilerini elde etme
(setq st_pt (cdr (assoc 10 entdata)))
(setq end_pt (cdr (assoc 11 entdata)))

; X, Y ve Z ortalamalarını hesaplama
(setq Xavg (/

(+ (car st_pt) (car end_pt))
2.0

))
(setq Yavg (/

(+ (cadr st_pt) (cadr end_pt))
2.0

))
(setq Zavg (/

(+ (caddr st_pt) (caddr end_pt))
2.0

))

) ;3d_midpt komutunun sonu.

Bitirmek için ortalamaları bir listeye alın ve bu koordinatta bir nokta çizin.

(defun c:3d_midpt ()

;Son varlığın varlık verisini elde etme
;Şayet son çizgi bir çizgi değilse, kod çökecektir.)
(setq ent (entlast))
(setq entdata (entget ent))

;Çizginin başlangıç ve bitiş noktası verilerini elde etme
(setq st_pt (cdr (assoc 10 entdata)))
(setq end_pt (cdr (assoc 11 entdata)))

; X, Y ve Z ortalamalarını hesaplama
(setq Xavg (/

(+ (car st_pt) (car end_pt))
2.0

))
(setq Yavg (/

(+ (cadr st_pt) (cadr end_pt))
2.0

))
(setq Zavg (/

(+ (caddr st_pt) (caddr end_pt))
2.0

))

;Ortalamaları bir liste olarak birleştirme
(setq midpt (list Xavg Yavg Zavg))

;Hesaplanan orta noktaya bir nokta çizme
(command “point” midpt)


) ;3d_midpt komutunun sonu.

Ve böylece işimiz bitmiş oldu. Umarım bu makaleden çok şey öğrenmiş ve Autolisp kullanarak veri alıp kullanmanın ne kadar kolay olduğunu görmeye başlamışsınızdır.

İlerdeki bir makalede, sürekli çizgilerde “polyline” nasıl gezineceğinize göz atacağız.

Hakkında Sertan Türkan

AutoCAD Beyni

Bunu da Kontrol edin

Revitte Kırılmış Kesit Çizgilerinin Çizgi Stilini Kontrol Etme

Revit’te kesit çizgisinin çizgi stilini Aralıklı çizgi tipinden Sürekli çizgi tipine değiştirebilirsiniz. Bunun için: Yönetim …

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.