23.06.2014 21:41    

ProhibiT
Creating Nested Block with entmake.

Kodlab yayınevinin "Yazara Sor" bölümünden gelen güzel bir soruya verdiğimiz cevabı burada paylaşmak istiyorum.



SORU:

Blokları mevcut blok kütüphanesinden değil de, çizim aşamasında entmake ile oluşturduğum parametrik çalışan bloklarla yapmayı düşünüyorum. Bunu bir ölçüde gerçekleştirdim.

Asıl istediğim, blok içinde tekrar eden benzer objeleri blok oluşturup blok içinde kullanmak. Yada karmaşık çizgilerden oluşan objeleri, entmake ile blok oluştururken kayıtlı kütüphaneden insert etmek.

İnternetten araştırdığım lisp rutinlerinde benzer bir uygulama bulamadım.

Sizden ricam entmake blok içine blok insert konusunda basit bir rütin.



CEVAP:

AutoCAD ortamında kısaca BLOCK olarak bahsettiğimiz nesneler, aslında BLOCK DEFINITION yani Block tanımlarıdır. Block Definition'lar drawing database'in Tables bölümünde yer alırlar ve Table Objects olarak adlandırılırlar.
Bilindiği gibi Table Objects çizim ekranında görünen nesneler değildir. BLOCK bazında düşünüldüğünde, Çizim ekranında gördüğümüz nesneler ise BLOCK REFERENCE yani Block başvuruları dediğimiz nesneler olup, bu nesneler INSERT olarak adlandırılır. INSERT nesneleri DRAWING DATABASE'in ENTITIES (Drawing Objects) bölümünde yer alırlar. Orijinal (İngilizce) kaynaklarda Biri isim, diğeri fiil olan iki INSERT kavramı net olarak anlatılmadığı için detaylı açıklama gereği duydum.

entmake ile bir BLOCK tanımı oluşturacağımız zaman, DRAWING DATABASE'in TABLES bölümüne bir ekleme yapıyoruz demektir.

Block altında block olmayan (non nested) bir block oluşturalım.
Kod:

(entmake (list '(0 . "BLOCK")
    '(70 . 2) ;;; Block, bir veya daha çok Nonconstant Attribute içeriyor.     
              ;;; Değeri sabit olmayan Attribute'ler, diğer çizim nesneleri ve
              ;;; değeri sabit olan Attribut'lerden farklı olarak işlenirler. 
    '(10 0.0 0.0 0.0) '(2 . "KotK-1")))

Önce Block Name, Insertion Base Point gibi temel tanımları oluşturuyoruz. Vermediğimiz her türlü bilgi Current (geçerli olan) değeriyle alınacaktır. Örneğimizde vermediğimiz Layer, current layer olarak alınacaktır.
-------------------------------------------------------------------------------
Bundan sonra, Block tanımı içinde yer alan çizim nesnelerimizi tanımlıyoruz (oluşturuyoruz).
Bu bölümde oluşturduğumuz nesneler Tables bölümünde yer alacaklarından, Ekranda görünmeyecektir.
Kod:

(entmake (list
    '(0 . "LINE") '(8 . "0") '(62 . 0) '(6 . "Bylayer") '(48 . 1.00)
    '(10 0.0 0.0 0.0) '(11 -0.3 0.3 0.0)))
(entmake (list
    '(0 . "LINE") '(8 . "0") '(62 . 0) '(6 . "Bylayer") '(48 . 1.00)
    '(10 0.30 0.30 0.0) '(11 0.0 0.0 0.0)))
(entmake (list
    '(0 . "LINE") '(8 . "0") '(62 . 0) '(6 . "Bylayer") '(48 . 1.00)
    '(10 -0.30 0.30 0.0) '(11 0.30 0.30 0.0)))
(entmake (list
    '(0 . "SOLID") '(8 . "0") '(62 . 256) '(6 . "Bylayer") '(48 . 1.00)
    '(10 0.0 0.30 0.0) '(11 0.30 0.30 0.0)
    '(12 0.0 0.0 0.0) '(13 0.0 0.0 0.0)))
(entmake (list
    '(0 . "ATTDEF") '(8 . "0") '(62 . 0) '(6 . "Bylayer") '(48 . 1.00)
    '(40 . 0.2) '(1 . "000") '(50 . 0.0) '(51 . 0.0) '(71 . 0) '(72 . 1)
    '(10 -0.25 0.15 0.0) '(11 0.0 0.15 0.0) '(3 . "REF : ")
    '(2 . "REF") '(70 . 1)))
