Zobrazit plnou verzi příspěvku: rozdělení čísla součásti

simunek
08.12.2017, 14:08

Zdravím, potřeboval bych prosím nějak "nakopnout" jakým stylem by šlo provést aby se mi Číslo součásti rozdělilo do dvou uživatelských iVlastností které by se mi vytvořili (např. DrawingNumber a DrawingTitle) Tyto iVlastnosti bych pak použil v razítku výkresu (v šabloně) Číslo součásti mám ve formátu R123456r0_xxx_yyyyy.R123456r0 by byla jedna iVlastnost (tato část je vždy 9 znaků)text za prvním podtržítkem by byla druhá iVlastnost.  Předpokládám nějak přes iLogic? Nebo by to šlo pomocí Xtools? Co jsem si pročítal Příručku tak jsem toto nenašel. Poradí prosím někdo? Předem díky

masa1
08.12.2017, 14:11
Co tohle - http://www.cadforum.cz/cadforum/pouziti-ilogic-na-rozklad-jmena-ipt-souboru-naplneni-ivlastnosti-tip9341.

simunek
08.12.2017, 14:18

Jo, toto jsem našel. Je to něco podobného, rozděluje se název souboru. Jen jsem popravdě nezachytil jak by to mělo vypadat pokud to chci rozdělit po prvním podtržítku. Také jak vytvořit uživatelské iVlastnosti do kterých to pak zapíše. V iLogicu nejsem vůbec zběhlý....bohužel :-(

Vladimír Michl
08.12.2017, 14:56

Tady je to spíš "kouzlení" s regulárními výrazy - asi bude stačit formálně upravit řetězec v příkladu na podtržítka (nezkoušeno): "\b([^-]+)-*([^-]+).*\b"-->"\b([^_]+)_*([^_]+).*\b"

EuroTec
08.12.2017, 16:08
Nebilo by lepší na to jít obráceně? Vyplnit nezávisle ty dvě (nebo tři, nebo deset) iVlastosti a ty potom sloučit do Čísla součásti . V rozpisce to jde docela dobře.

Navara
11.12.2017, 00:06

Vždycky je jednodušší slučovat, než rozdělovat. Ale pokud už je to takhle, tak co třeba tohle? [code]Dim partNumber As String = "R123456r0_xxx_yyyyy"Dim strings = partNumber.Split("_".ToCharArray(), 2)MsgBox(String.Format("Original: {0}{3}1. cast: {1}{3}2. cast: {2}", partNumber, strings(0), strings(1), vbCrLf))[/code] 

simunek
11.12.2017, 09:56
[QUOTE=Vladimír Michl]
Tady je to spíš "kouzlení" s regulárními výrazy - asi bude stačit formálně upravit řetězec v příkladu na podtržítka (nezkoušeno): "\b([^-]+)-*([^-]+).*\b"-->"\b([^_]+)_*([^_]+).*\b"[/QUOTE] No je to tedy boj Mám to zatím takto:v šabloně výkresu jsem si vytvořil uživ. vlastnosti DrawingTitle a DrawingNumber.Tyto vlastnosti pak používám v tom makru. Narazil jsem ale na chybu že když je název např. R171234r0_nazev_dilu : Tak mi to rozdělí na R171234r0 a nazev tzn. že to skončí u dalšího podtržítka. Zkoušel jsem smazat různé části z této podmínky "\b([^_]+)_*([^_]+).*\b" ale bez úspěchu. Bohužel nemám vůbec představu jak je tato pobmínka tvořena. Věděl by někdo jak to upravit aby to prostě rozdělilo na před prvním podtržítkem a zbytek po prvním podtržítku i když tam dále budou další podtržítka??? Také jsem laboroval kdy toto pravidlo spouštět. Mám to nastaveno na "změna iVlastnosti" a "Před uložením" je to správně prosím? Předem díky za pomoc 

Radek001
11.12.2017, 10:08

Možná nesmysl, ale co místo podtržítka použít definovaný počet znaků? Neřešit jestli 1., 2., nebo páté podtržítko. Prostě vzít prvních x znaků = jedna vlastnost, zbytek = druhá vlastnost. Podobně to lze v excelu.

simunek
11.12.2017, 10:10
[QUOTE=Radek001]
Možná nesmysl, ale co místo podtržítka použít definovaný počet znaků? Neřešit jestli 1., 2., nebo páté podtržítko. Prostě vzít prvních x znaků = jedna vlastnost, zbytek = druhá vlastnost. Podobně to lze v excelu.[/QUOTE]
 Jo to by taky šlo, ten kód před podtržítkem je stále stejně dlouhý. Víte jak na to?

Radek001
11.12.2017, 10:14

V excelu ano, v Inventoru bohužel ne. Ještě jsem to nepotřeboval.Ale myslím, že pokud to v Inventoru jde, tak pánové Michl a Navara jsou ti správní :-)

