Errore macro per importazione punti da txt

omar91

Utente poco attivo
Professione: Studente
Software: Solidworks
Regione: Liguria
#1
Salve a tutti, mi chiamo Omar e sono nuovo del forum. Sono uno studente di ingegneria meccanica (laureando) e ho appena iniziato ad utilizzare Solidworks.
Non avendo trovato un comando per importare una serie di punti, ho cercato su internet una macro che mi permettesse di farlo. Ne ho trovata una che sembrava funzionare e che riporto di seguito:

Sub main()

Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
swApp.ActiveDoc.ActiveView.FrameState = 1
Dim skPoint As Object

Open "C:\Users\Omar\Desktop\materiale tesi\voluta\linee\prova.txt" For Input As #1
Part.SketchManager.Insert3DSketch True
Do While Not EOF(1)
Input #1, X, Y, Z
Set skPoint = Part.SketchManager.CreatePoint(X, Y, Z)
Loop
Close #1

End Sub

Dico sembrava perché i valori dei punti vengono distorti, es. 45.888 diventa 45888, 451.888444 diventa 451888.444, cioè tutti i numeri vengono maggiorati di un fattore 1000; inoltre per valori della terna "piccoli" (diciamo sotto la decina, anche se in realtà sembra abbastanza random), i numeri vengono letti direttamente come 0 (per "risolvere" avevo pensato di dare in input valori ridotti di un fattore 1000 o dividere per 1000 X,Y e Z nella macro).
Per le mie capacità tutto ciò appare come "misterioso", qualcuno mi sa dare delle spiegazioni? Grazie
 

jenuary

Utente Standard
Professione: Progettista e Programmatore VB.Net
Software: Solidworks
Regione: Veneto
#2
Ciao,
la macro funziona bene e come dicevi tu devi dividere le coordinate per 1000, questo perché la "chiamata" alle Api "CreatePoint", richiede i valori in metri, questo per tutto quello che riguarda la programmazione in SolidWorks.
Ti consiglio di dichiarare sempre le variabili giuste per il tipo di dato da contenere, nel tuo caso Double (doppia virgola mobile, è un tipo di dato numero con minimo due decimali, es. trasforma 35 in 35.00).
L'Api CreatePoint richiede di passargli tre coordinate Double, Vba non sempre, ma fa per te questa "traduzione".

Mi raccomando sempre al separatore decimale, nel tuo caso il "." che deve coincidere con quello impostato nelle Impostazioni Aggiuntive dentro a Paese e lingua nel Pannello di controllo di Windows, altrimenti il computer interpreta i numeri in modo diverso.

Mi sono permesso di modificare la macro dichiarando in modo diverso la varibile "swapp" e dichiarando X,Y,Z come Double.
Inoltre ho inserito di non vedere l'inserimento grafico delle entità in fase di creazione dentro allo schizzo, questo velocizza in modo esponenziale la macro in fase di esecuzione, soprattutto quando i punti diventano tanti.
Al termine ho chiuso lo schizzo.

P.S.:Come magari saprai, se davanti a tutto quello che scrivi metti un ' (apostrofo), la riga si dice commentata e appare in verde e non viene letta in fase di esecuzione.

Buona giornata
Jenuary

Ecco il codice aggiornato

Dim X As Double
Dim Y As Double
Dim Z As Double
Dim swApp As SldWorks.SldWorks
Dim Part As SldWorks.ModelDoc2
Sub main()

Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
swApp.ActiveDoc.ActiveView.FrameState = 1

Dim skPoint As SldWorks.SketchPoint

Open "C:\prova.txt" For Input As #1
Part.SketchManager.Insert3DSketch True
'Per congelare la grafica in fase di inserimento, tutto è molto più veloce
Part.SketchManager.AddToDB = True

Do While Not EOF(1)
Input #1, X, Y, Z
Set skPoint = Part.SketchManager.CreatePoint(X / 1000, Y / 1000, Z / 1000)
Loop
Close #1
'Ripristino l'inserimento grafico
Part.SketchManager.AddToDB = False
'Chiudo lo schizzo
Part.SketchManager.Insert3DSketch False
End Sub
 

omar91

Utente poco attivo
Professione: Studente
Software: Solidworks
Regione: Liguria
#3
Grazie jenuary! Probabilmente quando avevo provato a dividere per 1000 nella macro avevo sbagliato qualcosa e quindi restituiva 0.
Ti ringrazio ulteriormente anche per le migliorie che hai apportato e che ora proverò. Nel mio caso specifico (diciamo quello più urgente, per la tesi) il numero di punti è limitato (alcuni txt da circa 50 punti), ma per curiosità avevo provato anche con un txt contenente un numero di punti molto più elevato ed effettivamente dopo un po' SW andava in crash.