Copyright © 2004-2022 SQL: 1.647 saniye - Sorgu: 104 - Ortalama: 0.01583 saniye
17.12.2009 11:18
bluebeta |
Arkadaşlar elinde attribute leri text e çeviren lispi olan var mı...
|
17.12.2009 12:29
ehya |
Lisp'e gerek yok. Express menü komutlarından BURST komutu ile bu işlemi yapabilirsiniz.
|
17.12.2009 13:02
bluebeta |
Bizim elimizdeki AutoCAD lerin hepsi LT. Sadece bir tane LT olmayan var o da 2004 ve express menü yok...
O yüzden 2004 de çalıştıracağım bir lisp arıyordum...
|
17.12.2009 21:07
ProhibiT |
Merhaba arkadaşlar,
Bu konuyla ilgili ehya hocamın da bahsettiği gibi BURST diye bir komut (Express Tools içinde bir AutoLisp fonksiyonu) olmasına rağmen bir programcık yazdım. Belki de bluebeta arkadaşımızın problemini de çözmeyecek, vl-remove komutunu kullandım, AutoCAD 2004'te bu komut var mı, kullanılabiliyor mu? bilmiyorum çünki. Bu fonksiyonu genel olarak AutoCAD kullanıcıları için değil de, AutoLisp yazan arkadaşlar için ilginç bir örnek olabilir düşüncesiyle yaplaşıyorum. AtrYaz komutunu girdiğinizde, çizim içinde insert edilmiş bütün block'ları bulur, içlerinde attribute olup olmadığına bakar, attribute invisible ise işlem yapmaz, bunu dışındaki türde attribute içeren blockları explode eder ve içerdikleri (invisible olanların dışındaki) attribute'lerin değerini Text olarak yazar. Yalnızca insert edilmiş block'ları explode ettiğinden ilgili block tanımlarını yok etmez... Kod: (defun c:atryaz () (setvar "cmdecho" 0) (setq BLcks (ssget "x" (list (cons 0 "INSERT"))) SLeng (sslength BLcks) n 0 ) (while (< n SLeng) (setq SObj (ssname BLcks n)) (if (= 1 (cdr (assoc 66 (entget SObj)))) (progn (while (/= "SEQEND" (cdr (assoc 0 (entget (entnext SObj))))) (setq AtrOb (entget (entnext SObj))) (if (/= (cdr (assoc 70 AtrOb)) 1) (progn (setq AtrOb (vl-remove (assoc 280 AtrOb) AtrOb) AtrOb (vl-remove (assoc 280 AtrOb) AtrOb) AtrOb (vl-remove (assoc 2 AtrOb) AtrOb) AtrOb (vl-remove (assoc 70 AtrOb) AtrOb) AtrOb (vl-remove (assoc 74 AtrOb) Atrob) AtrOb (vl-remove (assoc 5 AtrOb) AtrOb) AtrOb (subst (cons 0 "TEXT") (assoc 0 AtrOb) AtrOb) AtrOb (subst (cons 100 "AcDbText") (cons 100 "AcDbAttribute") AtrOb) ) (entmake AtrOb) ) ) (setq SObj (entnext SObj)) ) (command "explode" Sobj) (command "erase" (ssget "p" (list (cons 0 "ATTDEF"))) "") ) ) (setq n (1+ n)) ) (prin1) ) Selamlar, Sevgiler, Herkese Kolay Gelsin... Harbi65 hocamın tavsiyesi doğrultusunda düzeltilmiş halidir. ProhibiT (28.12.2009 07:34 GMT) |
17.12.2009 21:46
Harbi65 |
Hocam eline sağlık güzel bir örnek olmuş...
Ancak yeni text'i yazdığında Tag'ları silmesi gerekmez mi? Bir de assoc 72 kodu olması gerekiyor galiba.. Text aynı yere yerleşmiyor... AtrOb (vl-remove (assoc 72 AtrOb) Atrob)
|
17.12.2009 22:05
ProhibiT |
Harbi65 hocam haklısınız :)
assoc 72 kodu kullanılmayınca Horizontal Text Justification kayboluyor... Tag'lara gelince, BLock'u explode edince entlast'tan başlayarak geri doğru tarayarak ATTDEF türü objeleri siliyoruz. Böylelikle Attribute tanımları (Tag, Prompt ve default Value) siliniyor. Ya da ben sınırlı örnekler üzerinde denediğim için bendeki özel halde öyle oluyordur :) Bu arada ilginç olan bir şey; Objeleri çizim sıramız ve block yaparken seçim sıramız ne olursa olsun, BLock explode edilince, Attdef objeleri daima sonda sıralanıyorlar. Onun için bir while loop içinde entlast objesini alıp Attdef ise siliyorum, o silinince bir önceki obje entlast durumuna geliyor... entlast objesi Attdef olmayıncaya kadar devam ederek, Attribute Definition'ları siliyorum. Başta da yazdığım gibi, programlama mantığı açısından ilginç geldiği için paylaştım :) Kolay Gelsin...
|
17.12.2009 22:10
Harbi65 |
Paylaşımın içinçok teşekkürler.. Gerçekten güzel bir örnek oldu...
Bende silmesi lazım diye düşündüm ancak dediğim gibi.. 4 tane attribut içeren bi blok üzerinde denedim ATTDEF'lerin hiç birini silmedi.. Sanırım Explode yaptıktan sonra yeni bir seçim seti içinde taratmak gerekiyor...
|
17.12.2009 23:00
ProhibiT |
Harbi65 hocam,
Nezaket ve tevazu gösterip özel mesaj olarak yazdığınız çözümü müsadenizle burada paylaşmak istiyorum :) demişsiniz ki; Kod: (command "explode" Sobj) (setq Sobj:Lst (ssget "p")) (setq li 0) (repeat (sslength Sobj:Lst) (setq Lst:El (ssname Sobj:Lst li)) (if (= "ATTDEF" (cdr (assoc 0 (entget Lst:El)))) (entdel Lst:El) ) (setq li (1+ li)) ) şeklinde yazılsa daha doğru olmaz mı? Kesinlikle haklısınız, benim şeytanımın aklına gelmez bir detayı gösterdiniz bana. Teşekkürler. Explode edilen block objelerinin Previous Selection set'e alındığını bilmiyordum, denedim doğru. Gene özel mesajınızda "belkide siz daha kısa çözersiniz" demişsiniz. Sizi haklı çıkarmak için yazıvereyim bari :) Kod: (command "explode" Sobj) (setq Sobj:Lst (ssget "p" (list (cons 0 "ATTDEF"))) li 0) (repeat (sslength Sobj:Lst) (entdel Lst:El) (setq li (1+ li)) ) Çok canımızı sıkarsa abartıp; Kod: (command "erase" (ssget "p" (list (cons 0 "ATTDEF"))) "") şeklinde bile yazabiliriz :)))
|
17.12.2009 23:04
Harbi65 |
Daha pratik çözeceğinize emin olduğum için demiştim zaten..:)
Elinize sağlık. Bence şimdi sorun kalmadı... Teşekkürler.
|
17.12.2009 23:57
ProhibiT |
bluebeta arkadaşımızın AutoCAD 2004 versiyonunda da işine yaramasını garanti etmek için vl-remove kullanmadan yeniden düzenlenmiş hali;
Kod: (defun c:atryaz () (setvar "cmdecho" 0) (setq BLcks (ssget "x" (list (cons 0 "INSERT"))) SLeng (sslength BLcks) n 0 ) (while (< n SLeng) (setq SObj (ssname BLcks n)) (if (= 1 (cdr (assoc 66 (entget SObj)))) (progn (while (/= "SEQEND" (cdr (assoc 0 (entget (entnext SObj))))) (setq AtrOb (entget (entnext SObj))) (if (/= (cdr (assoc 70 AtrOb)) 1) (entmake (list (cons 0 "TEXT") (cons 100 "AcDbEntity") (cons 67 (cdr (assoc 67 AtrOb))) (cons 410 (cdr (assoc 410 AtrOb))) (cons 8 (cdr (assoc 8 AtrOb))) (cons 100 "AcDbText") (cons 10 (cdr (assoc 10 AtrOb))) (cons 40 (cdr (assoc 40 AtrOb))) (cons 1 (cdr (assoc 1 AtrOb))) (cons 50 (cdr (assoc 50 AtrOb))) (cons 41 (cdr (assoc 41 AtrOb))) (cons 51 (cdr (assoc 51 AtrOb))) (cons 7 (cdr (assoc 7 AtrOb))) (cons 71 (cdr (assoc 71 AtrOb))) (cons 72 (cdr (assoc 72 AtrOb))) (cons 11 (cdr (assoc 11 AtrOb))) (cons 210 (cdr (assoc 210 AtrOb))) (cons 100 "AcDbText") (cons 73 (cdr (assoc 73 AtrOb))) ) ) ) (setq SObj (entnext SObj)) ) (command "explode" Sobj) (command "erase" (ssget "p" (list (cons 0 "ATTDEF"))) "") ) ) (setq n (1+ n)) ) (prin1) ) Selamlar, Sevgiler, Herkese Kolay Gelsin... ProhibiT (29.12.2009 11:13 GMT) |
18.12.2009 07:20
ehya |
hocam gecenin bi yarısı yine aşmışsınız ne diyeyim :) Elinize sağlık. Express menü kullanamayanlar için güzel bir lisp oldu... :yes
|
18.12.2009 16:12
bluebeta |
Arkadaşlar ellerinize sağlık. Çok işime yaradı. Hepinize çok teşekkürler...
|
24.02.2011 15:48
aslanv |
Merhaba arkadaşlar,
aşağıdaki çizimi örrnek olarak yoluyorum ve size bir sorum olacak. en uygun konu da bu başlık altında. şimdi attribute ile oıluştutulmuş mahal pozları var. 5k-6k-8k ile başlayan yazılar tag ile oluşturulduğundan find ve replace ona işlemiyor. çizim içindeki tüm 5k ları 4k yap diyecektik o zaman farkettik. şimdi sorum şu tag leri nasıl text e dönüştürebilirim. teşekkürler. 52082-mahal.rar serhatkoroglu (25.02.2011 15:48 GMT) |
25.02.2011 04:11
ProhibiT |
Ben soruyu pek iyi anlayamadım herhalde :) bunun için değişik ihtimallere göre basit fonksiyonlar yazdım.
Kod: ;;; Seçilen tek bir Attribute Definition'ın Tag değerini Value olarak atama. Gözönüne almadığım bir ihtimal var, Atrribute'ün Tag'inin Text olarak yazdırılması ve Attribute objesinin yok edilmesi.(defun c:TV () (setq patr (entget (car (entsel))) patr (subst (cons 1 (cdr (assoc 2 patr))) (assoc 1 patr) patr)) (entmod patr) (entupd (cdr (assoc -1 patr))) (prin1) ) ;;; Seçilen obje gurubu içibdeki Attribute Definition'ların ;;; Tag değerlerini Value olarak atama. (defun c:TV1 () (setq patrs (ssget (list (cons 0 "attdef"))) L (sslength patrs) n -1) (while (< (setq n (1+ n)) L) (setq patr (entget (ssname patrs n)) patr (subst (cons 1 (cdr (assoc 2 patr))) (assoc 1 patr) patr)) (entmod patr) (entupd (cdr (assoc -1 patr)))) (prin1) ) ;;; Seçilen bLock Reference (insert) objesi içindeki ;;; Attribute (Atrrib) objelerinin Tag değerlerini Value olarak atama. (defun c:TV2 () (setq patr (ssname (ssget ":s" (list (cons 0 "insert") (cons 66 1))) 0)) (while (= (strcase "attrib") (cdr (assoc 0 (entget (setq patr (entnext patr)))))) (setq atrs (entget patr) atrs (subst (cons 1 (cdr (assoc 2 atrs))) (assoc 1 atrs) atrs)) (entmod atrs) (entupd (cdr (assoc -1 atrs)))) (prin1) ) ;;; Seçilen obje gurubundaki bLock Reference (insert) objeleri içindeki ;;; Attribute (Atrrib) objelerinin Tag değerlerini Value olarak atama. (defun c:TV3 () (setq patrs (ssget (list (cons 0 "insert") (cons 66 1))) L (sslength patrs) n -1) (while (< (setq n (1+ n)) L) (setq patr (ssname patrs n)) (while (= (strcase "attrib") (cdr (assoc 0 (entget (setq patr (entnext patr)))))) (setq atrs (entget patr) atrs (subst (cons 1 (cdr (assoc 2 atrs))) (assoc 1 atrs) atrs)) (entmod atrs) (entupd (cdr (assoc -1 atrs))))) (prin1) ) ;;; Seçilen obje gurubundaki bLock Reference (insert) objeleri içindeki ;;; Attribute (Atrrib) objelerinin girilen Tag değeri ile uyuşan ;;; Tag değerlerini Value olarak atama. (defun c:TV4 () (setq Tg (getstring "\Value atanacak Tag: ") patrs (ssget (list (cons 0 "insert") (cons 66 1))) L (sslength patrs) n -1) (while (< (setq n (1+ n)) L) (setq patr (ssname patrs n)) (while (= (strcase "attrib") (cdr (assoc 0 (entget (setq patr (entnext patr)))))) (if (= Tg (cdr (assoc 2 (entget patr)))) (progn (setq atrs (entget patr) atrs (subst (cons 1 (cdr (assoc 2 atrs))) (assoc 1 atrs) atrs)) (entmod atrs) (entupd (cdr (assoc -1 atrs))))))) (prin1) ) Kolay gelsin.
|
25.02.2011 08:25
aslanv |
Hocam elinize sağlık ancak sanırım gözönüne almadığınız ihtimal benim yapmak istediğim ihtimal. :-) seçeceğim tag objelerin text e dönüşmesi ve tag özelliğinin gitmesi.
|
25.02.2011 12:28
halilozcakir |
Burst komutu att leri text e çeviriyor denedin mi ? şu lispleri lt lerde kullanamamak ne acı (:
|
25.02.2011 12:59
aslanv |
Burst komutunu biliyorum o text'e çeviriyor ancak benim sorunum bloklanmadan tag olarak yazılmış bütün yazıları text haline getirmek. henüz çözemedim.
|
25.02.2011 18:09
ProhibiT |
Aslında yukarıda verdiğim tv ve tv1 fonksiyonları block yapılmamış attribute definition'ların tag değerini value olarak atama işlemini yapıyor. bu işlemden sonra da, find/replace kullanabilirsiniz. attribute definition'da "tag", "prompt" ve "default value" olur, block içinde insert edilince girdiğiniz değer (veya kabul edip geçerseniz default value) value olarak atanır. value değeri olmayan attribute definition objesi find/replace ile bulunamaz.
özet olarak illede text'e çevirmek gibi bir ihtiyacınız yoksa; tv2 kullanın, select object(s) dendiğinde "all" girip bütün çizimi seçebilirsiniz. bu basit işlemden sonra, attribute definition'larınıza value atanmış olacağından, find/replace işlemi yapabilirsiniz. Kod: ;;; Seçilen obje gurubu içibdeki Attribute Definition'ların Fonksiyonuyla, bütün attribute definition'ları Text objelerine dönüştürebilirsiniz.;;; Tag değerlerine göre Text'e dönüştürülmesi (defun c:TV5 () (setq patrs (ssget (list (cons 0 "attdef"))) L (sslength patrs) n -1) (while (< (setq n (1+ n)) L) (setq patr (entget (ssname patrs n))) (entmake (list (cons 0 "TEXT") (assoc 67 patr) (assoc 410 patr) (assoc 8 patr) (assoc 10 patr) (assoc 40 patr) (cons 1 (cdr (assoc 2 patr))) (assoc 50 patr) (assoc 41 patr) (assoc 51 patr) (assoc 7 patr) (assoc 71 patr) (assoc 72 patr) (assoc 11 patr) (assoc 73 patr))) (entdel (cdr (assoc -1 patr)))) (prin1) ) Kolay gelsin.
|
28.02.2011 09:01
aslanv |
Prohibit hocam çok sağolun. tv5 istediğim şeydi. çok yardımcı oldunuz. tekrar teşekkürler emeğinize sağlık.
|
Harbi65 |
Prohibit Hocam;
Yukarıda paylaştığınız Atryaz lispi ile ilgili sorun yaşıyorum. Sorun benim bloklardan mı kaynaklanıyor onuda anlamadım. Mirror yapılmış blokda Attributeleri texte çeviriyor fakat explode yaptıktan sonra tagları görmüyor ve dolayısıyla silmiyor. Taglar ters bi şekilde görünüyor. Bu sorunu nasıl çözebiliriz?
|