Pagina 1 di 2 12 UltimaUltima
Risultati da 1 a 10 di 11
  1. #1
    Utente Junior
    Iscritto dal
    2008
    Messaggi
    22
    Professione
    progettista
    Regione
    f.v.g.
    Software
    Solid Edge - TruTops - ActCut

    Predefinito Problemi con metodi BendTable Object

    Salve,

    Nella guida SDK ho trovato una macro che mi permette di aggiungere colonne alla tabella pieghe di una lamiera ed ora la sto personalizzando.
    Finché la tabella contiene solo le colonne di default tutto bene (o quasi...).
    Quando però vorrei editare da API la Colonne aggiunte ed i rispettivi valori cominciano i fastidi:

    il codice seguente che, secondo me, dovrebbe eliminare le colonne aggiunte, non elimina alcunché

    Codice:
     If objBendTable.ColumnCount > 6 Then
                    ' Elimina le colonne utente
                    For I = 7 To objBendTable.ColumnCount
                        Call objBendTable.DeleteColumn(7)
                    Next I
                Else
                    MsgBox("???")
                End If
    Il valore dell'oggetto DispEntry1 (inizializzato con una variabile pubblica derivata da un 'combo-box', strColt) non viene recepita del metodo SetColumnDataOptions se la colonna già esiste (ed il valore è previsto dalle opzioni per quella colonna)

    Codice:
    DispEntry1 = strColt '"OW202/K R1/28 H120"
    
               MsgBox(DispEntry1)
    
               Call objBendTable.SetColumnDataOptions(Colonna_Coltello, DispEntry1, True, 2, EntryData)
    Quando, infine, voglio popolare l'unica colonna aggiunta alla quale non ho dato ne' opzioni ne' valori (poiché tali valori derivano dall'angolo di ciascuna piega)

    Codice:
     For I = 1 To objBendTable.BendCount
                   Call objBendTable.GetBendDataEx(I, featureName, BendRadius, BendAngle, BendDirection, BendIncludeAngle)
                      PZL = (BendRadius * 1000 + NeutralFactor * MatThck) * BendAngle
                      INTSZ = 2 * ((BendRadius * 1000 + MatThck) / Math.Tan(BendIncludeAngle / 2))
                      AccTrumpf = PZL - INTSZ 
                      'MsgBox(PZL & "  " & INTSZ & "  " & AccTrumpf)
                   Call objBendTable.SetBendUserData(I, 10, AccTrumpf)
                Next
    riesco ad ottenere i valori necessari al calcolo col metodo GetBendDataEx ma il metodo SetBendUserData blocca la routine con il seguente messaggio

    Cattura.PNG



    Qualcuno saprebbe aiutarmi a capirci qualcosa?

    Grazie

  2. #2
    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 fiza Visualizza Messaggio
    Salve,

    Nella guida SDK ho trovato una macro che mi permette di aggiungere colonne alla tabella pieghe di una lamiera ed ora la sto personalizzando.
    Finché la tabella contiene solo le colonne di default tutto bene (o quasi...).
    Quando però vorrei editare da API la Colonne aggiunte ed i rispettivi valori cominciano i fastidi:

    il codice seguente che, secondo me, dovrebbe eliminare le colonne aggiunte, non elimina alcunché

    Codice:
     If objBendTable.ColumnCount > 6 Then
                    ' Elimina le colonne utente
                    For I = 7 To objBendTable.ColumnCount
                        Call objBendTable.DeleteColumn(7)
                    Next I
                Else
                    MsgBox("???")
                End If
    Rispondo solo per questa parte in quanto non ho tempo di analizzare il resto.
    Di solito in questi casi conviene procedere a ritroso e di conseguenza la routine diventa:

    Codice:
     If objBendTable.ColumnCount > 6 Then
                    ' Elimina le colonne utente
                    For I = objBendTable.ColumnCount to 7 step -1
                        Call objBendTable.DeleteColumn(I)
                    Next I
                Else
                    MsgBox("???")
                End If
    [/QUOTE]

    Questo ammesso che il metodo DeteleColumn funzioni.
    Francesco
    Cintura nera di solid edge

  3. #3
    Utente Standard
    Iscritto dal
    2008
    Messaggi
    952
    Professione
    disegnatore
    Regione
    Romagna
    Software
    Solid Edge

    Predefinito

    Ma non riuscivi a fare tutto da solid edge senza bisogno di una macro e questi dolori ?
    (questo è per scoraggiare chi vuol complicarsi la vita quando non serve, ah ah)

    Il tipo di errore sembra dovuto che stai passando un parametro (ad esempio) di tipo "testo" mentre la funzione attende un "numero" , ovvero "tipo di dato non corrispondente".

    In vb.net ogni variabile va definita correttamente, tutto assume un tipo e se non corrisponde, compare un errore che cita la riga d'errore, qui è alla riga 122, cosa c'è alla riga 122?

  4. #4
    Utente Junior
    Iscritto dal
    2008
    Messaggi
    22
    Professione
    progettista
    Regione
    f.v.g.
    Software
    Solid Edge - TruTops - ActCut

    Predefinito

    Citazione Originariamente Scritto da vespa_83 Visualizza Messaggio
    Il tipo di errore sembra dovuto che stai passando un parametro (ad esempio) di tipo "testo" mentre la funzione attende un "numero" , ovvero "tipo di dato non corrispondente".

    In vb.net ogni variabile va definita correttamente, tutto assume un tipo e se non corrisponde, compare un errore che cita la riga d'errore, qui è alla riga 122, cosa c'è alla riga 122?
    La riga 122 che da l'errore è, come detto, quella relativa alla chiamata del metodo SetBendUserData:

    Codice:
    Call objBendTable.SetBendUserData(I, 10, AccTrumpf)
    "I" è Integer (per antonomasia), "10" è un valore intero (System.Int32), "AccTrumpf" è Object (... in realtà un Double): tutto conforme, per quanto nella guida SDK (sesdk.chm) i tipi dei tre argomenti sono definiti "Long, Long, Variant", ma non credo che dipenda da questo.

    Ciao

    P.S.

    Citazione Originariamente Scritto da vespa_83 Visualizza Messaggio
    Ma non riuscivi a fare tutto da solid edge senza bisogno di una macro e questi dolori ?
    In verità mi addolora molto di più passare ore ed ore a fare le stesse identiche operazioni ....

  5. #5
    Utente Standard
    Iscritto dal
    2008
    Messaggi
    952
    Professione
    disegnatore
    Regione
    Romagna
    Software
    Solid Edge

    Predefinito

    Citazione Originariamente Scritto da fiza Visualizza Messaggio
    La riga 122 che da l'errore è, come detto, quella relativa alla chiamata del metodo SetBendUserData:

    Codice:
    Call objBendTable.SetBendUserData(I, 10, AccTrumpf)
    "I" è Integer (per antonomasia), "10" è un valore intero (System.Int32), "AccTrumpf" è Object (... in realtà un Double): tutto conforme, per quanto nella guida SDK (sesdk.chm) i tipi dei tre argomenti sono definiti "Long, Long, Variant", ma non credo che dipenda da questo.

    Ciao
    La mia prima impressione è che forse non trova la colonna 10.
    prova a prendere dimestichezza con il comando ad esempio con un
    Call objBendTable.SetBendUserData(2, 2, "ciao")

    Avrei provato ma non ho ancora capito nulla, sei in psm o in draft? come si chiama il file di esempio dal quale sei partito?
    Set objBendTable = ... ?

  6. #6
    Utente Standard
    Iscritto dal
    2008
    Messaggi
    952
    Professione
    disegnatore
    Regione
    Romagna
    Software
    Solid Edge

    Predefinito

    ok ho provato e ho trovato delle sorprese, quindi ti invito a provare prima di continuare.
    Apro un psm con pieghe.
    Nella tabella pieghe mi ritrovo, non sò perchè, come quarta colonna una colonna editabile di nome "niente", quindi ho fruttato questa per provare.
    Codice:
    dim objApp
    dim objDoc
    
    Set objApp = GetObject(, "SolidEdge.Application")
    Set objDoc = objApp.ActiveDocument
    
    Set objBendTable = objDoc.BendTable
    IndiceCol_Niente = 4
    msgbox(objBendTable.GetBendUserData(2, IndiceCol_Niente ) )
    
    Call objBendTable.SetBendUserData(2, IndiceCol_Niente , 100)
    Cosa ho rilevato:
    via API, il metodo GetUserData mi restituisce valori vuoti, se poi li imposto con il SET, allora mi restituisce quello che ho impostato. Mentre a video da solidedge vedo tutt'altro, anche se scrivo a mano la tabella, GET mi continua a restituire quando scritto con SET. Se metto in Draft il psm la Tabella Piega mi restituisce quanto vedevo a video in psm.

    Codice:
    ' Mosta msgbox per ogni piega con i valori user data
    dim objApp
    dim objDoc
    
    Set objApp = GetObject(, "SolidEdge.Application")
    Set objDoc = objApp.ActiveDocument
    
    Set objBendTable = objDoc.BendTable
    dim txt 
    
    for y=1 to objBendTable.BendCount 
    	txt = "Piega n." & y & vbTab & " colonne:" & vbCrLf & vbCrLf
    	for x=1 to objBendTable.ColumnCount 
    		txt = txt & x & ": " & objBendTable.GetBendUserData(y, x) & vbTab
    	next
    	msgbox( txt )
    next
    Conclusione: UserData penso sia uno spazio dove l'utente può salvare dei propri numeri (il testo non me lo prende), si scrivono e leggono solo via API, ma poi non c'è modo di visualizzarli nel psm o nel draft.

  7. #7
    Utente Junior
    Iscritto dal
    2008
    Messaggi
    22
    Professione
    progettista
    Regione
    f.v.g.
    Software
    Solid Edge - TruTops - ActCut

    Predefinito

    Citazione Originariamente Scritto da vespa_83 Visualizza Messaggio
    Conclusione: UserData penso sia uno spazio dove l'utente può salvare dei propri numeri (il testo non me lo prende), si scrivono e leggono solo via API, ma poi non c'è modo di visualizzarli nel psm o nel draft.
    Grazie ai tuoi spunti ho fatto anch'io le mie prove e posso anch'io concludere:

    1) gli indici colonna da 1 a 6 corrispondono effettivamente alle prime sei colonne della Tabella pieghe visualizzabili in un .psm e sono effettivamente editabili anche se rimangono "subordinati" (e nascosti, tanto nel .psm che nel .dft) dai valori-piega che SE inserisce in queste colonne "riservate". Il tipo di valori che puoi inserire in queste colonne dipende dal tipo assegnato in origine: 1=intero (Sequenza piega), 2 e 5=testo (Feature e Direzione), 3 con 5 e 6= double (Raggio e valori Angolo)

    2) come sospettavo fin dall'inizio, l'indice di una colonna non corrisponde affatto alla posizione che assume nella Tabella pieghe, ma è una sorta di "seriale" incrementale (una dato ID che viene usato solo una volta) che si "brucia" allorquando una colonna viene eliminata. Tale ID viene evidenziato se si inserisce nella Tabella pieghe (Draft) una data colonna, come nell'immagine allegata.

    2016-09-19 13_33_07-Foto.jpg

    Anche in questo caso il tipo di dati viene specificato (dall'utente) in sede di inserimento

    Specificando tali ID sia il metodo DeleteColumn che il metodo SetBendUserData funzionano perfettamente, altrimenti o non succede niente o viene restituita un'eccezione di argomento invalido.

    Ora non rimane che trovare un modo (via API) di conoscere l'ID di ciascuna colonna senza passare per la Tabella pieghe in Draft.

    Ciao e grazie ancora ...
    Immagini Allegate Immagini Allegate

  8. #8
    Utente Standard
    Iscritto dal
    2008
    Messaggi
    952
    Professione
    disegnatore
    Regione
    Romagna
    Software
    Solid Edge

    Predefinito

    Se conosci la posizione della colonna (ovvero se la posizione delle tue colonne personalizzate sono fisse), allora non hai problemi, grazie al metodo objBendTable.ColumnId(posizione).
    Vedi se questo ti può bastare:
    Codice:
    ' Mosta msgbox per ogni piega con i valori user data
    Dim objApp
    Dim objDoc
    
    Set objApp = GetObject(, "SolidEdge.Application")
    Set objDoc = objApp.ActiveDocument
    
    Set objBendTable = objDoc.BendTable
    
    ' Estrapola i ColumnId, data la posizione
    Dim ColumnIdArray
    Dim ColumnId
    
    For i = 1 To objBendTable.ColumnCount
        ColumnId = objBendTable.ColumnId(i) 'internal ColumnId, data la posizione
        ColumnIdArray = ColumnIdArray & ColumnId & ","
    Next
    ColumnIdArray = Left(ColumnIdArray, (Len(ColumnIdArray) -1))
    MsgBox ColumnIdArray, vbOKOnly , "ColumnIdArray: Elenco dei ColumnId"
    
    ' per il nome colonna si possono tutte le colonne con GetColumnData:
    'void GetColumnData(Int32 ColumnId, out String ColumnName, [...]vedi guida[...])
    
    
    'Call objBendTable.SetBendUserData(3, 4, 100)
    ' attenzione: se si scrive in un ColumnId diverso da quelli mostrati sopra,
    ' si scrive in una posizione che poi a video non è richiamabile.
    
    ' Mosta msgbox per ogni piega con i valori user data
    Dim txt
    For y = 1 To objBendTable.BendCount
        txt = "Piega n." & y & vbTab & " colonne:" & vbCrLf & vbCrLf
        For x = 1 To objBendTable.ColumnCount
            ColumnId = objBendTable.ColumnId(x) 'internal ColumnId, data la posizione
            txt = txt & "[" & ColumnId & "]: " & objBendTable.GetBendUserData(y, ColumnId) & vbTab
        Next
        MsgBox( txt )
    Next

  9. #9
    Utente Junior
    Iscritto dal
    2008
    Messaggi
    22
    Professione
    progettista
    Regione
    f.v.g.
    Software
    Solid Edge - TruTops - ActCut

    Predefinito

    Citazione Originariamente Scritto da vespa_83 Visualizza Messaggio
    Vedi se questo ti può bastare:
    Ok, Perfetto!! Grazie!

    Questo per eliminare le colonne utente in blocco:

    Codice:
            Dim objSEApplication As SolidEdgeFramework.Application = Nothing
            Dim objDoc As SolidEdgePart.SheetMetalDocument = Nothing
            Dim objBendTable As SolidEdgePart.BendTable = Nothing
            Dim I As Integer
            Dim ColumnId As Integer
            Dim ColumnName As String = Nothing
            Dim ColumnWidth As Double
            Dim ColumnType As SolidEdgePart.PropertyTypeConstants
            Dim ColumnTextAlignment As SolidEdgeFrameworkSupport.TextHorizontalAlignmentConstants
            Dim strMsg As String
            Dim intArr As Integer = Nothing
            Dim enuMsgBoxResult As MsgBoxResult
    
            Try
                objSEApplication = Marshal.GetActiveObject("SolidEdge.Application")
                objDoc = objSEApplication.ActiveDocument
                objBendTable = objDoc.BendTable
    
                If objBendTable.ColumnCount > 6 Then
    
                    Dim arrColumnId(objBendTable.ColumnCount - 7) As Integer
    
                    strMsg = "Le Colonne " & vbCrLf & vbCrLf
    
                    For I = 7 To objBendTable.ColumnCount
                        ColumnId = objBendTable.ColumnId(I) ' get internal ColumnId by position
                        objBendTable.GetColumnData(ColumnId, ColumnName, ColumnWidth, ColumnType, ColumnTextAlignment)
                        arrColumnId(intArr) = ColumnId
                        intArr = intArr + 1
                        strMsg = strMsg & ColumnName & " in posizione n°" & I & " con ID [" & ColumnId & "]" & vbCrLf
                    Next
    
                    MsgBox(strMsg & vbCrLf & "stanno per essere eliminate ..." & vbCrLf & vbCrLf & "Continuare?", 49, "Conferma Eliminazione")
    
                    If enuMsgBoxResult = 1 Then
                        ' Elimina le colonne utente
                        For I = 0 To (objBendTable.ColumnCount - 7)
                            Call objBendTable.DeleteColumn(arrColumnId(I))
                        Next
    
                    Else
                        ' Non fa niente. 
                        MsgBox("Pocesso interrotto", vbOKOnly, "Interruzione Utente")
                    End If
    
    
                Else
                    MsgBox("Non ci sono Colonne utente da eliminare", vbOKOnly, "Nessuna Colonna Utente")
                End If
    
                If objBendTable.ColumnCount = 6 Then
                    MsgBox("Colonne Utente eliminate", vbOKOnly, "Uscita")
                Else
                    MsgBox("Sono rimaste " & (objBendTable.ColumnCount - 6) & " Colonne Utente", vbOKOnly, "Uscita")
                End If
    
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
    questo per eliminarle singolarmente:

    Codice:
            Dim objSEApplication As SolidEdgeFramework.Application = Nothing
            Dim objDoc As SolidEdgePart.SheetMetalDocument = Nothing
            Dim objBendTable As SolidEdgePart.BendTable = Nothing
            Dim ColumnId As Integer
            Dim ColumnName As String = Nothing
            Dim ColumnWidth As Double
            Dim ColumnType As SolidEdgePart.PropertyTypeConstants
            Dim ColumnTextAlignment As SolidEdgeFrameworkSupport.TextHorizontalAlignmentConstants
            Dim enuMsgBoxResult As MsgBoxResult
    
            Try
                objSEApplication = Marshal.GetActiveObject("SolidEdge.Application")
                objDoc = objSEApplication.ActiveDocument
                objBendTable = objDoc.BendTable
    
                If objBendTable.ColumnCount > 6 Then
    
                    For I = 7 To objBendTable.ColumnCount
                        ColumnId = objBendTable.ColumnId(I) ' get internal ColumnId by position
                        objBendTable.GetColumnData(ColumnId, ColumnName, ColumnWidth, ColumnType, ColumnTextAlignment)
                        ' Elimina le colonne utente
                        MsgBox("La Colonna " & ColumnName & " in posizione n°" & I & " con ID [" & ColumnId & "]" & vbCrLf _
                        & "sta per essere eliminata" & vbCrLf & "Continuare?", 49, "Conferma Eliminazione")
                        If enuMsgBoxResult = 1 Then
                            Call objBendTable.DeleteColumn(ColumnId)
                        Else
                        End If
                    Next
    
                Else
                    MsgBox("Non ci sono Colonne utente da eliminare", vbOKOnly, "Nessuna Colonna Utente")
                End If
    
                If objBendTable.ColumnCount = 6 Then
                    MsgBox("Colonne utente eliminate")
                Else
                    MsgBox("Sono rimaste " & (objBendTable.ColumnCount - 6) & " colonne utente")
                End If
    
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
    ed infine questo per aggiornare i valori di una colonna (in questo caso la colonna in posizione 10):

    Codice:
                For I = 1 To objBendTable.BendCount
                    Call objBendTable.GetBendDataEx(I, featureName, BendRadius, BendAngle, BendDirection, BendIncludeAngle)
                    PZL = (BendRadius * 1000 + NeutralFactor * MatThck) * BendAngle
                    INTSZ = 2 * ((BendRadius * 1000 + MatThck) / Math.Tan(BendIncludeAngle / 2))
                    AccTrumpf = PZL - INTSZ '(BendRadius * 1000 + NeutralFactor * MatThck) * BendAngle - 2 * ((BendRadius * 1000 + MatThck) / Math.Tan(BendIncludeAngle / 2))
                    'MsgBox(PZL & "  " & INTSZ & "  " & AccTrumpf)
                    ColumnId = objBendTable.ColumnId(10)
                    Call objBendTable.SetBendUserData(I, ColumnId, AccTrumpf)
                Next
    Un solo altro piccolo problema: anche se alla conferma di eliminazione do OK il valore restituito è sempre 0 (zero), per cui per provare il codice ho dovuto "forzare" il valore.
    Dove sbaglio?

  10. #10
    Utente Junior
    Iscritto dal
    2008
    Messaggi
    22
    Professione
    progettista
    Regione
    f.v.g.
    Software
    Solid Edge - TruTops - ActCut

    Predefinito

    ... Come non detto, ho capito cosa sbagliavo ....

    la sintassi corretta è

    Codice:
                    If MsgBoxResult.Ok Then


  • Pagina 1 di 2 12 UltimaUltima

    Discussioni Simili

    1. Metodi alternativi al FEM per la progettazione con lamiere
      Di nicko.87 nel forum Progettazione meccanica - forum generale
      Risposte: 2
      Ultimo Messaggio: 16-05-2014, 19: 15
    2. telaio bicicletta metodi matriciali
      Di salvatore87 nel forum Progettazione meccanica - forum generale
      Risposte: 0
      Ultimo Messaggio: 29-07-2012, 22: 54
    3. METODI RAPIDI ESTRUSIONE LINEE
      Di Frizz nel forum Inventor
      Risposte: 2
      Ultimo Messaggio: 27-01-2012, 18: 57
    4. metodi di selezione HELP!
      Di saro nel forum VectorWorks
      Risposte: 2
      Ultimo Messaggio: 24-05-2011, 12: 42

    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