[MACRO] - Apri DFT

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#61
forse è sbagliata la riga 45 e 64, cioè la formula sovracitata:
dftname = Left(Replace(name,"\","\3D\",InstrRev(name,"\")), l - 3) + "dft"

bisogna far delle prove... se ho tempo stasera ci dò un occhio

ps: stamattina ho provato il codice originale e andava, poi ho modificando mettendo la nuova formula sulla fiducia, non ho testato la condizione visto che non ho le cartelle strutturate come te
 

Tequila

Utente Senior
Professione: teorico del paleocontatto
Software: Solid Edge ST7, scarabocchi su carta
Regione: Veneto (PD)
#62
forse è sbagliata la riga 45 e 64, cioè la formula sovracitata:
dftname = Left(Replace(name,"\","\3D\",InstrRev(name,"\")), l - 3) + "dft"

bisogna far delle prove... se ho tempo stasera ci dò un occhio

ps: stamattina ho provato il codice originale e andava, poi ho modificando mettendo la nuova formula sulla fiducia, non ho testato la condizione visto che non ho le cartelle strutturate come te
Nessun problema, va tranquillo. Quando hai tempo di darci un'occhiata ben venga :finger: , non ho nessuna fretta.

ciao e grazie ancora... a buon rendere
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#63
Tequila: allego ApriDFT modificato secondo la tua esigenza:
apre il file draft con lo stesso nome ma residente nella cartella di livello superiore.

il comando, selezionato in assembly un file3D residente in:
curPath + "\" + nome + ".par" (o asm , psm)
richiama un draft con questo percorso:
curPath + "\" + "..\" + nome + ".dft"

dove:
CurPath = percorso cartella parte 3D
..\ = risali di una cartella (percorso relativo)

nota: non ci sono controlli di file esistente oppure no, nè ci sono delle preferenze. Se il file non viene trovato è SolidEdge che restituisce un messaggio di errore (come hai già notato).

Be_on_Edge: ho riscritto una parte di codice per semplicità, inserendo la formula per ricavare curPath e nome , che avevo già scritto qualche giorno fa per la macro Save+PDF.

VERSIONE PERSONALIZZATA -NON UFFICIALE dell'Autore originale- modificando una versione OBSOLETA
 

Allegati

Tequila

Utente Senior
Professione: teorico del paleocontatto
Software: Solid Edge ST7, scarabocchi su carta
Regione: Veneto (PD)
#64
Tequila: allego ApriDFT modificato secondo la tua esigenza:
apre il file draft con lo stesso nome ma residente nella cartella di livello superiore.

il comando, selezionato in assembly un file3D residente in:
curPath + "\" + nome + ".par" (o asm , psm)
richiama un draft con questo percorso:
curPath + "\" + "..\" + nome + ".dft"

dove:
CurPath = percorso cartella parte 3D
..\ = risali di una cartella (percorso relativo)

nota: non ci sono controlli di file esistente oppure no, nè ci sono delle preferenze. Se il file non viene trovato è SolidEdge che restituisce un messaggio di errore (come hai già notato).

Be_on_Edge: ho riscritto una parte di codice per semplicità, inserendo la formula per ricavare curPath e nome , che avevo già scritto qualche giorno fa per la macro Save+PDF.

VERSIONE PERSONALIZZATA -NON UFFICIALE dell'Autore originale- modificando una versione OBSOLETA
Grazie mille, domani mattina scarico la macro e la provo.
 

Tequila

Utente Senior
Professione: teorico del paleocontatto
Software: Solid Edge ST7, scarabocchi su carta
Regione: Veneto (PD)
#65
La macro funziona benissimo, grazie.
Solo una cosa volevo sapere, come mai all'apertura dei files "dft" mi pone le viste inattive? E' un parametro che hai impostato sulla macro per esigenza tua o cosa?

ciao grazie mille
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#66
Tequila: ti rispondo con un vecchio messaggio:
Esatto, è tra i parametri di apertura del DFT che gli dico di tenerlo disattivato in modo che l'apertura sia più veloce. Io ho aggiunto il comando per attivare le viste proprio sotto quello per aggiornarle.

Ciao

P.S.: il parametro da cambiare nel programma per aprire le viste già attive è questo:

objDft.InactiveDrawingViewMode = True

cambiare True in False
se apri il file ApriDFT.vbs con Notepad++ puoi personalizzarti da te objDft.InactiveDrawingViewMode = False , righe 51 e 75
 

Tequila

Utente Senior
Professione: teorico del paleocontatto
Software: Solid Edge ST7, scarabocchi su carta
Regione: Veneto (PD)
#67
Tequila: ti rispondo con un vecchio messaggio:

se apri il file ApriDFT.vbs con Notepad++ puoi personalizzarti da te objDft.InactiveDrawingViewMode = False , righe 51 e 75
grazie mille... dovevo rileggermi tutto il thread.
a buon rendere :finger:

editato il file vbs, ora apre attivando le viste.
 

BRM

Utente Standard
Professione: Disegnatore
Software: cocreate drafting,solid edge
Regione: Emilia Romagna
#68
Ho fatto anche io una macro per aprire i dft e ho aggiunto l'opzione per disattivare le viste, vedo che funziona ma mi sembra che le viste vengano disattivate dopo l'apertura del dft.
Ho impostato nella finestra apri "disattiva viste di disegno durante la revisione" e quando apro un dft in modo classico ci mette poco tempo mentre se lo apro con la macro impiega un po' piu di tempo e mi dice che le viste non sono aggiornate e quindi presumo che vengano disattivate dopo l'apertura.
Penso che qualcosa non funziona come dovrebbe.
Grazie.
 

cop1

Utente Junior
Professione: progettista
Software: solidedge
Regione: italia
#69
Aggiornata macro, tenendo premuto il tasto SHIFT il dft viene aperto con le viste attive.

Scaricate la macro aggiornata dal primo post.

Ciao
Buongiorno,
sto usando questa macro che mi è molto utile (grazie!).
un problema forse risolvibile: se seleziono una buona parte dell'albero, ho tante parti (viti, cuscinetti, ecc.) che non hanno dft. La macro si blocca ogni volta indicando il messaggio di errore: è possibile bypassarlo?
Cop1
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#70
Il messaggio che compare non è della macro ma di Solid Edge.
Per aggirare il problema, prima di aprire il file controllo che effettivamente esista.

Macro aggiornata disponibile nel primo post della discussione.

Ciao
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#71
Per chi mi aveva chiesto il sorgente eccolo:

Codice:
Declare Function GetKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer

Private Sub Main()
Dim objApp As SolidEdgeFramework.Application
Dim objDoc As SolidEdgeDocument
Dim objPar As SolidEdgePart.PartDocument
Dim objPsm As SolidEdgePart.SheetMetalDocument
Dim objAsm As SolidEdgeAssembly.AssemblyDocument
Dim objDft As SolidEdgeDraft.DraftDocument

Dim objProps As SolidEdgeFramework.Properties

Dim objSelectSet As SolidEdgeFramework.SelectSet

Dim dftname As String
Dim stato As Boolean

Dim strActEnv As String
Dim name As String

On Error Resume Next
Set objApp = GetObject(, "SolidEdge.Application")

If GetKeyState(vbKeyShift) And &H8000 Then stato = True Else stato = False

If Err Then
    Err.Clear
    End
Else
    Set objDoc = objApp.ActiveDocument
    Set objAsm = objApp.ActiveDocument
    Set objPar = objApp.ActiveDocument
    Set objPsm = objApp.ActiveDocument
    Set objDft = objApp.ActiveDocument
End If

strActEnv = objApp.ActiveEnvironment

Set objProps = objDoc.Properties("Custom")

Select Case strActEnv

    Case Is = "Assembly"
        Count = objAsm.SelectSet.Count
        If Count = 0 Then
            
            name = objProps.Item("DraftLink").Value
            If Err.Number = 9 Then name = objAsm.FullName: Err.Clear
            
        Else
            For i = 1 To Count
                Set objProps = objAsm.SelectSet(i).OccurrenceDocument.Properties("Custom")
                name = objProps.Item("DraftLink").Value
                
                name = objAsm.SelectSet(i).OccurrenceFileName
                If name = "" Then name = objAsm.SelectSet(i).object.OccurrenceDocument.FullName
                l = Len(name)
                dftname = Left(name, l - 3) + "dft"
                If file_exist(dftname) Then
                    objDft = objApp.Documents.Open(dftname)
                    objDft.InactiveDrawingViewMode = stato
                End If
                name = ""
            Next
            End
        End If
    
    Case Is = "Part"
            name = objProps.Item("DraftLink").Value
            If Err.Number = 9 Then name = objPar.FullName: Err.Clear
            
    Case Is = "SheetMetal"
        name = objProps.Item("DraftLink").Value
        If Err.Number = 9 Then name = objPsm.FullName: Err.Clear
    
    Case Is = "Detail"
        name = objDft.FullName
        Set objProps = objDft.ModelLinks(1).ModelDocument.Properties("Custom")
        objProps.Item("DraftLink").Value = name
        
        If Err.Number = 9 Then
            objProps.Add "DraftLink", name
            objProps.Save
            Err.Clear
        End If
        
        Set objProps = Nothing
        Set objDft = Nothing
        
End Select

l = Len(name)
dftname = Left(name, l - 3) + "dft"

If file_exist(dftname) Then
    Set objDft = objApp.Documents.Open(dftname)
    objDft.InactiveDrawingViewMode = stato
End If

Set objApp = Nothing
Set objDoc = Nothing

End Sub

Function file_exist(dft As String) As Boolean

    A = Dir$(dft)
    If A <> "" Then file_exist = True Else file_exist = False
    
End Function
 

ApeGana

Utente Standard
Professione: Progettista
Software: Solid Edge ST8
Regione: Marche
#72
Ciao, vorrei utilizzare questa macro adattandola al mio archivio disegni, senza la necessità di utilizzare la proprietà DraftLink (che dovrebbe essere altrimenti generata manon mano in tutti i file).

Ho provato a fare qualche modifica: incollando il listato in excel e avviandola da lì mi sembra che funzioni tutto (per inciso: è un portento!) :finger:

Ora, non avendo un compilatore VB, ho provato a fare il semplice file WSF come suggerito in qualche post vecchio (mi sembra di ricordare da Vespa), ma non va. Probabilmente non è così semplice!
Dov'è che sbaglio? Per caso deve cambiare la sintassi?

Un'altra domanda: non ho capito la questione del tasto shift premuto o meno; non mi sembra che cambi niente. In effetti non credo di sapere neanche cosa significhi avere le viste attive o no in draft.

Grazie ha chi avrà la pazienza di rispondermi.
Ape
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#73
E' possibile non compilare in exe ma cambia leggermente la sintassi.
Il file WSF richiede anche una parte di inglobazione di tipo XML e quindi ti suggerisco di usare l'estenzione ".vbs" (vb script), come dall'esempio del post #36 (e seguenti)
http://www.cad3d.it/forum1/threads/3839-MACRO-Apri-DFT?p=289122&viewfull=1#post289122

se invece sei partito dal nuovo sorgente (postato erroneamente qua: http://www.cad3d.it/forum1/threads/...uire-cartiglio?p=356939&viewfull=1#post356939)

dovresti caricare su notepad++ (che colora la sintassi e facilita la lettura) ed effettuare a mano gli eventuali aggiornamenti, ma l'uso del tasto Shift non credo che con .vbs sia intercettabile, ma mi par di capire che nemmeno ti serve.

Quando uso un file vbs, trasformo in commento la dichiarazione mettendo l'apostrofo prima di "As" in questo modo:
Dim odjDoc 'As ...
poi eseguendo il file compare il messaggio di errore con scritto il numero di riga nel file che produce l'errore e ci si va su dietro.
Gli oggetti vanno inizializzati una sola volta con "Set " , e se un comando non va si antepone (o si toglie) "Call "
 

ApeGana

Utente Standard
Professione: Progettista
Software: Solid Edge ST8
Regione: Marche
#74
Dunque... io sono effettivamente partito dal sorgente postato da BoE nella discussione sbagliata.

Quindi, da quello che ho capito, se volessi mantenere la sintassi così com'è, le uniche 2 strade sono continuare a usare excel come intermediario, oppure dotarmi di un compilatore. Fin qui ci sono?

Altrimenti potrei seguire le strade wsf o vbs (non mi serve il compilatore), ma in entrambe andrebbe rivista la sintassi (e non so che altro) del codice che gira in excel. Corretto anche questo?

Le indicazioni che mi dai per trovare i "correttivi" per il formato vbs mi sembrano abbastanza complicate e sicuramente, date le mie conoscenze quasi nulle di questi argomenti, mi farebbero perdere un mucchio di tempo con risultati incerti.
Forse mi conviene valutare la possibilità di dotarmi di un programma per compilare l'exe. Qualche suggerimento?
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#75
Quando si può cerco di evitare di compilare perchè in generale richiede molte più conoscenze e vanno gestiti meglio i file, poi può essere una questione di gusti personali.

Per le prove e il debug excel (se è sufficiente) è comodo e veloce.

Ho preso il sorgente dal quale sei partito, ho adeguatamente commentato di "As" e corretto i messaggi dell'esecutore (qualche "End" è diventato "Exit Sub" , e "Case Is = " è diventato "Case "), infine ho adattato la verifica del Draft (file_exit) (ps.: io preferivo il messaggio di errore).

Ho dovuto disabilitare la gestione dello Shift e Disattiva Viste.

Ecco il ApriDraft.vbs equivalente. Questa non è una versione ufficiale dell'autore
 

Allegati

ApeGana

Utente Standard
Professione: Progettista
Software: Solid Edge ST8
Regione: Marche
#77
Allora... l'ho provata, dopo aver fatto le mie modifiche.
Funziona tutto, mi sembra :finger:
Ti ringrazio ancora.

Mi rimane però un dubbio (forse qualcuno in più... :tongue: ma adesso pensiamo al primo!): questa volta mi hai aiutato tu a "tradurre" il codice in modo che potesse essere eseguito senza essere compilato come exe.
D'altra parte scrivere il codice in excel per fare le prove è molto comodo, e per il futuro preferirei non dover essere costretto a "tradurre" un codice che, già testato con excel, funziona.
Se mi dotassi di VB6 potrei compilare in exe direttamente il codice funzionante in excel? O comunque anche in quel caso sarebbero necessari degli adattamenti?
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#78
VB6 è fuori commercio quindi bisognerebbe procurarselo per vie traverse. Non l'ho mai provato ma vedendo alcuni sorgenti direi che serve qualche riga di preambolo per le librerie di sistema.
Oggi si usa VS (visual studio) di microsoft che nella versione Express è gratuita o previa registrazione. Io per quel poco che faccio preferisco invece SharpDevelop (alias #develop) che è free e opensource. L'installazione di VS a mio avviso sporca molto il PC, scrive file ovunque e cambia molte chiavi di registro. SharpDevelop è pressoche 'portabile'.
Entrambi sfruttano le ultime tecnologie di dei linguaggi .NET (vb 2012(?), c#) ma ad ogni modo devi apporre, se pur minime, piccole modifiche rispetto vba per excel.
Ovvero: se necessiti di interagire con Excel, ovvio che ti conviene rimanere con vba per excel.
Se non devi interagire con nulla di più di un confirm o una casella di testo, ti suggerisco vbs (che ora conosci).
Per ogni altra cosa bisognerebbe passare a VS o Sharpdevelop , ma partire direttamente da qui per ridurre le incompatibilità di sintassi errori e warning.
Usare VB6 potrebbe essere comunque una buona idea.

Sharp Develop: http://www.icsharpcode.net/OpenSource/SD/Download/#SharpDevelop4x (ver. stabile al 30/03/2015)
VS: https://www.visualstudio.com/
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#79
Sto pensando di aggiungere la capacità di aprire il Draft anche dall'ambiente Draft, ovvero in una tavola di assieme, selezionando un Pallino (o richiamo) , lanciando la macro verrà aperto il disegno del particolare corrispondente.

Partendo dal sorgente che postato poco più su ApriDraft_20150325.zip, quando ho un po' di tempo ci proverò!
 

ApeGana

Utente Standard
Professione: Progettista
Software: Solid Edge ST8
Regione: Marche
#80
Chiedo aiuto ai guru del forum.

Ho fatto una mia versione della macro in modo che legga una certa proprietà personalizzata (rev) dai file e poi la utilizzi per ricostruire il nome file del draft da aprire.
Funziona tutto (mi pare) tranne in un caso: quando in un complessivo multilivello si seleziona un pezzo che sta dentro un sottoassieme dell'assieme aperto, la proprietà personalizzata non viene letta dall'oggetto selezionato ma da uno degli assiemi che lo contengono (non ho ancora capito quale).

In pratica la variabile rev viene letta dall'oggetto sbagliato, d'altra parte la variabile name viene letta correttamente.

Vi riporto la sezione di codice interessata:

Codice:
For i = 1 To Count
	Set objProps = objAsm.SelectSet(i).OccurrenceDocument.Properties("Custom")
	name = objAsm.SelectSet(i).OccurrenceFileName
	rev = objProps.Item("Rev.").Value
	If name = "" Then name = objAsm.SelectSet(i).object.OccurrenceDocument.FullName
	l = Len(name)
	dftname = Mid(name, 1, InStrRev(name, "\") + 6) & " " & rev & ".dft"
	If file_exist(dftname) Then
		objDft = objApp.Documents.Open(dftname)
		objDft.InactiveDrawingViewMode = false ' stato
	End If
	name = ""
Next
Qualcuno ha qualche idea?
Grazie.

Ape