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

[MACRO] - Apri DFT

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#81
La cosa più probabile è che hai messo un "On Error Resume ..." per ignorare gli errori, poi durante la iterazione "For" la riga "Set objProps =..." a volte non funziona ('.OccurrenceDocument' e '.Properties("Custom")' siamo sicuri che esistano sempre? no).
rev potrebbe rimanere "vecchio" e per questo "non corrisponde a niente".
Tratti in maniera molto diversa name e rev anche se in alcuni casi devono comportarsi in modo simile. Di per sè non è sbagliato, soltanto che in caso di eccezioni (e con il controllo errori non gestito) diventa complicato immaginarsi cosa viene letto bene e cosa rimane indietro, e perché.

Devi decidere se revisionare tutto oppure se limitarti ad aggiungere:
Codice:
If name = "" Then 
 name = objAsm.SelectSet(i).object.OccurrenceDocument.FullName
 rev  = objAsm.SelectSet(i).object.OccurrenceDocument.Properties("Custom").Item("Rev.").Value   ' che non è detto che restituisca sempre un valore valido
End If
in fondo
Codice:
name = ""
rev = ""
Se invece decidi di cambiare approccio, ti suggerisco in improntare il codice così:
Codice:
' Esempio di iterazione degli oggetti selezionati in ambiente Assembly
Sub Main()
	Dim objApp As SolidEdgeFramework.Application
	Dim objDoc As solidedgeAssembly.AssemblyDocument

	Dim objSel As SolidEdgeFramework.SelectSet
	Dim objComp As solidedgeAssembly.Occurrence

	
	Title = "Il mio programma"

	Set objApp = GetObject(, "SolidEdge.Application")
	objApp.Visible = True
	If Err Then
		Err.Clear
		MsgBox "Prima apri solid edge!!!" , vbOKOnly, Title
	Else
		Set objDoc = objApp.ActiveDocument

		' Get the active Selection
		Set objSel = objApp.ActiveSelectSet
		If objSel.Count < 1 Then
			MsgBox "Prima di lanciare la macro, Selezionare almeno un componente" , vbOKOnly, Title
		Else
			For Each objComp In objSel
				' per ogni componente nella selezione (il set dell'oggetto viene fatto automaticamente)
                            MsgBox(objComp.PartFileName)
                            ' .... objComp.OccurrenceDocument
			Next
		End If
	End If
End Sub
 

ApeGana

Utente Standard
Professione: Progettista
Software: Solid Edge ST8
Regione: Marche
#82
Innanzitutto grazie per la risposta.

La cosa più probabile è che hai messo un "On Error Resume ..." per ignorare gli errori, poi durante la iterazione "For" la riga "Set objProps =..." a volte non funziona ('.OccurrenceDocument' e '.Properties("Custom")' siamo sicuri che esistano sempre? no).
Non credo che il problema sia sul trattamento degli errori perché la macro funziona, non è che si interrompa; solo che quando lavori su assiemi multilivello non sempre ti apre il draft giusto.

Tratti in maniera molto diversa name e rev
Sì, è vero, me ne sono reso conto. È che in realtà io sono partito dal listato di BoE senza capire a pieno tutto e/o mettere in discussione; ho preso quello, ho eliminato le parti della proprietà "draftlink", ho aggiunto le parti della proprietà "rev" in modo analogo a come venivano trattate quelle della "draftlink", e ho rivisto la formula di generazione del path completo del file da aprire.
Questo per lo meno nelle intenzioni.

Quello che noto da quello che scrivi è che dopo l'istruzione "objAsm.SelectSet(i)" tu metti sempre un ".object" che invece nella seconda riga della parte di codice che ho riportato io non c'è. Che possa essere questo il problema?
D'altra parte perché negli assiemi multilivello la macro funziona sempre correttamente?

Un'altra cosa: l'ultimo listato che mi hai messo a cosa serve? A capire nei vari casi cosa Solid Edge va a leggere? È una macro per il debug dell'altra?

