Zobrazit plnou verzi příspěvku: KOPIE hladiny v rámci několika výřezů

Koluch
24.01.2019, 06:41

Dobrý den,prosím Vás, dá se nějak zkopírovat hladina?Mám hladinu a tu si chci zkopírovat a přejmenovat. Jde mi o to, aby měla stejné vlastnosti (viditelnost/neviditelnost) v daných výřezech.Při vytvoření nové hladiny jde buď všude zmrazit nebo všude vidět.Děkuji za radu.Lukáš Kolúch
Koluch2019-01-24 12:50:05

Vladimír Michl
24.01.2019, 07:22
Většinu vlastností nová hladina zdědí od hladiny, která je ve Správci vybrána v okamžiku, kdy použijete funkci Nová.Viz též úskalí https://www.cadforum.cz/cadforum/nelze-vytvorit-novou-hladinu-vyhovujici-aktivnimu-filtru-hladin-tip10675Nebo jste měl na mysli obsah hladiny?

Koluch
24.01.2019, 09:08

Nene obsah hladiny nechci kopírovat. Mám 50 rozvržení, ve 30 mám hladinu X zmraženou a ve 20 rozvrženích hladinu X odmraženou.Nyní chci vytvořit hladinu Y a od té chci, aby to co do ní budu kreslit, tak šlo vidět v těch rozvrženích, jako hladina X. Pokud vytvořím novou hladinu, tak buď bude viditelná všude, nebo neviditelná všude V podstatě kopie hladiny (bez obsahu hladiny). Jde to? Děkuji. LK

Vladimír Michl
24.01.2019, 10:14
To asi jednoduše nepůjde. Přepsání hladin funguje na výřezy, ne na rozvržení. Vlastnosti hladin zkopírujete mezi výřezy přes [CMD]KOPIEVLAST[/CMD], ale to asi nebude vyhovovat kvůli přenosu ostatních vlastností.

Koluch
24.01.2019, 10:16

Omlouvám se, jde o výřezy samozřejmě.

Koluch
25.01.2019, 06:28

Jde to teda nějak? 

Vladimír Michl
25.01.2019, 07:47

Viz výše - částečně přes MATCHPROP, ale přes uživatelské prostředí to jinak zřejmě nepůjde. Jedině asi napsat nějaký programový nástroj.

Koluch
25.01.2019, 11:31

Přijde mi to jako základní funkce.Dva měsíce člověk něco kreslí a chce pak něco doplnit, tak pak přece nebude klikat na všechny výřezy (jeden výřez na jednom rozvržení).

Koluch
25.01.2019, 13:41

OK zeptám se jinak. Jak vytvořit novou hladinu, která bude zmražená pouze v některých rozvrženích (co rozvržení to výřez)?Pokud kreslím od nuly, tak mám například Hladinu1 zmraženou ve výřezu 1,3,5,100 (a použiji funkci zmrazit v nových výřezech).Teď chci však dokreslit něco v nové Hladině2, která se tematicky váže k Hladině1 a tudíž musí být opět zmražena ve výřezech 1,3,5,100. Jak toho docílit?

johny
25.01.2019, 20:03
Kopírujete hladinu vybraného objektu nebo aktuální hladinu.Hledejte jak použít LISP, pokud nevíte.(vl-load-com)(defun c:CopyLayer (/ *error* ctb cme doc vpfreeze new old ss ids)    (defun *error* (errmsg)    (if (not (wcmatch errmsg "Function cancelled,quit / exit abort,console break,end"))      (princ (strcat "\nError: " errmsg)))    (if ctb (setvar 'CTAB ctb))    (if cme (setvar 'CMDECHO cme))    (if doc (vla-endundomark doc))    (princ))    ;----  (defun :CopyLayer (new old / ed )    (if (setq ed (entget (tblobjname "LAYER" old)))      (entmake (list '(0 . "LAYER")                     '(100 . "AcDbSymbolTableRecord")                     '(100 . "AcDbLayerTableRecord")                     (cons 2    new)                     (assoc 70  ed)                     (assoc 62  ed)                     (assoc 6   ed)                     (assoc 290 ed)                     (assoc 370 ed)                     (assoc 390 ed)))))    ; -----------------------------------------------------------------------------------------------------------  ; -----------------------------------------------------------------------------------------------------------    (setq old (if (setq ssl (ssget))              (cdr (assoc 8 (entget (ssname ssl 0))))              (getvar 'CLAYER))        new ""                ctb (getvar 'CTAB)        cme (getvar 'CMDECHO))    (vla-startundomark (setq doc (vla-get-activedocument (vlax-get-acad-object))))  (setvar 'CMDECHO 0)      (while (or (not (snvalid new 0))             (tblsearch "LAYER" new))    (setq new (lisped old)))    (if (:CopyLayer new old)    (foreach e (layoutlist)      (if (setq ss (ssget "_X" (list '(0 . "VIEWPORT") (cons 410 e) (cons -4 "!=") (cons 69 1))))        (progn          (setq ids nil)          (repeat (setq i (sslength ss))            (if (and (setq ent (ssname ss (setq i (1- i))))                     (setq lst (vl-remove-if-not '(lambda (x) (= 331 (car x))) (entget ent)))                     (setq lst (vl-remove-if-not '(lambda (x) (= old (cdr (assoc 2 (entget (cdr x)))))) lst))                     )              (setq ids (cons (cdr (assoc 69 (entget ent))) ids))))          (if ids            (progn              (setvar 'CTAB e)              (command "_.MSPACE")              (foreach id ids                (setvar 'CVPORT id)                (command "_.VPLAYER" "_Freeze" new "_Current" ""))              (command "_.PSPACE")))))))    (*error* "end")  )

