Zobrazit plnou verzi příspěvku: Hromadná změna měřítek čar

Matejka63
03.01.2018, 12:34
Dobrý den,občas potřebujeme ve stavebním výkrese (využívaném jako xref) upravit globální měřítko tak, aby bylo v souladu s naším globálním měřítkem ve zpracovávané profesi. Rád bych se proto zeptal, zda existuje nějaký lsp program, případně jiná funkce, která "oběhne" ve výkrese všechny úsečky, křivky, oblouky atd a přenásobí původní měřítko čar určitou zvolenou konstantou tak, aby zobrazení čar po změně globálního měřítka bylo opět OK?

Vladimír Michl
03.01.2018, 13:32

To by sice asi šlo udělat, ale není to zbytečná komplikace? V tom xrefu jsou opravdu čáry individuálně nastaveny na hodně různých měřítek typů čar? Nestačilo by globální LTSCALE/PSLTSCALE a VISRETAIN?

Matejka63
03.01.2018, 14:35
Děkuji za rychlou reakci,pokud to ale dobře chápu, LTSCALE mi mění v podstatě globální měřítko, tudy cesta asi nevede (nebo ji neznám) - čáry se mi zobrazí vždy dle globálního měřítka výkresu naší profese, globální měřítko xrefu nemá na jejich zobrazení v podstatě žádný vliv. PSLTSCALE změní "zaškrtávátko" "Použít měřítko výkresového souboru", to, pokud jej nechám zaškrtnuté, (tedy PSLTSCALE=1) mi způsobí pro mě nevyhovující vykreslení čar ve výkresovém prostoru, kde jsou výřezy zpravidla 1:50. VISRETAIN jsem zatím nepoužíval, ale podle toho, co jsem si o této proměnné zatím přečetl se mi nezdá, že by byla řešením problému.Standardní stavební podklad opravdu obsahuje zcela nahodilou sestavu typů čar a jejich měřítek, která jsou jen upravena tak, aby výsledné zobrazení vyhovovalo autorovi výkresu. Globální měřítko bohužel má skoro každý jiný. Musíme pracovat s podklady různých kanceláří, a ty mají různé zvyklosti. Je nutné tedy přes "Vybrat podobné" nebo "Rychle vybrat" najít množinu příslušných čar a upravit jejich měřítko nějakým pevným koeficientem (poměrem globálních měřítek). To bych rád zautomatizoval, protože je to docela pracné a při každé změně podkladů se tato procedura musí opakovat.Pokud program neexistuje, rád bych oslovil někoho, kdo jej zvládne napsat, případně mi pomůže, pokud bych se do toho pouštěl sám..

Vladimír Michl
03.01.2018, 14:52

Možných kombinací implicitních a přiřazených měřítek typů čar je hodně. Pokud chcete prostě individuálně přiřazená měřítka vynásobit nějakým koeficientem, můžete použít LISP kód z našeho anglického fóra:http://www.cadforum.cz/forum_en/forum_posts.asp?TID=11259&PID=30137&title=change-linetype-scale-by-a-factor#30137 Pro dynamickou změnu měřítka (vizuální) lze použít také DynLTscale (DLTS) - viz Download a tip:http://www.cadforum.cz/cadforum/dynamicke-nastaveni-meritka-typu-cary-tazenim-mysi-tip10854

Matejka63
03.01.2018, 15:48
Moc děkuji za výborný typ, funguje to, jen mě překvapilo, že funkce LSR se dá aplikovat v daném dwg pouze jednou, podruhé už nefunguje, přestože se zdá, že vše proběhlo korektně, měřítka čar se již podruhé nezmění - ale i to je velká pomoc..Nepomůže ani znovunačtení dwg nebo lsp. Pokusím se najít problém v lsp, ale je to na mě dost pokročilé, pochybuji, že na to přijdu.

