24.05.2014 09:00    

ehya
Şahin hocamla aramızdaki bazı konuşmalar makale değerinde olduğu için böyle bir bölümü açarak bu değerli bilgileri sizlerle paylaşmayı uygun gördük. Bundan sonra da Autocad, AutoLisp ve VisualLisp ile ilgili yazışmalar geçtikçe paylaşımlar devam edecektir.
Umarım sizlere de faydası olur.






SORU :

Ssget ile seçim yaparken dxf kodlarına göre süzgeç yapabiliyoruz.
örneğin : (ssget (list (cons 0 "LINE"))) gibi

Peki bu süzgeç yerine activex kodlarından süzgeç yapabilirmiyiz.?

Amaç, bir nesne ile ilgili daha geniş bilgiye sahip olduğumuzdan daha hızlı bir süzgeç elde edebiliriz.?






CEVAP :

DXF kodları veya AutoLISP formatında ele alınca Association List dediğimiz bilgiler, AutoCAD Drawing Databese'de kayıtlı Objet Database bilgilerine ASCII kodunda (DXF formatı) veya Associaton List (AutoLISP) olarak ulaşabiliyoruz. Burada dikkat edilmesi gereken ince ayrıntı bunlar dosyamızda kayıtlı bilgilerdir.

Bunun yanında vlax-get-properties veya vlax-dump-object gibi komutlarla elde ettiğimiz bazı bilgiler, drawing database'de ve dolayısıyle Object Database de yer almayan (kayıtlı olmayan) türemiş bilgilerdir. ssget ile seçim yaparken bu türemiş bilgileri filtre parametresi olarak kullanmak söz konusu olmaz. Çünki ssget ve benzeri seçme/arama fonksiyonları Drawing Database'de bulunan Object Database'de yer alan bilgileri filtre parametresi olarak kullanırlar.

Çok basit bir örnek üzerinden gidersek;
Bir Line objesini ele aldığımızda, bunun database'inde Başlangıç noktası, bitiş noktası, linetype'ı, Color ve Layer,... gibi bilgiler bulunur. Bu bilgilere (entget ... işleviyle eriştiğimizde '(10 x1 y1 z1) veya vlax-get-property ... kullanarak 'StartPoint şeklinde erişebiliriz. Araçlar farklı olduğu halde aynı kaynaktan, Drawing Database->Object Database'den bu bilgiler alınır.

Gene yanlış anlamamak gerek, her arama yaptığımızda Drawing dosyasına başvurulmaz. Drawing dosyasının bellekte yüklü database'i üzerinde işlem yapılır. Gene bilinen ama çok az farkında olunan bir durum da, yeni bir nesne oluşturduğumuzda, örneğin bir Line çizdiğimizde, Drawing Database'e eklenen Object Database, bilgisayar belleğinde kalır. Görülür, işlenir, silinir değiştirilir... ama, diske kaydetmediğimiz sürece bellekte kalır. Kaydetmeden çıktığımızda da uçar gider.

AutoCAD bu Line objesini drawing dosyasına (bellekteki yüklü kopyasına) kaydedip saklarken hiç bir zaman Length (uzunluk) diye bir bilgiyi saklamaz. Yani object database de length diye bir bilgi bulunmaz. Benzer şekilde Bir Polyline veya Circle objesinin de Area diye bir değeri Database'de yer almaz, kaydedilmez.

vlax-dump-object ... kullanarak bir çizim nesnesinin bilgilerine ulaştığımızda, Length veya Area özelliğinin yanında (RO) read only ifadesine dikkat etmek lazım. Bu Length bilgisinin database'de yer aldığı fakat (RO) olduğu anlamına gelmez. Length diye bir bilginin database'de yer almadığı anlamına gelir.

Buradan çıkacak doğal sonuç; vlax-put-property ... 'Area ... şeklinde bir işlem gerçekleştirilemez. İşin aslı bu Area özelliğinin (RO) bir değer olmasından değil, database'de Area diye bir bilgi bölümü bulunmadığından kaynaklanan bir durumdur.

Obje seçme veya seçim seti oluşturma mekanizmasında, işin görünüşü zihnimizi karıştırmamalı, her ne kadar ekrandan seçiyor gibi görünsekte, seçim işlemimiz Database üzerinden gerçekleşir.

Hal böyle iken, Database'de kayıtlı bilgilere (örneğin ssget komutunun filtre parametresi olarak) ulaşabiliyorken, dabase'de kayıtlı olmayan parametrelere vlax-... ile erişiyor olmak durumumuzu değiştirmez. Association List'de yer almayan (türeyen) bilgileri Seçim filtresi olarak kullanamıyoruz. Database'deki bilgilere DXF kodlarıyla veya Association List ile zaten ulaştığımıza göre, türetilmiş bilgilere göre seçimi ayrıca yapmaktan başka çare yok. Başka yöntemlere bence gerek te yok.

Önce database bilgilerine göre seçim seti oluşturup, sonrada seçim setinde üretilmiş bilgi kriterlerine göre taramak geçerli yöntemdir.

> 1 <
Copyright © 2004-2022 SQL: 0.849 saniye - Sorgu: 43 - Ortalama: 0.01974 saniye