• This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Leggi altro.

Macro per calcolare coordinate da schizzo 3D

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#61
Ok per quanto riguarda GetSubFeature() è tutto chiaro.
Per la function invece ho ancora qualche dubbio: non capisco bene a cosa serva. Ad esempio, per quale motivo io non potrei passare direttamente dalla scansione delle varie entità alla generazione della spline senza passare attraverso questa function? Che funzione svolge di essenziale all'interno della macro? Ho provato a far partire la macro dando un occhio alla finestra immediata, ma non mi ha chiarito molto.


Un'ultimo dubbio, che ho scordato di esporti nel post precedente: nel main, nelle istruzioni che riguardano l'identificazione delle varie entità e la loro scansione come tali, ho notato che nel caso della spline il codice è leggermente diverso dagli altri casi.
Ti posto il codice interessato: per prima cosa ti posto i casi relativi alla retta e all'arco:

Codice:
                        Case SwConst.swSketchSegments_e.swSketchLINE
                            skSegTypesString = skSegTypesString & "line"
                            'identifico segmento di retta e quindi lo scansiono come tale
                            Call ProcessSketchLine(swApp, myPart, MySketch, skSegment)

                        Case SwConst.swSketchSegments_e.swSketchARC
                            skSegTypesString = skSegTypesString & "arc"
                            'identifico arco e quindi lo scansiono come tale
                            Call ProcessSketchArc(swApp, myPart, MySketch, skSegment)
i due pezzi di codice sono identici.
Invece per quanto riguarda la spline abbiamo due righe in più di codice:

Codice:
                        Case SwConst.swSketchSegments_e.swSketchSPLINE
                            skSegTypesString = skSegTypesString & "spline"
                            vID = skSegment.GetID
                            Debug.Print "    SegID              = [" & vID(0) & ", " & vID(1) & "]"
                            Call ProcessSketchSpline(swApp, myPart, MySketch, skSegment)
Cosa sono quelle due righe di codice in più?


ciao e grazie
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#62
Scusa mi sono accorto adesso di un problema: la macro lavora soltanto con quel disegno che mi avevi postato tu (Parte4). Se io creo uno schizzo da zero, 2D o 3D che sia e poi faccio partire la macro mi va tutto in crash...
Forse c'è un problema nell'unire le varie parti dello schizzo in un'unica spline...
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#63
Bisogna per caso adottare qualche accorgimento quando si disegna lo schizzo per far si che la macro funzioni?Come mai funziona solo col tuo disegno?
Io ho semplicemente disegnato i vari tratti di curva e salvato il file. Devo fare altro?Sono obbligato a quotarlo per renderlo totalmente definito?
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#64
Ho capito come farlo funzionare. Io disegno lo schizzo, lo quoto fino a renderlo totalmente definito e poi devo cancellare tutte le quote. In questo modo funziona.
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#65
Adesso funziona sempre, anche con le quote. Boh, forse facevo io qualcosa di strano prima...Comunque senza quote non funziona...
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#66
Ok oggi ho fatto un po' di prove e sono riuscito a farlo funzionare in qualsiasi condizione: sia quotato che non quotato, sia 2D che 3D.
Ho notato però che, una volta finito di creare la traiettoria, devo chiudere lo schizzo e poi riaprirlo prima di far partire la macro, altrimenti va tutto in crash. Non ho capito bene il motivo per cui faccia così, ma basta saperlo!!:):)...
 

jenuary

Utente Standard
Professione: Progettista e Programmatore VB.Net
Software: Solidworks
Regione: Veneto
#67
Domani mattina faccio delle prove per poterti rispondere.
Se riesci allegami la tua macro modificata cosi ragiono sulla tua evoluzione.
Tornando alla domanda relativa alle Function, l'avevo inserito per ricavare il punto iniziale e finale di ogni entità dello schizzo se ti serviva.
Ciao
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#68
E' esattamente l'ultima versione della macro che mi hai postato tu. Non le ho fatto nessuna modifica ulteriore.
In pratica funziona tutto benissimo, ma quando creo il mio schizzo, prima di avviare la macro, devo chiudere lo schizzo e poi riaprirlo. Solo a quel punto posso far partire la macro.

p.s. quindi la function serve esclusivamente nel caso si volessero aggiungere i punti iniziale e finale della curva?Quindi al momento non svolge nessuna funzione essenziale?


Ciao e grazie
 

jenuary

Utente Standard
Professione: Progettista e Programmatore VB.Net
Software: Solidworks
Regione: Veneto
#69
Esatto! Ma non è detto che venga buona per altri calcoli, io non la cancellerei dal codice.
Ciao
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#70
No infatti non ho intenzione di cancellarla, perchè poi in futuro ci potrebbero essere modifiche alla macro e quindi la function potrebbe venire utile.

Ciao
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#71
Ne approfitto per chiederti una piccola cosa: sto cercando di completare la parte di codice relativa alla flag che si apre ogni qual volta si debba decidere quanti punti inserire nello schizzo.
Io ho cercato di distinguere il caso in cui l'utente inserisca un valore non numerico da quello in cui l'utente inserisca un valore numerico negativo o minore di 1.