johny2019-01-25 20:06:35

Vladimír Michl
25.01.2019, 22:45
Taky jsem se do toho pustil - zkuste utilitu/příkaz CopyAllVP ze sekce Download (načíst přes APLČTI a napsat příkaz CopyAllVP). Zkopíruje stav hladin jednoho rozvržení do všech ostatních. Používá jiný postup než aplikace Johnyho, stavy hladin. Tak si můžete vybrat :-)DOPLNĚNO: Pardon, ten CopyAllVP řeší trochu jiný problém - pro duplikaci hladiny použijte ten výše uvedený program, funguje dobře. Zde lehce upraven/doplněn:CopyLayer.lsp (doplněn 27.1. 16:14 a 28.1. 8:25)
Vladimír Michl2019-01-28 08:25:59

Koluch
26.01.2019, 12:28

Lisp (copylayer) se mi načte, příkaz spustím, ale: napíše mi to? úprava víceřádkového textu a po kliknutí na Plný editor to napíše Error: nesprávný typ argumentu: stringp -1.  Navíc příkaz nelze ukončit ESC, ani OK ani storno.  

Vladimír Michl
27.01.2019, 16:13
Plný editor zde nemá žádný smysl. Johny jej zde použil zřejmě pro pohodlnou modifikaci názvu kopie hladiny. Když vypnete CMDDIA, můžete název zadávat klasicky v příkazovém řádku. A ukliknutí na Plný editor je nyní v upravené verzi také ošetřeno. Já myslím, že to dělá to chcete.

Koluch
27.01.2019, 17:30

OK, když použiji LISP copylayer, tak se mi vytvoří nová hladina ***_copy. Když v té hladině ***_copy něco nakreslím, tak se mi to objeví ve výřezech, ve kterých to nechci, Nevím co všechno COPYLAYER kopíruje za vlastnosti, ale zmraženost/rozmraženost asi ne.Nebo dělám něco špatně?

johny
27.01.2019, 20:25
Toto by mohlo pomoci. (foreach l (layoutlist)      (if (and (setq lst (vl-remove-if-not    '(lambda (e) (vl-remove-if-not   '(lambda (x) (= old (cdr (assoc 2 (entget (cdr x))))))   (vl-remove-if-not ; just vp-frozen entities     '(lambda (x) (= 331 (car x)))     (entget e)))) ; entity's def. list inc. vp-frozen    (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_X" (list '(0 . "VIEWPORT") (cons 410 l)))))))) ; all entities        (setvar 'CTAB l)        (vl-cmdf "_.ZOOM" "_Extents" "_.MSPACE")        (setq lst (vl-sort (mapcar '(lambda (e) (cdr (assoc 69 (entget e)))) lst) '<))        ) (progn   (setq lst (if (setq 1st (= (car lst) 1))       (cdr lst)       lst))   (foreach e lst     (setvar 'CVPORT e)     (vl-cmdf "_.VPLAYER" "_Freeze" new "_Current" ""))   (vl-cmdf "_.PSPACE" "_ZOOM" "_Previous")   (if 1st (vl-cmdf "_.VPLAYER" "_Freeze" new "_Current" "")))))

johny2019-01-27 23:05:26

Vladimír Michl
28.01.2019, 08:27

Opět jsem si dovolil johnyho aktualizaci promítnout do LSP soubor viz výše - zkuste tuto aktualizovanou verzi.

Koluch
28.01.2019, 09:47
johny a Vladimír Michl jsou borciVůbec nerozumím zdrojovému kódu, ale funguje tak jak jsem potřeboval, děkuji.Regenerace přes výřezy a rozvržení probíhala cca 3 minuty, ale udělalo to to co mělo.Takže ještě jednou děkuji.Lukáš Kolúch

Vladimír Michl
28.01.2019, 10:06

Poděkování patří hlavně johnymu, v tomto případě jsem byl jen "údržbář" :-)