Macro VB per esportare in pdf contemporaneamente più disegni

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
Buongiorno a tutti,

Per facilitarmi nel mio lavoro sto scrivendo una serie di macro per Solid Edge che mi semplifichino le operazioni che svoglo più di frequente.
Il problema che voglio sottoporvi è il seguente: io sto cercando di scrivere una macro che individui tutti i DFT aperti e, per ognuno di essi, ne salvi una copia in formato PDF e una in formato DXF all'interno di una directory specifica.
Precedentemente avevo scritto una macro che eseguiva la stessa operazione con un DFT alla volta, ma adesso non riesco a estendere questo concetto anche a tutti i DFT aperti.
Vi posto il codice che ho scritto:

Codice:
Module Module1

    Dim objApp As SolidEdgeFramework.Application
    Dim objDft As SolidEdgeDraft.DraftDocument
    Dim filename As String
    Dim pathname_1 As String
    Dim pathname_2 As String

    Sub Main()
        On Error Resume Next

        objApp = GetObject(, "SolidEdge.Application") ' Crea un'applicazione con determinate caratteristiche

        If objApp Is Nothing Then
            MsgBox("Solid Edge non è aperto! Aprire Solid Edge.", vbCritical, "Attenzione")
            Exit Sub
        End If

        If objApp.ActiveDocumentType <> SolidEdgeFramework.DocumentTypeConstants.igDraftDocument Then
            MsgBox("Nessun documento DRAFT aperto! Aprire un DRAFT.", vbInformation, "Attenzione")
            Exit Sub
        End If

        objDft = objApp.ActiveDocument
        If objDft Is Nothing Then
            MsgBox("Nessun documento aperto!", vbInformation, "Attenzione")
            Exit Sub
        End If

        Do     'Esegue il ciclo fintanto che ci sono DRAFT aperti
            Call objDft.Save() ' Messo prima del nome, per i file nuovi viene correttamente chiesto di dare il nome

            filename = Left(objDft.Name, Len(objDft.Name) - 4)  ' Ricava solo il nome file
            pathname_1 = "S:\ug\dxf\"   ' percorso file dxf
            pathname_2 = "S:\ug\dati\"  ' percorso file pdf

            objApp.DisplayAlerts = False    'Sovrascrive in automatico i file con lo stesso nome senza chiedere

            Call objDft.SaveAs(pathname_1 + filename + "." + "dxf") ' salva con nome
            Call objDft.SaveAs(pathname_2 + filename + "." + "pdf") ' salva con nome

            objApp.DisplayAlerts = True     'Riattiva i messaggi di allerta di Windows 

            Call objDft.Close()  'Chiude il file DRAFT di cui ha appena creato pdf e dxf

            objDft = Nothing
            objApp = Nothing
        Loop Until objApp.ActiveDocumentType <> SolidEdgeFramework.DocumentTypeConstants.igDraftDocument
    End Sub
End Module

Come potete notare ho cercato di creare un ciclo Do...Loop Until in modo tale che lui vada a cercare di volta in volta i DFT aperti, ma non funziona: il risultato è che mi salva soltanto il primo DFT attivo e poi si interrompe, costringendomi a fare partire la macro nuovamente per ciascun file.

Mi sapreste aiutare? Dove sto sbagliando?

Grazie a tutti in anticipo

Alex
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
Non funziona perché hai messo "objApp = Nothing" dentro al ciclo Loop.
Di conseguenza al secondo giro non hai più un objApp valido su cui proseguire.
Devi poi anche istanziare objDft all'interno del Loop altrimenti anche questo ti darà errore.

Se poi tra i tuoi documenti aperti hai un qualche modello 3D il tuo loop terminerà prematuramente.

Ciao
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
Grazie per la risposta.
Ho provato a cambiare il codice seguendo le tue indicazioni: funziona meglio ma a volte non esegue l'operazione su tutti i DFT, ma me ne lascia uno aperto. Cosa potrebbe essere?

Nel frattempo ti chiedo: se volessi aggiungere la macro al menu rapido di solid edge, in quale ambiente dovrei inserirla? Ho provato a inserirla nell'ambiente Draft ma non funziona, esegue l'operazione solo sul dft da cui è stata fatta partire.