Ciao
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#83
1. Ti funziona senza errori perchè prima di queste istruzioni hai un "On Error Resume Next" che significa: "in caso di errore, ignora e prosegui con la prossima istruzione". Ok, la macro gira, ma in caso di problemi il codice come si deve comportare? infatta hai trovato dei comportamenti inspiegabili.

2. " .object " l'ho copiato dal tuo, ovvero è un refuso del codice originale, bisognerebbe indagare sul cosa serve, forse dice di trattare l'oggetto come oggetto generico, boh è nuovo per me. Se c'era, male non farà.

3. Ti ho riportato un esempio nel caso uno volesse riscrivere un po' tutto da zero, ma nel tuo caso ti interessa la porzione da "For Each objComp In objSel" a "Next"

ci dò una occhiata poi ti rispondo come la si potrebbe modificare, ciao.
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#84
Per ApeGana:
fai un backup del tuo codice, poi prova a sostituire così il tuo "FOR ... NEXT":
Codice:
Dim objComp As solidedgeAssembly.Occurrence

' ripristina il controllo degli errori
On Errore Goto 0

' per ogni componente nella selezione (il set dell'oggetto viene fatto automaticamente)
For Each objComp In objSel
	Set objProps = objComp.OccurrenceDocument.Properties("Custom")
	
	name = ""
	name = objComp.OccurrenceFileName ' originale: objProps.Item("DraftLink").Value
	If name = "" Then name = objComp.OccurrenceDocument.FullName
	
	rev = ""
	rev = objProps.Item("Rev.").Value
	If rev = "" Then rev = "01"
	
	l = Len(name)
	' attenzione: non è bene impostare una lunghezza fissa del nome file.
	' Ape_Gana: dftname = Mid(name, 1, InStrRev(name, "\") + 6) & " " & rev & ".dft"
	dftname = Left(name, l - 4) & " " & rev & ".dft"
	If file_exist(dftname) Then
		objDft = objApp.Documents.Open(dftname)
		objDft.InactiveDrawingViewMode = false ' stato
	End If
Next
Note:
A. ho inserito il rispristino ERRORI: On Errore Goto 0 , se ti da noie inutili, commentalo.
B. in caso nel Componente non esista la scheda "Custom" (Proprietà Personalizzate), oppure la proprietà "Rev."), si avrà rev="" , quindi verrà inserito un valore di default: rev="01". Adattata questo valore alla tua realtà (0, 1, A, ....)
C. ho cambiato una tua riga con: dftname = Left(name, l - 4) & " " & rev & ".dft"
dove era 3 ho messo 4 per tagliare il punto: "dft" -> ".dft"
D. non posso provare il codice ma dovrebbe andare. Buona fortuna
 

ApeGana

Utente Standard
Professione: Progettista
Software: Solid Edge ST8
Regione: Marche
#85
per Vespa:
per il momento ti ringrazio molto; appena riesco provo e poi ti faccio sapere. :finger:
 

ApeGana

Utente Standard
Professione: Progettista
Software: Solid Edge ST8
Regione: Marche
#86
Ho risolto!!! :finger::finger::finger:
Era quel maledetto .object che mancava. In pratica ho corretto la riga così
Codice:
Set objProps = objAsm.SelectSet(i).object.OccurrenceDocument.Properties("Custom")
e adesso funziona.

Scusa Vespa se ti ho fatto perder tempo, di questa stranezza mi ero già accorto, ma sono talmente fesso ed inesperto che continuavo a fare modifiche in Notepad++ senza rendermi conto che non le stavo salvando... vabè, meglio tacere! :rolleyes:

Per BeOnEdge: io sono partito dal tuo listato, forse anche te succede qualcosa di strano negli assiemi multipli....
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#87
Macro Apri_Draft.vbs (formato aperto)
Questa versione non è ufficiale ed è parallela alla ufficiale di Be_on_edge.

Funzione aggiuntiva: in Draft apre i Draft dei Pallini selezionati (per viste aggiornate)

minor bug fixed for sub-asm.

(invito il Moderatore a cancellare i miei messaggi in questo thread dal 10-dic al 07-gen compresi )
 

Allegati