Il codice è questo:

Codice:
Dim no_of_items As Single
Dim flag As Integer
 flag = 1
 While flag = 1
 On Error Resume Next
 no_of_items = InputBox("In quanti punti si desidera suddividere la traiettoria?")
 If (Err.Number <> 0) Then
 MsgBox "Devi inserire un numero"
 flag = 1
 ElseIf (no_of_items < 1) Or (Int(no_of_items) <> no_of_items) Then
 MsgBox "Devi inserire un numero maggiore di zero"
 Else
 flag = 0
 End If
 Wend
Il mio problema è questo: se io ad esempio mi fossi sbagliato a far partire la macro, non appena appare la finestra mi verrebbe da premere il tasto "annulla" presente nella flag, oppure la "X" in alto a destra. Il problema è che sia il tasto "Annulla" che la "X" non mi permettono di uscire dalla finestra. In pratica una volta fatta comparire questa finestra non si può più tornare indietro, ma bisogna per forza eseguire tutta la macro.

Dopo qualche prova credo di aver capito che il tasto "Annulla" e la "X" fanno capo al caso "Err.Number > 0". Ti tornano i conti?
Il problema è che a Err.Number > 0 fanno anche capo tutti quei valori non numerici che l'utente potrebbe inserire.
C'è un modo per far sì che, se io premo il tasto "Annulla" o la "X", la flag si chiuda e la macro non venga eseguita?

Grazie
 

jenuary

Utente Standard
Professione: Progettista e Programmatore VB.Net
Software: Solidworks
Regione: Veneto
#72
Ne approfitto per chiederti una piccola cosa: sto cercando di completare la parte di codice relativa alla flag che si apre ogni qual volta si debba decidere quanti punti inserire nello schizzo.
Io ho cercato di distinguere il caso in cui l'utente inserisca un valore non numerico da quello in cui l'utente inserisca un valore numerico negativo o minore di 1.

Il codice è questo:

Codice:
Dim no_of_items As Single
Dim flag As Integer
 flag = 1
 While flag = 1
 On Error Resume Next
 no_of_items = InputBox("In quanti punti si desidera suddividere la traiettoria?")
 If (Err.Number <> 0) Then
 MsgBox "Devi inserire un numero"
 flag = 1
 ElseIf (no_of_items < 1) Or (Int(no_of_items) <> no_of_items) Then
 MsgBox "Devi inserire un numero maggiore di zero"
 Else
 flag = 0
 End If
 Wend
Il mio problema è questo: se io ad esempio mi fossi sbagliato a far partire la macro, non appena appare la finestra mi verrebbe da premere il tasto "annulla" presente nella flag, oppure la "X" in alto a destra. Il problema è che sia il tasto "Annulla" che la "X" non mi permettono di uscire dalla finestra. In pratica una volta fatta comparire questa finestra non si può più tornare indietro, ma bisogna per forza eseguire tutta la macro.

Dopo qualche prova credo di aver capito che il tasto "Annulla" e la "X" fanno capo al caso "Err.Number > 0". Ti tornano i conti?
Il problema è che a Err.Number > 0 fanno anche capo tutti quei valori non numerici che l'utente potrebbe inserire.
C'è un modo per far sì che, se io premo il tasto "Annulla" o la "X", la flag si chiuda e la macro non venga eseguita?

Grazie

Inserisci un Exit sottole righe MsgBox e vedrai che funziona.

Ciao
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#73
Inserisci un Exit sottole righe MsgBox e vedrai che funziona.
Si si quello lo so, ma il mio problema (se così si può chiamare) è un altro: come faccio a distinguere il caso in cui l'utente prema il tasto "Annulla" da quello in cui scriva un carattere che non sia un numero?
Perchè al momento entrambi i casi sono contemplati nella riga di codice: "If (Err.Number <> 0)"
Diciamo che non è essenziale, ma mi piacerebbe distinguere le due casistiche: se l'utente preme "Annulla" vorrei che si uscisse dalla finestra, mentre se l'utente scrive un carattere non numerico vorrei che lo si avvisasse dell'errore mantenendo però aperta la inputbox, in modo che possa fare un nuovo tentativo senza dover riavviare la macro.

Ciao
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#75
In questo periodo ho utilizzato la macro e devo dire che funziona benissimo!
Avrei un consiglio da chiederti: avrei bisogno di calcolare la lunghezza della mia curva. Ho visto sul web che esiste un'istruzione chiamata "GetLength3(StartParam, EndParam)" che permette di farlo, ma necessita dell'inserimento di due parametri relativi al punto iniziale e finale della mia curva (che come sai bene è un'insieme di diversi tratti, che vengono poi uniti in un'unica spline). Ho provato ma non riesco bene a capire come impostare il codice per calcolarmi la lunghezza della curva. Hai idea di come si possa fare?

Grazie mille
 

jenuary

