Pagina 6 di 7 PrimaPrima ... 4567 UltimaUltima
Risultati da 51 a 60 di 69
  1. #51
    Moderatore L'avatar di Be_on_edge
    Iscritto dal
    2007
    Messaggi
    2758
    Professione
    Progettazione
    Regione
    Emilia Romagna
    Software
    Solid Edge

    Predefinito

    Citazione Originariamente Scritto da guido.bonalumi Visualizza Messaggio
    So che non è un metodo ortodosso ma è il più semplice che mi è venuto in mente e per altro funziona. Comunque seguirò il tuo consiglio e approfondirò l'argomento! Il problema però è che, quando tale condizione si verifica, la funzione BOM(item) da errore; nessuna idea a riguardo?
    Metodo ortodosso che ti porterà ad errori in futuro. Cosa succede se il nome del file è una variante e non finisce con ASM ?

    Hai strutturato male la funzione.
    Per come è scritta devi assegnargli un risultato stringa.
    Nella tua funzione invece non glielo assegni mai.

    Anche la riga per chiamare la funzione è sbagliata, ritornando un valore stringa lo devi impiegare in qualche modo (nel tuo caso per scrivere la riga con il risultato).

    Ciao
    Francesco
    Cintura nera di solid edge

  2. #52
    Utente Standard
    Iscritto dal
    2011
    Messaggi
    100
    Professione
    Studente
    Regione
    Lombardia
    Software
    Solid Edge ST

    Predefinito

    Cavoli hai ragione non mi ero accorto dell'errore che generava la ricorsione restituendo una stringa. Ora l'ho corretta utilizzando una funzione di tipo Public Sub che, se non erro, non restituisce alcun valore (la stringa che restituiva era solo di controllo e andava comunque eliminata dopo).
    Ciò nonostante però continua a darmi errore... per completezza questo è il nuovo codice della funzione:
    Codice:
    Public Sub BOM(ByVal objAssembly As SolidEdgeAssembly.AssemblyDocument)
    
            Dim VariantComponentsList As New System.IO.StreamWriter("C:\Users\Guido\Desktop\Tirocinio\Assiemi\VariantComponentsList.txt")
            Dim VariantComponentName As String = Nothing
    
            For Each Item In objAssembly.Occurrences
                VariantComponentName = Item.OccurrenceFileName
                VariantComponentsList.WriteLine(Item.OccurrenceFileName)
    
                If VariantComponentName.EndsWith(".asm") Then
                    BOM(Item)
                End If
    
            Next Item
    
            VariantComponentsList.Close()
    
        End Sub

  3. #53
    Moderatore L'avatar di Be_on_edge
    Iscritto dal
    2007
    Messaggi
    2758
    Professione
    Progettazione
    Regione
    Emilia Romagna
    Software
    Solid Edge

    Predefinito

    Citazione Originariamente Scritto da guido.bonalumi Visualizza Messaggio
    Cavoli hai ragione non mi ero accorto dell'errore che generava la ricorsione restituendo una stringa. Ora l'ho corretta utilizzando una funzione di tipo Public Sub che, se non erro, non restituisce alcun valore (la stringa che restituiva era solo di controllo e andava comunque eliminata dopo).
    Ciò nonostante però continua a darmi errore... per completezza questo è il nuovo codice della funzione:
    Codice:
    Public Sub BOM(ByVal objAssembly As SolidEdgeAssembly.AssemblyDocument)
    
            Dim VariantComponentsList As New System.IO.StreamWriter("C:\Users\Guido\Desktop\Tirocinio\Assiemi\VariantComponentsList.txt")
            Dim VariantComponentName As String = Nothing
    
            For Each Item In objAssembly.Occurrences
                VariantComponentName = Item.OccurrenceFileName
                VariantComponentsList.WriteLine(Item.OccurrenceFileName)
    
                If VariantComponentName.EndsWith(".asm") Then
                    BOM(Item)
                End If
    
            Next Item
    
            VariantComponentsList.Close()
    
        End Sub
    Perchè Item non è un SolidEdgeAssembly.AssemblyDocument ma un SubAssembly.

    Ciao
    Francesco
    Cintura nera di solid edge

  4. #54
    Moderatore L'avatar di Be_on_edge
    Iscritto dal
    2007
    Messaggi
    2758
    Professione
    Progettazione
    Regione
    Emilia Romagna
    Software
    Solid Edge

    Predefinito

    Te l'ho scritta così capisci meglio (nel mio esempio stampo un debug, ma puoi inserire la scrittura su file di testo come detto in precedenza).

    Codice:
    Dim objApp As SolidEdgeFramework.Application
    Dim objAsm As SolidEdgeAssembly.AssemblyDocument
    
    Sub Main()
    
        Set objApp = GetObject(, "SolidEdge.Application")
        Set objAsm = objApp.ActiveDocument
        
        Call BOM(objAsm.Occurrences, "1")
    
    End Sub
    
    Sub BOM(Occurrences As SolidEdgeAssembly.Occurrences, level As String)
        
        For Each Item In Occurrences
        
            If Item.Type = igSubAssembly Then
                Call BOM(Item.OccurrenceDocument.Occurrences, level + 1)
            Else
                Debug.Print level + " - " + Item.OccurrenceFileName
            End If
    
        Next Item
    
    End Sub
    Ciao
    Francesco
    Cintura nera di solid edge

  5. #55
    Utente Standard
    Iscritto dal
    2011
    Messaggi
    100
    Professione
    Studente
    Regione
    Lombardia
    Software
    Solid Edge ST

    Predefinito

    GRAZIE MILLE!!! Ci ho provato ed ero giunto a qualcosa di simile ma, non ho ancora capito bene perchè, la mia va in loop! Adesso provo con la tua!

  6. #56
    Utente Standard
    Iscritto dal
    2011
    Messaggi
    100
    Professione
    Studente
    Regione
    Lombardia
    Software
    Solid Edge ST

    Predefinito

    Ho provato ad adattarla a ciò che serve a me, ma mi da un errore che non capisco; questo è il codice:
    Codice:
    Public Function BOMOK(ByVal objAssembly As SolidEdgeAssembly.AssemblyDocument) As String
    
            Dim Message As String = "BOM scritta"
    
            Call BOM(objAssembly.Occurences, 1)
    
            Return Message
    
        End Function
    
        Public Sub BOM(ByVal Occurrences As SolidEdgeAssembly.Occurrences, ByVal level As String)
    
            Dim VariantComponentsList As New System.IO.StreamWriter("C:\Users\Guido\Desktop\Tirocinio\Assiemi\VariantComponentsList.txt")
    
            For Each Item In Occurrences
    
                If Item.Type = SolidEdgeFramework.ObjectType.igSubAssembly Then
                    Call BOM(Item.OccurrenceDocument.Occurrences, level + 1)
                Else
                    VariantComponentsList.WriteLine(Item.OccurrenceFileName)
                End If
    
            Next Item
    
            VariantComponentsList.Close()
    
        End Sub
    L'errore è in corrispondenza di questa linea:
    Codice:
    Call BOM(objAssembly.Occurences, 1)
    e dice: "Impossibile trovare il membro pubblico 'Occurences' nel tipo 'AssemblyDocument'."
    Eppure non mi sembra di aver fatto, almeno in queste linee, qualcosa di diverso da ciò che mi hai suggerito.
    Un dettaglio: ho dovuto utilizzare la linea
    Codice:
    SolidEdgeFramework.ObjectType.igSubAssembly
    al posto semplicemente di
    Codice:
    igSubAssembly
    perchè quest'ultima non veniva ricnosciuta. Non penso ci sia differenza comunque no!?

  7. #57
    Moderatore L'avatar di Be_on_edge
    Iscritto dal
    2007
    Messaggi
    2758
    Professione
    Progettazione
    Regione
    Emilia Romagna
    Software
    Solid Edge

    Predefinito

    Citazione Originariamente Scritto da guido.bonalumi Visualizza Messaggio
    L'errore è in corrispondenza di questa linea:
    Codice:
    Call BOM(objAssembly.Occurences, 1)
    e dice: "Impossibile trovare il membro pubblico 'Occurences' nel tipo 'AssemblyDocument'."
    Occurrences si scrive con due R.

    Ciao
    Francesco
    Cintura nera di solid edge

  8. #58
    Utente Standard
    Iscritto dal
    2011
    Messaggi
    100
    Professione
    Studente
    Regione
    Lombardia
    Software
    Solid Edge ST

    Predefinito

    Che idiota! Grazie! Adesso funziona correttamente!

  9. #59
    Utente Standard
    Iscritto dal
    2011
    Messaggi
    100
    Professione
    Studente
    Regione
    Lombardia
    Software
    Solid Edge ST

    Predefinito

    Nuova domanda: se io apro 3 istanze di questo tipo
    Codice:
    Dim VariantComponentsListReader As New System.IO.StreamReader("C:\Users\Guido\Desktop\Tirocinio\Assiemi\VariantComponentsList.txt")
            Dim ParametricComponentsListReader As New System.IO.StreamReader("C:\Users\Guido\Desktop\Tirocinio\Assiemi\ParametricComponentsList.txt")
            Dim ComponentsWithCurveListReader As New System.IO.StreamReader("C:\Users\Guido\Desktop\Tirocinio\Assiemi\ComponentsWithCurveList.txt")
    può esserci qualche tipo di problema?
    Ho 3 cicli Do While uno dentro l'altro che richiedono la lettura di questi 3 file, ma non funzionano; in particolare, se non ho capito male gli utlimi 2 funzionano correttamente, mentre il primo, quello più esterno, no. Quel che accade è che del primo legge sempre solo la prima riga, ma non capisco perchè non avvenga anche negli altri 2. Questo è il codice della funzione completa:
    Codice:
    Public Function ConfrontLists() As String
    
            Dim VariantComponentsListReader As New System.IO.StreamReader("C:\Users\Guido\Desktop\Tirocinio\Assiemi\VariantComponentsList.txt")
            Dim ParametricComponentsListReader As New System.IO.StreamReader("C:\Users\Guido\Desktop\Tirocinio\Assiemi\ParametricComponentsList.txt")
            Dim ComponentsWithCurveListReader As New System.IO.StreamReader("C:\Users\Guido\Desktop\Tirocinio\Assiemi\ComponentsWithCurveList.txt")
            Dim VariantComponentName As String = Nothing
            Dim ParametricComponentName As String = Nothing
            Dim ComponentWithCurveName As String = Nothing
            Dim i As Integer = 0
    
            Do While VariantComponentsListReader.Peek() <> -1
                VariantComponentName = VariantComponentsListReader.ReadLine()
    
                Do While ParametricComponentsListReader.Peek() <> -1
                    ParametricComponentName = ParametricComponentsListReader.ReadLine()
                    i = ParametricComponentName.Length
    
                    If Right(VariantComponentName, i) = ParametricComponentName Then 'VariantComponentName = ParametricComponentName
    
                        Do While ComponentsWithCurveListReader.Peek() <> -1
                            ComponentWithCurveName = ComponentsWithCurveListReader.ReadLine()
    
                            If Right(VariantComponentName, i) = ComponentWithCurveName Then
                                Console.WriteLine("Il componente " + VariantComponentName + " contiene una curva")
                                Console.ReadLine()
                            Else
                                Console.WriteLine("Il componente " + VariantComponentName + " non contiene una curva")
                                Console.ReadLine()
                            End If
    
                        Loop
    
                    End If
    
                Loop
    
            Loop
    
            VariantComponentsListReader.Close()
            ParametricComponentsListReader.Close()
            ComponentsWithCurveListReader.Close()
            Return VariantComponentName
    
        End Function
    
    End Module

  10. #60
    Utente Standard
    Iscritto dal
    2011
    Messaggi
    100
    Professione
    Studente
    Regione
    Lombardia
    Software
    Solid Edge ST

    Predefinito

    Ho scoperto qual'è il problema ma non riesco a risolverlo... Dipende dal metodo peek:
    Codice:
    ParametricComponentsListReader.Peek() <> -1
    A quanto ho capito in questo modo il ciclo procede fino a che non viene restituito il valore -1 dal metodo peek, il che avviene quando il file in questione è stato letto fino all'ultima riga.
    Avendo più cicli uno dentro l'altro, una volta che viene restituito -1 in uno di questi cicli questo non viene più eseguito, perchè appunto non si verifica più la condizione d'ingresso nel ciclo.
    Dovrei fare in modo che, una volta che viene restituito -1 in un ciclo e si esce da questo, nel ciclo Do While precedente si azzeri il conteggio di questo ciclo (so che è contorto e non si capisce bene, ma è complicato da spiegare); non trovo il codice che serve per far in modo che il valore restituito dal metodo peek non sia più -1, ma ricominci dal valore iniziale. Qualcuno sa il codice che serve per farlo? perchè un altra soluzione sarebbe chiudere il file che si sta leggendo e riaprirlo, ma non mi sembra una soluzione intelligente ed elegante.


  • Pagina 6 di 7 PrimaPrima ... 4567 UltimaUltima

    Discussioni Simili

    1. MACRO-TUTORIAL-ESEMPI per Solid Edge
      Di cacciatorino nel forum Solid Edge
      Risposte: 5
      Ultimo Messaggio: 19-07-2017, 12: 45
    2. MACRO per Solid Edge
      Di cacciatorino nel forum Solid Edge
      Risposte: 126
      Ultimo Messaggio: 17-01-2017, 12: 47
    3. Macro SOLID EDGE salvataggio dxf
      Di marcomexx nel forum Altri software di CAD generico
      Risposte: 2
      Ultimo Messaggio: 21-05-2011, 14: 16
    4. Aiuto con Solid Edge
      Di amstrod nel forum Solid Edge
      Risposte: 17
      Ultimo Messaggio: 17-09-2010, 09: 32
    5. Sviluppo macro in .NET per Solid Edge ST
      Di checco03 nel forum Solid Edge
      Risposte: 4
      Ultimo Messaggio: 19-09-2008, 14: 51

    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