Navara
11.12.2017, 10:23

Regulární výrazy jsou fajn, ale je potřeba je umět napsat a odladit. Na internetu je spousta nástrojů pro testování RegExů.Například:https://regex101.com/Základy psaní jsou popsány třeba tadyhttps://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference EDIT:Ten regulární výraz by měl vypadat podle mě takhle[code] \b([^_]+)+_(.*)\b [/code] Jinak ten můj kód by potom vypadal takhle [code]Dim partNumber As String = iProperties.Value("Project", "Part Number") 'For debug onlypartNumber = "R123456r0_xxx_yyyyy" Dim strings = partNumber.Split("_".ToCharArray(), 2)Dim DrawingTitle As String = strings(1)Dim DrawingNumber As String = strings(0) 'TODO: Vytvořit uživatelské iVlastnosti' 'Nastavit hodnoty iVlastností'iProperties.Value("Custom", "DrawingTitle") = DrawingTitleiProperties.Value("Custom", "DrawingNumber") = DrawingNumber 'For debug onlyMsgBox(String.Format("Original: {0}{3}DrawingTitle: {1}{3}DrawingNumber: {2}", partNumber, DrawingTitle, DrawingNumber, vbCrLf)) [/code]      


Navara2017-12-11 10:36:58

simunek
11.12.2017, 10:42
[QUOTE=Navara]
Regulární výrazy jsou fajn, ale je potřeba je umět napsat a odladit. Na internetu je spousta nástrojů pro testování RegExů.Například:https://regex101.com/Základy psaní jsou popsány třeba tadyhttps://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference EDIT:Ten regulární výraz by měl vypadat podle mě takhle[code] \b([^_]+)+_(.*)\b [/code] Jinak ten můj kód by potom vypadal takhle [code]Dim partNumber As String = iProperties.Value("Project", "Part Number") 'For debug onlypartNumber = "R123456r0_xxx_yyyyy" Dim strings = partNumber.Split("_".ToCharArray(), 2)Dim DrawingTitle As String = strings(1)Dim DrawingNumber As String = strings(0) 'TODO: Vytvořit uživatelské iVlastnosti' 'Nastavit hodnoty iVlastností'iProperties.Value("Custom", "DrawingTitle") = DrawingTitleiProperties.Value("Custom", "DrawingNumber") = DrawingNumber 'For debug onlyMsgBox(String.Format("Original: {0}{3}DrawingTitle: {1}{3}DrawingNumber: {2}", partNumber, DrawingTitle, DrawingNumber, vbCrLf)) [/code]      


[/QUOTE]
  Díky moc, v tomto Vašem zápisu mám i zhruba představu na co který řádek je  Už to i chodí jak má jen když nastavim spouštění pravidla "před uložením" tak mi to při prvním uložení vyhodí tuto hlášku Poté při dalším uložení už to chybu nehodí a změny v razítku se provedou jak mají.

Navara
11.12.2017, 11:11