Utente Standard
Professione: Progettista e Programmatore VB.Net
Software: Solidworks
Regione: Veneto
#76
Ciao, ho modificato la macro e alla fine di tutto il processo, all'interno della Sub Main,
ho inserito la misurazione dello schizzo, funziona in questo modo:
- Gli si passa lo schizzo
- Vengono scartate le linee di costruzione, che nel nostro caso erano le entità che hanno formato la spline.
- Viene ritornato la lunghezza totale (nel nostro caso abbiamo solo una spline).

Valuta se puo andarti bene
 

Allegati

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#77
Ti ringrazio per la risposta. Si va benissimo grazie! Io avevo provato a calcolare la lunghezza in un modo differente: lo avevo fatto all'interno del Sub Punti () e avevo scritto questo:
Codice:
    Dim swApp                                       As SldWorks.SldWorks
    Dim swModel                                     As SldWorks.ModelDoc2
    Dim boolstatus                                  As Boolean
    Dim nLength                                     As Double
    Dim SelectionManager                         As Object
    Dim SketchSegment                           As Object

    'Misurazione della lunghezza totale della curva
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    boolstatus = swModel.Extension.SelectByID2("Spline" & vID(1) & "@" & MySketchName, "EXTSKETCHSEGMENT", -2.26303320559162, 0.274955752667652, 0, True, 0, Nothing, 0)
    Debug.Print "Spline" & vID(1) & "@" & MySketchName
    
    Set SelectionManager = swModel.SelectionManager()
    Set SketchSegment = SelectionManager.GetSelectedObject6(1, 0)
    nLength = SketchSegment.GetLength()               'Lunghezza della spline risultante
Secondo te è corretto questo codice oppure in questo modo non si calcola la lunghezza della spline?

Grazie
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#78
Intanto che ci sono ne approfitto per chiederti una cosa che mi preme un po': secondo te sarebbe complicato se io volessi scrivere sul file txt le tre coordinate dopo averle moltiplicate (o divise) per alcuni coefficienti?
Mi spiego meglio: mettiamo il caso che io abbia un punto di coordinate x =1 y = 2 z = 3. Se io volessi riportare sul file txt una cosa del tipo:
x = 1*8 y = 2+5 z = (3*4)+2, sarebbe una cosa molto complicata?

Posso svolgere i calcoli direttamente al momento in cui scrivo sul file txt?

Codice:
f.writeline Format(Round(swMathPt.ArrayData(0) * 1000#, 3)) & " " & _
                                    Format(Round(swMathPt.ArrayData(1) * 1000#, 3)) & " " & _
                                    Format(Round(swMathPt.ArrayData(2) * 1000#, 3))
                         
                                i = i + 1
oppure mi conviene svolgerli prima?

Ti ringrazio in anticipo, perchè è una cosa a cui sto pensando da parecchio e che mi preme abbastanza, ma non so bene da dove partire.

ciao
 

jenuary

Utente Standard
Professione: Progettista e Programmatore VB.Net
Software: Solidworks
Regione: Veneto
#79
Ciao alxG88,
relativamente ai calcoli:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
f.writeline Format(Round(swMathPt.ArrayData(0) * 1000#, 3)) & " " & _
Format(Round(swMathPt.ArrayData(1) * 1000#, 3)) & " " & _
Format(Round(swMathPt.ArrayData(2) * 1000#, 3))

i = i + 1
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
io condivido il codice, cioè trasformerei i numeri durante la scrittura nel file, questo per non intaccare le coordinate originali, utili per eventuali calcoli futuri se implementerai la macro.
Inoltre creeresti ulteriori variabili al tuo codice che comunque dovrai poi scrivere nel file di testo.

Per la selezione e la misurazione della spline risultante, il codice che avevi scritto è corretto, anche se meno dinamico, infatti
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
boolstatus = swModel.Extension.SelectByID2("Spline" & vID(1) & "@" & MySketchName, "EXTSKETCHSEGMENT", -2.26303320559162, 0.274955752667652, 0, True, 0, Nothing, 0)
Debug.Print "Spline" & vID(1) & "@" & MySketchName
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ti permette di selezionare la spline, ma non è detto che domani tu non abbia bisogno di aggiungere altre curve al tuo schizzo, dovendo implementare la tua selezione con altri SelectBiID2.
La strada più flessibile è quella della scansione delle entità, anche se in fase di creazione del codice sappiamo entrambi che non è la più veloce.

Ottimo lavoro comunque, e ....mi piacerebbe, se possibile e se posso chiedere, vedere un piccolo video della mini fresa in movimento...mi piacciono queste cose.

Buona giornata a tutti
 

alxG88

Utente Junior
Professione: Ingegnere Meccanico
Software: SolidWorks, Solid Edge, Inventor, Autocad
Regione: Emilia Romagna
#80
mi piacerebbe, se possibile e se posso chiedere, vedere un piccolo video della mini fresa in movimento...mi piacciono queste cose.
Certamente!Al momento non ho ancora testato questa macro sulla fresa, ma entro 15/20 giorni dovrei iniziare a fare le prove pratiche, quindi non appena riuscirò a farle compiere qualche piccola lavorazione farò un video e te lo farò vedere!!...

Ciao e a presto