Pagina 6 di 9 PrimaPrima ... 45678 ... UltimaUltima
Risultati da 51 a 60 di 81
  1. #51
    Utente Junior
    Iscritto dal
    2013
    Messaggi
    59
    Professione
    Ingegnere Meccanico
    Regione
    Emilia Romagna
    Software
    SolidWorks, Solid Edge, Inventor, Autocad

    Predefinito

    Perfetto!!A questo punto scriverò io l'esportazione in txt prendendo come spunto quella che mi avevi scritto in una precedente macro e poi la posterò su questa discussione!!
    Nel frattempo ti ringrazio ancora e auguro a te e a tutti gli utenti del forum un buon 2014!!

    Ciao

  2. #52
    Utente Junior
    Iscritto dal
    2013
    Messaggi
    59
    Professione
    Ingegnere Meccanico
    Regione
    Emilia Romagna
    Software
    SolidWorks, Solid Edge, Inventor, Autocad

    Predefinito

    Mi permetto di chiederti un ultimo consiglio, dato che ormai siamo alla fine del lavoro: ho provato a scrivere il pezzo di macro per salvare in .txt ma, pur non avendo problemi in fase di compilazione, non scrive correttamente sul file di testo le coordinate.
    Il risultato è che mi crea i ref points, mi crea il file di testo e mi cancella successivamente i ref points (quindi in teoria tutto perfetto). Il problema è che il file di testo è composto da soli valori "zero": in pratica ho un file txt pieno di zeri (tante colonne di zeri quanti sono i ref points).
    Ti posto il codice che ho scritto, magari ho fatto un errore banale di cui non mi accorgo dato che non son pratico del VBA.

    Codice:
        Dim swApp                                  As SldWorks.SldWorks
        Dim swModel                                As SldWorks.ModelDoc2
        Dim swFeat                                  As SldWorks.Feature
        Dim swSelMgr                               As SldWorks.SelectionMgr
        Dim swSubFeat                             As SldWorks.Feature
        Dim swSketch                               As SldWorks.Sketch
        Dim swSkPt                                  As SketchPoint
        Dim sFeatType                              As String
        Dim swRefPt                                 As SldWorks.RefPoint
        Dim swRefPtData                           As SldWorks.RefPointFeatureData
        Dim swRefPointFeatData                 As SldWorks.RefPointFeatureData
        Dim swMathPt                                As Variant
        Dim vswRefPt                                As SldWorks.RefPoint
        Dim swMgr                                    As SketchManager
        Dim vFeat                                     As Variant
        Dim v                                           As Variant
        Dim i                                            As Integer
        Dim j                                            As Long
        Dim sFilename As String
        Dim tFilename As String
        Dim f As Object
        Dim fs As Object
        Dim bRet                                    As Boolean
        Dim boolstatus As Boolean
        Dim longstatus As Long, longwarnings As Long
        Dim nLength                         As Double
        Dim xValue() As Double
        Dim yValue() As Double
        Dim zValue() As Double
        Dim point_count As Integer
    
    ...
    ...
    ...
    
    
    'scansione del Feature Manager, se trovo punti di riferimento li scrivo nel file .txt
        Set swFeat = swModel.FirstFeature
        i = 1
        Do While Not swFeat Is Nothing
            sFeatType = swFeat.GetTypeName
             
                Select Case sFeatType
                    Case "RefPoint"
                        If swFeat.Name Like "*Punto*" Then
                        Set swRefPt = swFeat.GetSpecificFeature2
                        Set swMathPt = swRefPt.GetRefPoint
                            point_count = UBound(swMathPt)
                                    ReDim xValue(point_count)
                                    ReDim yValue(point_count)
                                    ReDim zValue(point_count)
    
                            For i = 0 To point_count
    
                        Set vswRefPt = swMathPt(i)
            
                                    xValue(i) = swMathPt.ArrayData(0) * 1000#
                                    yValue(i) = swMathPt.ArrayData(1) * 1000#
                                    zValue(i) = swMathPt.ArrayData(2) * 1000#
                               
                            Next i
    
                            '
                            'Creo il file .txt e ci scrivo sopra i valori
        
                            tFilename = swModel.GetPathName
                            sFilename = Left(tFilename, Len(tFilename) - 7)
                            Set fs = CreateObject("Scripting.FileSystemObject")
                            Set f = fs.CreateTextFile(sFilename & ".txt", True)
                             For i = 0 To point_count
                                    f.writeline Format(xValue(i)) & " " & _
                                    Format(yValue(i)) & " " & _
                                    Format(zValue(i))
                            Next i
                        
                 End If
                 
                End Select
            Set swFeat = swFeat.GetNextFeature
          Loop
       '
       'Cancello i punti
       Call DeletePoints

    Ciao

  3. #53
    Utente Standard L'avatar di jenuary
    Iscritto dal
    2007
    Messaggi
    385
    Professione
    Progettista e Programmatore VB.Net
    Regione
    Veneto
    Software
    Solidworks

    Predefinito

    Mi potresti girare l'intera macro, mi da errore su UBound
    Grazie

  4. #54
    Utente Junior
    Iscritto dal
    2013
    Messaggi
    59
    Professione
    Ingegnere Meccanico
    Regione
    Emilia Romagna
    Software
    SolidWorks, Solid Edge, Inventor, Autocad

    Predefinito

    Ecco qui la macro:


    Mia scansione_Rev_2_txt.rar


    ciao

  5. #55
    Utente Standard L'avatar di jenuary
    Iscritto dal
    2007
    Messaggi
    385
    Professione
    Progettista e Programmatore VB.Net
    Regione
    Veneto
    Software
    Solidworks

    Predefinito

    Nella fase di scrittura della riga nel file txt, devi aggiungere

    For i = 0 To point_count
    f.writeline Format(xValue(i)) & " " & _
    Format(yValue(i)) & " " & _
    Format(zValue(i)) & vbCrLf
    Next i

    Cosi facendo (vbCrLf) vai a capo
    Fammi sapere.
    Ciao

  6. #56
    Utente Junior
    Iscritto dal
    2013
    Messaggi
    59
    Professione
    Ingegnere Meccanico
    Regione
    Emilia Romagna
    Software
    SolidWorks, Solid Edge, Inventor, Autocad

    Predefinito

    Così facendo è cambiata soltanto la visualizzazione degli zeri dentro al file txt. Adesso ogni riga di zeri è separata da quella seguente da una riga vuota, ma purtroppo gli zeri rimangono.
    Sembra in poche parole che riesca a capire di quanti ref point calcolare le coordinate, ma non riesca a trovarli (infatti, ad esempio, se io decido di avere 5 ref point, alla fine nel file txt ho cinque righe, ognuna della quali composta da tre zeri).

  7. #57
    Utente Junior
    Iscritto dal
    2013
    Messaggi
    59
    Professione
    Ingegnere Meccanico
    Regione
    Emilia Romagna
    Software
    SolidWorks, Solid Edge, Inventor, Autocad

    Predefinito

    Credo di esserci riuscito!!Faceva confusione perchè avevo inserito un ciclo for all'interno di un loop e quindi il compilatore non capiva ciò che chiedevo. Ho modificato il codice in questo modo:


    Codice:
    Dim swApp                                  As SldWorks.SldWorks
        Dim swModel                                As SldWorks.ModelDoc2
        Dim swFeat                                  As SldWorks.Feature
        Dim swSelMgr                        As SldWorks.SelectionMgr
        Dim swSubFeat                              As SldWorks.Feature
        Dim swSketch                        As SldWorks.Sketch
        Dim swSkPt                      As SketchPoint
        Dim sFeatType                              As String
        Dim swRefPt                                As SldWorks.RefPoint
        Dim swRefPtData                 As SldWorks.RefPointFeatureData
        Dim swRefPointFeatData                      As SldWorks.RefPointFeatureData
        Dim swMathPt                                As SldWorks.MathPoint
        Dim vswRefPt                    As SldWorks.RefPoint
        Dim swMgr                       As SketchManager
        Dim vFeat                       As Variant
        Dim v                                      As Variant
        Dim i                                      As Integer
        Dim j                                      As Long
        Dim sFilename As String
        Dim tFilename As String
        Dim f As Object
        Dim fs As Object
        Dim bRet                                    As Boolean
        Dim boolstatus As Boolean
        Dim longstatus As Long, longwarnings As Long
        Dim nLength                         As Double
        Dim xValue() As Double
        Dim yValue() As Double
        Dim zValue() As Double
    
    
    ...
    ...
    ...
    
    
    'scansione del Feature Manager, se trovo punti di riferimento li scrivo nel file .txt
        Set swFeat = swModel.FirstFeature
        tFilename = swModel.GetPathName
        sFilename = Left(tFilename, Len(tFilename) - 7)
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.CreateTextFile(sFilename & ".txt", True)
        
        Do While Not swFeat Is Nothing
            sFeatType = swFeat.GetTypeName
             
                Select Case sFeatType
                    Case "RefPoint"
                        If swFeat.Name Like "*Punto*" Then
                        Set swRefPt = swFeat.GetSpecificFeature2
                        Set swMathPt = swRefPt.GetRefPoint
                            
                                    ReDim xValue(no_of_items)
                                    ReDim yValue(no_of_items)
                                    ReDim zValue(no_of_items)
    
                            
    
                        Set vswRefPt = swMathPt(i)
            
                                    xValue(i) = swMathPt.ArrayData(0) * 1000#
                                    yValue(i) = swMathPt.ArrayData(1) * 1000#
                                    zValue(i) = swMathPt.ArrayData(2) * 1000#
                               
                        
                                    f.writeline Format(xValue(i)) & " " & _
                                    Format(yValue(i)) & " " & _
                                    Format(zValue(i)) & vbCrLf
                             
                                    i = i + 1
          
                 End If
                        
                End Select
            Set swFeat = swFeat.GetNextFeature
          Loop
       '
       'Cancello i punti
       Call DeletePoints'scansione del Feature Manager, se trovo punti di riferimento li scrivo nel file .txt
        Set swFeat = swModel.FirstFeature
        tFilename = swModel.GetPathName
        sFilename = Left(tFilename, Len(tFilename) - 7)
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.CreateTextFile(sFilename & ".txt", True)
        
        Do While Not swFeat Is Nothing
            sFeatType = swFeat.GetTypeName
             
                Select Case sFeatType
                    Case "RefPoint"
                        If swFeat.Name Like "*Punto*" Then
                        Set swRefPt = swFeat.GetSpecificFeature2
                        Set swMathPt = swRefPt.GetRefPoint
                            
                                    ReDim xValue(no_of_items)
                                    ReDim yValue(no_of_items)
                                    ReDim zValue(no_of_items)
    
                            
    
                        Set vswRefPt = swMathPt(i)
            
                                    xValue(i) = swMathPt.ArrayData(0) * 1000#
                                    yValue(i) = swMathPt.ArrayData(1) * 1000#
                                    zValue(i) = swMathPt.ArrayData(2) * 1000#
                               
                        
                                    f.writeline Format(xValue(i)) & " " & _
                                    Format(yValue(i)) & " " & _
                                    Format(zValue(i)) & vbCrLf
                             
                                    i = i + 1
          
                 End If
                        
                End Select
            Set swFeat = swFeat.GetNextFeature
          Loop
       '
       'Cancello i punti
       Call DeletePoints
    E' giusto secondo te come impostazione del codice o ci sono errori concettuali?

    ciao

  8. #58
    Utente Standard L'avatar di jenuary
    Iscritto dal
    2007
    Messaggi
    385
    Professione
    Progettista e Programmatore VB.Net
    Regione
    Veneto
    Software
    Solidworks

    Predefinito

    Non l'ho provata perchè nel frattempo stavo creando una mofica parallela alla macro...
    Prova questa in allegato, ho inserito un Round nel valore della coordinata, che ti permette di esportare solo 3 cifre decimali (basta cambiarlo per averne 4 o 5 o più).

    Ciao
    File Allegati File Allegati

  9. #59
    Utente Junior
    Iscritto dal
    2013
    Messaggi
    59
    Professione
    Ingegnere Meccanico
    Regione
    Emilia Romagna
    Software
    SolidWorks, Solid Edge, Inventor, Autocad

    Predefinito

    Grazie mille, funziona molto bene anche la tua versione: è sicuramente più accurata della mia, che ho scritto con le mie scarse conoscenze del vba.

    A questo punto direi che la macro svolge esattamente ciò che volevo svolgesse: ti rinnovo i miei ringraziamenti per il tuo prezioso aiuto, senza il quale sarebbe stato tutto enormemente più difficile.

    Prima di concludere volevo solo capire bene ogni parte del codice, in modo tale da entrare per bene nell'ottica della scrittura di una macro di questo tipo, così magari da essere più preparato in futuro se dovessi scriverne altre o apportare modifiche a questa.
    In pratica se ho capito bene la macro agisce in questo modo:

    1- Nel main viene indicato alla macro di analizzare, all'interno di uno schizzo, tutte le entità del contorno.

    2- Ogni entità del contorno viene scansionata e identificata attraverso le chiamate "ProcessSketchLine, ProcessSketchEllipse, etc...". In pratica la macro identifica ogni entità e capisce se si tratti di una retta, un arco, un'ellisse...

    3- Ogni entità del contorno, una volta identificata, viene poi passata ad una function che ne ricava i dati e al termine viene generata una spline in tolleranza +-0.001 mm

    4- A questo punto viene chiamato "private sub Punti()", all'interno del quale si stabilisce in quanti punti suddividere la spline, si esegue la suddivisione, si effettua una scansione del feature manager e per ogni ref point trovato si scrivono le relative coordinate su un file txt

    5- Infine si chiama in causa "DeletePoints()" che provvede all'eliminazione dei punti di riferimento generati.


    Ho capito bene fin qui o ci sono cose che ho capito male?


    Ho solo un paio di dubbi:

    - Che cos'è "GetSubFeature()", che viene chiamato in causa all'inizio del main?

    - Non ho capito bene come agisce la function. Quando di preciso entra in azione e cosa intendi con "ricava i dati di ogni entità del contorno"?


    Questi dovrebbero essere gli unici dubbi sul codice (che comunque va benissimo, queste sono solo mie curiosità perchè voglio imparare bene a programmare su SW).


    Grazie ancora e ciao

  10. #60
    Utente Standard L'avatar di jenuary
    Iscritto dal
    2007
    Messaggi
    385
    Professione
    Progettista e Programmatore VB.Net
    Regione
    Veneto
    Software
    Solidworks

    Predefinito

    Hai capito bene tutti i passaggi dall'1 al 5

    Per quanto riguarda "GetSubFeature()" mi serve a inizio macro a memorizzare l'ultima fature dell'albero, infatti eseguo la scansione partendo dal fondo del feature manager, e salvo l'ultima feature in una variabile.
    Quando passiamo alla "DeletePoints()", comincio a cancellarli dal fondo e interrogando il nome della feature, mi fermo ed esco quando trovo la feature memorizzata all'inizio.
    Questo è un sistema che utilizzo per rendere la macro veloce, infatti prova a pensare di avere una parte con 200 feature o piu, partendo a scansionare dall'alto, mi devo passare quasi tutte le feature per cancellare alla fine quelle in piu, mentre cosi parto dal fondo e mi fermo dove mi serve.
    E' una sorta di Undo.

    Per quanto riguarda le function, se attivi da VBA dentro il menu a tendina Visualizza-> Finestra Immediata, ad ogni Debug.Print, leggi il risultato in questa finestra (coordinate, tipo entità ecc.), che si apre sotto l'intefaccia.

    Prova e fammi sapere
    Ciao


  • Pagina 6 di 9 PrimaPrima ... 45678 ... UltimaUltima

    Discussioni Simili

    1. Calcolare il volume
      Di fapalti27 nel forum Altri CAD per la Meccanica
      Risposte: 5
      Ultimo Messaggio: 18-09-2017, 19: 31
    2. Macro coordinate punti
      Di erf nel forum Solidworks
      Risposte: 21
      Ultimo Messaggio: 02-11-2011, 17: 54
    3. Calcolare il peso
      Di ciccino nel forum AutoCAD
      Risposte: 3
      Ultimo Messaggio: 05-11-2010, 21: 20
    4. Risposte: 14
      Ultimo Messaggio: 13-09-2010, 15: 33
    5. Calcolare un'espressione
      Di Shaba nel forum OneSpace Designer Modeling
      Risposte: 26
      Ultimo Messaggio: 14-01-2008, 09: 45

    Segnalibri

    Segnalibri

    Permessi di Scrittura

    • Tu non puoi inviare nuove discussioni
    • Tu non puoi inviare risposte
    • Tu non puoi inviare allegati
    • Tu non puoi modificare i tuoi messaggi
    •  





    CAD3D.it - la community dei progettisti