Dnešní díl o iLogicu bud trochu složitější. Pravidlo, které si dnes spolu vytvoříme a vysvětlíme nám bude automaticky ukládat aktuální výkres do PDF podle našeho nastavení. Kolega Lukáš Hrubý už v minulých článcích ukazoval příklady kódů které Vám uloží výkres buď jednoduše bez jakýchkoliv nastavení nebo s možností menšího nastavení. My v tomto článku půjdeme ještě dál a každý kus kódu si vysvětlíme. Výsledkem bude tedy zcela automatický iLogic kód, ve kterém jednou nastavíte pár možností a po té už automaticky ukládáte. Doporučuji si tedy tyto předešlé články nastudovat dříve než se vrhnete na tento složitější kód.
Nastavit budete moct následující:
- Název složky do které se PDF ukládá
- Jestli se má vytvořit PDF jednotlivě pro každý list výkresu
- Mají-li se v PDF zobrazit barvy čar
- Mají-li se odstranit všechny tloušťky čar
- Jaké má být vectorové rozlišení
A také Vás toto iLogic pravidlo upozorní, pokud uloží PDF úspěšně nebo pokud ho z jakéhokoliv důvodu nebude moci uložit (například bude PDF otevřeno).
Takže se na to rovnou vrhneme. Nejdřív zde uvedu opět celý kód tak jak ho mám v iLogicu a celý jej tedy stačí zkopírovat do nového pravidla a budete mít v podstatě hotovo. Pokud se chcete probrat ve formátovaném textu tak si stáhněte celý soubor formátovaný v ilogicVB.
'start Sub Main() '------- NASTAVTE ------- NAZEV_SLOZKY = "PDF" 'Do uvozovek napiste jak se ma jmenovat slozka do ktere se bude PDF zapisovat JEDNOTLIVE = "NE" 'Pokud chcete Ukladat jednotlive PDF jako zvlastni soubory tak prepiste NE na ANO CERNE = "ANO" 'Maji byt vsechny barvy cerne? ODSTRANIT_TLOUSTKY = "NE" 'Maji se odstranit vsechny tloustky car? Dim VEKTOR As Integer = "400" 'Nastaveni Vectoroveho rozliseni '--- KONEC NASTAVOVANI --- 'Nastavenií sys promennych CESTA = ThisDoc.Path 'Cesta k otevrenemu dokumentu NAZEV_SOUBORU = ThisDoc.FileName(False) 'False = bez pripony PDFAddIn = ThisApplication.ApplicationAddIns.ItemById("{0AC6FD95-2F4D-42CE-8BE0-8AEA580399E4}") AKTIVNI_DOKUMENT = ThisApplication.ActiveDocument FIN_ULOZISTE = CESTA & "\" & NAZEV_SLOZKY & "\" 'Nastavení složky KAM se to PDF uloží oContext = ThisApplication.TransientObjects.CreateTranslationContext oContext.Type = IOMechanismEnum.kFileBrowseIOMechanism oOptions = ThisApplication.TransientObjects.CreateNameValueMap oDataMedium = ThisApplication.TransientObjects.CreateDataMedium 'Preulozeni uzivatelskych voleb do 1 a 0 cemuz iLogic rozumi If CERNE = "ANO" Then BLACK = "1" Else BLACK = "0" End If If ODSTRANIT_TLOUSTKY = "ANO" Then LINEWEIGHTS = "1" Else LINEWEIGHTS = "0" End If If JEDNOTLIVE="NE" Then 'Maji se ukladat jednotlive listy zvlast nebo vse pohromade? 'PRVNI CAST - VSECHNY LISTY DO JEDNOHO PDF If PDFAddIn.HasSaveCopyAsOptions(oDataMedium, oContext, oOptions) Then oOptions.Value("All_Color_AS_Black") = BLACK 'Odstrani vsechny cerne oOptions.Value("Remove_Line_Weights") = LINEWEIGHTS 'Odstrani vsechny tloustky oOptions.Value("Vector_Resolution") = VEKTOR 'Nastaveni vektoru oOptions.Value("Sheet_Range") = Inventor.PrintRangeEnum.kPrintAllSheets 'Rozsah výkresu. Nastaveno AllSheets = Všechny listy End If 'Existuje finalni slozka v ulozisti? Pokud ne tak vytvori If Not System.IO.Directory.Exists(FIN_ULOZISTE) Then System.IO.Directory.CreateDirectory(FIN_ULOZISTE) End If On Error Goto CHYBA: 'Resume Next Ochrana před errorem pokud je PDF zamčeno nebo otevřeno a nejde přepsat oDataMedium.FileName = FIN_ULOZISTE & NAZEV_SOUBORU & ".pdf" 'Výsledný název ukládaného PDF souboru 'Ulozeni finalniho PDF Call PDFAddIn.SaveCopyAs(AKTIVNI_DOKUMENT, oContext, oOptions, oDataMedium) 'Uložit kopii jako...PDF.. s nastavením Inventoru - barvy černé MessageBox.Show("PDF soubor uložen jako: " & vbLf & oDataMedium.FileName, "Uložení PDF",MessageBoxButtons.OK, MessageBoxIcon.Information) ' Potvrzovací okno, ze ulozeni probehlo v poradku. 'Shell("explorer.exe " & FIN_ULOZISTE,vbNormalFocus) Else ' DRUHA CAST - jednotlive PDF Dim oDrawing As DrawingDocument oDrawing = ThisDoc.Document 'Definujeme tento otevrený dokument Dim oSheet As Sheet Dim lPos As Long Dim rPos As Long Dim sLen As Long Dim sSheetName As String Dim iSheetNumber As Integer For Each oSheet In oDrawing.Sheets ' Projdi další část kódu pro každý výkres znovu lPos = InStr(oSheet.Name, ":") 'Najdeme v nazvu listu oddelujici dvojtecku v nazvu listu Sheet:(cislo) sLen = Len(oSheet.Name) 'Najdeme kolik má list počet znaků v názvu sSheetName = Left(oSheet.Name, lPos -1) 'Najdeme jaký má list název (tudiz uz bez cisla) iSheetNumber = Right(oSheet.Name, sLen -lPos) 'A tentokrat naopak najdeme pouze cislo bez nazvu 'Nastavime si moznosti ulozeni PDF If PDFAddIn.HasSaveCopyAsOptions(oDataMedium, oContext, oOptions) Then oOptions.Value("All_Color_AS_Black") = BLACK oOptions.Value("Remove_Line_Weights") = LINEWEIGHTS oOptions.Value("Vector_Resolution") = VEKTOR oOptions.Value("Sheet_Range") = Inventor.PrintRangeEnum.kPrintSheetRange 'Tiskni pouze rozsah listů zvolený dale oOptions.Value("Custom_Begin_Sheet") = iSheetNumber 'OD ktereho listu oOptions.Value("Custom_End_Sheet") = iSheetNumber 'DO ktereho listu End If 'Existuje finalni slozka v ulozisti? Pokud ne tak vytvori If Not System.IO.Directory.Exists(FIN_ULOZISTE) Then System.IO.Directory.CreateDirectory(FIN_ULOZISTE) End If On Error Goto CHYBA: 'Ochrana před errorem pokud je PDF zamčeno nebo otevřeno a nejde přepsat oDataMedium.FileName = FIN_ULOZISTE & NAZEV_SOUBORU & "_" & sSheetName & "_" & iSheetNumber & ".pdf" 'Opet nastavujeme vysledny nazev PDF souboru i s cestou 'Ulozeni finalniho PDF PDFAddIn.SaveCopyAs(AKTIVNI_DOKUMENT, oContext, oOptions, oDataMedium) Next MessageBox.Show("PDF soubor uložen jako: " & vbLf & oDataMedium.FileName, "Uložení PDF",MessageBoxButtons.OK, MessageBoxIcon.Information) ' Potvrzovací okno, ze ulozeni probehlo v poradku. End If Exit Sub 'Tato cast se spusti jen pokud ji zavolame pres Goto - erorova hlaska ktera nam rekne ze se neco nemohlo ulozit spravne CHYBA: MessageBox.Show("Nepodařilo se uložit PDF. Soubor již praděpodobně existuje a nejde přepsat." & vbLf & vbLf & "Soubor:" & vbLf & oDataMedium.FileName, "CHYBA",MessageBoxButtons.OK,MessageBoxIcon.Stop) End Sub 'end 'Matej Skarka 'matej.skarka@adeon.cz
A nyní teda postupně. První část je následující:
'start Sub Main() '------- NASTAVTE ------- NAZEV_SLOZKY = "PDF" 'Do uvozovek napiste jak se ma jmenovat slozka do ktere se bude PDF zapisovat JEDNOTLIVE = "NE" 'Pokud chcete Ukladat jednotlive PDF jako zvlastni soubory tak prepiste NE na ANO CERNE = "ANO" 'Maji byt vsechny barvy cerne? ODSTRANIT_TLOUSTKY = "NE" 'Maji se odstranit vsechny tloustky car? Dim VEKTOR As Integer = "400" 'Nastaveni Vectoroveho rozliseni '--- KONEC NASTAVOVANI ---
V této části začínáme nové pravidlo poměrně netradičně. A to pomocí Sub Main(), což jsme si vlastně “vypůjčili” z Visual Basicu. Jedná se o hlavní proceduru pravidla. My jsme si tím vypomohli pouze z jednoho jediného důvodu. Umožní nám to totiž velmi lehce vytvořit MessageBox,který máme úplně na konci a který se spustí Pouze tehdy, pokud na něj přímo odkážeme. Ukážeme si až dále.
Po té začíná podle mého nejlehčí ale nejdůležitější část. Mezi poznámkami “NASTAVTE” jsou všechny proměnné které musíte jako uživatel nastavit a podle těchto proměnných pak bude celá aplikace fungovat. Někdy v dalším článku si pravidlo ještě vylepšíme aby jsme měli vše volitelné přes dialogové okna, v tento moment jsem ale zvolil tento postup, jelikož pak jednoduše pomocí ctrl+c zkopírujete celé funkční pravidlo bez nutnosti cokoliv dělat. Všimněte si, že jedna proměnná je trochu jiná – a to VEKTOR. Ten jsem pomocí příkazu Dim nadefinoval jako Integer. Z prostého důvodu. Pokud bych to neudělal tak by zápis 400 nebyl brán jako číslo (v tomto případě číslo pouze celé).
Dále máme neměnné nastavení proměnných, do kterých už uživatelský nesaháme a aplikace samotná si je nastaví. Do NAZEV_SOUBORU ukládáme název aktivního dokumentu bez přípomny a to úmyslně. Protože si k němu pak chceme přidat příponu PDF. Mohli bychom sice uložit název i s příponou a potom ji pomocí 2 řádků kódu zase umazat, ale takové kódy co jsem viděl se pak mohli občas chovat hůře předvídatelně.
Řádek PDFAddin nám do proměnné nastaví Addin Inentoru uložení PDF. Pokud bychom chtěli třeba podobně udělat STEP, DWF a další tak se jenom změní kódový řetězec v závorce. Podle toho na jaký Addin se budeme odkazovat.
PDFAddIn = ThisApplication.ApplicationAddIns.ItemById("{0AC6FD96-2F4D-42CE-8BE0-8AEA580399E4}")
Od řádku If CERNE měníme uživatelskou volbu do možností, kterým už bude iLogic rozumět. A jelikož Českému ANO/NE rozhodně rozumět nebude, tak převádíme Ano na jedničku a Ne na nulu. A tyto čísla pak budeme dále zapisovat.
No a jdeme na samotnou akci. V podstatě má teď kód už jen 2 části. Jedna se provede pokud chceme tisknout všechny listy do jednoho dokumentu a druhá se provede v opačném případě – když se mají tisknout listy jednotlivě.
Takže nejdřív ta první možnost: If JEDNOTLIVE=„NE“ Then
V takovém případě bude iLogic nastavovat možnosti tisku do PDF. Tudíž to co jsme na začátk kódu zvolili uživatelsky tak zde vepíše pěkně řádek po řádku. Mají být vsechny barvy čar pouze černé? Má tisk odstranit všechny tloušťky čar? Jaké má být Vektorové rozlišení? No a poslední řádek Sheet_Range jen řekne že se mají tisknout všechny listy.
'PRVNI CAST - VSECHNY LISTY DO JEDNOHO PDF If PDFAddIn.HasSaveCopyAsOptions(oDataMedium, oContext, oOptions) Then oOptions.Value("All_Color_AS_Black") = BLACK 'Odstrani vsechny cerne pokud jsme tak zvolili oOptions.Value("Remove_Line_Weights") = LINEWEIGHTS 'Odstrani vsechny tloustky oOptions.Value("Vector_Resolution") = VEKTOR 'Nastaveni vektoru oOptions.Value("Sheet_Range") = Inventor.PrintRangeEnum.kPrintAllSheets 'Rozsah výkresu. Nastaveno AllSheets = Všechny listy End If
Máme nastaveno a tudíž jdeme dál. Nejdříve si zkontrolujeme, zda již existuje cílové umístění (složka) kam budeme PDF ukládat a pokud neexistuje, tak jej vytvoří:
'Existuje finalni slozka v ulozisti? Pokud ne tak vytvori If Not System.IO.Directory.Exists(FIN_ULOZISTE) Then System.IO.Directory.CreateDirectory(FIN_ULOZISTE) End If
A nyní trochu netradičně vložíme varování před chybou. Sice trochu zvláštně předem, jelikož jsme ještě ani neřekli, že budeme na PDF šahat, ale je to tak. A tedy následující řádek:
On Error Goto CHYBA: 'Resume Next Ochrana před errorem pokud je PDF zamčeno nebo otevřeno a nejde přepsat
Tento řádek nám jednoduše říká: Pokud narazíš na nějakou chybu, tak skoč až na řádek označený jako “CHYBA:”. A tam si zvolíme co se bude dít. Má se příkaz zkusit znovu? Na t pozor, ať pravidlo nezacyklíte. My tento řádek s chybou máme až dole na konci samotného pravidla.
Exit Sub 'Tato cast se spusti jen pokud ji zavolame pres Goto - erorova hlaska ktera nam rekne ze se neco nemohlo ulozit spravne CHYBA: MessageBox.Show("Nepodařilo se uložit PDF. Soubor již praděpodobně existuje a nejde přepsat." & vbLf & vbLf & "Soubor:" & vbLf & oDataMedium.FileName, "CHYBA",MessageBoxButtons.OK,MessageBoxIcon.Stop) End Sub
Všimněte si, že je tento řádek mezi Exit a End Sub. Jedná se o pokračování VB příkazu Sub Main (hned na začátku). Jednoduše řečeno se tyto řádky neprovedou pokud na ně sami neodkážeme. Tudíž i když jsou na konci programu a teoreticky by na ně dřív nebo později měl program skočit a provést tak to tak sám od sebe neudělá. My zde máme MessageBox, který nám při chybě zobrazí informaci, že dané PDF nešlo uložit. Což si myslím je velmi důležitá informace. Jinak budu v přesvědčení že vše ukládám a svou chybu mohu odhalit příliš pozdě.
Vraťme se ale zpátky. Po Eroru nastavujeme proměnnou oDataMedium.FileName – Do ní zapíšeme celu cestu finálního souboru i s názvem a koncovou příponou (.pdf) – Tudíž komplet stav pod čím budeme ukládat.
No a máme skoro hotovo. Nyní zavoláme příkaz PDFAddIn.SaveCopyAs, kterým provedeme samotné Uložit Jako. Pod cestou a názvem který již máme nastavit a s možnostmi tisku které jsme již také vyplnili. Na závěr si jen vyhodíme MessageBox, že se vše povedlo a pod čím byl nakonec PDF uložen (vhodné pro zjišťování chyb). Já jsem nakonec uvedl ještě jeden zakomentovaný řádek, který se neprovede dokud ho neodkomentujeme. Tento řádek jsme se již naučili v předešlém článku. Jednoduše jen otevře aktuální umístění souboru. Já mám toto celé ukládací pravidlo nastavené do iSpouštěčů, a proto nechci automatické otvírání. Při každém uložení souboru by se mi totiž otevírala složka což by bylo otravné. Hotovo…
Tedy né zcela. To byla ta první část. Co když jsme ale zvolili aby se vytvořilo jednotlivě PDF pro každý list výkresu? V takovém případě se spustí část za řádkem Else.
V takovém případě si tedy nadefinujeme proměnné, které budeme dále využívat a podle kterých budeme zjišťovat kolik listů PDF má. Proměnným nejdřív určíme že mají být tzv Long – což je v podstatě to samé jako Integer (celé čísla) akorát 32bit – delší. Proměnná sSheetName bude tzv. String – nebo-li řetězec znaků.
Všimněte si, že používáme For Each a následně Next. Nebo-li jinak řečeno pro každý oSheet (každý list) ve výkrese se následující kód provede znovu (Next) a to do té doby dokud listy nedojdou. Pak se zobrazí už jen MessageBox že bylo PDF uloženo a hotovo. V nastavení tisku je opět vše stejné co jsme si již vysvětlovali níže a to až na jednu malou změnu:
oOptions.Value("Sheet_Range") = Inventor.PrintRangeEnum.kPrintSheetRange 'Tiskni pouze rozsah listů zvolený dale oOptions.Value("Custom_Begin_Sheet") = iSheetNumber 'OD ktereho listu oOptions.Value("Custom_End_Sheet") = iSheetNumber 'DO ktereho listu
V první částí kódu jsme tiskli všechny listy a nyní jenom jednotlivě. První řádek nám říká že budeme zvolit pouze SheetRange (Od….Do). A další dva řády nám právě udávají do Od a následně Do kterého listu. Jinak řečeno při prvním průchodu pravidla bude nastaveno Od:1, Do:1 = v PDF bude jen první list. Pak dosáhne kód na Next a provede se od řádku For Each znovu. Tentokrát bude mít ale nastaveni Od:2, Do:2 = v PDF bude jen druhý list… a tak dále a tak dále 🙂
A to je v podstatě vše. Někdy v dalších článcích si toto pravidlo ještě vylepšíme, aby umělo ukládat i přesný rozsah listů který mu i zadáme, nebo abychom mohli určit výsledný název souboru, jelikož některé firmy ukládají výsledný název i s určením PartNumber no a samozřejmě pravidlo ještě můžeme uživatelský zlepšit a nastavit vše přes dialogové okna (formuláře). A jak už samozřejmě víte tak celé pravidlo si můžete nastavit přes iSpouštěč do automatického ukládání.
Pokud máte ke kódu jakékoliv otázky, tak můžete zde dole v komentářích. Těším se na Vaše dotazy.
Náš výsledek si můžete prohlédnout zde:
Dobry den,
Chcem sa Vam podakovat za clanky na temu iLogic, je to vyborna pomocka na zrychlenie a ulahcenie prace v invetore.
Vsimol som si jednu vec v kode pre automaticku tvorbu pdf. V casti NASTAVTE je premenna JEDNOTLIVE nastavena ako „NE“. Invetor vytlaci vsetky listy do jedneho pdf suboru. Ak zmenim hodnotu na „ANO“ tak samozrejme vytlaci kazdy list samostatne. Ak ale znova zmenim na „NE“, inventor vytlaci iba posledny list, napriek to mu ze mam viac listov vo vykrese. Predpokladam ze si pamata neaku hodnotu ktoru pouzil pri tlaci jednotlivych listov.
Samozrejme mi je jasne ze v realite takato situacia malokedy nastane, ale rad by som pochopil funkciu kodu, a ci je mozne nastavit resetovanie hodnot na zaciatku.
Dakujem
S pozdravom
Filip Hlinka
Dobrý den,
mockrát děkuji za vaše kladná slova o našich článcích. Jsem rád, že Vám přijdou užitečné. Na kód se mrknu, máte pravdu, že to opravdu trošku hloupne, čehož jsem si nevšiml. Podívám se na to a hodím tady potom aktualizaci.
Děkuji a přeji Vám pěkný den.
Matěj Škarka
Dobrý den,
Mám trochu problém s exportem do 3D Pdf…
Vytvořím model, třeba krychli a na jednu stěnu přes funkci „nový náčrt – vložení – obrázek“ vložím jpg nebo png obraz, potom přes funkci obtisk ho obalím k ploše, popř zadám řetězení ploch. Při exportu do dwf se vše vyexportuje správně vč. namapovaného obrázku, při exportu do 3D pdf se vyexportují pouze povrchy z knihovny inventoru, ale vložené obázky ne. Zkoušel jsem to řešit přes SimLab, ale ani tam jsem s exportem modelu s obrázky do 3d PDF neuspěl. Nemohl by mi někdo poradit? Děkuji
Dobrý den,
těžko takto říct. Sám jsem modely s obtisky nezkoušel exportovat. V jak verzi INV zkoušíte? Popř mi na e-mail pošlete model s ilogic kódem který zkoušíte a můžu tady u sebe otestovat a uvidíme na co příjdeme. (matej.skarka@adeon.cz)
Děkuji a přeji Vám pěkný den.
Matěj Škarka
Dobry den, mel bych dotaz odledne
PDFAddIn = ThisApplication.ApplicationAddIns.ItemById(„{90AF7F40-0C01-11D5-8E83-0010B541CD80}“)
kde presne najdu ten to AddIn aby mohl prekopirovat „adresu“
Kdyz se kouknam do doplnku tak tam je pouze 3D PDF.
Predem Dekuji
Doležal
INVENTOR 2018
Dobrý den,
jakou cestu chcete překopírovat? Všechny Translátory a addiny najdete přes Tools > Add-Ins … a například záložka Translators.