Vítejte !   Přihlášení | Registrace
Hlavní menu
CATIA fórum.cz
Novinky
Seriál CATIA
Obecně o CAD
Novinky ze světa DS
Makra pro CATIA V5
Diskuse
Vytvořit téma
Koncepty
Seznam oblíbených
Soukromé zprávy
Pravidla
Live CHAT
VIP žádost
Základy Catia
Ke stažení
Doporučujeme
Pracovní příležitosti
Reklama a kampaně
O fóru
Nápověda

Nastavení hodnoty dle volby parametru typu String

UživatelPříspěvek
Tomáš Fridrichovský

Poslat zprávu | Profil
Datum: 13.7. 2021 | Zobrazeno: 3739x
Konfigurace CATIA: V5-6R2018, MD2

Text dotazu:
Dobrý den,
potřeboval bych vytvořit následující:
- uživatel si vybere z nabídky hodnotu pro parametr TYP (A, B, případně i další),
- podle toho se automaticky nastaví velikost parametru POLOROZVOR, který si bude tahat informace z parametrů POLOROZVOR A, POLOROZVOR B apod.

Parametr TYP je typu String. Parametr POLOROZVOR je Real.

Pro tento účel vytvořím pravidlo Law s názvem Law.1-rozvor_podvozku. V něm založím v kolonce Formal parameters následující subparametry:
- typ (String),
- rozvor (Real).

Syntaxi pro rozhodovací pravidlo udělám následovně:
If (`typ` =="A")
{`rozvor`=`POLOROZVOR A`}

else if (`typ` =="B")
{`rozvor`=`POLOROZVOR B`}



Když pak chci promítnout výsledek pravidla do parametru POLOROZVOR přes formuli:
`Relations\Law.1-rozvor_podvozku` ->Evaluate(`Typ_podvozku` )
Vyskočí ba ně hláška:
Syntax Error line 1 :
bad kind of argument number 1 in Method Evaluate
(should be Real instead String)
Do you want to go to...



Otázka - co je špatně? Jak do Law, tak do Formula vstupují typově stejné hodnoty (String, Real). Je někde nějaký zádrhel např. se psaním syntaxe IF funkce? V jedné z diskuzí jsem narazil na zmínku, že Law neumí String, to je pravda?


P.S.: Snahou je udělat si parametrický podklad pro skeleton vozidla, kde uživatel pouze vybere z nabídky typ vozidla (A, B...) a vše (rozvor, průměry kol...) se přenastaví samo.


Děkuji

Ing Jan Cinert

