09.10.2008 07:33    

k005
mrb arkadaşlar;

Wblock objeleri explode kullanmadan, rengini lisp kodu ile nasıl değiştirebiliriz?


yardımcı arkadaş(lar)a şimdiden teşekkürler..

ProhibiT (31.05.2021 08:39 GMT)

09.10.2008 09:38    

ehya
Blok yapmadan önce layerını sıfır katmanında yaparsan ya da blokeditor'e girip blok layerını sıfıra çevirirsen, bundan sonra layerını değiştirdiğinde layer rengi ne ise o olacaktır. Lispe gerek yok yani...

09.10.2008 09:56    

Harbi65
Ehya'nın söylediğine ek olarak;

Blok yaparken çizgilerin rengini Byblok olarak tariflersen de, bloğu patlatmadan çizgi rengi değiştirir gibi bloğu seçip rengini değiştirdiğinde Byblock tariflediğin nesneler seçtiğin rengi alacaktır...

09.10.2008 10:11    

k005
Alıntı
ehya :
Blok yapmadan önce layerını sıfır katmanında yaparsan ya da blokeditor'e girip blok layerını sıfıra çevirirsen, bundan sonra layerını değiştirdiğinde layer rengi ne ise o olacaktır. Lispe gerek yok yani...




Bloğu ben yapmıyorum. Farklı bir dwg dosyasında mevcut bloklar var. ve bunların rengini değiştirmek istiyorum. yani Autocad ortamındaki wblock yapma olayı değil. o yüzden lisp ile olabilir mi diye sormuştum?.

09.10.2008 11:42    

ehya
Kafamda canlandırdığım kadarıyla zor bir konu. Yazmaya başlamadan da birşey diyemem.. Müsait bir zamanda denerim..
Ya da harbi65 sen başla istersen denemelere :)

09.10.2008 12:23    

k005
Alıntı
ehya :


Tamam hocam. teşekkürler..

11.03.2009 09:26    

kurtsalih
Alıntı
k005 :
mrb arkadaşlar;

Wblock objeleri explode kullanmadan, rengini lisp kodu ile nasıl değiştirebiliriz?


yardımcı arkadaş(lar)a şimdiden teşekkürler..



rengini değiştirmek istediğin bloğun üzerine sağ tıkla; block editör/ bloğun tamamını seç ve rengini değiştir. close block editör. gelen soruda yes (evet).. işlem tamamdır..

10.11.2009 08:03    

aziz_ank
tesekkur ederim

11.11.2009 08:34    

ProhibiT
Merhaba arkadaşlar :)

Bir arkadaşımızın söylediği gibi Block Editor ile rengini değiştirmek çözüm elbette.

Ama ille de daha seri ve pratik yapmak isteyenler için bir kaç satır AutoLisp yazdım.
Başlığı açan arkadaşımızın ihtiyacını karşılayacağı gibi, işin programlama boyutuyla ilgilenen arkadaşların ilgisini çekeceğini düşünüyorum.
Kod:

(defun c:BLCLr ()
  (if (= "INSERT" (cdr (assoc 0 (entget (setq BLock (car (entsel "\Rengini değiştirmek istediğiniz Block'u seçiniz")))))))
    (progn
      (setq BlockName (cdr (assoc 2 (entget BLock)))
            BLockDef (tblsearch "BLock" BLockName)
            Renk (acad_colordlg 0)
            BLockEnt (cdr (assoc -2 BLockDef))
      )
      (while BLockEnt
        (setq SubObj (entget BLockEnt))
        (if (assoc 62 SubObj)
          (setq SubObj (subst (cons 62 Renk) (assoc 62 SubObj) SubObj))
          (setq SubObj (append SubObj (list (cons 62 Renk))))
        )
        (entmod SubObj)
        (entupd (cdr (assoc -1 SubObj)))
        (setq BLockEnt (entnext BLockEnt))
      )
      (entupd BLock)
    )
    (princ "\nSectiginiz obje bir BLock değildir, yeniden deneyiniz...")
  )
  (prin1)
)

Ekranda insert edilmiş bir block seçiliyor, Block olup olmadığı kontrol edildikten sonra;
tblsearch ile block tanımına ulaşıp, orada block tanımı içindeki bütün objelerin rengi değiştiriliyor.
Block tanımı yeni renklerine göre "entupd" edildikten sonra, insert edilmiş block objelerinin de "entupd" ile "regen" edilmeleri gerekiyor ki, yeni renkleri ekranda görünsün. Programı uzatmamak için yalnızca seçilen "INSERT" objesini "entupd" yaptım ki, yapılan işlem algılanabilsin, takip edilebilsin. Çizim içinde insert edilmiş aynı isimli diğer blocklar bu safhada eski renginde kalacak, ilk "regen" işleminde yeni renklerine döneceklerdir. Yani Automatic Regen yapıncaya kadar sabrı yoksa kullanıcının kendi regen ettirmelidir.

