• This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Leggi altro.

Pulsante per esportare tavola in dxf

Filo

Utente Standard
Professione: Perditempo
Software: Inventor2015 ANSYS Fluent Gambit SolidWorks Algor
Regione: Veneto
#1
La mia esigenza era di avere un pulsante da cliccare per generare un file dxf da un file idw. Inoltre non volevo che il dxf fosse salvato nella stessa cartella del file idw ma in un'altra cartella uguale per tutti i file dxf.
Il tutto si potrebbe fare anche con iLogic e sarebbe tutto più semplice, però, ad oggi, non sono ancora riuscito a creare un pulsante esterno al browser di iLogic.

Facendo un po' di copia incolla dalla rete e aggiungendo un po' del mio sono riuscito a fare il tutto. Ho testato il codice su Inventor 2013

Codice:
Public Sub PubblicaDxf()
    
    ' Obtain reference to drawing
    Dim oDoc As Document
    Set oDoc = ThisApplication.ActiveDocument
    
    If oDoc.DocumentType <> kDrawingDocumentObject Then
        MsgBox ("Deve essere aperta una tavola")
        Exit Sub
    End If
    
    
    Dim oDrw As DrawingDocument
    Set oDrw = oDoc
    ' Get the Dxf translator Add-In.
    Dim DxfAddIn As TranslatorAddIn
    Set DxfAddIn = ThisApplication.ApplicationAddIns.ItemById("{C24E3AC4-122E-11D5-8E91-0010B541CD80}")


    Dim oContext As TranslationContext
    Set oContext = ThisApplication.TransientObjects.CreateTranslationContext
    oContext.Type = kFileBrowseIOMechanism
    
  
    ' Create a NameValueMap object
    Dim oOptions As NameValueMap
    Set oOptions = ThisApplication.TransientObjects.CreateNameValueMap

    ' Create a DataMedium object
    Dim oDataMedium As DataMedium
    Set oDataMedium = ThisApplication.TransientObjects.CreateDataMedium

    ' Check whether the translator has 'SaveCopyAs' options
    If DxfAddIn.HasSaveCopyAsOptions(oDrw, oContext, oOptions) Then

        Dim strIniFile As String
        strIniFile = "tuofile.ini"
        ' Create the name-value that specifies the ini file to use.
        oOptions.Value("Export_Acad_IniFile") = strIniFile
    End If

   ' Sets directory for file save
     Dim DXFDirectory As String
     DXFDirectory = "percorso cartella di destinazione"

    'Set the destination file name
    Dim fn As String
    Dim fna As String
    fna = oDrw.DisplayName
    fna = Strings.Left(fna, Len(fna) - 4) & ".dxf"
    fn = DXFDirectory & fna
    oDataMedium.FileName = fn
    
    'Publish document.
    Call DxfAddIn.SaveCopyAs(oDrw, oContext, oOptions, oDataMedium)
End Sub
Per vedere come copiare il codice VB, come aggiungere e personalizzare un bottone leggete questa discussione

Se la vostra esigenza è salvare il file dxf in automatico o salvarlo nella stessa cartella del file idw o che vi chieda ogni volta in che cartella salvarlo dovete lavorare sulle ultime righe di codice e in rete potete trovare tutto

Ciao
Filippo
 

Filo

Utente Standard
Professione: Perditempo
Software: Inventor2015 ANSYS Fluent Gambit SolidWorks Algor
Regione: Veneto
#2
Lo script scritto sopra ha un baco alle linee di codice
Codice:
    'Set the destination file name
    Dim fn As String
    Dim fna As String
    fna = oDrw.DisplayName
    fna = Strings.Left(fna, Len(fna) - 4) & ".dxf"
    fn = DXFDirectory & fna
    oDataMedium.FileName = fn
Perché se nel nome del file ci sono caratteri speciali tipo "_" "-" "#" ecc.. il comando "Strings" prende questo carattere come riferimento e non il punto per "estrarre" il nome del file