Poslat zprávu | Profil
[#6992] | Publikováno: 13.07. 2021 - 16:04
Dobrý den,

problém je v tom, že Law skutečně umí pracovat jen s typem Real (pro mě stále nepochopitelné). Řešením je Rule, ale na to zase potřebujete licenci KWA.

Workaround:
Jediná mě známá možnost je dostat do hodnot parametrů nějaká čísla, např. 1_A, 2_B atd. ty pak vypreparovat pomocí String->Extract a String->ToReal do dalšího parametru - již typu Real, a s ním jít do Law. Samotný Law pak nemusí přebírat hodnoty dalších parametrů, ale rovnou řídit POLOROZVOR (dá se větvit neomezeně).

Je to trochu krkolomnější, ale funkční řešení.
Tomáš Fridrichovský

Poslat zprávu | Profil
[#6993] | Publikováno: 13.07. 2021 - 17:28
Dobrý den, sice to nebude úplně čisté řešení, ale použití číslovek by nevadilo. Pro změnu teď narážím na problém syntaxe příkazu String To Real. Nemáte nějaký příklad, jak jí přesně napsat, respektive co přesně vložit? Dostávám jen errory...
Pavel Krsek

Poslat zprávu | Profil
[#6994] | Publikováno: 14.07. 2021 - 06:54
Dobrý den,
další možnost je také ve skeletonu vytvořit design table ze kterého se nalinkují parametry. Něco hodné podobného jsme měli u nás také vytvořené a fungovalo to OK. Sice jsem to nakonec předělal jako externí makro, ale jen z důvodu, že při práci s naším PLM systémem se musí XLS tabulka design table ukládat jako samostatný dataset.
Tomáš Fridrichovský

Poslat zprávu | Profil
[#6995] | Publikováno: 14.07. 2021 - 10:20
Dobrý den,
design table je určitě je ve hře, ale tak trochu povinností je mít z hlediska uživatelského komfortu vybíratelné menu - typ A, typ B, anebo typ 1_A, typ 2_B apod. Bohužel převod ze String na Real se mi furt nedaří, respektive nevím, jak přesně má vypadat syntaxe.
Pokud dovytvořím parametr TYP_Real, tak ve skupině příkazů String je "String->ToReal (): Real" s obsahem v kolonce pro formuli "->ToReal()". Bohužel ať zkouším libovolnou syntaxi, např.: "->ToReal(`TYP_Real` )" nebo "`typ` ->ToReal(`TYP_Real` )" atd., tak skončím u chyby Syntax Error line 0... apod.
Počítám, že prostor před šipkou nezůstává prázdný, ale to se spíš jen domnívám podle vyhodnocení pro Law.
Ing Jan Cinert

Poslat zprávu | Profil
[#6996] | Publikováno: 15.07. 2021 - 14:46
Zkuste to takhle...

Extract se musí nastavit tak, aby vytáhl tu číselnou hodnotu ze stringu. První parametr je odkud (pozor, první znak je na pozici 0), druhý udává délku podřetězce. Pokud budete mít více než 10 hodnot, pak je dobré začít s 01 atd a tahat dva znaky.

Přiložené obrázky:

Honza_V

Poslat zprávu | Profil
[#7243] | Publikováno: 24.03. 2025 - 09:59
Narazil jsem na toto vlákno při řešení podobného problému. Udělal jsem to trochu jinak, tak se podělím. Třeba to někomu pomůže.

Požadavek byl řídit předvoleným vstupním parametrem typu String (Varianta A, Varianta B, Varianta C,......) několik rozměrových hodnot.

1) Vytvořil jsem si řídící parametr typu String.1 a do něj předvolil jednotlivé varianty (Varianta A/Varianta B/Varianta C). Pro následující příklad uvádím tyto 3 varianty.
2) Do dalšího parametru String.2 jsem si vyextrahoval variantní písmeno na 10 pozici `String.1` ->Extract(9,1)
3) Vytvořil jsem si tolik parametrů typu Integer, kolik mám variant a do každého z nich provedl ověření dané písmenné varianty pomocí funkce Search. Každý z výsledků jsem vynásobil o řád se zvyšujícím číslem.

Tedy první Integer.1 bude mít funkci `String.2` ->Search("A")*1 (to krát 1 je jen pro úplnost)
Pokud se tedy v extractu String.2 nachází písmeno A je na výstupu 0 / pokud ne, je tam -1

Pak druhý Integer.2 bude mít funkci `String.2` ->Search("B") *10
Pokud se tedy v extractu String.2 nachází písmeno B je na výstupu 0 / pokud ne, je tam -10

No a třetí Integer.3 bude mít funkci `String.2` ->Search("C") *100
Pokud se tedy v extractu String.2 nachází písmeno C je na výstupu 0 / pokud ne, je tam -100

Nakonec jsem vytvořil finální součtový Ineger.4 do kterého jsem sečetl všechny předchozí a abych se zbavil záporného znaménka, tak jsem vše vynásobil -1
(`Integer.1` +`Integer.2` +`Integer.3` )*-1

V závislosti na dané variantě se tedy tento finální Ineger.4 mění následovně
Varianta A => 110
Varianta B => 101
Varianta C => 11
Není potřeba nad tím složitě přemýšlet a něco počítat, prostě postupně vyberu každou z variant a opíšu si výsledný kontrolní součet.
Tento konečný parametr typu Integer už lze použít pro funkci Law a řídit s ní například délkové rozměry.

Přiložené obrázky:

Ing Jan Cinert

Poslat zprávu | Profil
[#7244] | Publikováno: 01.04. 2025 - 15:56
Uživatel odpovídá na příspěvek #7243:

Pořád vidím jistou nevýhodu, že při přidávání variant budete muset přidávat i parametr na vyhledání konkrétní varianty, pak parametr součtu, a nakonec i samotný Law.

V předchozím řešení stačí upravit jen Law, a navíc víte přesně jaké číslo do Law použít (extract z názvu varianty), a nemusíte přepnou na konkrétní variantu, abyste viděl daný součet ;-)

Ale fungovat to bude tak jako tak.


Uživatel nepřihlášen

Pro zobrazení obsahu stránky / provedení akce (vytvoření nového téma, napsání odpovědi do diskuse apod.) musíte být přihlášeni.