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("{0AC6FD96-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

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

  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