Codice:
Module Module1

    Dim objApp As SolidEdgeFramework.Application
    Dim objDft As SolidEdgeDraft.DraftDocument
    Dim filename As String
    Dim pathname_1 As String
    Dim pathname_2 As String

    Sub Main()
        On Error Resume Next

        objApp = GetObject(, "SolidEdge.Application") ' Crea un'applicazione con determinate caratteristiche

        If objApp Is Nothing Then
            MsgBox("Solid Edge non è aperto! Aprire Solid Edge.", vbCritical, "Attenzione")
            Exit Sub
        End If

        If objApp.ActiveDocumentType <> SolidEdgeFramework.DocumentTypeConstants.igDraftDocument Then
            MsgBox("Nessun documento DRAFT aperto! Aprire un DRAFT.", vbInformation, "Attenzione")
            Exit Sub
        End If

        Do     'Esegue il ciclo fintanto che ci sono DRAFT aperti
            objDft = objApp.ActiveDocument
            Call objDft.Save() ' Messo prima del nome, per i file nuovi viene correttamente chiesto di dare il nome

            filename = Left(objDft.Name, Len(objDft.Name) - 4)  ' Ricava solo il nome file
            pathname_1 = "S:\ug\dxf\"   ' percorso file dxf
            pathname_2 = "S:\ug\dati\"  ' percorso file pdf

            objApp.DisplayAlerts = False    'Sovrascrive in automatico i file con lo stesso nome senza chiedere

            Call objDft.SaveAs(pathname_1 + filename + "." + "dxf") ' salva con nome
            Call objDft.SaveAs(pathname_2 + filename + "." + "pdf") ' salva con nome

            objApp.DisplayAlerts = True     'Riattiva i messaggi di allerta di Windows 

            Call objDft.Close()  'Chiude il file DRAFT di cui ha appena creato pdf e dxf
        Loop Until objApp.ActiveDocumentType <> SolidEdgeFramework.DocumentTypeConstants.igDraftDocument

        If objDft Is Nothing Then
            MsgBox("Nessun documento aperto!", vbInformation, "Attenzione")
            Exit Sub
        End If

        objDft = Nothing
        objApp = Nothing
    End Sub
End Module

Grazie

Alex
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
Da come hai strutturato il codice il tuo Loop termina al primo documento non Draft che incontri.
Chiudendo i documenti non hai controllo su quello successivo che diventa attivo motivo per il quale potrebbe terminare prima del dovuto.

Io al posto del "Do - Loop" farei un ciclo "For Each" su objApp.Documents

Ciao
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
Quindi una cosa del tipo:
Codice:
objDft = objApp.Documents
For Each objDft In objApp.Documents
...
...
Next

In questo modo però io intercetto tutti i documenti, anche quelli che non sono DFT. Dovrei quindi dargli un'istruzione per ignorare (o chiudere) tutti file non DFT e occuparsi solo dei DFT.
Intendi questo?

Grazie

Alex
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
Codice:
For Each Document In objApp.Documents

     If Document.Type = igDraftDocument then
          
          Set objDft = Document
          ...

     End If

Next Document
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
Perfetto, grazie mille!
Adesso il programma sembra funzionare ed è stato scritto così:

Codice:
Module Module1

    Dim objApp As SolidEdgeFramework.Application
    Dim objDft As SolidEdgeDraft.DraftDocument
    Dim filename As String
    Dim pathname_1 As String
    Dim pathname_2 As String

    Sub Main()
        On Error Resume Next

        objApp = GetObject(, "SolidEdge.Application") ' Crea un'applicazione con determinate caratteristiche

        If objApp Is Nothing Then
            MsgBox("Solid Edge non è aperto! Aprire Solid Edge.", vbCritical, "Attenzione")
            Exit Sub

        ElseIf objApp.ActiveDocument Is Nothing Then
            MsgBox("Nessun documento aperto!", vbInformation, "Attenzione")
            Exit Sub

        ElseIf objApp.Document.Type <> SolidEdgeFramework.DocumentTypeConstants.igDraftDocument Then
            MsgBox("Nessun documento DRAFT aperto! Aprire un DRAFT.", vbInformation, "Attenzione")
            Exit Sub
        End If

        For Each Document In objApp.Documents     'Esegue il ciclo fintanto che ci sono DRAFT aperti

            If Document.Type = SolidEdgeFramework.DocumentTypeConstants.igDraftDocument Then
                objDft = Document
                Call objDft.Save() ' Messo prima del nome, per i file nuovi viene correttamente chiesto di dare il nome

                filename = Left(objDft.Name, Len(objDft.Name) - 4)  ' Ricava solo il nome file
                pathname_1 = "S:\ug\dxf\"   ' percorso file dxf
                pathname_2 = "S:\ug\dati\"  ' percorso file pdf

                objApp.DisplayAlerts = False    'Sovrascrive in automatico i file con lo stesso nome senza chiedere

                Call objDft.SaveAs(pathname_1 + filename + "." + "dxf") ' salva con nome
                Call objDft.SaveAs(pathname_2 + filename + "." + "pdf") ' salva con nome

                objApp.DisplayAlerts = True     'Riattiva i messaggi di allerta di Windows 
                Call objDft.Close()  'Chiude il file DRAFT di cui ha appena creato pdf e dxf
            End If

        Next Document

        objDft = Nothing
        objApp = Nothing
    End Sub
