Macro per salvare in pdf senza aprire dft

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?

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

Barone_Birra

Utente standard
Professione: Ingegnere
Software: solidedge
Regione: lombardia
mi riallaccio a questa discussione,
Non ho problemi a salvare in PDF il file dft con VBA ma in alcuni casi questo .dft è composto da 2 o più fogli (mai più di 3 in teoria) e vorrei che mi salvasse un unico PDF con più pagine dove sulla prima ho il pdf del foglio 1 sulla seconda del foglio 2 e cosi via. è possibile?
grazie mille
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
mi riallaccio a questa discussione,
Non ho problemi a salvare in PDF il file dft con VBA ma in alcuni casi questo .dft è composto da 2 o più fogli (mai più di 3 in teoria) e vorrei che mi salvasse un unico PDF con più pagine dove sulla prima ho il pdf del foglio 1 sulla seconda del foglio 2 e cosi via. è possibile?
grazie mille
Devi aprire le impostazioni di salvataggio PDF ed abilitare il salvataggio di tutti i fogli

1661149705737.png
 

pollocad

Utente Junior
Professione: disegnatore meccanico
Software: Solid edge
Regione: Emilia Romagna
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
Riprendo questa discussione per chiedere due informazioni. Creo PDF e DXF con un processo automatico, c'è modo di fare l'aggiornamento viste disegno automatico prima della creazione del PDF o DXF? inoltre una volta aperto il DFT e creati i due file, alla chiusura del file mi viene chiesto di salavare le modifiche apportate, posso bypassare questo problema?

Grazie
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
Per aggiornare le viste devi chiamare il metodo "Update" di ogni vista, di ogni foglio.
Update DV

Quando chiudi il file puoi aggiungere True o False per salvare o meno le modifiche senza che ti venga chiesto
Close document

In generale però è bene disattivare i messaggi quando si fanno operazioni massive su file utilizzando la proprietà "DisplayAlerts" di SolidEdge.Application
Display Alerts
 

pollocad

Utente Junior
Professione: disegnatore meccanico
Software: Solid edge
Regione: Emilia Romagna
ma a livello di impostazioni di solid edge non esiste niente che faccia quanto richiesto senza passare dalla programmazione?
 

pollocad

Utente Junior
Professione: disegnatore meccanico
Software: Solid edge
Regione: Emilia Romagna
Abbiamo sviluppato internamente una macro per l'aggiornamento del dft. In pratica generiamo un file PDF in automatico su una macchina server, quindi all'input viene aperto solidedge, viene aperta la tavola e tramite un programmino eseguibile .exe sviluppato da noi, andremmo ad aggiornare la tavola (qualora fosse da aggiornare), poi verrebbe creato il PDF.
Quello che non riusciamo a trovare è il modo di far partire la macro autonomamente all'apertura del DFT. Sapete come fare?
Grazie
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
Non è chiaro chi si occupa di aprire il DFT e generare il PDF, sarebbe bene che fosse la stessa "entità" che prima di generare il pdf si preoccupasse di lanciare la macro che aggiorna se necessario.

Ancora meglio un unico processo che si occupa di tutto
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
Ti suggerisco questa applicazione (in cui ho collaborato nello sviluppo), dovrebbe fare tutto quello che ti serve, e per quello che manca può comunque lanciare degli eseguibili esterni durante il processo.

 

pollocad

Utente Junior
Professione: disegnatore meccanico
Software: Solid edge
Regione: Emilia Romagna
Non è chiaro chi si occupa di aprire il DFT e generare il PDF, sarebbe bene che fosse la stessa "entità" che prima di generare il pdf si preoccupasse di lanciare la macro che aggiorna se necessario.

Ancora meglio un unico processo che si occupa di tutto
L'apertura del dft e la creazione del PDF lo fa il PDM, quello che non riescono a capire gli sviluppatori è come fare l'aggiornamento della tavola nel caso ne fosse necessario e per questo un collega ha sviluppato il programmino, ma non sappiamo come far si che all'apertura del DFT (che avviene appunto tramite PDM), parta automaticamente la macro per l'aggiornamento della tavola
 

Statistiche forum

Discussioni
56,410
Messaggi
481,082
Utenti registrati
97,912
Ultimo utente registrato
drago78

Utenti online

Nessun utente è online al momento.

Top