Tutto il nuovo codice corretto, sperando che non ci siano altri errori, lo strovate di seguito
Codice:
Public Sub PubblicaDxf()
    
    ' Obtain reference to drawing
    Dim oDoc As Document
    Set oDoc = ThisApplication.ActiveDocument
    
    If oDoc.DocumentType <> kDrawingDocumentObject Then
        MsgBox ("Deve essere aperta una tavola")
        Exit Sub
    End If
    
    
    Dim oDrw As DrawingDocument
    Set oDrw = oDoc
    ' Get the Dxf translator Add-In.
    Dim DxfAddIn As TranslatorAddIn
    Set DxfAddIn = ThisApplication.ApplicationAddIns.ItemById("{C24E3AC4-122E-11D5-8E91-0010B541CD80}")


    Dim oContext As TranslationContext
    Set oContext = ThisApplication.TransientObjects.CreateTranslationContext
    oContext.Type = kFileBrowseIOMechanism
    
  
    ' Create a NameValueMap object
    Dim oOptions As NameValueMap
    Set oOptions = ThisApplication.TransientObjects.CreateNameValueMap

    ' Create a DataMedium object
    Dim oDataMedium As DataMedium
    Set oDataMedium = ThisApplication.TransientObjects.CreateDataMedium

    ' Check whether the translator has 'SaveCopyAs' options
    If DxfAddIn.HasSaveCopyAsOptions(oDrw, oContext, oOptions) Then

        Dim strIniFile As String
        strIniFile = "C:\Users\FMantovani\Documents\dxf.ini"
        ' Create the name-value that specifies the ini file to use.
        oOptions.Value("Export_Acad_IniFile") = strIniFile
    End If

   ' Sets directory for file save
     Dim DXFDirectory As String
     DXFDirectory = "C:\Users\FMantovani\Desktop\"

    'Set the destination file name
    Dim fn As String
    Dim fna As String
    Dim fnb As String
    
    fna = oDrw.DisplayName
    fnb = Left(fna, InStr(fna, ".") - 1)
    fnb = fnb & ".dxf"
    fn = DXFDirectory & fnb
    oDataMedium.FileName = fn
    
    'Publish document.
    Call DxfAddIn.SaveCopyAs(oDrw, oContext, oOptions, oDataMedium)
End Sub
Lo stesso problema si verifica anche con lo script per pubblicare i pdf postato da Catafratto qui

Ciao Filippo
 

Catafratto

Utente Standard
Professione: Disegnatore/progettista
Software: Inventor 2016
Regione: Veneto
#3
Lo script scritto sopra ha un baco alle linee di codice
Codice:
    'Set the destination file name
    Dim fn As String
    Dim fna As String
    fna = oDrw.DisplayName
    fna = Strings.Left(fna, Len(fna) - 4) & ".dxf"
    fn = DXFDirectory & fna
    oDataMedium.FileName = fn
Perché se nel nome del file ci sono caratteri speciali tipo "_" "-" "#" ecc.. il comando "Strings" prende questo carattere come riferimento e non il punto per "estrarre" il nome del file

Tutto il nuovo codice corretto, sperando che non ci siano altri errori, lo strovate di seguito

Lo stesso problema si verifica anche con lo script per pubblicare i pdf postato da Catafratto qui

Ciao Filippo
:confused: A me non succede (appena provato), usi la 2013 o sei alla 2014 (devo ancora iniziare a usarla...)? Forse una differenza nella versione VBA, la mia 6.3 (per esempio Left a me non funziona, solo String.Left) ?
A parte questo, la tua variazione tronca al primo "." che trova partendo da Sinistra verso destra: se il nome file come carattere speciale include il ".", come nei miei tanto per capirci :tongue: il nome in uscita risulterà troncato.
Boh, son curioso di capire il malfunzionamento!
Ciao!
 

Filo

Utente Standard
Professione: Perditempo
Software: Inventor2015 ANSYS Fluent Gambit SolidWorks Algor
Regione: Veneto
#4
Giustamente se nel nome c'è un "." oltre a quello dell'estensione non funziona...

Ho ancora il 2013 e la versione di VB è anche la mia 6.3. Per i nomi dei file tipo "ab__cde.idw" in uscita mi dava "ab_.idw", ovvero prendeva il secondo "_" come riferimento.

Ciao
 

Catafratto

Utente Standard
Professione: Disegnatore/progettista
Software: Inventor 2016
Regione: Veneto
#5
Giustamente se nel nome c'è un "." oltre a quello dell'estensione non funziona...

