Vytisknout stránku | Zavřít okno

výpis hladin-2

Vytištěno z: CAD Fórum
Kategorie: Autodesk - stavebnictví, strojírenství, CAD/GIS
Název fóra: CAD programování
Popis fóra: Otázky programování - nadstavby a utility pro CAD a GIS aplikace Autodesk (VBA, AutoLISP, ARX/C++, .Net, JavaScript, Python, MEL...)
URL: https://www.cadforum.cz/forum/forum_posts.asp?TID=9098
Datum vytištění: 13.kvě.2026 v 22:48


Téma: výpis hladin-2
Odeslal: Ferdinand
Předmět: výpis hladin-2
Datum odeslání: 17.srp.2009 v 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)
...
 


-------------
-FerTh-



Odpovědi:
Odeslal: Seiner
Datum odeslání: 17.srp.2009 v 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)


-------------
Vítězslav Seiner

Chrudim


Odeslal: Seiner
Datum odeslání: 17.srp.2009 v 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


-------------
Vítězslav Seiner

Chrudim


Odeslal: Seiner
Datum odeslání: 17.srp.2009 v 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))))
    )
  )
)


-------------
Vítězslav Seiner

Chrudim


Odeslal: Ferdinand
Datum odeslání: 18.srp.2009 v 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-> : "
    )
    )


-------------
-FerTh-


Odeslal: Seiner
Datum odeslání: 18.srp.2009 v 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.


-------------
Vítězslav Seiner

Chrudim


Odeslal: Seiner
Datum odeslání: 18.srp.2009 v 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í.

-------------
Vítězslav Seiner

Chrudim


Odeslal: Ferdinand
Datum odeslání: 18.srp.2009 v 16:24
Aha, fakt, omluva... jak jsem to chtěl rychle napsat, tak se mi to pomotalo (i mně se to stává...Geek).
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.


-------------
-FerTh-


Odeslal: Seiner
Datum odeslání: 18.srp.2009 v 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.

-------------
Vítězslav Seiner

Chrudim


Odeslal: Ferdinand
Datum odeslání: 19.srp.2009 v 11:29
Dobře; děkuji.

-------------
-FerTh-



Vytisknout stránku | Zavřít okno