johny
03.01.2018, 16:36
Jeden řádek kódu je tam blbě, teď to fungovalo jen když ltscale bylo defaultně 1. Trochu to otestujte, jestli to opravdu funguje jak má.;;change linetype scale by a factor;;original version: http://www.cadforum.cz/forum_en/forum_posts.asp?tid=11259&title=change-linetype-scale-by-a-factor;;modified by will garmer to work on selection set instead of single object 2015-07-20;;fixed Johny 2018-01-03(defun c:lsr (/ ss lts_fac count old_val new_val e)    ;;=====================================================================================  ;;main body of c:lsr    ;;get the selection set  (setq ss (ssget))    ;;get the scale factor  (if (not old_lts_fac) (setq old_lts_fac 1))  (setq lts_fac (getreal (strcat "\nMultiply linetypescale by  factor <" (rtos old_lts_fac) ">: ")))  (if (= lts_fac nil)    (setq lts_fac old_lts_fac))  (setq old_lts_fac lts_fac)    ;;do the deed  (terpri)  (setq count 0)  (while    (< count (sslength ss))    (princ (strcat "\n--> Processing entity no.:" (itoa (+ 1 count)) " of " (itoa (sslength ss)) "... "))    (setq e (entget (ssname ss count)))    ;if the object already has a ltscale    ;then multiply it by the factor    ;else set the new scale equal to the factor    (if    (assoc 48 e)      ;then      (progn        (setq old_val (cdr (assoc 48 e))              new_val (* lts_fac old_val))        (setq e (subst (cons 48 new_val) (assoc 48 e) e)) ;; johny fixed 2018-01-03        (entmod e)        (entupd (ssname ss count))        );progn then            ;else      (progn        (setq new_val (cons 48 lts_fac))        (setq e (append e (list new_val)))        (entmod e)        (entupd (ssname ss count))        );progn else      );end if        ;increase the count by one to move on to the next object    (setq count (+ count 1))    );while    ;end the program gracefully  (prompt (strcat "\nEntity linetypescale of **" (itoa (sslength ss)) "** selected objects scaled by a factor of <" (rtos lts_fac) ">. "))  (princ)  );defun c:lsr

Matejka63
03.01.2018, 17:01
Díky MOOC, nyní to funguje bezvadně

Matejka63
04.01.2018, 07:31
Maličko jsem to doplnil, aby se faktor nemusel dopočítávat ručně, ale zadali jsme rovnou nové globální měřítko:;;change linetype scale by a factor;;original version: http://www.cadforum.cz/forum_en/forum_posts.asp?tid=11259&title=change-linetype-scale-by-a-factor;;modified by will garmer to work on selection set instead of single object 2015-07-20;;fixed Johny 2018-01-03;;modified by Matejka63 to change the variable "LTSCALE" easily 2018-01-04(defun c:lsr (/ ss lts_fac count old_val new_val e old_lts new_lts)    ;;=====================================================================================  ;;main body of c:lsr    ;;get the selection set  (setq ss (ssget))    ;;get the scale factor by a NEW LTSCALE     (setq old_lts (getvar "LTSCALE"))    (setq new_lts (getreal (strcat "Insert a NEW LTSCALE <" (rtos old_lts) ">: ")))    (if (= new_lts nil)      (setq new_lts old_lts))    (setvar "LTSCALE" new_lts)    (setq lts_fac (/ old_lts new_lts))    ;;do the deed  (terpri)  (setq count 0)  (while    (< count (sslength ss))    (princ (strcat "\n--> Processing entity no.:" (itoa (+ 1 count)) " of " (itoa (sslength ss)) "... "))    (setq e (entget (ssname ss count)))    ;if the object already has a ltscale    ;then multiply it by the factor    ;else set the new scale equal to the factor    (if    (assoc 48 e)      ;then      (progn        (setq old_val (cdr (assoc 48 e))              new_val (* lts_fac old_val))        (setq e (subst (cons 48 new_val) (assoc 48 e) e)) ;; johny fixed 2018-01-03        (entmod e)        (entupd (ssname ss count))        );progn then            ;else      (progn        (setq new_val (cons 48 lts_fac))        (setq e (append e (list new_val)))        (entmod e)        (entupd (ssname ss count))        );progn else      );end if        ;increase the count by one to move on to the next object    (setq count (+ count 1))    );while    ;end the program gracefully  (prompt (strcat "\nEntity linetypescale of **" (itoa (sslength ss)) "** selected objects scaled by a factor of <" (rtos lts_fac) ">. "))  (princ)  );defun c:lsr