1372826956:AAFe2Py65GSQkfGiRnXuOQ-eD9yXcwMv988

Seçim Setini İşleme

Bir seçim kümesindeki tüm nesneleri yinelemek için çeşitli yollar vardır, bazı yöntemler daha sezgiselken, diğerleri daha verimlidir.

Aşağıda, farklı yöntemlerin çeşitli örneklerini gösterecek bazı örnekler sunacağım ve her yöntemin nasıl çalıştığına ve işleminin etkinliğine ilişkin kısa bir açıklama yapmak için elimden gelenin en iyisini yapacağım.

Aşağıdaki örneklerin hepsinde, kullanıcıdan bir nesne seçmesi istenir ve örnek program, her varlığın varlık türünü (veya VLA- nesne adını) yazdırırken seçim seti üzerinde yineleyecektir.

Örneklerin birçoğu basitlik ve okunabilirlik için çeşitli değişkenler kullanacak şekilde genişletilmiş olup; daha sonra ifadeleri iç içe yerleştirmek suretiyle kısaltılabilirdi, ancak bu bu makalemde amaçladığım şey değildir

Yöntem 1: while

(defun c:test1 ( / e i n s x )

(if (setq s (ssget))

  (progn

(setq i 0

n (sslength s)

)

  (while (< i n)

(setq e (ssname s i)

                      x (cdr (assoc 0 (entget e)))

i (1+ i)

)

(print x)

            )

        )

    )

    (princ)

)

Yukarıdaki fonksiyon, seçim kümesinin yinelemesi için bir while döngüsünü kullanır. Bir saç değişkeni olan i, 0’da başlatılır ve bir sınırlayıcı değişken olan n, seçim kümesinin boyutu, yani setteki öğe sayısı olarak atanır.

While döngüsünün kontrol durumu, sayacın değerinin setteki öğelerin sayısından az olması koşuluyla D (doğru) “T (true)” olarak değerlendirilir.

Sayaç değişkeni daha sonra while döngüsü içinde artar ve böylece tüm varlıklar işlendiğinde döngünün sonlandırılmasını sağlar.

Tüm seçim setlerinin sıfır temelli bir endeksi bulunduğunu ve bu nedenle seçimdeki ilk öğenin 0, son öğenin setin eleman sayısı – 1’endeks numarasına sahip olduğunu unutmayın.

Yöntem 1a: Reverse while

(defun c:test1a ( / e i s x )

    (if (setq s (ssget))

        (progn

            (setq i (1- (sslength s)))

            (while (<= 0 i)

                (setq e (ssname s i)

                      x (cdr (assoc 0 (entget e)))

                      i (1- i)

                )

                (print x)

            )

        )

    )

    (princ)

)

Bu örnek, önceki örnekle aynı mantığı kullanır, ancak sayaç değişkeni kümedeki son endekste başlatılır ve sıfıra ulaşana kadar döngü içinde azaltılır.

Bu yaklaşım, önceki örnekteki kısıtlayıcı değişkene duyulan ihtiyacı ortadan kaldırır.

Yöntem 2: repeat

(defun c:test2 ( / e i s x )

(if (setq s (ssget))

(progn

(setq i 0)

(repeat (sslength s)

(setq e (ssname s i)

x (cdr (assoc 0 (entget e)))

i (1+ i)

)

(print x)

  )

        )

    )

    (princ)

)

Yukarıdaki fonksiyon aynı zamanda, tekrar eden döngü içinde artan bir sayaç değişkeni (i) kullanır; ancak, döngü gerçekleştirilmeden önce (sslength komutu kullanılarak) setteki öğelerin sayısı belirlenebildiğinden, bu repeat daha verimli bir döngüdür ve repeat döngüsü setteki öğelerin sayısına eşit sayıda kümeyi yinelemek için kullanılır.

Yöntem 2a: Reverse repeat

(defun c:test2a ( / e i s x )

(if (setq s (ssget))

(repeat (setq i (sslength s))

(setq e (ssname s (setq i (1- i)))

x (cdr (assoc 0 (entget e)))

            )

            (print x)

        )

    )

    (princ)

)

(Yöntem 1a daki örnekteki) While döngüsünün aksine, bu daha kısa (fakat belki de daha az okunabilir) örnek, i değişkenini, setin öğe sayısıyla başlatır; bununla birlikte, bu repeat fonksiyonuna döngü sayısı sağlamak için,  setq  ifadesinin geri döndürdüğü değeri kullanır.

Sayaç değişkeni daha sonra döngü içinde azaltılır ((sslength – 1) inci varlıkta işleme başlamak için) ve yine, bu setq ifadesinin döndürdüğü değer ssname fonksiyonuna iletilir.

Bu örnek, önceki örneğe göre verimlilik bakımından önemsiz bir farklılığa sahiptir; ancak daha kısadır.

Yöntem 3: ssnamex

(defun c:test3 ( / s )

    (if (setq s (ssget))

        (foreach e (ssnamex s)

(if (= ename (type (cadr e)))

(print (cdr (assoc 0 (entget (cadr e)))))

            )

        )

    )

    (princ)

)