Block'u oluşturan objelerin rengi "ByLayer" ise Entity Listinde 62 numaralı anahtar yer almıyor.
Bu durumda Entity List'e yeni bir anahtar (62) ve seçilen renk kodunun eklenmesi gerekiyor.
ByLayer rengi dışındaki diğer renklerde, "ByBLock" ta dahil olmak üzere 62 Anahtarı zaten bulunduğundan, değiştirilmesi yeterli oluyor.

Son olarak bir konuya dikkatinizi çekmek istiyorum; Eğer Block içinde Attribute varsa, bu program onun rengini değiştirmez. Atrribute aslında BLock objesi ile ilişlilendirilmiş Farklı bir objedir, bir bakıma SubEntity değildir. Şüphesiz attribute'lerin de rengini değiştirecek şekilde düzenlenebilir. Burada en kısa en sade şekilde örneklemek adına yazılmış bir programın kapsamında gerek görmedim yazmaya.

Selamlar, Sevgiler, Herkese Kolay Gelsin...

11.11.2009 09:35    

k005
Alıntı
ProhibiT :

Hocam çok teşekkürler..

13.11.2009 15:43    

snoopyy
çok teşekkürler ellerinize sağlık... çok işime yaradı aynı şekilde block lu parçanın line weight ini nasıl değiştirebilirim.

14.11.2009 17:19    

ProhibiT
Örnek Lisp'te Renk değiştirmek için Object Color Group Code olan 62 kullanılıyor.
Object LineWeight in Group Code'u da 370 tir. Bu programcıkta bu yönde değişiklik yapılırsa elbette lineweight değiştirmek için de kullanılabilir...

Kolay Gelsin...

16.11.2009 11:26    

bud_0782
Teşekkürler prohibit :) çok kullanışlı bir programcık.peki bu lispi şu şekilde düzenlemekte mümkün olur mu; blockları tek tek seçerek renk değiştirmektense bir defada istediğim kadar block seçebilsem ve bir kerede tüm blocklarımın rengini değiştirebilsem...

16.11.2009 12:48    

ProhibiT
Elbette mümkün :)
Ama bir seferde seçtiğin bütün BLock'lrın rengini aynı yapar bu haliyle.
Bir kerede çoklu BLock seçip renklerini farklı yapmak için eklemeler yapmak gerekir.
Ki; her BLock için ayrı renk soracağından pratik olmaktan çıkar bence...
stediğiniz şekliyle akşam yazıp buradan paylaşmış olurum...

16.11.2009 14:57    

bud_0782
Hayır her bloğun ayrı renk olmasına gerek yok.tek renk seçeneği yeterli olacaktır.aksi halde dediğiniz gibi tek tek yapmaktan farkı kalmaz.amacım bir kerede tüm renkli blockları seçip beyaz yapmak...
ilginize teşekkürler...

16.11.2009 15:19    

ProhibiT
Akşam olmuş bile :)
İlgilenen arkadaşların kolayca takip edebilmeleri için mümkün olduğunca sade yazmaya çalışıyorum...
Kod:

(defun c:BLCLr ()
  (princ "\Rengini değiştirmek istediğiniz BLock'ları seçiniz")
  (setq BLocklar (ssget))
  (setq Renk (acad_colordlg 0)
        BLcsayi (sslength BLocklar)
        sayac 0)
  (while (< sayac BLcsayi)
    (if (= "INSERT" (cdr (assoc 0 (entget (setq BLock (ssname BLocklar sayac))))))
      (progn
        (setq BlockName (cdr (assoc 2 (entget BLock)))
              BLockDef (tblsearch "BLock" BLockName)
              BLockEnt (cdr (assoc -2 BLockDef))
        )
        (while BLockEnt
          (setq SubObj (entget BLockEnt))
          (if (assoc 62 SubObj)
            (setq SubObj (subst (cons 62 Renk) (assoc 62 SubObj) SubObj))
            (setq SubObj (append SubObj (list (cons 62 Renk))))
          )
          (entmod SubObj)
          (entupd (cdr (assoc -1 SubObj)))
          (setq BLockEnt (entnext BLockEnt))
        )
        (entupd BLock)
      )
    )
    (setq sayac (1+ sayac))
  )
  (command "Regen")
  (prin1)
)


Blockları seçerken özgürce seçebilirsiniz... İster window ile ister crossing ile seçin, ister pick'leyin Selection set içinden BLock objelerini bulur ve onları işleme alır. Bir de Sonuna "Regen" ekledim ki, rengi değişenler hemen görünsün...

Selamlar, Sevgiler, Herkes Kolay Gelsin...

17.11.2009 06:02    