Ho ancora il 2013 e la versione di VB è anche la mia 6.3. Per i nomi dei file tipo "ab__cde.idw" in uscita mi dava "ab_.idw", ovvero prendeva il secondo "_" come riferimento.

Ciao
Riprovato, a me funziona bene quanto ho postato... BOH! Per curiosità, c'è una "terza parte" che fa una prova per noi?
Grazie!
Ciao a tutti!
 

Filo

Utente Standard
Professione: Perditempo
Software: Inventor2015 ANSYS Fluent Gambit SolidWorks Algor
Regione: Veneto
#7
Oggi ho riguardato il tutto.
Ora funziona correttamente anche a me, non riesco a capire il perché, forse avevo fatto qualche altro pasticcio senza accorgermene.

Ciao
 

Filo

Utente Standard
Professione: Perditempo
Software: Inventor2015 ANSYS Fluent Gambit SolidWorks Algor
Regione: Veneto
#9
La tua frase
Windows è sempre Windows
Mi ha messo la pulce nell'orecchio, infatti alcune prove le ho fatte con Seven e altre con Vista...

Devo ancora approfondire bene, ma per ora mi sono accorto che "oDrw.DisplayName" in Seven restituisce "nomefile.idw" mentre in Vista "nomefile"...

Cosa che mi fa girare e non poco le scatole!

Se ho news vi tengo aggiornati

Ciao
 

Matteo Pagliaro

Utente poco attivo
Professione: Tecnico industrializzazione
Software: Inventor, Libellula 3D
Regione: Veneto
#10
Quello che è stato fatto è molto interessante, dato che ne avevo più volte sentito il bisogno durante l'attività lavorativa. Purtroppo io non me ne intendo poi tanto di VBA pertanto resterò con il desiderio dell'esportazione dxf automatica. Ma gradirei suggerire, se lo riteneste interessante (io lo uso spessissimo al lavoro), di integrare l'esportazione automatica non solo al file idw, ma anche in qualche modo alla vista in pianta del modello piatto dello sviluppo lamiera in una serie di file ipt.
Congratulazioni ancora per il lavoro fatto.

M.
 

Catafratto

Utente Standard
Professione: Disegnatore/progettista
Software: Inventor 2016
Regione: Veneto
#11
La tua frase

Mi ha messo la pulce nell'orecchio, infatti alcune prove le ho fatte con Seven e altre con Vista...

Devo ancora approfondire bene, ma per ora mi sono accorto che "oDrw.DisplayName" in Seven restituisce "nomefile.idw" mentre in Vista "nomefile"...

Cosa che mi fa girare e non poco le scatole!

Se ho news vi tengo aggiornati

Ciao
Controlla che l'opzione di Winzozz "Nascondi estensione per i tipi di file conosciuti" sia disabilitata, se non ricordo male crea questi problemi...
Comunque occhio che il .DisplayName è quanto visualizzato nel browser: se vuoi essere sicuro di recuperare il nome del file usa oDrw.FullFileName e poi separa path e nomefile.
Ciao!
 

Catafratto

Utente Standard
Professione: Disegnatore/progettista
Software: Inventor 2016
Regione: Veneto
#12
Quello che è stato fatto è molto interessante, dato che ne avevo più volte sentito il bisogno durante l'attività lavorativa. Purtroppo io non me ne intendo poi tanto di VBA pertanto resterò con il desiderio dell'esportazione dxf automatica. Ma gradirei suggerire, se lo riteneste interessante (io lo uso spessissimo al lavoro), di integrare l'esportazione automatica non solo al file idw, ma anche in qualche modo alla vista in pianta del modello piatto dello sviluppo lamiera in una serie di file ipt.
Congratulazioni ancora per il lavoro fatto.

M.
Purtroppo sono sempre cose legate al ciclo di lavoro aziendale, da fare quasi "su misura": per esempio quello che chiedi per me sarebbe assolutamente inutile, comunque in tavola metto sempre il modello piatto quotato (tu non puoi farlo?) anche perchè devo controllarne il verso (uso molta lamiera pellicolata) e quindi l'esportazione è "compresa nel prezzo"... Creare queste macro è un po' come essere sarti, io ne ho fatte molte ma se le cose non sono organizzate esattamente come voglio io proprio non vanno.
Quando avrò un po' più di tempo posto quelle più universali...
Ciao a tutti!
 

