07.04.2010 14:18    

aslanv
Arkadaşlar Merhaba,
Bir çiizm içerisindeki bir dinamic bloktan kaç tane olduğunu nasıl sayarız. bcount veya filter komutları çalışmıyor. Sadece qselect komutu ile yaparsak blok ismini girerek seçtirebiliyoruz. Ama benim asıl istewdiğim bcount ile toplu olarak saydırabilmekti. Bunun başka bir yolu var mıdır?

07.04.2010 14:33    

ProhibiT
Kod:

(defun C:KAC ()
   (setvar "cmdecho" 0)  (command "undo" "group")
   (setq bln "" bln (getstring "\nBlock Adı: "))
   (if (= bln "")
     (progn
       (setq blkm (entget (car (entsel "\nSaymak istediginiz bloku seciniz..."))))
       (while (/= (cdr (assoc 0 blkm)) "INSERT")
(setq blkm (entget (car (entsel "\nSecilen obje bir blok degil! Yeniden seciniz..."))))
       )
       (setq bln (cdr (assoc 2 blkm)))
     )
   )
   (while (= (tblsearch "BLOCK" bln) nil)
     (setq bln (getstring (strcat "\nBu cizimde -" bln "- isimli bir block bulunamadi. \nBlock adini yeniden giriniz : ")))
   )
   (setq bln (cdr (assoc 2 (tblsearch "BLOCK" bln))))
   (princ (strcat "\n-" bln "- Bloklarini Tum cizimde aramak icin Enter giriniz..."))
   (if (= (ssget) nil)
    (setq bls (ssget "x" (list (cons 0 "INSERT") (cons 2 bln))))
    (setq bls (ssget "p" (list (cons 0 "INSERT") (cons 2 bln))))
   )
   (if (= bls nil)
     (princ (strcat "\n   -" bln "- bulunamadi..."))
     (progn (setq quant (sslength bls)) (princ (strcat "\n   " (itoa quant) " adet -" bln "- bulundu")))
   )
   (command "undo" "e")  (prin1)
)

Fonksiyonunu kullanabilirsiniz.
Block adını yazmanız istenir, block adı yerine enter (ya da sağ tuş) girince obje seçimine döner, blocku ekrandan seçebilirsiniz.
Belirlediğimiz block'u seçeceğimiz gurup içinde (Window, Crossing... gibi) arayabileceği gibi, eğer enter girerseniz bütün çizim içinde ilgili blocktan kaç tane bulunduğunu sayar ve yazar.

Kolay Gelsin...

07.04.2010 14:59    

Harbi65
ProhibiT hocam;
Dinamik blokların özellikleri değiştirildiğinde isimleri değişmektedir.. Bu nedenle bu fonksiyonla doğru sayım yapılmaz....



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

Harbi65 (07.04.2010 15:09 GMT)

07.04.2010 18:34    

ProhibiT
Haklısın Harbi65 hocam :) tezcanlılık etmişim...

07.04.2010 18:44    

Harbi65
Estağfirullah hocam..
Sizin yazdığınız kod da mutlaka örnek olacaktır...!

08.04.2010 07:00    

blama
ellerinize saglik arkadaslar guzel oldu
bir de ust uste 2 ayni block duruyor ise onu uyaran birsey varmi acaba sayimda yanlistiriyor
yardimlariniza tesekkurler

08.04.2010 13:50    

ProhibiT
Kod:

;;; Belirnen bir Block'tan seçilen objeler içinde veya Tüm Çizim içinde,
;;; Değiştirilmiş Dinamik Blokları da sayarak, kaç tane olduğunu bulur
;;; Hazırlayan M. Şahin Güvercin 08.04.2010 - Ankara
(defun c:bsay ()
  (vl-load-com)
  (setq bln (getstring "\nSayılacak Block adı: <Blok Seçmek için ENTER giriniz> ") sayi 0)
  (if (= bln "")
    (progn
      (setq e (car (entsel "\nSaymak istediginiz bloku seciniz...")) bm (entget e))
      (while (/= (cdr (assoc 0 bm)) "INSERT")
(setq e (car (entsel "\nSecilen obje bir blok degil! Yeniden seciniz...")) bm (entget e)))
      (setq obj (vlax-ename->vla-object e))
      (if (= -1 (vlax-get obj 'IsDynamicBlock))
(setq bln (vlax-get obj 'EffectiveName)) (setq bln (cdr (assoc 2 (entget e)))))))
  (while (= (tblsearch "BLOCK" bln) nil)
    (princ (strcat "\nBu cizimde -" bln "- isimli bir Block Tanımı bulunamadi."))
    (setq bln (getstring "\nBlock adini yeniden giriniz : ")))
  (setq bln (cdr (assoc 2 (tblsearch "BLOCK" bln))))
  (princ (strcat "\nÇizimin tümünde -" bln "- aramak icin Enter giriniz..."))
  (if (= (ssget) nil)
    (setq bls (ssget "x" (list (cons 0 "INSERT"))) sss "\nBu çizim içinde ")
    (setq bls (ssget "p" (list (cons 0 "INSERT"))) sss "\nSeçilen objeler içinde " ))
  (setq n 0 l (sslength bls))
  (while (< n l)
    (setq e (ssname bls n) obj (vlax-ename->vla-object e))
    (if (= -1 (vlax-get obj 'IsDynamicBlock))
      (if (= (vlax-get obj 'EffectiveName) bln) (setq sayi (1+ sayi)))
      (if (= (cdr (assoc 2 (entget e))) bln) (setq sayi (1+ sayi))))
    (setq n (1+ n)))
  (if (< sayi 1)
    (princ (strcat sss "-" bln "- bulunamadi..."))
    (princ (strcat sss (itoa sayi) " adet -" bln "- bulundu...")))
  (prin1)
)


Değiştirilmiş Dynamic Block'ları da sayacak şekilde düzenlenmiş hali.
halilozcakir kardeşimiz iltifat etmiş, boşa çıkarmamak için düzeltmek şart olmuştu :)

Kolay gelsin...

08.04.2010 14:24    

ehya
hocam ellerinize sağlık.
yazdığınız lisplerde visuallisp kodları da görmek nasip oldu :)

08.04.2010 14:30    

ProhibiT
Teşekkür ederim ehya hocam :)
AutoLisp komutlarının yetmediği yerlerde başvuruyorum VisualLisp'e.
Burada olduğu gibi; Dynamic Block'ların Extended Data (xdata) bölümüne AutoLisp ile ulaşmak çetrefil bir iş. VisualLisp'i sular seller gibi bilmediğim için de; Densizlikten değil, Yersizlikten bazen kullanıyorum. :)

ProhibiT (22.01.2011 07:50 GMT)

08.04.2010 15:33    

aslanv
prohibit hocam teşekkürler. Ancak buna bir şey ekleyebilir miyiz. Bu lispin bcount mantığı ile çalışmasını sağlayabilir misiniz. Yani bcount da enter enter dediğimizde çiizm içindeki tüm blokların sayısını veriyor ya bu da enter enter dediğimizde çizim içindeki tüm farklı dinamik bloklarının sayısını verse. Metraj mantığı gibi düşünüyorum da. Teşekkürler ilginiz için.

08.04.2010 17:26    

ProhibiT
merhaba aslanv,

Açıkçası bcount fonksiyonunu hiç kullanmadım, nasıl çalıştığını da bilmiyorum.
Sorduğunuz soruyu da bu boyutuyla tam anlayamadım.
bcount'a sizin sorunuzu anlamak için bakacağım :)

Sorunuzdan şimdilik anladığımı özetlersek;
- Burada verdiğim fonksiyonda olduğu gibi bir block seçmeyeceğiz.
- Drawing dosyası içinde mevcut bütün blokc'ları listeleyip,
- Her birinden kaç tane insert edildiğini saydırıp, liste halinde yazdıracağız.

Çok zor bir şey gibi görünmüyor. Yanlış anladığım noktalar varsa,
buradan düzeltip açıklarsanız yazmayı denerim elbette...

Kolay Gelsin.

Düzenleme:
Kod:

;;; Çizim içindeki bütün Kullanıcı Bloklarını sayılır.
;;; Edit edilmiş dinamik bloklar da sayıma dahil edilir.
;;; istenirse sayım sonuçları liste halinde dosyaya yazılır.
;;; Hazırlayan M. Şahin Güvercin 09.04.2010 - Ankara
(defun c:bsay ()
  (vl-load-com) (initget 1 "E H")
  (setq btot 0 dfn (getvar "dwgname") dfn (substr dfn 1 (- (strlen dfn) 4)))
  (setq dy (getkword "\nSonuçlar Dosyaya Yazılsın mı? (Evet/Hayır): "))
  (if (eq dy "E")
    (setq f (open (getfiled "Block Liste Dosyası" (strcat (getvar "dwgprefix") dfn) "txt" 1) "w")))
  (princ "\n BLock Adı...... Sayısı") (princ "\n =============== ======")
  (if (eq dy "E")
    (progn (write-line " BLock Adı...... Sayısı" f) (write-line " =============== ======" f)))
  (setq bln (tblnext "BLOCK" T) bls (ssget "x" (list (cons 0 "INSERT"))) l (sslength bls))
  (while bln
    (setq bln (cdr (assoc 2 bln)))
    (if (not (eq (substr bln 1 1) "*"))
      (progn
        (setq n 0 sayi 0)
        (while (< n l)
          (setq e (ssname bls n) obj (vlax-ename->vla-object e))
          (if (= -1 (vlax-get obj 'IsDynamicBlock))
            (if (= (vlax-get obj 'EffectiveName) bln) (setq sayi (1+ sayi)))
            (if (= (cdr (assoc 2 (entget e))) bln) (setq sayi (1+ sayi))))
          (setq n (1+ n)))
        (if (> sayi 0)
          (progn
            (while (< (strlen bln) 15) (setq bln (strcat bln ".")))
            (princ (strcat "\n " bln ": " (itoa sayi)))
            (if (eq dy "E") (write-line (strcat " " bln ": " (itoa sayi)) f))
            (setq btot (+ btot sayi))))))
    (setq bln (tblnext "BLOCK")))
  (princ "\n =============== ======") (princ (strcat "\n TopLam.........: " (itoa btot)))
  (if (eq dy "E")
    (progn (write-line " =============== ======" f)
      (write-line (strcat " TopLam.........: " (itoa btot)) f) (close f)))
  (prin1)
)

İsteğe bağlı olarak sonuçları dosyaya yazdırma seçeneği de ekledim.
Umarım bu haliyle işinizi görür :)

ProhibiT (21.01.2011 10:41 GMT)

09.04.2010 06:38    

aslanv
Prohibit hocam,
Çok sağolun. Kör istedi bir göz siz verdiniz iki göz. :-) İstediğim aynen bu şekilde birşeydi. Çok çok teşekkür ediyorum. Bu forumu seviyorum sıkıştığım anda biliyorum ki birileri mutlaka yardımcı oluyor. Sağlıcakla kalın.

12.10.2010 09:58    

BERNAYZ
Merhaba,
lisp için çok teşekkürler. Ancak ismi *U21 olan blokları, daha doğrusu isminin başında * olan blokları hiçbiryerde görünmüyor. Çizimde var. list ile bakınca blok ismini görüyorsunuz ancak ne FİLTER da ne de INSERT ile baktığında bu blok yok. Dolayısı ile bu lisp ile de saymıyor. Filter ile de... Sebebi nedir? Yardımcı olabilir misiniz?

12.10.2010 10:02    

halilozcakir
bloğun adını değiştirmeni öneririm.format menüsünde en altta renameden * yerine başka bişey..

12.10.2010 10:44    

BERNAYZ
işte malesef olmuyor. Format menuden rename e girip block diyorum fakat sağ tarafta yazan blok isimlerinde bu* ile başlayan bloklar görünmüyor. ACIL YARDIIIIM

12.10.2010 10:54    

Harbi65
Alıntı
BERNAYZ :
işte malesef olmuyor. Format menuden rename e girip block diyorum fakat sağ tarafta yazan blok isimlerinde bu* ile başlayan bloklar görünmüyor. ACIL YARDIIIIM



İsmi *U21 şeklinde görünen bloklar dinamik bloktur. Dinamik blokların niteliklerini değiştirirseniz bu şekilde benzer isim alırlar. Örneğin INSERT komunu çalıştırdığınızda bu bloklar gerçek ismiyle görünürler... Yukarıda ProhibiT hocamın yazdığı lisp bu blokları saymaktadır... Ama bu bu isimle değil gerçek isimleri ile listelenirler...

Burda ki lisp ile de sayabilirsiniz...


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

12.10.2010 11:29    

BERNAYZ
Prohibit 'e teşekkür ediyorum ama malesef o lisp de saymıyor... Netten araştırdığım kadarı ile buna Anonymous Block deniyormuş. Bu tip blokların adını değiştiren bir lisp buldum netten ama o da tek tek seçerek değiştirmen gerekiyor. :( Tek tek tek seçtikten sonra zaten otur say (72000 m2 lik proje olunca bu da işkence) oluyor... :( PROHIBİT bu tip blokların ismini değiştirmek için bir lisp yazarsa süper olur doğrusu... Yine de teşekkürler her şey için...

12.10.2010 12:00    

halilozcakir
merak etme üstad kısa sürede dönüş yapar yetişir imdada..
çizimi de görmeden net konuşamıyorum ama Anonymous Blockları saysak ,oradan da başka verilerinden layerlarından vs saydırsak ?

12.10.2010 14:29    

ProhibiT
Merhaba BERNAYZ

Öncelikla Anonymus BLock'lar ile ilgili kısa bir açıklama yapmak isterim.

Anonymus BLock dediğimiz türden ve isimleri * ile başlayan BLocklar değişik yollarla oluşturulurlar.
- Dynamic BLock'lar da edit edildiklerinde *??? şeklinde bir isim alarak Anonymus BLock'a dönüşürler.
- Ctrl+C ve Shift+Ctrl+V şeklinde copy paste yaparken de Anonymus BLock oluşturulabilir...
- Çizim içindeki her bir dimension objesi de aslında birer Anonymus BLock'tur ve isimleri *D??? formatındadır.

Edit edilen Dynamic Block'lar Anonymus BLock'a dönüşürken, aslını inkar etmez ve object tanımı içinde orijinal BLock adını barındırırlar. Yukarıda BLock sayma fonksiyonunda bu özelliği kullanarak edit edilmiş Dynamic BLock'ları da sayıma dahil etmiştim.

Gelelim sizin probleminize...
Bir kere biz BLock tanımlarını aramıyorsak, insert edilmiş BLock'ları (Ki bunlar artık INSERT objeleridir) arıyorsak, işimiz zor değil.
Insert edilmiş bir Block objesinin Entity Type'ı (Assoc 0'ı) "INSERT" tür. Bu objenin Block Name'i (Assoc 2'si) ise bahsettiğiniz *U???? formatındaki stringdir.
Hal böyle olunca aşağıdaki fonksiyonla *U??? şeklindeki BLocklarınızı da seçebilirsiniz...
(Deneme, test etme fırsatım olmadı açıkçası, doğrudan buraya yazıyorum.)
Kod:

(defun c:ABLbuL ()
  (setq abLname (strcat (chr 96) (getstring "\Anonymus Block Adını yazınız: "))
           SelectionSet (ssget "x" (list (cons 0 "INSERT") (cons 2 abLname)))
           Lngth (sslength SelectinSet))
  (princ (strcat "\n" Lngth " tane " abLname " Blocku bulundu..."))
)

ABLbuL fonksiyonunu çalıştırdıktan sonra, Bulunan BLock'lar Previous Selectin Set'e alınırlar.
Yani bu komuttan hemen sonra kullanacağınız AutoCAD komutunda (mesela Copy) P (previous) seçerek söz konusu BLock'larınızı seçmiş olursunuz.
Bir problem çıkarsa, Söz konusu Drawing dosyanızı bana Mail olarak gönderirseniz, bir çözüm yolu daha bakarız...

Herkese Kolay gelsin.

Düzenleme: Mesajınızın detayını şimdi okudum, *U21 isimli BLock'un ismini değiştirmek istiyorsunuz sanırım. O zaman iş değişir. Akşam evde yazmaya çalışırım, yazarsam da buradan paylaşırım :)

ProhibiT (12.10.2010 15:40 GMT)

13.10.2010 06:09    

BERNAYZ
Merhaba PROHIBIT,
bloksayma lispiniz bu anonymus blokları saymıyordu. Bu sepeple isimlerini değiştirmek istemiştim. Yada bir şekilde bu blokların özelliklerini değiştirmek istiyordum ki lisp saysın. Ama BULDUUUUM. Help de yaptığım araştırmalar sonucunda RESETBLOCK komutunu girip 'all' dediğinizde tüm anonymus blokları normal dynamic bloklara çeviriyor... Böyle olunca da sizin yazdığınız lisp ile sayabiliyorsunuz. Benzer sorunu olabilecek arkadaşlar için paylaşmak istedim.
Herşey için teşekkürler...

Copyright © 2004-2022 SQL: 2.479 saniye - Sorgu: 111 - Ortalama: 0.02234 saniye