End Module

Avresti altri consigli da darmi per rendere il programma più preciso o ti sembra fatto bene? Non ho ancora molta esperienza con la programmazione in Visual Basic emi farebbe piacere che chi ha più esperienza di me mi dia consigli per una buona stesura di un programma.

Grazie ancora

Alex
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
Perfetto, grazie mille!
Adesso il programma sembra funzionare ed è stato scritto così:

Codice:
Module Module1

    Dim objApp As SolidEdgeFramework.Application
    Dim objDft As SolidEdgeDraft.DraftDocument
    Dim filename As String
    Dim pathname_1 As String
    Dim pathname_2 As String

    Sub Main()
        On Error Resume Next

        objApp = GetObject(, "SolidEdge.Application") ' Crea un'applicazione con determinate caratteristiche

        If objApp Is Nothing Then
            MsgBox("Solid Edge non è aperto! Aprire Solid Edge.", vbCritical, "Attenzione")
            Exit Sub

        ElseIf objApp.ActiveDocument Is Nothing Then
            MsgBox("Nessun documento aperto!", vbInformation, "Attenzione")
            Exit Sub

        ElseIf objApp.Document.Type <> SolidEdgeFramework.DocumentTypeConstants.igDraftDocument Then
            MsgBox("Nessun documento DRAFT aperto! Aprire un DRAFT.", vbInformation, "Attenzione")
            Exit Sub
        End If

        For Each Document In objApp.Documents     'Esegue il ciclo fintanto che ci sono DRAFT aperti

            If Document.Type = SolidEdgeFramework.DocumentTypeConstants.igDraftDocument Then
                objDft = Document
                Call objDft.Save() ' Messo prima del nome, per i file nuovi viene correttamente chiesto di dare il nome

                filename = Left(objDft.Name, Len(objDft.Name) - 4)  ' Ricava solo il nome file
                pathname_1 = "S:\ug\dxf\"   ' percorso file dxf
                pathname_2 = "S:\ug\dati\"  ' percorso file pdf

                objApp.DisplayAlerts = False    'Sovrascrive in automatico i file con lo stesso nome senza chiedere

                Call objDft.SaveAs(pathname_1 + filename + "." + "dxf") ' salva con nome
                Call objDft.SaveAs(pathname_2 + filename + "." + "pdf") ' salva con nome

                objApp.DisplayAlerts = True     'Riattiva i messaggi di allerta di Windows 
                Call objDft.Close()  'Chiude il file DRAFT di cui ha appena creato pdf e dxf
            End If

        Next Document

        objDft = Nothing
        objApp = Nothing
    End Sub
End Module

Avresti altri consigli da darmi per rendere il programma più preciso o ti sembra fatto bene? Non ho ancora molta esperienza con la programmazione in Visual Basic emi farebbe piacere che chi ha più esperienza di me mi dia consigli per una buona stesura di un programma.

Grazie ancora

Alex

Visto che è una macro che farai partire da Draft tutta la parte iniziale sulla verifica dell'esistenza di Solid Edge e di un documento Draft la puoi evitare.
In oltre dovresti evitare di utilizzare "On Error Resume Next" e gestire i vari tipi di errore che potrebbero emergere.

Non mi piace molto il fatto che vai a chiudere i vari draft una volta salvati ma immagino faccia parte del tuo flusso di lavoro.

Ciao
 

Statistiche forum

Discussioni
57,934
Messaggi
493,596
Utenti registrati
102,354
Ultimo utente registrato
Massimo p

Utenti online


Top