Inventor iLogic – Automatická tvorba PDF (pro pokročilé)

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).

image00

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:

InventorPDF

Ušetřete 25% na produktech Autodesk
Technický CAD konzultant ve společnosti Adeon CZ. Zde na blogu píši články zaměřené především na cloudový CAD program Fusion 360 a také doplněk pro automatizaci iLogic v programu Autodesk Inventor. Potkat mě můžete v ostravské kanceláři Adeonu.

6 Komentářů

  1. 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

  2. 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

  3. 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

  4. 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.

Comments are closed.