Filo

Utente Standard
Professione: Perditempo
Software: Inventor2015 ANSYS Fluent Gambit SolidWorks Algor
Regione: Veneto
#13
Controlla che l'opzione di Winzozz "Nascondi estensione per i tipi di file conosciuti" sia disabilitata, se non ricordo male crea questi problemi...
Ho verificato ed il problema è proprio qui, non c'entra seven o vista...
Comunque occhio che il .DisplayName è quanto visualizzato nel browser: se vuoi essere sicuro di recuperare il nome del file usa oDrw.FullFileName e poi separa path e nomefile.
Ciao!
Infatti ancora prima che scrivessi avevo già cambiato il codice con FullFileName...

Ecco il codice definitivo
Public Sub PubblicaDxf()

' Obtain reference to drawing
Dim oDoc As Document
Set oDoc = ThisApplication.ActiveDocument

If oDoc.DocumentType <> kDrawingDocumentObject Then
MsgBox ("Deve essere aperta una tavola")
Exit Sub
End If


Dim oDrw As DrawingDocument
Set oDrw = oDoc
' Get the Dxf translator Add-In.
Dim DxfAddIn As TranslatorAddIn
Set DxfAddIn = ThisApplication.ApplicationAddIns.ItemById("{C24E3AC4-122E-11D5-8E91-0010B541CD80}")


Dim oContext As TranslationContext
Set oContext = ThisApplication.TransientObjects.CreateTranslationContext
oContext.Type = kFileBrowseIOMechanism


' Create a NameValueMap object
Dim oOptions As NameValueMap
Set oOptions = ThisApplication.TransientObjects.CreateNameValueMap

' Create a DataMedium object
Dim oDataMedium As DataMedium
Set oDataMedium = ThisApplication.TransientObjects.CreateDataMedium

' Check whether the translator has 'SaveCopyAs' options
If DxfAddIn.HasSaveCopyAsOptions(oDrw, oContext, oOptions) Then

Dim strIniFile As String
strIniFile = "Percorso tuo_file.ini"
' Create the name-value that specifies the ini file to use.
oOptions.Value("Export_Acad_IniFile") = strIniFile
End If

' Sets directory for file save
Dim DXFDirectory As String
'La riga sottostante salva il file sul desktop se vuoi cambiare cartella cancella la riga sottostante e incolla DXFDirectory = "percorso cartella"
DXFDirectory = Environ("allusersprofile") & "\Desktop\"

'Set the destination file name
Dim fn As String
Dim fna As String
Dim fnb As String

fna = oDrw.FullFileName
fna = Strings.Right(fna, Len(fna) - InStrRev(fna, "\"))
fnb = Strings.Left(fna, Len(fna) - 4) & ".dxf"
fn = DXFDirectory & fnb
oDataMedium.FileName = fn

'Publish document.
Call DxfAddIn.SaveCopyAs(oDrw, oContext, oOptions, oDataMedium)
End Sub
Per ora non ho trovato bachi ma se volete testarlo mi fate un favore...
 

Filo

Utente Standard
Professione: Perditempo
Software: Inventor2015 ANSYS Fluent Gambit SolidWorks Algor
Regione: Veneto
#14
...Purtroppo io non me ne intendo poi tanto di VBA pertanto resterò con il desiderio dell'esportazione dxf automatica.
Se riesco te lo faccio... dxf nella stessa cartella del file o in una cartella da te scelta? Comunque ti consiglio di spendere un'ora e di provare a farlo con iLogic, non è molto difficile da fare e impari qualcosa che potrà tornanrti utile ancora


Ma gradirei suggerire, se lo riteneste interessante (io lo uso spessissimo al lavoro), di integrare l'esportazione automatica non solo al file idw, ma anche in qualche modo alla vista in pianta del modello piatto dello sviluppo lamiera in una serie di file ipt...
come ti ha detto Catafratto questi script funzionano tanto meglio quanto più sono cuciti addosso alle proprie esigenze e una cosa di questo tipo anche per me sarebbe inutile perché ogni ipt ha il suo idw con relativo modello piatto

Ciao
Filippo