MACRO per Solid Edge

diego76

Utente standard
Professione: Ingegnere
Software: Solid edge
Regione: piemonte
Il parto è stato difficile ma è andato a buon fine (scusate il monologo).:tongue:

Questa è la stringa di codice corretto:
Call Shell("Explorer.exe /select,""" & fullPathName & """", vbNormalFocus)

Allego la macro aggiornata come richiesto da Davimont.
FUNZIONA!!
GRAZIE
 

Dexy87

Utente poco attivo
Professione: Progettista
Software: Solid Edge ST10 - Catia V5-V6
Regione: Veneto
Ciao a tutti...Esiste una macro per compilare il cartiglio, non usando i campi personalizzati...
mi piacerebbe una schermata che si attiva con un pulsante.
Dove dice,.....scala...disegnatore. responsabile......ecc ecc
Grazie
Ciao Bmax

Hai avuto risposta alla tua domanda? mi interesserebbe anche a me una macro simile
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
Ciao Bmax

Hai avuto risposta alla tua domanda? mi interesserebbe anche a me una macro simile
Esistono aziende che vendono programmi per la gestione dei documenti e ciclo vita del prodotto
PLM (Product Lifecycle Management) o PDM (Product Data Management).
Visto che ti stai approcciando alle macro ma è da poco che lavori in una azienda nuova quindi non avrai tempo, ti sconsiglio di provare a scrivertelo (forse è la prima volta che scoraggio così direttamente).

Quindi inizia con la tabella dentro SolidEdge\Informazioni\Gestione Proprietà
un po' è personalizzabile, cliccando tasto destro sulle intestazioni di colonna.
Spesso è sufficiente.

Informati, magari dal tuo rivenditore di Solid Edge, sul PDM nativo preinstallato nelle ultime versioni di SolidEdge ST.
Cerca di capire cosa fa e come. E' necessaria una licenza, non sò se qualcuno nel forum la usa.
 

Dexy87

Utente poco attivo
Professione: Progettista
Software: Solid Edge ST10 - Catia V5-V6
Regione: Veneto
Esistono aziende che vendono programmi per la gestione dei documenti e ciclo vita del prodotto
PLM (Product Lifecycle Management) o PDM (Product Data Management).
Visto che ti stai approcciando alle macro ma è da poco che lavori in una azienda nuova quindi non avrai tempo, ti sconsiglio di provare a scrivertelo (forse è la prima volta che scoraggio così direttamente).

Quindi inizia con la tabella dentro SolidEdge\Informazioni\Gestione Proprietà
un po' è personalizzabile, cliccando tasto destro sulle intestazioni di colonna.
Spesso è sufficiente.

Informati, magari dal tuo rivenditore di Solid Edge, sul PDM nativo preinstallato nelle ultime versioni di SolidEdge ST.
Cerca di capire cosa fa e come. E' necessaria una licenza, non sò se qualcuno nel forum la usa.
Ciao Vespa

Abbiamo già analizzato un PLM, però non è tra le priorità dell'azienda. :O
Ho fatto delle personalizzazioni dentro le proprietà come suggerisci sopra, e per ora sta andando bene, tranne che nel cartiglio abbiamo solo una revisione che continua a sovrascriversi facendone delle altre, mentre ci piacerebbe averne 3 come storico.
 

MorFa

Utente poco attivo
Professione: disegnatore
Software: Solid Edge
Regione: Veneto
Buongiorno a tutti... scrivo perchè avrei bisogno di un aiuto. Nella fattispecie mi servirebbe sapere come estrapolare il valore della lunghezza totale di taglio da una parte sheet metal con una macro.
Il valore che cerco per capirci è quello presente in "progetto di costo" alla voce taglio. Ho provato a cercarlo con spy, ma evidentemente sbaglio qualcosa.
Se qualcuno fosse così gentile da passarmi il codice vbs (mi basta un msgbox che scrive il valore) gliene sarei eternamente grato. Confido in qualche anima pia. Ciao.
 

Be_on_edge

Moderatore
Membro dello Staff
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
allora son riuscito a togliere tutti i conflitti riportando tutti gli schizzi in blu ed ora il file si apre e chiude al volo. il problema è che ora non posso piu ne aggiungerene nuovi ne modificare gli elementi frame gia creati; posso solo eliminarli...è come se il modello fosse congelato in quella configurazione. se ad esempio modifico uno schizzo non aggiorna il frame relativo a quello schizzo. se creo un nuovo schizzo e gli assegno un elemento frame, sul menu "a tendina" a compare quel nuovo frame, ma non viene poi visualizzato, rimane come visualizzazione il solo sketch nudo...
Buongiorno a tutti... scrivo perchè avrei bisogno di un aiuto. Nella fattispecie mi servirebbe sapere come estrapolare il valore della lunghezza totale di taglio da una parte sheet metal con una macro.
Il valore che cerco per capirci è quello presente in "progetto di costo" alla voce taglio. Ho provato a cercarlo con spy, ma evidentemente sbaglio qualcosa.
Se qualcuno fosse così gentile da passarmi il codice vbs (mi basta un msgbox che scrive il valore) gliene sarei eternamente grato. Confido in qualche anima pia. Ciao.
Ciao,

Premessa:
il valore che cerchi non è direttamente disponibile nelle proprietà del file ma occorre calcolarlo.

Per fare questo occorre analizzare tutti i bordi di tutte le facce del modello sviluppato.
Scartare le facce perpendicolari allo sviluppo (gli spessori), scartare i bordi interni (quelli di inizio e fine piega), scartare le facce doppie (ogni lembo del pezzo ha 2 facce uguali per via dello spessore). Una volta trovati tutti i bordi occorre calcolarne la lunghezza, per una linea od un arco è piuttosto facile, per una curva complessa un po più complicato.

Fine premessa.

Un buon punto di partenza che copre tutti i punti sopra citati è l'esempio "GandT" che trovi in C:\Programmi\Siemens\Solid Edge xxxx\Custom\GandT

Se hai conoscenza del visual basic dovresti essere in grado di ottenere quello che cerchi con poco sforzo.
Altrimenti aspetta lunedì che ti copio incollo la mia funzione (non ce l'ho con me al momento).

Ciao
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
Buongiorno a tutti... scrivo perchè avrei bisogno di un aiuto. Nella fattispecie mi servirebbe sapere come estrapolare il valore della lunghezza totale di taglio da una parte sheet metal con una macro.
Il valore che cerco per capirci è quello presente in "progetto di costo" alla voce taglio.
Per una stima accurata del tempo di taglio si dovrebbero utilizzare i software del CNC laser.
Il mio fornitore mi dice che a volte serve più tempo per fare il piercing che fare una sagoma. Evidentemente vale per spessori grossi e con molti fori o scavi.
 

MorFa

Utente poco attivo
Professione: disegnatore
Software: Solid Edge
Regione: Veneto
Ciao,

Un buon punto di partenza che copre tutti i punti sopra citati è l'esempio "GandT" che trovi in C:\Programmi\Siemens\Solid Edge xxxx\Custom\GandT

Se hai conoscenza del visual basic dovresti essere in grado di ottenere quello che cerchi con poco sforzo.
Altrimenti aspetta lunedì che ti copio incollo la mia funzione (non ce l'ho con me al momento).

Ciao
Intanto grazie per la dritta, proverò a guardare l'esempio, tuttavia ti chiedo comunque di allegarmi la tua funzione, se possibile.

Per una stima accurata del tempo di taglio si dovrebbero utilizzare i software del CNC laser.
Il mio fornitore mi dice che a volte serve più tempo per fare il piercing che fare una sagoma. Evidentemente vale per spessori grossi e con molti fori o scavi.
In efetti è vero, infatti il valore mi serve per interfacciarmi poi con le tabelle di taglio del cnc (velocità e tempi di sfondamento). Il tempo di sfondamento incide in maniera significativa solo se hai dei grigliati o spessori grossi (sopra gli 8 mm). Nel mio caso, avendo spessori fini, lo gestirò aggiungendo una quota fissa facendo una media degli sfondamenti, mentre in caso di grigliati il pezzo sarà imputato ad una combinata che ha un parametro di costo diverso che tiene conto di queste lavorazioni.
 

Be_on_edge

Moderatore
Membro dello Staff
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
Ti inserisco la mia sub di calcolo, la devi ripulire di tutte le cose che non servono.
(Ho già tolto report e calcolo numero di pieghe altrimenti era troppo lungo e non me lo faceva postare)

Aggiungo che per calcolare il numero di punti di sfondamento occorre contare il numero di "loop"

Codice:
Public Sub AvvioCalcoloCosto(tipo_lamiera As String, bShowResult As Boolean)

    Dim objFaces As Object
    Dim objFace As Object
    Dim objTopFaces() As Object
    Dim dblMinRange(1 To 2) As Double
    Dim dblMaxRange(1 To 2) As Double
    Dim dblNormal(1 To 3) As Double: Dim dblNormalRef(1 To 3) As Double
    Dim iTopFaceCount As Integer
    Dim iOutlineEdgeCount As Integer
    Dim iFoldEdgeCount As Integer
    Dim objOutlineEdges() As Object
    Dim objFoldEdges() As Object
    Dim objEdges As Object
    Dim lgFaceCount As Long
    Dim objSharedFaces(1 To 2) As Object
    Dim iSharedFaceIndex As Integer
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim iFilePointer As Integer
    Dim dblStartPoint(1 To 3) As Double
    Dim dblEndPoint(1 To 3) As Double
    Dim dblCenter(1 To 3) As Double
    Dim dblRadius As Double
    Dim dblStartAngle As Double
    Dim dblSweepAngle As Double
    Dim dblMajorAxis(1 To 3) As Double
    Dim DuplicateEdge As Boolean
    Dim dblOrigin(1 To 2) As Double
    Dim StrokeCount As Long
    Dim StrokePoints() As Double
    Dim StrokeParams() As Double
    Dim Länge As Double
    Dim props As Object
    Dim Dicke As Double
    Dim vars As Object
    Dim Radius As Double
    Dim Schnitt(15) As Double
    Dim dx As Double
    Dim dy As Double

    On Error Resume Next
    Set objApp = GetObject(, "SolidEdge.Application")
    If Err Then
        MsgBox "Solid Edge deve essere aperto."
        End
    End If
    On Error GoTo 0
    
    If objApp.ActiveEnvironment <> "SheetMetal" Then
        MsgBox "Nessuna parte in lamiera aperta."
        End
    End If
    
    Set objFoldedDoc = objApp.ActiveDocument
    
    'Make sure the document contains a solid model
    If objFoldedDoc.Models.count = 0 Then
        MsgBox "Il file aperto non contiene un modello solido."
        End
    End If

    Set objProps = objFoldedDoc.Properties

    NomeFileXls = (Left(objFoldedDoc.FullName, Len(objFoldedDoc.FullName) - 4) + "_costo.xls")

    norm_vector = 3
    norm_value = 1

    Set objModel = objFlatDoc.Reference.Body.Shells(1)

    ' Get all of the planar faces in the model.
    'Set objFaces = objModel.Body.Faces(FaceType:=igQueryPlane)
    Set objFaces = objModel.Faces '(FaceType:=igFace)

    ' Allocate memory to store all of the top faces.
    ReDim objTopFaces(1 To objFaces.count / 2) As Object

    ' Find and save all faces whose normal is in the positive Z axis.
    iTopFaceCount = 0
    For Each objFace In objFaces
        ' Get the parametric range of the face.
        Call objFace.GetParamRange(MinParam:=dblMinRange, MaxParam:=dblMaxRange)

        ' Get the normal at the min param point.
        Call objFace.GetNormal(NumParams:=1, Params:=dblMinRange, Normals:=dblNormal)

        ' Check to see if it's pointed in the positive Z direction.
        If CStr(dblNormal(norm_vector)) = CStr(norm_value) Then
            ' Save this face because it's one of the top faces.
            iTopFaceCount = iTopFaceCount + 1
            Set objTopFaces(iTopFaceCount) = objFace
        End If
    Next

    ' Allocate space for the edges
    'ReDim objOutlineEdges(1 To objModel.Body.Edges(igQueryAll).Count / 3) As Object
    ReDim objOutlineEdges(1 To objModel.Body.Edges(igQueryAll).count / 2) As Object
    If tipo_lamiera = "Virola" Then
        ReDim objFoldEdges(2) As Object
    Else
        ReDim objFoldEdges(1 To iTopFaceCount * 2) As Object
    End If

    Dim oFoldEdges As Collection
    Set oFoldEdges = New Collection

    ' Initialize the counters.
    iOutlineEdgeCount = 0
    iFoldEdgeCount = 0

    ' Go through the top faces and collect all of the unique edges.  If any edges
    ' are shared by top faces, then they're saved seperately as fold edges.

    n_profili = 1

    For i = 1 To iTopFaceCount

        ' Trovo i Loop della faccia e li sommo -1
        n_profili = n_profili + objTopFaces(i).Loops.count - 1

        ' Get all of the edges of the current face.
        Set objEdges = objTopFaces(i).Edges

       ' Check each edge to see if it is shared with another face.
        For j = 1 To objEdges.count
            ' Get the other face that shares this edge.
            Call objEdges(j).GetFaces(NumFaces:=lgFaceCount, Faces:=objSharedFaces)

            ' Get the other face.
            If objSharedFaces(1) Is objTopFaces(i) Then
                iSharedFaceIndex = 2
            Else
                iSharedFaceIndex = 1
            End If

            ' Get the parametric range of the face.
            Call objSharedFaces(iSharedFaceIndex).GetParamRange(MinParam:=dblMinRange, MaxParam:=dblMaxRange)

            ' Get the normal at the min param point.
            Call objSharedFaces(iSharedFaceIndex).GetNormal(NumParams:=1, Params:=dblMinRange, Normals:=dblNormal)

            ' If the normal is pointing in the positive Z direction then the edge is shared with another top face.
            If Abs(dblNormal(norm_vector)) > norm_value - 0.1 And dblNormal(norm_vector) < norm_value + 0.1 Then

                ' Check to see if this edge is already accounted for.
                DuplicateEdge = False
                For k = 1 To iFoldEdgeCount
                    If objEdges(j) Is objFoldEdges(k) Then
                        DuplicateEdge = True
                        Exit For
                    End If
                Next

                If Not DuplicateEdge Then
                    'If iTopFaceCount * 2 < iFoldEdgeCount Then
                        iFoldEdgeCount = iFoldEdgeCount + 1
                        Set objFoldEdges(iFoldEdgeCount) = objEdges(j)
                        oFoldEdges.Add (objEdges(j))
                    'End If
                End If

            Else
                ' The edge is outside edge.
                iOutlineEdgeCount = iOutlineEdgeCount + 1

                Set objOutlineEdges(iOutlineEdgeCount) = objEdges(j)

            End If
        Next
    Next

    Gesamtlänge = 0

    For i = 1 To iOutlineEdgeCount

        Länge = 0

        Select Case objOutlineEdges(i).Geometry.Type
        Case igLine
            Call objOutlineEdges(i).GetEndPoints(StartPoint:=dblStartPoint, EndPoint:=dblEndPoint)

            'Länge der Linie
            Länge = ((dblEndPoint(1) - dblStartPoint(1)) ^ 2 + (dblEndPoint(2) - dblStartPoint(2)) ^ 2) ^ 0.5

        Case igCircle
            ' Determine if the edge is actually a circle or an arc.
            If objOutlineEdges(i).IsClosed Then
                Call objOutlineEdges(i).Geometry.GetCircleData(CenterPoint:=dblCenter, AxisVector:=dblNormal, Radius:=dblRadius)

                Länge = dblRadius * 2 * PI

            Else
                Call GetArcData(objOutlineEdges(i), True, dblCenter, dblNormal, dblStartPoint, dblEndPoint, _
                                dblStartAngle, dblSweepAngle, dblMajorAxis, dblRadius)

                ' Modify the start angle so it is based on the major axis direction.  Since we're only
                ' concerned with the arc in 2D space on the X-Y place, the start angle should be relative
                ' to the x axis instead.
                dblOrigin(1) = 0
                dblOrigin(2) = 0
                dblStartAngle = dblStartAngle + Bearing(dblOrigin, dblMajorAxis)

                Länge = dblRadius * dblSweepAngle

            End If

        Case igEllipse, igBSplineCurve

            ' Stroke ellipses and bspline curves.
            Call objOutlineEdges(i).GetStrokeData(Tolerance:=0.001, StrokeCount:=StrokeCount, Points:=StrokePoints, Params:=StrokeParams)

            For j = 2 To StrokeCount
                dx = StrokePoints((j - 1) * 3) - StrokePoints((j - 2) * 3)
                dy = StrokePoints(((j - 1) * 3) + 1) - StrokePoints(((j - 2) * 3) + 1)
                Länge = Länge + (dx ^ 2 + dy ^ 2) ^ 0.5
            Next

        End Select

        Gesamtlänge = Gesamtlänge + Länge

    Next

    For i = 1 To iFoldEdgeCount
        Select Case objFoldEdges(i).Geometry.Type
        Case igLine
            Call objFoldEdges(i).GetEndPoints(StartPoint:=dblStartPoint, EndPoint:=dblEndPoint)

        Case igCircle
            ' Determine if the edge is actually a circle or an arc.
            If objFoldEdges(i).IsClosed Then
                Call objFoldEdges(i).Geometry.GetCircleData(CenterPoint:=dblCenter, AxisVector:=dblNormal, Radius:=dblRadius)

            Else
                Call GetArcData(objFoldEdges(i), True, dblCenter, dblNormal, dblStartPoint, dblEndPoint, _
                                dblStartAngle, dblSweepAngle, dblMajorAxis, dblRadius)

                ' Modify the start angle so it is based on the major axis direction.  Since we're only
                ' concerned with the arc in 2D space on the X-Y place, the start angle should be relative
                ' to the x axis instead.
                dblOrigin(1) = 0
                dblOrigin(2) = 0
                dblStartAngle = dblStartAngle + Bearing(dblOrigin, dblMajorAxis)

            End If
        Case igEllipse, igBSplineCurve

            ' Stroke ellipses and bspline curves.
            Call objFoldEdges(i).GetStrokeData(Tolerance:=0.001, StrokeCount:=StrokeCount, Points:=StrokePoints, Params:=StrokeParams)

        End Select
    Next
    
    On Error Resume Next
    props("Perimetro").Value = Format(Gesamtlänge, "0.000") & " m"
    If Err Then
        props.Add "Perimetro", Format(Gesamtlänge, "0.000") & " m"
    End If

End Sub
 

MorFa

Utente poco attivo
Professione: disegnatore
Software: Solid Edge
Regione: Veneto
Ti inserisco la mia sub di calcolo, la devi ripulire di tutte le cose che non servono.
(Ho già tolto report e calcolo numero di pieghe altrimenti era troppo lungo e non me lo faceva postare)

Aggiungo che per calcolare il numero di punti di sfondamento occorre contare il numero di "loop"
Scusa il ritardo nella risposta, ma ieri è stata una giornata piuttosto piena. Intanto ti ringrazio, mi metto subito al lavoro per farne uno script (non so usare VB, ma conosco abbastanza il linguaggio) sperando di riuscirci.

P.s.
A titolo di curiosità GandT mi restituisce un errore in quanto la versione compilata ha il path errato. Comunque dal listato vb qualcosa l'ho capita.

Grazie di nuovo per la disponibilità.
 

MorFa

Utente poco attivo
Professione: disegnatore
Software: Solid Edge
Regione: Veneto
Ti inserisco la mia sub di calcolo
Aggiornamento e soluzione:
Dopo una serie di tentativi non sono riuscito a riportare in vbs la tua macro ("Dim.. As..." allo script non piace e a volte è indispensabile)
Tuttavia ho risolto inserendo uno schizzo nella campitura sviluppata su cui ho incluso tutti i profili di taglio. Poi una volta creata l'area di questo schizzo "magicamente" nelle variabili appare il perimetro. A quel punto ho recuperato il valore facilmente e una volta contato gli sfondamenti sono arrivato ad una soluzione più che accettabile con uno script abbastanza semplice.
 

MorFa

Utente poco attivo
Professione: disegnatore
Software: Solid Edge
Regione: Veneto
Premessa:
il valore che cerchi non è direttamente disponibile nelle proprietà del file ma occorre calcolarlo.
Salve di nuovo a tutti,
non è esattamente come avere il valore pronto perchè come giustamente detto da Be_on_edge il valore non è scritto in una proprietà del file, ma con questo codice sono riuscito a estrapolare su un file csv i valori presenti nella tabella di Progetto di costo.
Codice:
 Private Sub DesignCost(sender As Object, e As EventArgs) Handles Button1.Click
        objApp = GetObject(, "SolidEdge.Application")
        objDoc = objApp.ActiveDocument
        Dim FileCSV = "C:\Test_costo\pippo.csv"
        Call objDoc.ExportDesignCostToCSV(objDoc.fullname, FileCSV, False)

End Sub
Da li basta andare a leggere quel file e il perimetro di taglio è facilmente recuperabile. Poi mancano gli sfondamenti, ma per quelli basta contare i loop del modello.
Magari a qualcuno può tornare utile.