bud_0782
Elinize sağlık şimdi daha kullanışlı olmuş...özellikle tüm dosyayı seçsek bile içinden blockları ayırıp işlem yapması müthiş...ilginize teşekkür ederim :) bu lispin kalınlık ayarını yapanını da istesem çok mu olurum :blush bu konu benim hep başımı ağrıtan bir konu da :)

bud_0782 (17.11.2009 06:11 GMT)

18.11.2009 07:57    

ProhibiT
Kod:

(defun c:BLLwt ()
  (princ "\LineWeight'ini değiştirmek istediğiniz BLock'ları seçiniz")
  (setq BLocklar (ssget))
  (setq LineWt (getint "\BLock objeleri için LineWeight giriniz. \n<Defaul=-3, ByBLock=-2, ByLayer=-1>: ")
        BLcsayi (sslength BLocklar)
        sayac 0)
  (while (< sayac BLcsayi)
    (if (= "INSERT" (cdr (assoc 0 (entget (setq BLock (ssname BLocklar sayac))))))
      (progn
        (setq BlockName (cdr (assoc 2 (entget BLock)))
              BLockDef (tblsearch "BLock" BLockName)
              BLockEnt (cdr (assoc -2 BLockDef))
        )
        (while BLockEnt
          (setq SubObj (entget BLockEnt))
          (if (assoc 62 SubObj)
            (setq SubObj (subst (cons 370 Renk) (assoc 370 SubObj) SubObj))
            (setq SubObj (append SubObj (list (cons 370 LineWt))))
          )
          (entmod SubObj)
          (entupd (cdr (assoc -1 SubObj)))
          (setq BLockEnt (entnext BLockEnt))
        )
        (entupd BLock)
      )
    )
    (setq sayac (1+ sayac))
  )
  (command "Regen")
  (prin1)
)


Bu konuyu fazla kurcaladık gibi geldi bana :)
AutoLisp ile ilgilenen arkadaşların ilgisini çekebilecek bir örnek diye başlamıştım. İstek üzerine Bu üçüncü versiyon oldu.

İstediğiniz şekilde Block objelerinin Line Weight'lerini değiştiriyor.
Çalışma mantığı önceki renk değiştiren fonksiyonun aynı.

Dikkat edilmesi gereken konu;
Line Weight'i Default yapmak için -3
Line Weight'i ByBLock yapmak için -2
Line Weight'i ByLayer yapmak için -1 girmeniz gerektiği.
AutoCAD de database'inde bu şekilde tutuyor bu değerleri.

Ekranda sorulan LineWeight değeri olarak,
9 girerseniz Line Weight 0.09 olur
90 girerseniz Line Weight 0.9 olur
900 girerseniz Line Weight 9 olur.
0 girerseniz de elbette Line Weight sıfır olacaktır.

Selamlar, Sevgiler, Herkese Kolay Gelsin...

19.11.2009 05:49    

bud_0782
Emeğinize sağlık :) Teşekkür ederim...

28.05.2021 07:42    

k005
@ProhibiT


Hocam merhaba .

2009 block rengi değiştirme ile ilgili bir kod yazmıştınız. O dönemde çok işime yaramıştı., şimdi buna bir ekleme durumu hasıl oldu hocam.

Şöyle : Rengi değiştirmek istediğim blok tıkladığımda , ilgili layerdaki blokları seçtirebilirmiyiz ?



list içerik:

BLOCK REFERENCE Layer: "Kolon"
Space: Model space
Color: 7 (white) Linetype: "BYLAYER"
Handle = 2032d
Block Name: "IDE411Entity542"

mesela bu kolon örneğinde durum şu şekilde:

layer : kolon
kolonun her bir kenarı da block...


Teşekkürler.



Kod:

(defun c:BLCLr ()
  (if (= "INSERT" (cdr (assoc 0 (entget (setq BLock (car (entsel "\Rengini değiştirmek istediğiniz Block'u seçiniz")))))))
    (progn
      (setq BlockName (cdr (assoc 2 (entget BLock)))
            BLockDef (tblsearch "BLock" BLockName)
            Renk (acad_colordlg 0)
            BLockEnt (cdr (assoc -2 BLockDef))
      )
      (while BLockEnt
        (setq SubObj (entget BLockEnt))
        (if (assoc 62 SubObj)
          (setq SubObj (subst (cons 62 Renk) (assoc 62 SubObj) SubObj))
          (setq SubObj (append SubObj (list (cons 62 Renk))))
        )
        (entmod SubObj)
        (entupd (cdr (assoc -1 SubObj)))
        (setq BLockEnt (entnext BLockEnt))
      )
      (entupd BLock)
    )
    (princ "\nSectiginiz obje bir BLock değildir, yeniden deneyiniz...")
  )
  (prin1)
)

Copyright © 2004-2022 SQL: 1.563 saniye - Sorgu: 101 - Ortalama: 0.01547 saniye