(entmake (list
    '(0 . "ATTDEF") '(8 . "0") '(62 . 0) '(6 . "Bylayer") '(48 . 1.00)
    '(40 . 0.2) '(1 . "000") '(50 . 0.0) '(51 . 0.0) '(71 . 0) '(72 . 1)
    '(10 -0.25 0.40 0.0) '(11 0.0 0.40 0.0)
    '(3 . "KOT: ") '(2 . "KOT") '(70 . 0)))

Block tanımımızda yer alan nesneleri tanımlayıp bitirdikten sonra, Block sonunu gösteren bir table nesnesi olan ENDBLK oluşturuyoruz.
Kod:

(entmake (list '(0 . "ENDBLK")))

Örneğimizde KotK-1 isimli Block tanımladık. Tanımlanan block altında 3 tane LINE, 1 tane SOLID ve 2 tane de ATTDEF (Attribute Definition) nesnesi tanımladık. Yeri gelmişken, kısaca Attribute diye adlandırdığımız ATTDEF ve ATTRIB (Attribute Reference) farklı nesnelerdir.

Bu noktada bir konuya daha dikkat çekmek isterim;
AutoLISP (entmake ...) işlevi sonunda elde edilen değer (return value) İlişkilendirilmiş Nesne Listesidir (Association List veya Entity List).

Buradan çıkarılacak sonuç; Block tanımımız altında daha önceden tanımlanmış başka bir Block kullanacağımız zaman, tanımlı Block'un Entity List'inin (varlık listesi) ana block altında yer alması yeterli olacaktır. Gene dikkat edilmesi gereken ayrıntı; Block tanımı (tables section) altına bir varlık listesi (Entity List) ekleyeceğiz. Eklenecek varlık listesi Table Object değil Drawing Object yani INSERT olacaktır.

Bunu 2 adımda Örnekleyelim.

1. adımda önceki örneğimizde yer alan Attdef nesneleri dışında kalan Line ve solid nesnelerini bağımsız bir Block olarak tanımlayalım.
Kod:

(entmake (list '(0 . "BLOCK")
    '(70 . 0) ;;; Block, sabit olmayan hiç bir Attribute içermiyor.           
    '(10 0.0 0.0 0.0)
    '(2 . "KotK-Czm")))

KotK-Czm isimli Block'umuzun temel tanımlarını oluşturduk.
-------------------------------------------------------------------------------
Block tanımı altında yer alan nesnelerimizi oluşturalım.
Kod:

(entmake (list
    '(0 . "LINE") '(8 . "0") '(62 . 0) '(6 . "Bylayer") '(48 . 1.00)
    '(10 0.0 0.0 0.0) '(11 -0.3 0.3 0.0)))
(entmake (list
    '(0 . "LINE") '(8 . "0") '(62 . 0) '(6 . "Bylayer") '(48 . 1.00)
    '(10 0.30 0.30 0.0) '(11 0.0 0.0 0.0)))
(entmake (list
    '(0 . "LINE") '(8 . "0") '(62 . 0) '(6 . "Bylayer") '(48 . 1.00)
    '(10 -0.30 0.30 0.0) '(11 0.30 0.30 0.0)))
(entmake (list
    '(0 . "SOLID") '(8 . "0") '(62 . 256) '(6 . "Bylayer") '(48 . 1.00)
    '(10 0.0 0.30 0.0) '(11 0.30 0.30 0.0)
    '(12 0.0 0.0 0.0) '(13 0.0 0.0 0.0)))

Block sonunu oluşturalım.
Kod:

(entmake (list '(0 . "ENDBLK")))


2. adımda KotK-2 Block'umuzu tanımlarken, daha önce tanımladığımız KotK-Czm block'unu alt nesne olarak tanımlıyoruz.
Kod:

(entmake (list '(0 . "BLOCK")
    '(70 . 2) ;;; Block, sabit olmayan bir veya daha çok Attribute içeriyor.   
    '(10 0.0 0.0 0.0) '(2 . "KotK-2")))

Block Name, Insertion Base Point gibi temel tanımları oluşturduk
-------------------------------------------------------------------------------
Block'umuzun Attribute Definition'larını ekleyelim.
Kod:

(entmake (list
    '(0 . "ATTDEF") '(8 . "0") '(62 . 0) '(6 . "Bylayer") '(48 . 1.00)
    '(40 . 0.2) '(1 . "000") '(50 . 0.0) '(51 . 0.0) '(71 . 0) '(72 . 1)
    '(10 -0.25 0.15 0.0) '(11 0.0 0.15 0.0)
    '(3 . "REF : ") '(2 . "REF") '(70 . 1)))
(entmake (list
    '(0 . "ATTDEF") '(8 . "0") '(62 . 0) '(6 . "Bylayer") '(48 . 1.00)
    '(40 . 0.2) '(1 . "000") '(50 . 0.0) '(51 . 0.0) '(71 . 0) '(72 . 1)
    '(10 -0.25 0.40 0.0) '(11 0.0 0.40 0.0)
    '(3 . "KOT: ") '(2 . "KOT") '(70 . 0)))

Daha önce tanımladığımız (veya çizimde mevcut) KotK-Czm block'unun varlık listesini (Entity list) Tables bölümüne KotK-2 block'unun altına ekleyelim. Yani Alt Block'umuzu ekleyelim.
Kod:

(entmake (list
    '(0 . "INSERT") '(2 . "KotK-Czm") '(10 0.0 0.0 0.0)
    '(41 . 1.0) '(42 . 1.0) '(43 . 1.0)))

Görüldüğü gibi alt block'umuzu eklerken BLOCK DEFINITON değil, BLOCK REFERENCE yani INSERT nesnesinin Varlık Listesini ekledik.
-------------------------------------------------------------------------------
Block sonunu oluşturalım.
Kod:

(entmake (list '(0 . "ENDBLK")))


Sonuç: Daha önceden tanımladığımız veya çizim içinde mevcut KotK-Czm block'unu, yeni oluşturduğumuz KotK-2 blockunda alt block olarak kullandık.

ProhibiT (24.06.2014 07:26 GMT)

24.06.2014 05:50    

kesinhesapci
Anlaya mıyorum, ama Sualleri cevapsız bırakmadığınız için teşekkür ediyorum.
saygılar.

24.06.2014 06:11    

Travaci
Teşekkürler hocam elinize sağlık.

24.06.2014 07:02    

ehya
Çok güzel bir konuya açıklık getirmişsiniz hocam. :yes

24.06.2014 07:45    

ProhibiT
Teşekkür ederim arkadaşlar :) Forumda bazı arkadaşlarımızın özensizliği nedeniyle kargaşa arasında kaybolup giden o kadar çok konu var ki. Yapacak bir şey yok, her seviyeden arkadaşımızın soru sorma ve fikir beyan etme hakkına saygı duymak zorundayız. Böyle bir bölümün açılmasını düşünüp gerçekleştiren Mehmet hocama ayrıca teşekkür etmek isterim.

Bu başlık altında temel detaylarını açıklamaya çalıştığım blok altında blok kullanma (iç içe bloklar / nested blocks) diyebileceğimiz konu bile o kadar derin ve geniş ki. İlgilenen arkadaşlara bir soru da ben sorarak konuyu derinleştirmek istiyorum.

Yukarıda verdiğim örnekte, Attribute tanımlarını ana blokta verdim. Alt block'ta hiç bir Attribute tanımı yok. Attribute tanımları içeren bir alt blok kullanmak istenseydi, aynı yöntemle sonuç alınabilir miydi?

Herkese kolay gelsin :)

24.06.2014 08:43    

ehya
Hocam belaltı vuruyorsunuz ama :)

24.06.2014 09:12    

Travaci
Bence yapılabilir, ama sonuç alınamazdı :) Zaten Autocad "Enhanced Attribute Editor" herzaman enüstteki attribut ü okumuyor mu ? Bu yüzden anlamsız olacağını düşünüyorum. Aslında binevi %50 şansımı kullandım çaktırmayın :D

24.06.2014 11:55    

ProhibiT
Mehmet hocam bazen ben de güzel soru sorabiliyorum :) Maksadım belaltı vurmak olamaz elbette. Burada amacım, AutoCAD ortamındaki ilginç bir (tutarsızlık demeyim de) kopukluğa dikkat çekmekti. Erkan Taravaci'nın yaklaşımı sonuç olarak doğru. Banan son derece ilginç gelen bu konuyu ilk fırsat bulduğumda biraz daha didikleyerek paylaşmak istiyorum.

24.06.2014 12:23    

ehya
Benle alakalı olsa gerek. Lisplerimde şuana kadar hiç Attribute kullanmadım. Belki de lispden olsa gerek hiç attribute nesnelerine ihtiyaç duymadım. Bu yüzden bu soru benim için tam bir belaltı :)
Konu ile ilgili paylaşımlarınızı mutlaka bekliyorum hocam. Çok teşekkürler...

> 1 <
Copyright © 2004-2022 SQL: 1.302 saniye - Sorgu: 65 - Ortalama: 0.02004 saniye