alxG88
Utente Junior
- Professione: Ingegnere Meccanico
- Software: SolidWorks, Solid Edge, Inventor, Autocad
- Regione: Emilia Romagna
Buongiorno a tutti,
Ho da poco scritto una macro in VB, che lavora solo in ambiente .asm, e funziona più o meno così:
1. Fa una scansione di tutte le parti (o sottoassiemi) che compongono l'assieme di base
2. Apre i dft di tutte le singole parti (o sottoassiemi)
3. Salva in pdf tutti i dft e li deposita in un percorso prestabilito
4. Chiude tutti i dft aperti
PS La macro si spinge solo al primo livello di eventuali sottoassiemi
La macro fa esattamente ciò che desidero, ma risulta essere un po' lenta con gli assiemi composti da un gran numero di parti (la macro impiega mediamente 2.8 s a elaborare ogni file) proprio perchè è costretta ad aprire tutti i dft per poter creare il rispettivo pdf.
La mia domanda è dunque la seguente: si può fare in modo di salvare in pdf senza obbligatoriamente aprire il dft, ma direttamente conoscendo il par/asm/psm desiderato?
Grazie a tutti in anticipo,
Alex
Ho da poco scritto una macro in VB, che lavora solo in ambiente .asm, e funziona più o meno così:
1. Fa una scansione di tutte le parti (o sottoassiemi) che compongono l'assieme di base
2. Apre i dft di tutte le singole parti (o sottoassiemi)
3. Salva in pdf tutti i dft e li deposita in un percorso prestabilito
4. Chiude tutti i dft aperti
PS La macro si spinge solo al primo livello di eventuali sottoassiemi
La macro fa esattamente ciò che desidero, ma risulta essere un po' lenta con gli assiemi composti da un gran numero di parti (la macro impiega mediamente 2.8 s a elaborare ogni file) proprio perchè è costretta ad aprire tutti i dft per poter creare il rispettivo pdf.
La mia domanda è dunque la seguente: si può fare in modo di salvare in pdf senza obbligatoriamente aprire il dft, ma direttamente conoscendo il par/asm/psm desiderato?
Codice:
Imports System.Runtime.InteropServices
Imports System
Imports System.Drawing
Module Module1
Dim objApp As SolidEdgeFramework.Application
Dim objDft As SolidEdgeDraft.DraftDocument
Dim objSht As SolidEdgePart.SheetMetalDocument
Dim objPrt As SolidEdgePart.PartDocument
Dim objPwd As SolidEdgePart.AssemblyWeldment
Dim objAsm As SolidEdgeAssembly.AssemblyDocument
Dim oOccs As SolidEdgeAssembly.Occurrences
Dim PrtName As String
Dim AsmName As String
Dim DftName As String
Dim PdfName As String
Dim pathname As String
Dim filename As String
Public Sub Main()
On Error Resume Next
'...se Solid Edge non è aperto
objApp = GetObject(, "SolidEdge.Application")
If objApp Is Nothing Then
MsgBox("Solid Edge non è aperto! Aprire Solid Edge.", vbCritical, "Attenzione")
Exit Sub
End If
'...se il file aperto non è un assieme (.asm)
If objApp.ActiveDocumentType <> SolidEdgeFramework.DocumentTypeConstants.igAssemblyDocument Then
MsgBox("Il documento aperto non è un ASSIEME (.asm)! Aprire un ASSIEME (.asm).", vbInformation, "Attenzione")
Exit Sub
End If
'...se non c'è nessun documento di Solid Edge aperto
objAsm = objApp.ActiveDocument
If objAsm Is Nothing Then
MsgBox("Nessun documento aperto!", vbInformation, "Attenzione")
Exit Sub
End If
'Apri il .dft dell'assieme d'origine
objApp.DisplayAlerts = False
AsmName = objAsm.FullName
DftName = Left(AsmName, Len(AsmName) - 3) + "dft"
objDft = objApp.Documents.Open(DftName)
PdfName = Left(objDft.Name, Len(objDft.Name) - 4) 'Ricava il nome del rispettivo pdf
pathname = "S:\utenti\Alex\Macro_PDF\" 'Percorso in cui salvare il file pdf
Call objDft.SaveAs(pathname + PdfName + "." + "pdf") ' Salva il pdf nella cartella desiderata
objDft.Save() 'salva .dft
objDft.Close() 'chiudi .dft
'Inizia a scansionare le occorrenze dell'albero delle parti
oOccs = objAsm.Occurrences
For i As Integer = 1 To oOccs.Count
'...se l'occorrenza è un file .par/.psm/.pwd
If oOccs.Item(i).PartDocument = True Then
objPrt = oOccs.Item(i).PartDocument '.par
objSht = oOccs.Item(i).PartDocument '.psm
objPwd = oOccs.Item(i).PartDocument '.pwd
PrtName = oOccs.Item(i).PartFileName 'Ricava il nome del file .par
DftName = Left(PrtName, Len(PrtName) - 3) + "dft"
objDft = objApp.Documents.Open(DftName)
PdfName = Left(objDft.Name, Len(objDft.Name) - 4) 'Ricava il nome del rispettivo pdf
pathname = "S:\utenti\Alex\Macro_PDF\" 'Percorso in cui salvare il file pdf
Call objDft.SaveAs(pathname + PdfName + "." + "pdf") ' Salva il pdf nella cartella desiderata
objDft.Save() 'salva .dft
objDft.Close() 'chiudi .dft
objPrt.Close() 'chiudi .par
objSht.Close() 'chiudi .psm
objPwd.Close() 'chiudi .pwd
End If
'...se l'occorrenza è un file .asm (sottoassieme dell'assieme d'origine)
If oOccs.Item(i).Subassembly = True Then
AsmName = oOccs.Item(i).OccurrenceFileName
DftName = Left(AsmName, Len(AsmName) - 3) + "dft"
objDft = objApp.Documents.Open(DftName)
For Each soOcc In oOccs.Item(i).SubOccurrences
objPrt = soOcc.SubOccurrenceDocument
objSht = soOcc.SubOccurrenceDocument
objPwd = soOcc.SubOccurrenceDocument
PrtName = soOcc.SubOccurrenceFileName
DftName = Left(PrtName, Len(PrtName) - 3) + "dft"
objDft = objApp.Documents.Open(DftName)
PdfName = Left(objDft.Name, Len(objDft.Name) - 4) 'Ricava il nome del rispettivo pdf
pathname = "S:\utenti\Alex\Macro_PDF\" 'Percorso in cui salvare il file pdf
Call objDft.SaveAs(pathname + PdfName + "." + "pdf") ' Salva il pdf nella cartella desiderata
objDft.Close() 'chiudi .dft
objPrt.Close() 'chiudi .par
objSht.Close() 'chiudi .psm
objPwd.Close() 'chiudi .pwd
Next
End If
Next i
objApp.DisplayAlerts = True
End Sub
End Module
Grazie a tutti in anticipo,
Alex