Copyright © 2004-2022 SQL: 1.081 saniye - Sorgu: 99 - Ortalama: 0.01092 saniye
10.12.2013 15:53
özkan-wien |
tesekkürler harbi65
|
10.12.2013 18:23
ProhibiT |
Harbi65 hocam ve konuya katkıda bulunan arkadaşlarımıza böyle incelikli kavramları paylaştıkları için teşekkür etmek isterim. Aynı soruların tekrar tekrar sorulması genelde paylaşımcılar açısından heves kırıcı olabiliyor. Böyle bir konuyu görmekten kendi adıma çok keyif aldım ve bir şeyler yazmadan geçemedim. :)
Genel olarak AutoCAD Nesnesi (object) olarak adlandırılan kavramlar farklı guruplar altında yer alırlar. Drawing Objects (Çizim Nesneleri): Line, Polyline, Spline, Text, Block (insert edilmiş Blocklar ki bunlara gerçekte Insert varlıkları diyoruz) ve bunun gibi çizimi oluşturan varlıklardır (entities). Çizim nesnelerinin verilerine entget veya vlax-get-property işlevleriyle ulaşıyoruz. Table Objects (Tablo Nesneleri): Layer, Linetype, View, Style, Block tanımları, UCS, DimStyle ve Vport gibi nesnelerin tanımlarının yer aldığı, genelde ekranda görünmeyen ama ekranda görünen nesnelerin nasıl ve ne şartlarda oluşturulup görüntüleneceğini belirleyen kavramlardır. Tablo nesnelerinin bilgilerine tblobjname, tblnnext ve entget gibi işlevlerle ulaşıyoruz. Dictionary Object (Sözlük nesneleri): Bu bölümdeki nesnelerin detaylarına girmeden, yukarıda ele alınan örnekte söz konusu edilen Multi Line Style (Mlinestyle) tanımları bu bu bölümde, Named Object Dictionary altında yer aldığını belirtmekle yetinelim. Daha önce de burada sorulan Çizim veritabanına kendi bilgilerini eklemek isteyen arkadaşlarımızın sorularının cevapları da Dictionaries kavramında karşılığını buluyor. Forum ortamında fazla derin dalıp karmaşa yaratmamak adına burada yamak uygun gelmedi. Bu konunun detayları yazıldı, ilgilenen arkadaşlar yakın bir zamanda ulaşabilecekler. Dictionary nesnelerinin bilgilerine, dictsearch gibi işlevlerle erişiyoruz. dictadd ile yeni tanımlar ve eklemeler, dictremove işlevi ile de çıkarmalar yapabiliyoruz. Ele alınan konuya gelince, DUVAR isimli Mlinestyle tanımının varlığını araştırırken, iki ayrı şartı denetlemeye gerek yok. Altında herhangi bir Multi Line Style tanımı olmasa (içi boş olsa) bile çizim veritabanında Acad_MLineStyle tanımı her durumda bulunacaktır. Bu bir başlıktır, altı boş bile olsa başlık her durumda vardır. Bu açıklamalar ışığında ele alınan kontrol işlemini doğrudan yapmak mümkündür. Kod: (if (dictsearch şeklinde yazmak mümkün.(cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_MLINESTYLE"))) "DUVAR") (princ "\nDUVAR isimli MLINESTYLE tanımlı.") (princ "\nDUVAR isimli MLINESTYLE tanımlı değil.")) Çizim veritabanında DUVAR isimli MLinestyle var ise; Kod: (dictremove ifadesiyle de bu tanımı çizimden kaldırabiliriz.(cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_MLINESTYLE"))) "DUVAR") Bulunmayan bir MLineStyle tanımının AutoLISP kullanılarak eklenmesi biraz daha uzun bir işlem. :) Herkese kolay gelsin.
|
10.12.2013 19:15
Travaci |
Elinize sağlık teşekkürler.
|
11.12.2013 10:41
özkan-wien |
Prohibit Hocam cok tesekkürler, su yazdiginiz bilgiler keske digital bi ortamda kitap olsa da aradigimizi kolayca bulsak. her kösede bi Bilgi var sayenizde ama maalesef toplu halde degiller.
Lisp ile mlstyle olusturmak isteyen arkadaslar icin kodu da ben ekleyim. (ben yazmadim ama ) Kod: (defun c:mladd ( / lst )
(setq lst (list (cons 0 "MLINESTYLE") (cons 100 "AcDbMlineStyle") (cons 2 "DUVAR") ; Name (cons 70 272) ; caps/fill/joints 273 dolu 272 bos (cons 3 "") ; Desc (cons 51 1.5708); Start ang ucu kapalai (cons 52 1.5708); End ang sonu kapali (cons 71 2) ; Number of lines (cons 49 -0.5) ; Element Offset (cons 62 256) ; Element Colour (cons 6 "BYLAYER") ; Element Linetype (cons 49 0.5) (cons 62 256) (cons 6 "BYLAYER") ) ) (LM:AddMLS lst) ) (defun LM:AddMLS ( data / dic obj ) (if (and (setq dic (dictsearch (namedobjdict) "ACAD_MLINESTYLE")) (not (dictsearch (setq dic (cdr (assoc -1 dic))) (cdr (assoc 2 data)))) (setq obj (entmakex data))) (dictadd dic (cdr (assoc 2 data)) obj) ) ) ProhibiT (11.12.2013 12:13 GMT) |
11.12.2013 13:02
ProhibiT |
Değişkenleri fonskiyondan alt fonksiyona koşturup yormaya gerek yok. :)
Bir de daha önceki mesajımda yazdığım gibi, iki tane ayrı şartı denetlemeye de gerek yok. Kod: (defun c:AddMLS (/ dic)
(if (not (dictsearch (setq dic (cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_MLINESTYLE")))) "DUVAR")) (dictadd dic "DUVAR" (entmakex (list (cons 0 "MLINESTYLE") (cons 100 "AcDbMlineStyle") (cons 2 "DUVAR") (cons 70 272) (cons 3 "") (cons 51 1.5708) (cons 52 1.5708) (cons 71 2) (cons 49 -0.5) (cons 62 1) (cons 6 "BYLAYER") (cons 49 0.5) (cons 62 1) (cons 6 "BYLAYER"))))) (princ))
|
11.12.2013 15:11
özkan-wien |
Eline saglik hocam hemen kopyaladim. Prohibit hocam ikiden fazla sayida cizgiden olusan mlstyle a disardan nasil müdahale ederiz.
birinci duvar 20 cm ikinci duvar 12 olacak mesela. hangi dxf codlarini editlemem gerekiyor? asagidaki rengi denedim ama olmadi, cizgilerin kodunu da tam cözemedim. Daha dogrusu 3 tane 49 var. (defun c:mle (/ ) (setq mlineDict (dictsearch (namedobjdict) "ACAD_MLINESTYLE")) (setq mlineStd (dictsearch (cdr (assoc -1 mlineDict)) "duvar2")) (entmod (subst (cons 62 2)(assoc 70 mlineStd) mlineStd)) )
|
11.12.2013 15:26
özkan-wien |
hocam yalniz mlstyle da bir obje cizilmisse silinmesine ve degistirilmesine izin vermiyor. ben eger 25 cm duvar 10 cm yalitim cizmek istersem onun icin ayri, 30 cm duvar 15 cm yalitim cizmek istersem onun icin ayri bi mlstyle olusturmam mi gerekecek.
|
12.12.2013 08:03
ProhibiT |
Doğrudur. Aslında MLineStyle tanımlarını AutoCAD'in Purge işlemi ile aynı mantıkta düşünmek gerekir. Örneğin, DUVAR isimli MLSTYLE çizim içinde kullanılmış ise, Ne AutoCAD komutlarıyla ne de yukarıda verdiğimiz dictremove işleviyle kaldırılamaz. AddMLs işlevinde de DUVAR isimli MLStyLe'ın mevcut olup olmadığını kontrol ettikten sonra, mevcut değilse, tanım oluşturuyoruz. Böyle bir kontrol yapılmadan, mevcut bir MLStyLe yeniden tanımlanmaya çalışıldığında, işlem hata ile sonuçlanacaktır. Yani tanımlı bir MLStyLe'ı da değiştiremiyoruz. Evet, farklı Duvar kalınlığı ve farklı yalıtım kalınlıkları için ayrı ayrı MLSTYLE tanımlanması gerekiyor.
|
12.12.2013 12:46
özkan-wien |
10 puanlik uzman sorusu,
arkadaslar asagidaki 1. satiri yazdigimda mline noktalarini girmek icin pause yapiyorum ve noktalari girince Lisp devam etmiyor. *devamindaki kod süper bisey islem devam ediyor. Acaba girilen noktalari kaydetme sansim var mi ? *o komutun icinde "J" ve "S" yi ayarlama sansim var mi? ;(command "_.mline" "_J" wand_just_lesen "_S" wand_staerke1 pause) (command "_.mline" "_J" wand_just_lesen "_S" wand_staerke1 "");Burda ayar yapip cizmeden cikiyorum (command "_.mline") (while (= 1 (logand 1 (getvar 'CMDACTIVE))) (command pause) )
|
12.12.2013 14:26
özkan-wien |
Alıntı Sayin Prohibit hocam, dün lispi bu sekilde degistirdim ama inanilmasi güc bi hata veriyor. En azindan ben anlayamadim :-). lispi yükleyip calistirin ve lütfen (2 -3 kez pickleyin) herhangi bir sekilde duvar cizin. islem bitince cizdiginiz duvar polyline olacak. Justification "t" ve "b" de. duvar kalinligi "0.2" simdi komut satirindan "justification" ayarini ortaya "z" ye getirin. ve lispi tekrar calistirin. justification ayari ortada iken cizilen duvarin sol kapanma noktasi hep ayri kaliyor. yani polyline yapilamiyor. lispsiz ml komutuyla bi duvar daha cizin ve "x" enter "l" ve "join" "p" dediginizde sol parcanin birlesmedigini göreceksiniz. hatayi düzeltmek daha da ilginc. komut satirina mlst yazip (daha önce wand stylindeki tüm objeler silinecek) acilan pencereden "modify" ye ve sonra "ok" "ok" e tiklayip cikin. lispi Justification "z" de tekrar calistirin ve düzeldigini göreceksiniz. Ben de aynen bu sekilde. 2014 versiyon. Kod: (defun c:crtmlst (/ dic)
(if (not (dictsearch (setq dic (cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_MLINESTYLE")))) "WAND")) (progn (dictadd dic "WAND" (entmakex (list (cons 0 "MLINESTYLE") (cons 100 "AcDbMlineStyle") (cons 2 "WAND") (cons 70 272) (cons 3 "") (cons 51 1.5708) (cons 52 1.5708) (cons 71 2) (cons 49 -0.5) (cons 62 256) (cons 6 "BYLAYER") (cons 49 0.5) (cons 62 256) (cons 6 "BYLAYER")))) (setvar "cmlstyle" "WAND")) (progn (setvar "cmlstyle" "WAND"))) (command "_.mline") (while (= 1 (logand 1 (getvar 'CMDACTIVE))) (command pause) ) (setq ml_multi (entlast)) (command "_.explode" ml_multi ) (setq ml_son (ssget "_P")) (setq ml_son1 (ssname ml_son 0)) (command "_.pedit" ml_son1 "" "_j" ml_son "" "") (princ)) ProhibiT (12.12.2013 14:58 GMT) |
12.12.2013 20:37
ProhibiT |
Soruyu anlamak için yazdıklarını denemeye sabrım yetmedi de :) crtmlst fonksiyonun sonunda command ve pause kullanımı tam anlamıyla usta işi. :) Bununla beraber, 2 tane gereksiz progn var. (setvar "cmlstyle" "WAND") ifadesini if blokundan çıkışta bir kere yazmak yeterli. böylece ilk progn tek işlev olduğundan gereksiz, ikincisi zaten tek işlev olduğundan gereksiz. Sorunun özüyle ilgili de vakit bulunca bakmaya çalışırım.
|
16.12.2013 09:37
özkan-wien |
hocam vaktin oldugunda incelersen sevinirim. Justificazion "Z" ayarinda hata veriyor kisacasi
|
16.12.2013 09:39
özkan-wien |
arkadaslar her lispin basinda ve sonunda Ayar degistirip düzeltmekten biktim valla. bu isin bi kolayi yok mu?
mesela su asagidaki ilk_ayar ve son_ayari her lispe yüklüyorum. bunlari (ilk_ayar) gibi alt fonsiyonla Lisp disindan cagirmak mümkün mü? (defun ilk_ayar (/) (setq cmdsave (getvar "CMDECHO")) (setvar "cmdecho" 0) (command "_.undo" "_begin") (setq ac_clayer (getvar "clayer")) (setq eskiosnap (getvar "osmode")) (setvar "osmode" 0) (setq olderr *error* *error* hata )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lisp sonunda son ayar (defun son_ayar (/) (command "_.undo" "_end") (setvar "osmode" eskiosnap) (command "_.layer" "_set" ac_clayer "") (setvar "cmdecho" cmdsave) (defun hata (s) (if (/= s "Function cancelled") (princ (strcat "\nError: " s)) );if (setvar "osmode" eskiosnap) (command "_.undo" "_end") (setq *error* olderr)) )
|
16.12.2013 10:00
Travaci |
Alıntı Lisp ini başlatırken ve bitirirken çağırcaksın Ör; Kod: (defun c:ornek (/) (ilk_ayar) .... .... (son_ayar) ) Eğer bunlar bir kısa yola tanımlı olsaydı mesela Kod: (defun c:ilk_ayar (/) (setq cmdsave (getvar "CMDECHO")) (setvar "cmdecho" 0) (command "_.undo" "_begin") (setq ac_clayer (getvar "clayer")) (setq eskiosnap (getvar "osmode")) (setvar "osmode" 0) (setq olderr *error* *error* hata) ) Aşağıdaki gibi olucaktı Kod: (defun c:ornek (/) (c:ilk_ayar) .... .... (c:son_ayar) ) Bu şekilde herhangi bir dosyada yazılan kodları (yüklü olduğu taktirde) başka lisplere çağırarak kullanıyoruz, her lisp dosyasında yazılı olmasına gerek kalmıyor.
|
16.12.2013 10:17
özkan-wien |
Tesekkür ederim Travaci.
|
18.12.2013 09:17
özkan-wien |
arkadaslar merhaba ,
secim setinden aldigim bir elemanin layerini "command" kullanmadan nasil degistiririm. eleman1 le eleman_layername cepte. (command "_.change" eleman1"" "_P" "_LA" eleman_layername "") tesekkürler.
|
18.12.2013 09:19
halilozcakir |
Merhabalar aşağıdaki lispin içine çizgi tipinide ilave edebilirmiyiz çizgi tipleri objelere tanımlı olduğundan purge yapılamıyor buda çizime yük getiriyor teşekkürler ..
Alıntı
|
18.12.2013 09:21
Travaci |
özkan-wien Kod: (vla-put-Layer (vlax-ename->vla-object (ssname lst 0)) "yenilayer")
|
18.12.2013 10:03
özkan-wien |
tesekkür ederim travaci
rengini bylayer yapmak icin elemani bir kere tanimlayip kullanamiyoruz. her defasinda (vlax-ename->vla-object (ssname caa_sec caa_syc)) bunu yazmak zorundamiyiz? (setq vla_elem ((vlax-ename->vla-object (ssname caa_sec caa_syc)))) ;;;(vla-put-Layer (vlax-ename->vla-object (ssname caa_sec caa_syc)) caa_layern_yaz_me) (vla-put-Layer vla_elem caa_layern_yaz_me) (vla-put-color vla_elem 256) özkan-wien (18.12.2013 10:13 GMT) |
Travaci |
özkan-wien Kod: (defun c:ozkn (/ obj)
(vl-load-com) (setq obj (vlax-ename->vla-object (ssname (ssget) 0))) (vla-put-Layer obj "Yenilayer") (vla-put-Color obj "256") (princ))
|