Pagina 5 di 7 PrimaPrima ... 34567 UltimaUltima
Risultati da 41 a 50 di 69
  1. #41
    Utente Standard
    Iscritto dal
    2011
    Messaggi
    100
    Professione
    Studente
    Regione
    Lombardia
    Software
    Solid Edge ST

    Predefinito

    Per finestra immediata intendi la console? Perchè ho fatto tutto come dici ma nella console non vedo nulla. Ci dev'essere qualcosa che mi sfugge...

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

    Predefinito

    Penso di esser riuscito a risolvere il problema... Ho creato un .txt nel quale vado a scrivere semplicemente in questo modo:
    Codice:
    Dim ComponentsList As New System.IO.StreamWriter("C:\Users\Guido\Desktop\Tirocinio\Assiemi\Lista.txt")
    
            For Each Item In objAssembly.Occurrences
    
                Debug.Print(Item.OccurrenceFileName)
                ComponentsList.Write(Item.OccurrenceFileName)
    
            Next Item
    
            ComponentsList.Close()
    Ti chiedo ancora un paio di cose però:
    - con questo codice ogni volta cerco di creare un nuovo file Lista.txt oppure, se questo esiste già (come succede dalla seconda volta che eseguo la macro in poi) vado semplicemente ad aprirlo ed editarlo?
    - se si limita ad aprirlo ed editarlo come faccio prima di editarlo a cancellare il contenuto del file in modo che non rimanga all'interno il contenuto della volta precedente in cui ho eseguito la macro? Questo perchè poi questo file mi servirà per un confronto.
    - come faccio ad andare a capo? Al momento ho scritto tutto su una riga.

  3. #43
    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
    Ti chiedo ancora un paio di cose però:
    - con questo codice ogni volta cerco di creare un nuovo file Lista.txt oppure, se questo esiste già (come succede dalla seconda volta che eseguo la macro in poi) vado semplicemente ad aprirlo ed editarlo?
    - se si limita ad aprirlo ed editarlo come faccio prima di editarlo a cancellare il contenuto del file in modo che non rimanga all'interno il contenuto della volta precedente in cui ho eseguito la macro? Questo perchè poi questo file mi servirà per un confronto.
    - come faccio ad andare a capo? Al momento ho scritto tutto su una riga.
    In VB6 quando apri un file di testo devi specificare se vuoi modificarlo o crearlo nuovo. In pratica si aggiunge un "for append" nel caso di editazione. Se non si mette nulla te lo riscrive da zero.

    Sempre in VB6 per aggiungere un ritorno a capo io aggiungo "+ VbCrLf" alla fine della riga che scrivo.

    Codice:
    Open "C:\lista.txt" For Append As #1   'Apertura in modifica
    Open "C:\lista.txt" As #1              'Apertura come se fosse nuovo
    
    For Each Item In objAssembly.Occurrences
    
                Write #1, Item.OccurrenceFileName + VbCrLf
    
    Next Item
    
    Close #1
    Ciao
    Francesco
    Cintura nera di solid edge

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

    Predefinito

    Smanettando un pò ero riuscito a fare quel che volevo... a questo punto usando il codice:
    Codice:
    ComponentsList.Write(Item.OccurrenceFileName)
    ogni volta lo apre e lo compila come se fosse nuovo e a me va benissimo così!
    Ho un problema con la procedura che mi elenca i componenti dell'assieme: alcuni di questi sono assiemi a sua volta e io ho bisogno di sapere i .par che contengono. Come faccio ad "andare al secondo livello" e quindi elencare i file contenuti in un assieme contenuto in quello principale? Avevo pensato di fare un secondo ciclo for dentro il primo ma mi da un errore che non capisco... il codice era qualcosa di questo tipo:
    Codice:
    For Each Item In objAssembly.Occurrences
    
                Debug.Print(Item.OccurrenceFileName)
                VariantComponentsList.WriteLine(Item.OccurrenceFileName)
    
                For Each SubItem In Item
    
                    Debug.Print(SubItem.Item)
                    VariantComponentsList.WriteLine(SubItem.OccurrenceFileName)
    
                Next SubItem
    
            Next Item
    Una domanda più di logica che di programmazione: se i livelli fossero più di 2 e magari un numero non noto come potrei fare in modo di ottenere una lista che contenga tutti i par? In sostanza dovrei controllare che ogni elemento sia un o meno un assieme e, se è un assieme, fare un ciclo su tutti i suoi componenti; il problema è che poi devo controllare di nuovo se questi sono o meno assiemi e quindi mi sembra sia un circolo vizioso...

  5. #45
    Utente Standard L'avatar di Leso
    Iscritto dal
    2007
    Messaggi
    546
    Professione
    Ufficiale tecnico
    Regione
    Veneto
    Software
    Solid Edge ST9

    Predefinito

    Dovresti fare un funzione ricorsiva tipo:



    Codice:
    Sub CercaComponentiAssieme (objAssembly As obj)  'non so se obj o qualcos'altro 
    
                For Each Item In objAssembly.Occurrences
    
                      Debug.Print(Item.OccurrenceFileName)
                      VariantComponentsList.WriteLine(Item.OccurrenceFileName)
                      CercaComponentiAssieme (Item)
    
                Next Item
    
    End Sub
    Occio ai codici ricorsivi che stai poco ad andare in loop infinito...
    Ultima modifica di Leso; 26-11-2011 alle 09: 12 Motivo: Italiano

  6. #46
    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 Leso Visualizza Messaggio
    Dovresti fare un funzione ricorsiva tipo:



    Codice:
    Sub CercaComponentiAssieme (objAssembly As obj)  'non so se obj o qualcos'altro 
    
                For Each Item In objAssembly.Occurrences
    
                      Debug.Print(Item.OccurrenceFileName)
                      VariantComponentsList.WriteLine(Item.OccurrenceFileName)
                      CercaComponentiAssieme (Item)
    
                Next Item
    
    End Sub
    Occio ai codici ricorsivi che stai poco ad andare in loop infinito...

    Si esatto la soluzione è questa, si può inserire un controllo per verificare se "Item" è un sottoassieme oppure no ed evitare quindi giri "strani".

    A questo punto si può anche inserire un contatore di livello, da scrivere davanti il nome occorrenza in modo da avere la lista con il livello dei pezzi.

    Ciao
    Francesco
    Cintura nera di solid edge

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

    Predefinito

    Ho fatto qualcosa del genere:
    Codice:
    Public Function BOM(ByVal objAssembly As SolidEdgeAssembly.AssemblyDocument) As String
    
            Dim VariantComponentsList As New System.IO.StreamWriter("C:\Users\Guido\Desktop\Tirocinio\Assiemi\VariantComponentsList.txt")
            Dim VariantComponentName As String = Nothing
            Dim BOMOK As String = "BOM scritta"
    
            For Each Item In objAssembly.Occurrences
                VariantComponentName = Item.OccurrenceFileName
                VariantComponentsList.WriteLine(Item.OccurrenceFileName)
    
                If VariantComponentName = "*.asm" Then
                    BOM(Item)
                End If
    
            Next Item
    
            VariantComponentsList.Close()
            Return BOMOK
    
        End Function
    Il problema è che non funziona... In particolare sembra non verificarsi mai la condizione del ciclo If e quindi la funzione BOM non viene mai richiamata dentro se stessa e così non va mai "al secondo livello". Deduco che il controllo è sbagliato, ma come lo correggo?
    Inizialmente ho provato a farlo senza il ciclo If, richiamando direttamente la funzione BOM, ma in questo modo non funziona; penso che sia perchè il primo componente che incontra è un .par mentre in ingresso alla funzione c'è un documento di tipo assembly e quindi credo vada in errore.

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

    Predefinito

    Sono riuscito a risolvere il problema per cui non si verificava la condizione del ciclo If che controlla se un file è un assieme o meno con un codice di questo tipo:
    Codice:
    If VariantComponentName.EndsWith(".asm") Then
              BOM(Item)
    End If
    Ora il controllo funziona però, quando si verifica la condizione VariantComponentName.EndsWith(".asm") e quindi viene richiamata la funzione BOM(), da errore... Qualche idea sul perchè?

  9. #49
    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
    Sono riuscito a risolvere il problema per cui non si verificava la condizione del ciclo If che controlla se un file è un assieme o meno con un codice di questo tipo:
    Codice:
    If VariantComponentName.EndsWith(".asm") Then
              BOM(Item)
    End If
    Ora il controllo funziona però, quando si verifica la condizione VariantComponentName.EndsWith(".asm") e quindi viene richiamata la funzione BOM(), da errore... Qualche idea sul perchè?
    Non mi sembra un bel modo di verificare se è un sottoassieme oppure no. Nelle proprietà di item c'è il valore "Type" e devi verificare che sia "Sub-Assembly Object"

    Codice:
    If Item.Type = igSubAssembly Then ....
    Credo anche che sia ora che tu dia un'occhiata alla struttura ad oggetti di solid edge altrimenti rischi tutte le volte di cercare strade improbabili.

    Ciao
    Francesco
    Cintura nera di solid edge

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

    Predefinito

    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?


  • Pagina 5 di 7 PrimaPrima ... 34567 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