Macro per salvare in pdf senza aprire dft

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#1
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?

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
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#2
Non puoi convertire un DFT in PDF senza aprirlo, puoi però velocizzare le cose disabilitando l'aggiornamento dello schermo con:

Codice:
objApp.ScreenUpdating = False
ricordati quando hai finito di riattivare l'aggiornamento schermo con:

Codice:
objApp.ScreenUpdating = True
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#3
Dimenticavo, sempre per velocizzare le cose potresti aprire i DFT in stato "Inattivo" inserendo questa riga prima dell'apertura:

Codice:
Call objApp.SetGlobalParameter(seApplicationGlobalSessionDraftOpenInactive, True)
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#4
Non puoi convertire un DFT in PDF senza aprirlo, puoi però velocizzare le cose disabilitando l'aggiornamento dello schermo con:

Codice:
objApp.ScreenUpdating = False
ricordati quando hai finito di riattivare l'aggiornamento schermo con:

Codice:
objApp.ScreenUpdating = True

Grazie per il consiglio!
Però anche se inserisco il comando di disabilitare l'aggiornamento schermo, non cambia niente, e io continuo a vedere i file che si aprono e sui chiudono.
Che problema può essere?
Ho disabilitato a inizio Main () e lo ho riabilitato alla fine
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#5
Grazie per il consiglio!
Però anche se inserisco il comando di disabilitare l'aggiornamento schermo, non cambia niente, e io continuo a vedere i file che si aprono e sui chiudono.
Che problema può essere?
Ho disabilitato a inizio Main () e lo ho riabilitato alla fine
Vedi fisicamente il draft con tutte le viste ? O solo la scheda comparire ?
Screen updating agisce solo sull'area grafica bloccandola, il file in ogni caso viene aperto.
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#6
Vedi fisicamente il draft con tutte le viste ? O solo la scheda comparire ?
Screen updating agisce solo sull'area grafica bloccandola, il file in ogni caso viene aperto.
Vedo fisicamente tutti i draft con le relative viste, che appaiono e poi scompaiono.
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#7
E' un pezzo che non uso VB, forse devi metterci un "Set" davanti:

Set objApp.ScreenUpdating = False
In ogni caso ti consiglio di aprire i DFT inattivi come da post successivo, andrai a caricare molti meno dati.
 

delki

Utente Standard
Professione: Tecnical Support e Formazione su Solid Edge e SolidRules
Software: Solid Edge, Visual Basic .NET, SolidRules: InCentro, Desk, Configurator Manufactoring, Studio
Regione: Veneto
#8
Ti suggerisco pure di eseguire una verifica se le viste nella tavola sono aggiornate o da aggiornare, perché in tal caso stamperesti la tavola di un disegno potenzialmente sbagliato