Protože tam chybí kontrola na úspěšné rozděleníTady je pokus o finální kód, jak s použitím funkce Split, tak s použitím RegEx. Každý si může vybrat co mu sedí víc  [code]Dim partNumber As String = iProperties.Value("Project", "Part Number")'FOR DEBUG ONLYpartNumber = "R123456r0_xxx_yyyyy"Dim drawingTitle As String = ""Dim drawingNumber As String = ""'----------------------------------------------------'Split functionDim strings = partNumber.Split("_".ToCharArray(), 2)If strings.Length > 1 Then    drawingTitle = strings(1)    drawingNumber = strings(0)        'FOR DEBUG ONLY    MsgBox(String.Format("Original: {0}{3}DrawingTitle: {1}{3}DrawingNumber: {2}", partNumber, drawingTitle, drawingNumber, vbCrLf), Title:="Split function")Else    MsgBox("Rozdeleni se nezdarilo", Title:="Split function", Buttons:=MsgBoxStyle.Exclamation)End If'----------------------------------------------------'----------------------------------------------------'RegExDim pattern As String = "^([^_]+)+_(.*)$"Dim matchCollection = System.Text.RegularExpressions.Regex.Matches(partNumber, pattern)Dim groupCollection = matchCollection(0).GroupsIf groupCollection.Count > 2 Then    drawingNumber = groupCollection(1).Value    drawingTitle = groupCollection(2).Value    'FOR DEBUG ONLY    MsgBox(String.Format("Original: {0}{3}DrawingTitle: {1}{3}DrawingNumber: {2}", partNumber, drawingTitle, drawingNumber, vbCrLf), Title:="RegEx")Else    MsgBox("Rozdeleni se nezdarilo", Title:="RegEx", Buttons:=MsgBoxStyle.Exclamation)End If'----------------------------------------------------iProperties.Value("Custom", "DrawingTitle") = drawingTitleiProperties.Value("Custom", "DrawingNumber") = drawingNumber[/code] 

simunek
11.12.2017, 12:43

Díky moc, bohužel nyní to po prvním uložení vyhodí tu hlášku "Rozdělení se nezdařilo". Když jsem si to procházel tak je to zřejmě tím že před prvním uložením je číslo součásti prázdné.Zřejmě iLogic pravidlo spouštěné před uložením se spouští dříve než Inventor zapisuje do čísla součásti název souboru. Pak by to dávalo smysl. S tím asi moc nesvedeme že? I v tomto stavu mi to samozřejmě dost ulehčí práci. Jde v podstatě jen o odkliknutí hlášky. Při dalším uložení už to chodí jak má.  

Navara
11.12.2017, 12:58

Tady se dá udělat jediná věc a to je kontrola na začátku, jestli partNumber je prázdné. Pokud ano, tak ukončit pravidlo.Jinak ta hláška se dá samozřejmě vypnout.  Složitější varianta je nastavit to pravidlo jak před uložením tak po uložení a v případě prvního uložení spouštět to pravidlo PO u dalších uložení PŘED. Ale to už je dost komplikované hlavně na údržbu. S tím souvisí i to, že tahle pravidla by měla být VŽDY externí a měla by se spouštět třeba pomocí XTools, protože to zjednoduší pozdější údržbu. Řešení pomocí spouštěčů iLogic nedoporučuju, protože jsou vždy zapsány v dokumentu a do starších souborů je dostanete velmi obtížně.

simunek
11.12.2017, 14:22

pane Navara mohl bych Vás tedy požádat ještě o doplnění té kontroly a ukončení v případě že partNumber je prázdný?? Nějak jsem to zkoušel ale nedaří se. Jinak ohledně externích pravidel a Xtoolsů souhlasím, nicméně u starších souborů mě chybějící makro trápit moc nebude a upřímně, jsem rád že dám dohromady iLogic natož to ještě "komplikovat" s xtoolsy :-)

Navara
11.12.2017, 15:05

Psal jsem to bez testu[code]If partNumber = "" Then   ReturnEnd If[/code] XTools a externí pravidla je dobrá rada, ale dělejte jak myslíte. 

simunek
11.12.2017, 15:14
[QUOTE=Navara]
Psal jsem to bez testu[code]If partNumber = "" Then   ReturnEnd If[/code] XTools a externí pravidla je dobrá rada, ale dělejte jak myslíte. [/QUOTE]
 Jo tak ten Return mi tam chyběl  Už to chodí krásně. Mockrát díky

EuroTec
11.12.2017, 15:15
Jestliže nemáte při prvním uložení vyplněno číslo součásti, pak zastávám názor, že je mnohem lepší vyplnit dva nezávislé atributy a ty sloučit do čísla součásti, tím spíše, že jeden máte zřejmě stejný pro všechna díly.