rozdělení čísla součásti
Vytištěno z: CAD Fórum
Kategorie: Autodesk - stavebnictví, strojírenství, CAD/GIS
Název fóra: Inventor
Popis fóra: Otázky k programům Autodesk Inventor Professional, Product Design & Manufacturing Collection, Factory Design; digitální prototypy
URL: https://www.cadforum.cz/forum/forum_posts.asp?TID=25384
Datum vytištění: 25.čvc.2026 v 20:29
Téma: rozdělení čísla součásti
Odeslal: simunek
Předmět: rozdělení čísla součásti
Datum odeslání: 08.pro.2017 v 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
------------- Pavel Šimůnek
|
Odpovědi:
Odeslal: masa1
Datum odeslání: 08.pro.2017 v 14:11
Co tohle - http://www.cadforum.cz/cadforum/pouziti-ilogic-na-rozklad-jmena-ipt-souboru-naplneni-ivlastnosti-tip9341 - http://www.cadforum.cz/cadforum/pouziti-ilogic-na-rozklad-jmena-ipt-souboru-naplneni-ivlastnosti-tip9341 .
------------- Mašek
|
Odeslal: simunek
Datum odeslání: 08.pro.2017 v 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 :-(
------------- Pavel Šimůnek
|
Odeslal: Vladimír Michl
Datum odeslání: 08.pro.2017 v 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" -->
------------- Vladimír Michl (moderátor) ARKANCE CZ - https://arkance.world - arkance.world (podpora viz emea.support.arkance.world)
|
Odeslal: EuroTec
Datum odeslání: 08.pro.2017 v 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.
------------- Milan Denk
EuroTec JKR
|
Odeslal: Navara
Datum odeslání: 11.pro.2017 v 00:06
|
Vždycky je jednodušší slučovat, než rozdělovat. Ale pokud už je to takhle, tak co třeba tohle?
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))
|
|
Odeslal: simunek
Datum odeslání: 11.pro.2017 v 09:56
Vladimír Michl napsal(a):
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" --> |
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
------------- Pavel Šimůnek
|
Odeslal: Radek001
Datum odeslání: 11.pro.2017 v 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.
------------- Radek Štěpánek OTIS, mechanical engineer
|
Odeslal: simunek
Datum odeslání: 11.pro.2017 v 10:10
Radek001 napsal(a):
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. |
Jo to by taky šlo, ten kód před podtržítkem je stále stejně dlouhý. Víte jak na to?
------------- Pavel Šimůnek
|
Odeslal: Radek001
Datum odeslání: 11.pro.2017 v 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í :-)
------------- Radek Štěpánek OTIS, mechanical engineer
|
Odeslal: Navara
Datum odeslání: 11.pro.2017 v 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/" rel="nofollow - https://regex101.com/ Základy psaní jsou popsány třeba tady https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference" rel="nofollow - https://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 Jinak ten můj kód by potom vypadal takhle
Dim partNumber As String = iProperties.Value("Project", "Part Number") 'For debug only partNumber = "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") = DrawingTitle iProperties.Value("Custom", "DrawingNumber") = DrawingNumber 'For debug only MsgBox(String.Format("Original: {0}{3}DrawingTitle: {1}{3}DrawingNumber: {2}", partNumber, DrawingTitle, DrawingNumber, vbCrLf))
|
|
Odeslal: simunek
Datum odeslání: 11.pro.2017 v 10:42
Navara napsal(a):
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/" rel="nofollow - https://regex101.com/ Základy psaní jsou popsány třeba tady https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference" rel="nofollow - https://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 Jinak ten můj kód by potom vypadal takhle
Dim partNumber As String = iProperties.Value("Project", "Part Number") 'For debug only partNumber = "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") = DrawingTitle iProperties.Value("Custom", "DrawingNumber") = DrawingNumber 'For debug only MsgBox(String.Format("Original: {0}{3}DrawingTitle: {1}{3}DrawingNumber: {2}", partNumber, DrawingTitle, DrawingNumber, vbCrLf))
|
|
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í.
------------- Pavel Šimůnek
|
Odeslal: Navara
Datum odeslání: 11.pro.2017 v 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 
Dim partNumber As String = iProperties.Value("Project", "Part Number") 'FOR DEBUG ONLY partNumber = "R123456r0_xxx_yyyyy" Dim drawingTitle As String = "" Dim drawingNumber As String = "" '---------------------------------------------------- 'Split function Dim 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 '---------------------------------------------------- '---------------------------------------------------- 'RegEx Dim pattern As String = "^([^_]+)+_(.*)$" Dim matchCollection = System.Text.RegularExpressions.Regex.Matches(partNumber, pattern) Dim groupCollection = matchCollection(0).Groups If 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") = drawingTitle iProperties.Value("Custom", "DrawingNumber") = drawingNumber
|
|
Odeslal: simunek
Datum odeslání: 11.pro.2017 v 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á.
------------- Pavel Šimůnek
|
Odeslal: Navara
Datum odeslání: 11.pro.2017 v 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ě.
|
Odeslal: simunek
Datum odeslání: 11.pro.2017 v 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 :-)
------------- Pavel Šimůnek
|
Odeslal: Navara
Datum odeslání: 11.pro.2017 v 15:05
|
Psal jsem to bez testu
If partNumber = "" Then Return End If
|
XTools a externí pravidla je dobrá rada, ale dělejte jak myslíte.
|
Odeslal: simunek
Datum odeslání: 11.pro.2017 v 15:14
Navara napsal(a):
Psal jsem to bez testu
If partNumber = "" Then Return End If
|
XTools a externí pravidla je dobrá rada, ale dělejte jak myslíte. |
Jo tak ten Return mi tam chyběl  Už to chodí krásně. Mockrát díky
------------- Pavel Šimůnek
|
Odeslal: EuroTec
Datum odeslání: 11.pro.2017 v 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.
------------- Milan Denk
EuroTec JKR
|
|