28.01.2021 20:39    

huseyinkus
Öncelikle merhabalar;
Herkese hayırlı akşamlar diliyorum. Benim Layer oluşturma konusunda yardıma ihtiyacım var. Bu zamana kadar autolisp ile ufak tefek programlar yazdım ve bunları herhangi bir layer kullanmadan yaptım. Şimdi ise nasıl layer yaratabileceğimi ve özelliklerini nasıl tanımlayabileceğimi merak ediyorum. Örneğin bir "Kolon" isminde layer oluşturacağım ve rengini de kırmızı yapacağım. Çizgi kalınlığını vesaire gireceğim. Ve de bu layerı kullanırken programda nasıl birbirleri arasında geçiş yapacağım. Yardımcı olursanız sevinirim. Şimdiden teşekkürler.
Saygılarımla.

29.01.2021 01:33    

ProhibiT
Merhaba,

AutoLisp ile görünen nesneler (drawing objects) veya görünmeyen (table objects; tanım nesneleri) oluştururken entmake işlevi kullanmak hem en kolay hem de en garantili yoldur. Yeri gelmişken ve konumuzla da doğrudan ilgili iken, örnekle açıklamak gerekirse; bir Line nesnesi çizim nesnesi (drawing Object), Layer nesnesi ise tanım nesnesidir (table object'tir). Bazı kaynaklarda Graphical Objects ve Nongraphical Objects olarak geçtiğini hatırlatmak isterim.



Bu açıklamaları dikkatle okumakta fayda var. Açıklandığı gibi, entmake ile kullanılan varlık listesi (association list) entget ile elde edilen liste ile aynıdır. Burada hemen bir tersine mühendislik (reverse engineering) uygulayarak istediğimiz işlemi kolaylıkla yapabiliriz.

Ele aldığımız konu bir Layer oluşturmak olduğuna göre; AutoCad komutlarıyla bir örnek layer nesnesi oluşturarak bunu entget ile alıp, öncelikle liste içinde hangi anahtarların hangi özellikle ilgili olduğunu çözmek gerekir. Layer tanımı gibi tanım nesnelerinin varlık listesini elde etmek için,
(entget (tblobjname "Layer" LAYERNAME)) kullanılabilir. Burada LAYERNAME yerine örnek olarak oluşturduğumuz Layer'ın adı (string, karakter dizisi biçiminde) yazılacaktır.
Kod:

(entget (tblobjname "Layer" "Deneme"))
((-1 . <Entity name: 299f21b74e0>) (0 . "LAYER") (330 . <Entity name: 299f21bb020>) (5 . "286") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "Deneme") (70 . 0) (62 . 1) (6 . "Continuous") (290 . 1) (370 . 30) (390 . <Entity name: 299f21bb0f0>) (347 . <Entity name: 299f21bb6e0>) (348 . <Entity name: 0>))

örnek olarak oluşturduğumuz "Deneme" isimli Layer'ın varlık listesine göz attığımızda; Yukarıda açıklandığı gibi entmake'te etkisiz olan -1, 330, 347 ve 348 anahtarlı Entity Name, 5 anahtarlı handling number bölümlerini kaldırdığımızda listemiz,
Kod:

((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "Deneme") (70 . 0) (62 . 1) (6 . "Continuous") (290 . 1) (370 . 30))
haline gelir.
Burada
0. Nesne Türü (örneğimizde LAYER),
2. Layer Adı,
6. Çizgi Tipi (Linetype, örneğimizde Continuous),
62. Layer Rengi (ACI Renk Numarası 1, yani kırmızı) ve
370. Lineweight (çizgi kalınlığı, örneğimizde 30 değeri yüzde cinsindendir 0.30'u ifade eder).
ifade eder. Listemizdeki 70 ve 290 anahtarlı değerlerin anlamını da, bilenler bilmeyenlere anlatsın, diyerek sizlere ödev olarak bırakıyorum. :)
elde ettiğimiz listeyi kullanarak,
Kod:

(entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "Deneme") (62 . 1) (70 . 0) (6 . "Continuous") (290 . 1) (370 . 30)))
biçiminde veya
Kod:

(entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(2 . "Deneme") '(62 . 1) '(70 . 0) '(6 . "Continuous") '(290 . 1) '(370 . 30)))
biçiminde daha da doğrusu
Kod:

(entmake (list (cons 0 "LAYER") (cons 100 "AcDbSymbolTableRecord") (cons 100 "AcDbLayerTableRecord") (cons 2 "Deneme") (cons 62 1) (cons 70 0) (cons 6 "Continuous") (cons 290 1) (cons 370 30)))

şeklinde amaçladığımız şekilde Layer'ımızı oluştururuz.

Sorunuzun ikinci kısmına gelince: Başlangıçta öğrenmek için AutoCad Komut Satırından yaptığımız işlemleri aynı mantık ve sıra ile Lisp içinden gerçekleştirmek öğrenmek için kabul edilebilir bir yol olabilir! Bu durumda da yazdığımız AutoCAD Script mantığından öteye geçemez yani bir program olmaz. Yukarıda ödev olarak verdiğim anahtar kodları çözdüğünüzde kast ettiğiniz pek çok işlemin yapıldığını göreceksiniz. Bir adım daha ileri gidin, Örnek olarak komut satırından oluşturduğunuz Layer'ı; freeze, thaw, lock, unlock, lineweight, linetype, new VP freeze ve plot,... gibi özelliklerini değiştirerek varlık listesine göz atarak bu özelliklerini nasıl değiştireceğinizi çözebilirsiniz.
Son bir tavsiye daha: gene script mantığında düşünerek Lisp fonksiyon içinde current layer'ı değiştirerek yeni oluşturulacak nesneleri bu layer'da oluşturmaya gerek var mı! Söz konusu yeni çizim veya tanım nesnelerini oluştururken layer atamak daha kolay ve garantili değil mi?
Benzer şekilde mevcut çizim ve tanım nesnelerini de entmod veya vlax-put-property ve benzeri fonksiyonlar ile doğrudan yönetmek mümkündür.

Herkese kolay gelsin.

ProhibiT (29.01.2021 07:19 GMT)

29.01.2021 07:21    

huseyinkus
Hocam emeğinize sağlık. Bu anahtar kelimelerini hep görüyordum ama anlamlandıramıyordum. Sayenizde ne işe yaradıklarını öğrenebildim. Ayrıca "70" anahtar isminin değerini "100" yaptığım zaman layer'ı kilitliyor, 0 yaptığımda ise kilidi kaldırıyor ancak "290" isimli anahtar kelimesinin ne işe yaradığını çözemedim. Peki bu (entget (tblobjname "Layer" "Deneme")) yaptıktan sonra anahtar kelimeleri görebiliyoruz ama diğer "line" "circle" vs. gibi komutların anahtar kelimelerini nasıl göreceğim?
Saygılarımla.

29.01.2021 07:38    

ehya
Şahin hocamın bu güzel açıklamasına ek olarak sorduğu ödevi cevaplayayım :)

