13.10.2010 16:42    

ProhibiT
Merhaba, Problemi çözmüş olmanıza sevindim...

Burada bir noktaya dikkatinizi çekmek istiyorum;
ResetBLock komutunu uyguladığınızda, işleme aldığınız Dynamic BLock'lar orijinal hallerine dönerler.
Mesela bir kapı BLock'u yaptınız, kapı Genişliğini Dynamic BLock özelliklerini kullanarak ayarlıyorsunuz. Yani, 80'lik, 90'lın ve 100'lük kapılar için ayrı ayrı BLock yapmadınız, hepsini tek BLock ile hallediyorsunuz. Bu durumda, ResetBLock uyguladığınızda bütün Kapı BLock'larınız orijinal hallerine döndüklerinden, Kapılarımızı ebatlarına göre ayrı ayrı sayamayacağımız gibi, çizimlerde de bütün kapılar, BLock tanımındaki orijinal ebadı neyse ona döneceklerdir.

Sonuç olarak, ResetBLock kullanmadan, edit edilmiş Dynamic BLock'larınızı;
Kod:

;;; Seçeceğiniz Edit edilmiş Dynamic BLock'tan
;;; çizim içinde kaç tane insert edilmiş olduğu sayılır.
;;; Hazırlayan M. Şahin Güvercin 13.10.2010 - Ankara
(defun c:dbsay ()
  (vl-load-com) (setq btot 0 efn nil)
  (while (/= "INSERT" (cdr (assoc 0 (setq bLn (entget (car (entsel "\nSaymak istediğiniz BLock'u seçiniz...")))))))
    (princ "\n..... seçtiğiniz obje BLock değil, yeniden seçiniz..."))
  (if (= (substr (cdr (assoc 2 bLn)) 1 2) "*U")
    (setq BLcks (ssget "x" (list (cons 0 "INSERT") (cons 2 (strcat (chr 96) (cdr (assoc 2 bLn))))))
          obj   (vlax-ename->vla-object (cdr (assoc -1 bLn)))
          efn   (vlax-get obj 'EffectiveName)
          btot  (sslength BLcks))
    (setq BLcks (ssget "x" (list (cons 0 "INSERT") (cons 2 (cdr (assoc 2 bLn))))) btot  (sslength BLcks)))
  (if efn
    (princ (strcat "\nSeçtiğiniz BLock "" (cdr (assoc 2 bLn)) "" , "" efn "" Dynamic BLock'unun edit edilmiş halidir.\nBu çizim içinde " (itoa btot) " tane bulunmuştur."))
    (princ (strcat "\nSeçtiğiniz BLock "" (cdr (assoc 2 bLn)) "" edit edilmiş bir Dynamic BLock değildir.\nBu çizim içinde " (itoa btot) " tane bulunmuştur.")))
  (prin1)
)
fonksiyonu ile saydırabilirsiniz.
Yani aynı Dynamic BLock'tan türetilerek kullanılmış BLock'larınızı (mesela 80'lik, 90'lık ve 100'lük kapılarınızı) ayrı ayrı saydırabilirsiniz...

dbsay fonksiyonu çalıştırıldığında, BLock objesi seçmenizi ister, BLock'un *U???? formatındaki adını bilmek zorunda değilsiniz. Seçtiğiniz obje edit edilmiş Dynamic BLock ise, aynı *U??? ismine sahip BLockları sayar, ve bu sayıyla birlikte, BLock'un orijinal adının ne olduğu da ekranda yazılır. Eğer, seçtiğiniz BLock objesi edit edilmiş bir Dynamic BLock değilse, (Dnamic BLock ve edit edilmemişse, ya da Dynamic BLock değilse) Bu durumda da ilgili BLock sayılarak, sayıyla birlikte, edit edilmemiş BLock olduğu bilgisi ekran yazılır...

Bu arada AutoLisp ile uğraşan arkadaşlarımız için;
program kodu içinde kullandığım (chr 96) yani ` karakterine dikkat çekmek isterim :)

Kolay gelsin.

11.12.2010 21:34    

deli.dahi
Sayın ProhibiT,

Verdiğiniz örnekler gerçekten çok güzel ve faydalı; ma acaba iki örneğinizi birleştirebilir misiniz? İlkinde tek tek blokları saymak gerekiyor, ikincisindeyse elektrik ile illgili olmayan mimari ve benzeri bloklar da listeye giriyor. Acaba stediğimiz blokları seçip, metin belgesine yazan bir örnek şekline çevirebilir misiniz? Teşekkürler.

23.12.2010 15:22    

ProhibiT
Kod:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;  Seçeceğiniz BLock veya Edit edilmiş Dynamic BLock'tan çizim içinde     ;;;
;;;  kaç tane insert edilmiş olduğu sayılır.                                ;;;
;;;  Hazırlayan M. Şahin Güvercin 23.12.2010 - Ankara                       ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:dbsay (/ btot efn namelist dy yer dwgname f bLn BLcks obj)
  (setvar "cmdecho" 0) (command "_.undo" "group") (vl-load-com)
  (setq btot 0 efn nil namelist nil) (initget 1 "E H")
  (setq dy      (getkword "\nSonuçlar Dosyaya Yazılsın mı? (Evet/Hayır): ")
        yer     (getvar "dwgprefix") dwgname (getvar "dwgname")
        dwgname (substr dwgname 1 (- (strlen dwgname) 4)))
  (if (eq dy "E") (setq f (open (getfiled "Block Liste Dosyası"
                                          (strcat yer dwgname) "txt" 1) "w")))
  (princ "\nSaymak istediğiniz BLockları seçiniz...")
  (while (setq bLn (car (entsel)))
    (if (= "INSERT" (cdr (assoc 0 (entget bLn)))) (progn
        (setq bLn (entget bLn))
        (if (= (substr (cdr (assoc 2 bLn)) 1 2) "*U")
          (setq BLcks (ssget "x" (list (cons 0 "INSERT")
                               (cons 2 (strcat (chr 96) (cdr (assoc 2 bLn))))))
                obj   (vlax-ename->vla-object (cdr (assoc -1 bLn)))
                efn   (vlax-get obj 'EffectiveName) btot (sslength BLcks))
          (setq BLcks (ssget "x" (list (cons 0 "INSERT")
                                       (cons 2 (cdr (assoc 2 bLn)))))
                btot  (sslength BLcks) efn nil))
        (if efn (progn
            (if (= dy "E") (write-line (strcat (cdr (assoc 2 bLn)) " : "
                               (itoa btot) " (Dynamic BLock adı: " efn ")") f))
            (princ (strcat "\n"" (cdr (assoc 2 bLn)) "" , "" efn
                 "" Dynamic BLock'unun edit edilmiş halidir. Bu çizim içinde "
                           (itoa btot) " tane bulundu."))) (progn
            (if (= dy "E") (write-line (strcat (cdr (assoc 2 bLn)) " : "
                                               (itoa btot)) f))
            (princ (strcat "\n"" (cdr (assoc 2 bLn)) "" Bu çizim içinde "
                           (itoa btot) " tane bulunmuştur.")))))
      (princ "\n..... seçtiğiniz obje BLock değil, yeniden seçiniz..."))
    (princ "\nYeni bir BLock seçiniz, Seçim bitince Enter giriniz..."))
  (if f (close f)) (command "_.undo" "e") (prin1)
)

Kolay gelsin...

ProhibiT (18.03.2012 18:49 GMT)

24.12.2010 06:23    

bud_0782
teşekkürler

31.12.2010 23:33    

deli.dahi
Teşekkürler.

21.01.2011 09:52    

aytac_kavak
Çok Teşekkürler hocam. Eline sağlık 10 numara iş yapmışınız gene Selamlar.

21.05.2014 07:32    

halilozcakir
merhaba , dbsay Dinamik bloklarda propertiesinden sadece visibility özelliklerine göre sayacak şekilde olmadı ,
diğer değişkenlerine göre de ayıklama yaptığı için sayımı tam yapamadık.
örneğin dinamaik elektrik anahtarı bloğu 7 çeşit anahtardan oluşuyor
bu 7 çeşitte mimariye göre mirror vb dinamik özelliklere tabi tutulmuş,lispimiz mirror dinamiği de içine katarak sayıyor.
metraj için bizim aradığımız sadece visibility özelliğini dikkate alacak.
teşekkürler .

21.05.2014 17:25    

ProhibiT
Merhaba halilozcakir.
Bilindiği gibi Dynamic Block'lar insert edildiklerinde AutoCAD Drawing Database'de Orijinal isimleriyle yer alırlar.

Insert edilmiş blokta Flip, rotate, move, stretch,... dynamic parametreleri kullanılarak değişiklik uygulandığı anda, Database'deki block adı *U?? şeklinde sistem tarafından otomatik olarak verilen bir blok adı ile değiştirilir.

Değiştirilen Block adı ilgili nesnenin database'inde Effective Block Name adı ile saklanır.

Burada paylaştığımız AutoLISP fonksiyon, drawing databse'de tüm *U??? isimli blockları ele alarak bunlar arasında belirlenen Effective Block Name'e uygun olanları seçerek sayar.

Sonuç olarak Dynamic block'ta hangi parametrenin kullanıldığına bakılmaksızın, aynı Effective Block Name'e sahip olan blocklar sayılır. Yani parametrik olarak mirror uygulanmış veya uygulanmamış blocklar bu mantık kurgusu ile ayırt edilemezler.

Bahsettiğiniz türden, dynamic parametrelerine göre block sayımı yapmak farklı bir konu, ayrıca ele almak çözmek gerek. Dynamic Block'ların Properties penceresinde görülen "flip state" durumlarına göre sayan bir fonksiyon yazılabilir. Önce block tanımı içinde kaç tane dynamic parameter var buna bakılır, seçilen örnek block'taki bu parametrelerin durumları (state) ile uygun blocklar araştırılarak sayma işlemi yapılabilir. Bunun için nesne veri tabanında (object database) ...state'lerin hangi formatta ve nerede saklandığının araştırılması gerek.

Dynamic Parameter State'lere göre block sayan AutoLISP fonksiyonu hemen yazarım diye söz vermek doğru olmaz. İlgili ve konuya hakim arkadaşlar el atmak isterse detayları anlatmış bulundum :)

Belki de block tanımlarındaki flip (mirror) parametreleri kaldırılıp bunlar ayrı blocklar olarak tanımlandıklarında paylaştığımız bu fonksiyon ile sayılmaları mümkün olabilir.

Umarım yanlış anlamamışımdır. Kolay gelsin.

21.05.2014 21:40    

Travaci
halilozcakir


Kod:

(defun c:svb (/ ob n gr) (vl-load-com)
  (setq ob (ssget (list (cons 0 "insert"))) n -1 gr (ssadd))
  (if ob (progn (repeat (sslength ob) (setq n (1+ n))
    (foreach att (vlax-invoke (vlax-ename->vla-object
      (ssname ob n)) 'GetAttributes)
      (if (= (vlax-get-property att 'TagString) "NUMARA")
        (if (= (vlax-get-property att 'Invisible) :vlax-false)
          (ssadd (ssname ob n) gr)))))
    (if (> (sslength gr) 0) (sssetfirst nil gr)))) (princ))

Bende doğrumu anladım bilmiyorum ama şöyle birşey yaptım.
Yukarıdaki kod seçilen blocklarda NUMARA isimli tag varsa ve bu görünür ise blockları seçer.
Tag ismini kendine göre değiştirirsin, görünür olmayanları seçmek için ise :vlax-false yi :vlax-true yapmalısın.

22.05.2014 06:56    

ProhibiT
Benim anladığım Attribute Tag değil de, dynamic parametrelere göre seçim yapılmak isteniyor.
Örneğin Block tanımızda Horizontal Flip koyduk, insert edilmiş block'ta ilgili mavi ok işaretine tıklandığında dikey eksene göre mirror uygulanıyor. Bu işlem AutoCAD mirror komutuyla yapılınca Orijinal block adı değişmiyor. Fakat Dynamik block parametresi kullanılarak block mirror edilmiş duruma getirildiğinde block Anonymous block name'e dönüşüyor. halilozcakir arkadaşımızın bahsettiği, bir elektrik projesinde Anahtar sembolü dynamik block olarak yapılmış. Filp (dynamic mirror mu demeli buna...) uygulandığında Anahtar başka bir anahtar tipi oluyor ve bunların ayrıca sayılması isteniyor.

22.05.2014 08:52    

Travaci
Hocam benim anladığım visibilty parametresi kullanarak 7 çeşit anahtarı tek bir block ta birleştirmiş, aynı zamanda diğer parametrelerden de kullanmış, anahtar sembolü için örneğin sadece kapalı anahtar sembollerini saydırmak istediğinde lisp hepsini seçiyor, ben block unda attribut tag de kullandığını düşündüm, bu sadece resimlerden de oluşabilir tabi. Tag de kullandığını düşünerekten böyle birşey yaptım. Ak mı kara mı belli olur : ) Eğer bu block sadece resimlerden oluşuyorsa, visibilty parametresi kontrolü nasıl yapılır düşünmek gerek :dozingoff

Edit: Bizden önce düşünenler olmuş tabikide : ) Buradaki lispi kullanabilirsin.

Dinamik blok sayma lispi download

Örnek Sonuç
============================
Block..................................Count
============================
Dynamic Block..............................5
State1..................................3
State2..................................1
State3..................................1
---------------------------------------------
Standard Block1............................4
---------------------------------------------
Standard Block2............................7
============================

admin (13.09.2018 21:49 GMT)

22.05.2014 12:30    

halilozcakir
budur :) teşekkür ederim üstadlar. aradığım tamda bu.bizim elektrikçiler bayram edecek incelemeniz için dwg ekte. 64792-dinamik-sayim.dwg

26.06.2014 21:31    

mustafaandic
Hocam Merabalar
Çok uçuk olurmu bilmiyorum ama elektrik projelerinde atıyorum; blokların 100W gücü olsun ve toplasın, herhangi bir yol varmıdır ? Piyasa'da Elektricad var ama pek ısınamadım ve çizimlerde 2 iş oluyor...

Cevap ve çözümlerinizi bekliyorum, eyvallah :)

22.10.2016 11:48    

elk21
VALLAHİ ALLAH SİZDEN RAZI OLSUN YAZMIŞ OLDUĞUNUZ LİSPLER DOĞA ÜSTÜ HARİKA LİSPLER BURDA BULUNAN TÜM ÜSTADLARIMI SAYGIYLA SEVGİYLE SELAMLIYORUM SELAM VE DUA İLE

(NOT: BU LİSP TE DAHİL OLMAK ÜZERE KULLANMIŞ OLDUĞUM HERHANGİ BİR LİSP KOMUTUNU DEĞİŞTİREBİLİRMİYİM ÖRNEK: DBCount KOMUTUNU ADINI ÜSTADIM YAPMAK İSTİYORUM YAPABİLİRMİYİM)

HİZMETİNİZDEYİM.........

Copyright © 2004-2022 SQL: 1.185 saniye - Sorgu: 80 - Ortalama: 0.01482 saniye