Zobrazit plnou verzi příspěvku: výpis hladin-2

Ferdinand
17.08.2009, 14:11
Poněvadž téma je již uzavřeno, a potřebuji opět prodebatovat:
Příklad od p. Seinera je opravdu inspirující (až na nějaké nejasnosti: k čemu tam slouží prom. "t" a "typ" ?).
Nyní jsem narazil na nutnost vytvoření "filtrovaného" seznamu hladin, tj. ze všech hladin udělat dílčí seznam pouze začínajících stejným kódem.
Příklad:
Existující sada hladin je s názvy
R6.00-build, R6.00-dim, R6.00-el, ...
k tomu ještě samozřejmě existuje mnoho dalších (i podobných - např. R6.25-build, R6.25-dim, ...). Celkem je jich dejme tomu 75 .
Předpona R6.00- (prom. PREDP) je zvolena při založení nové sady hladin (pomocí lispu).
Mým cílem je seznam, který bude obsahovat pouze ty které jsou R6.00-*
Stávající rutinka - na zákl. vzoru p. Seinera:
;;seznam hladin;;-bez filtru(defun C:layerlist (/ LAY LYRL i tt)  (setq LAY  0 LYRL nil  )  (tblnext "LAYER" LAY)  (while LAY    (setq LAY (cdr (assoc 2 (tblnext "LAYER"))))    (if LAY      (setq LYRL (append LYRL (list LAY)))    )  ))
 
Pro ten filtr se nedá použít proměnné PREDP jako argumentu:
(if (wcmatch LAY PREDP)
...
 

Seiner
17.08.2009, 14:52
Už moc nevím, o co šlo, ale zřejmě jsem Vám tenkrát jen vypreparoval kousek kódu z nějakého mého staršího prográmku a ty proměnné tam prostě zůstaly. Myslím, že jsem to požíval v projektu, který vytvářel zadání pro prográmek pro výpočet prutových a rámových konstrukcí a typ byl druh prvku.
Nevím, jestli jsem úplně pochopil dotaz, ale filtrovat podle začátku názvu hladiny by šlo primitivně třeba takto:
 

;;seznam hladin;;-bez filtru(defun C:layerlist (/ LAY  i tt)  (setq LAY  0 LYRL nil  )  (tblnext "LAYER" LAY)  (while LAY    (setq LAY (cdr (assoc 2 (tblnext "LAYER"))))    (if LAY      (if (=(SUBSTR LAY 1 (STRLEN PREDP))PREDP)      (setq LYRL (append LYRL (list LAY))))    )  ))
 
(Seznam hladin jsem vyhodil z lokálních proměnných, abych to mohl testovat)

Seiner
17.08.2009, 15:08
1. Nevidím důvod, proč by nešel použít wcmatch
2. Asi by bylo dobré odstranit "case-sensitivity" pomocí fce STRCASE

Seiner
17.08.2009, 15:36
;;seznam hladin;;-bez filtru(defun C:layerlist (/ LAY  i tt)  (setq LAY  0 LYRL nil  )  (tblnext "LAYER" LAY)  (while LAY    (setq LAY (cdr (assoc 2 (tblnext "LAYER"))))    (if LAY       (if (WCMATCH  (STRCASE LAY) (STRCAT (STRCASE PREDP) "*"))      (setq LYRL (append LYRL (list LAY))))    )  ))

Ferdinand
18.08.2009, 08:03
To jsem pak špatně pochopil fci wcmatch - měl jsem za to, že slouží právě k tomu, aby se zohlednily jakékoliv znaky v řetězci (bez ohledu na malá/velká písmena).
Nechápu, k čemu je dobré ve výrazu to zdvojení:
(if (wcmatch  (strcase LAY) (strcat (strcase PREDP) "*"))
Doposud jsem používal takhle:
(strcase "aBcD123eF");vrací aBcD123eF
(strcat "aBcD123eF");vrací ABCD123EF
Proměnná PREDP může být jakýkoliv řetězec (jsou tam malá/velká písmena, čísla, znaky...):
(setq PREDP    (getstring      "\nZadejte předponu názvu sady hladin vč. oddělovače [-/./_] <R6_Fx-> : "    )    )

Seiner
18.08.2009, 08:09
No, jde o to, jestli to chcete mít case sensitiv nebo ne. Osobně bych se tomu snažil vyhnout - uživatelé to dost těžko chápou.
To "zdvojení" je IMHO triviální - zkonvertuji oba porovnávané řetězce na velká písmena.
Co se týká wcmatch - snadno otestujete, když vyhodíte to strcase.

Seiner
18.08.2009, 08:50
IMHO jste to ve vaší odpovědi zpřeházel - STRCAT je zřetězení a NEMŮŽE měnit velikost písmen. Je tam proto, abyste na hodnotu proměnné PREDP přilepil tu hvězdičku a udělal z toho vzor pro hledání.

Ferdinand
18.08.2009, 16:24
Aha, fakt, omluva... jak jsem to chtěl rychle napsat, tak se mi to pomotalo (i mně se to stává...).
Výsledný efekt používání m/v písmen názvů tkví v tom, že 1.
KDYŽ NAPIŠU VŠE VELKÝMI PÍSMENY tak to zabere více místa v tabulce editoru hladin, ale
Když napišu vše 1malými písmeny tak to zabere místa méně...(což se může zdát jako prkotina, ale při delším řetězci je markantní - na obrazovce je při maximalizaci okna cca. 10 cm místa pro popis a stává se, že to nestačí).
2. popis je jednoznačný. Příklad:  1Lo1o (jedna_el_o_jedna_o) vs. 1lo10 anebo 11010, B86 (bé_osm_šest) vs. 886, Z0na (zet_nula_en_a) vs. zona ...atd. Ale to je už tak trochu na jiné téma.

Seiner
18.08.2009, 21:40
Ale to jste mne poněkud nepochopil. Já vůbec nezpochybňuji praktičnost nebo nepraktičnost používání velkých/malých písmen v názvech hladin. Šlo mi čistě o ten filtr hladin. Pokud jsou voleny minusky a verzály jen z důvodu čitelnosti, viděl bych jako vhodné, aby filtr nebral ohled na velikost písma. Jestli to připravujete nejen pro sebe, vyhnete se opakovaným reklamacím, že program špatně pracuje: "Vždyť jsem zadal předponu KLM a ono mi to nenašlo hladinu Klmxy!" Ale to je opravdu jen na okraj a mimo téma dotazu. Jinak doufám, že jsem Vám aspoň trochu pomohl postrčit řešení Vašeho problému.

Ferdinand
19.08.2009, 11:29
Dobře; děkuji.