70 değeri layer'ın görünürlüğü ile ilgili değerdir.

0 = herşey açık
1 = modelde freeze'li
2 = layoutda freeze'li
3 = hem modelde hem layoutda freeze'li
4 = kilitli

Ek bilgi vermek gerekise,
Modelde hem freeze hemde kilitli isterseniz, bu iki değeri toplayıp 70 değerini 5 olarak kullanabilirsiniz.


290 değeri ise, layer'ın baskıda çıkıp çıkmayacağı ile ilgilidir.
0 olursa bu layer baskıda çıkmaz.

29.01.2021 07:40    

huseyinkus
Ehya hocam ben biraz yanlış mantık yürütmüşüm galiba :)
Teşekkürler.

29.01.2021 08:02    

Travaci
huseyinkus


Drawing nesnesi için;

Kod:

(foreach ep (entget (car (entsel))) (print ep))

29.01.2021 08:11    

huseyinkus
Teşekkürler emeklerinize sağlık.

29.01.2021 08:25    

ehya
Aşağıdaki link üzerinden Autocad ile ilgili tüm varlıkların DXF kodlarına ve anlamlarına ulaşabilirsiniz.




Linkleri görebilmek için ÜYE olmalısınız.

29.01.2021 08:55    

ProhibiT
ehya hocam ve travacı arkadaşımıza katkılarından dolayı teşekkür ederim. Huseyinkus arkadaşımıza da doğru sorusu için teşekkür ederiz. Doğru soru ile nelere ulaşabileceğini görmüştür sanırım.

Yukarıda yazdığım "ödev olarak bırakıyorum" ifadesi şimdi daha iyi anlaşılmıştır sanıyorum. Bu tür mesajlarımızın ukalalıkla, birilerinin aklına ip ölçmekle bir ilgisi olamaz elbette. Bu şekilde, adım adım ve mantık silsilesiyle hem daha iyi öğreniliyor hemde kalıcı oluyor.

Konuyu tamamlamak açısından tecrübeli arkadaşlara başka bir soru sormak istiyorum. Bu sefer bilenler bilmeyenlere anlatsın demiyorum, zihinlerdeki gri noktaları aydınlatmak amacındayım. :)

Kitabımızda ve yukarıdaki alıntısında:
"Eski sürümlerle uyumluluk sağlanması amacıyla 100 gurup koduyla verilen AcDbText, AcDbAttribute, AcDbAttributeDefinition, AcDbBlockBegin, AcDbBlockEnd, AcDbSequenceEnd, AcDbBlockReference, AcDbMInsertBlock, AcDb2dVertex, AcDb3dPolylineVertex, AcDbPolygonMeshVertex, AcDbPolyFaceMeshVertex, AcDbFaceRecord, AcDb2dPolyline, AcDb3dPolyline, AcDbArc, AcDbCircle, AcDbLine, AcDbPoint, AcDbFace, AcDbPolyFaceMesh, AcDbPolygonMesh, AcDbTrace, AcDbSolid, AcDbShape ve AcDbViewport obje türü verileri göz ardı edilirler." demişiz.

Bu listeyi neden böyle uzun uzun yazmışız acaba? Yerli ve yabancı bazı kaynaklarda olduğu gibi kestirmeden, 100 grup koduyla verilen bilgiler entmake tarafından göz ardı edilir... deyip geçseydik; yukarıda örneklediğimiz Layer oluşturma işleminde 100 anahtarlı AcDbSymbolTableRecord ve AcDbLayerTableRecord direktiflerini yazmadan Layer oluşturulabilir miydi?

Mesajı doğru anlayan ve katkıda bulunan herkese tekrar teşekkür eder, selam ve saygılarımla herkese kolaylıklar dilerim.

ProhibiT (29.01.2021 22:23 GMT)

29.01.2021 18:35    

huseyinkus
Bütün yardımcı olan hocalarıma teşekkür ediyorum. Sayenizde entmake mantığını anlamış oldum. Bazı soru işaretlerim var onları da deneme yanılma yöntemleriyle halledeceğim. Bilgiye ne kadar kolay ulaşırsam o kadar kolay unuturum onun için çabalamaya devam :)
Saygılarımla.

> 1 <
Copyright © 2004-2022 SQL: 1.47 saniye - Sorgu: 71 - Ortalama: 0.0207 saniye