Ssnamex fonksiyonu, bir seçim setinin nasıl toplandığı hakkında bilgi döndürmek için kullanılabilir. Bu bilgi, seçimdeki tüm varlık adlarını da içerir.

Yukarıdaki örnek, ssnamex fonksiyonu tarafından döndürülen listede yineleme yapacak ve içerdiği varlıkları işleyecektir.

 

Bununla birlikte, bu kod metni önceki örneklere kıyasla daha özlü olduğu için, daha verimli olduğunu düşünerek aldanmayın …

Ssnamex fonksiyonu, işlem yoğun bir fonksiyondur ve değerlendirme yapmak için, yavaştır; ayrıca foreach döngüsü, ssnamex fonksiyonu herhangi bir pencere seçimi hakkında ek bilgi içerdiğinden (veya diğer seçme yöntemleri ) kullanılmış olabileceğinden, setteki öğelerin sayısından daha fazla sayıda yinelenebilir.

Yöntem 4: ssdel

(defun c:test4 ( / e s )

    (if (setq s (ssget))

(while (setq e (ssname s 0))

(print (cdr (assoc 0 (entget e))))

            (ssdel e s)

        )

    )

    (princ)

)

Bu yöntem, setteki işlem yaptığı öğeyi sırayla setten çıkartarak ve seçim kümesinin doğal davranışından istifade ederek bir seçim kümesi üzerinde yineleme yapmaya başlar.

Bir seçim seti bir varlıklar dizisi olarak görülebilir. Her varlık dizide bir konum veya endeks kullanır, ilk varlık 0 endeksini işgal eder.

Bir varlık, seçim setinden kaldırıldığında, dizide bir ‘boşluk’ olmaması için, kaldırılan varlığın üst tarafındaki konumları işgal eden tüm varlıklar, daha düşük konumları işgal etmek üzere aşağı kaydırılır; böylece, setten çıkartılan varlık tarafından oluşturulan ‘boşluk doldurur.

Bu yolla, seçim kümesi boş olmadığı sürece her zaman varlık 0 endeksini işgal eden bir varlık olacaktır.

Bununla birlikte, varlıkları seçim kümesindeki yeni endekslere sürekli olarak geçirme süreci gereksizdir ve büyük ölçüde verimsizdir ve bu nedenle, birçok nesne içeren seçim setlerini işlerken bu yöntemden kaçınılmalıdır.

Yöntem 4a: Reverse ssdel

(defun c:test4a ( / e i s )

(if (setq s (ssget))

        (progn

(setq i (sslength s))

            (while (setq e (ssname s (setq i (1- i))))

                (print (cdr (assoc 0 (entget e))))                (ssdel e s)

            )

        )

    )

    (princ)

)

Bu yöntem de ssdel  fonksiyonunu kullanan yukarıdaki (Yöntem 4 deki) tekniğe benzer şekilde, sette varlık kalmayıncaya kadar ilk öğeyi seçim kümesinden sırayla çıkartır. Bu yöntem, önce seçim kümesindeki (sslength – 1) endeksini işgal eden varlığı kaldırır. Burdakli amaç; her varlığın daha düşük bir endeks numarasına kaymasıyla ortaya çıkan verimsizliği önlemektir.

Bununla birlikte, bu örnekte while döngüsünün sonlandırılması, tüm varlıkların işlenmesinden sonra boşalan seçim setine dayanmasına rağmen, Yöntem 1a ve Yöntem 2a, seçim kümesini işlemek için kümeden bir varlığın çıkarılmasının gerekli olmadığını göstermektedir ve bu nedenle bu yöntemler ssdel fonksiyonunun kullanımından nispeten daha etkilidir.

 

Yöntem 5: Visual LISP ActiveX

(defun c:test5 ( / s )

    (if (ssget)

        (progn

            (vlax-for o (setq s (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))

                (print (vla-get-objectname o))

            )

            (vla-delete s)

        )

    )

    (princ)

)

(vl-load-com) (princ)

Bu yöntem, programın seçimdeki varlıkların VLA-Nesnesi gösterimlerinde çalışması gerektiğinde ve her nesneyi eşdeğer VLA-Nesnesinin temsiline dönüştürmek için vlax-ename-> vla-object fonksiyonunu kullanma ihtiyacından kaçınmak için yararlıdır.

Yöntem, AktifSeçimSeti “ActiveSelectionSet” koleksiyonunu çizimdeki SeçimSetleri “SelectionSets” koleksiyonundan alır ve burada bulunan VLA-Nesnelerinin üzerinde yineleme yapar.

Bununla birlikte, bu Yöntemi kullanırken, bu koleksiyonda izin verilen SeçimSeti “SelectionSet “ nesnesi sayısına bir sınırlama olduğundan, VLA SeçimSeti “SelectionSet “ nesnesinin kullanımdan sonra SeçimSeti “SelectionSet “ nesnesi SeçimSetleri “SelectionSets” koleksiyonundan silinmelidir.

 

Hakkında Sertan Türkan

AutoCAD Beyni

Bunu da Kontrol edin

Revitte Kesit Başlığı Ailesi Oluşturma

Revit’te kesit başı sembolünüze çizim ve pafta numaraları ekleyebilirsiniz. Aşağıdaki prosedür, bir kesit başı ailesi …

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.