meccanicamg
Utente Senior
professione: Mechanical engineer manager
software: SolidWorks, FreeCAD, NanoCAD5, Me10, Excel, LibreOffice
regione: Lombardia
Buonasera a tutti.
Ho fatto qualche programma nella mia vita in Tutto pascal, C++, qualche lisp e qualcosa in VBA.
Mi sto aiutando dall'IA di Copilot perché non conosco le API di SOLIDWORKS e sto cercando di fare una macro che metta un blocco (formato da dei testi che puntano a delle variabili della parte o dell'assieme) in un punto specifico del foglio.
Sto usando SOLIDWORKS 2023.
Allo stato attuale funziona correttamente il -90 e -100mm da destra e da sotto indipendente dal formato del foglio. Risulta in una zona che poi definirò meglio io come misure ma è sopra al cartiglio.
Il blocco viene posizionato sempre dal codice VBA in coordinate 0,0 cioè in basso a sinistra e non trovo maniera di spostare il blocco sul punto dello schizzo o comunque, a poterlo fare, inserire direttamente alle coordinate usando il suo punto di inserimento del blocco stesso.
Qualcuno ha una macro similare da condividere per capire come fare? C'è @jenuary che ha tempo e voglia di darmi una mano tra i suoi mille lavori?
Di seguito la macro:
Ho fatto qualche programma nella mia vita in Tutto pascal, C++, qualche lisp e qualcosa in VBA.
Mi sto aiutando dall'IA di Copilot perché non conosco le API di SOLIDWORKS e sto cercando di fare una macro che metta un blocco (formato da dei testi che puntano a delle variabili della parte o dell'assieme) in un punto specifico del foglio.
Sto usando SOLIDWORKS 2023.
Allo stato attuale funziona correttamente il -90 e -100mm da destra e da sotto indipendente dal formato del foglio. Risulta in una zona che poi definirò meglio io come misure ma è sopra al cartiglio.
Il blocco viene posizionato sempre dal codice VBA in coordinate 0,0 cioè in basso a sinistra e non trovo maniera di spostare il blocco sul punto dello schizzo o comunque, a poterlo fare, inserire direttamente alle coordinate usando il suo punto di inserimento del blocco stesso.
Qualcuno ha una macro similare da condividere per capire come fare? C'è @jenuary che ha tempo e voglia di darmi una mano tra i suoi mille lavori?
Di seguito la macro:
Dim swApp As Object
Dim Part As Object
Dim swDraw As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Dim blockInstance As Object
Dim blockDefinition As Object
Dim nPt(2) As Double
Dim vPt As Variant
Dim blockName As String
Sub main()
' Imposta swApp sull'applicazione SolidWorks attiva
Set swApp = Application.SldWorks
Debug.Print "Applicazione SolidWorks impostata."
' Imposta Part sul documento attivo
Set Part = swApp.ActiveDoc
If Part Is Nothing Then
Debug.Print "Nessun documento attivo."
Exit Sub
End If
Debug.Print "Documento attivo impostato."
' Ottieni il foglio corrente
Set swDraw = Part
Dim sheet As Object
Set sheet = swDraw.GetCurrentSheet
If sheet Is Nothing Then
Debug.Print "Nessun foglio corrente."
Exit Sub
End If
Debug.Print "Foglio corrente impostato."
' Ottieni le dimensioni del foglio utilizzando GetSize
Dim sheetWidth As Double
Dim sheetHeight As Double
boolstatus = sheet.GetSize(sheetWidth, sheetHeight)
If Not boolstatus Then
Debug.Print "Impossibile ottenere le dimensioni del foglio."
Exit Sub
End If
Debug.Print "Dimensioni del foglio ottenute: Larghezza = " & sheetWidth 1000 & " mm, Altezza = " & sheetHeight 1000 & " mm."
' Converti le dimensioni del foglio in mm
sheetWidth = sheetWidth * 1000
sheetHeight = sheetHeight * 1000
' Definisci le coordinate dove vuoi inserire il blocco (100 mm dal bordo destro e 90 mm dal bordo inferiore)
Dim x As Double, y As Double
x = sheetWidth - 100 ' 100 mm dal bordo destro
y = 90 ' 90 mm dal bordo inferiore
Debug.Print "Coordinate definite: X = " & x & " mm, Y = " & y & " mm."
' Crea un punto alle coordinate per verificarle
Dim skMgr As Object
Set skMgr = Part.SketchManager
skMgr.InsertSketch True
Dim point As Object
Set point = skMgr.CreatePoint(x / 1000, y / 1000, 0)
If point Is Nothing Then
Debug.Print "Impossibile creare il punto di verifica."
Exit Sub
End If
skMgr.InsertSketch False
Debug.Print "Punto di verifica creato alle coordinate: X = " & x / 1000 & " m, Y = " & y / 1000 & " m."
' Carica la definizione del blocco
Set blockDefinition = Part.SketchManager.MakeSketchBlockFromFile(Nothing, _
"C:\prova.SLDBLK", False, 1, 0)
If blockDefinition Is Nothing Then
Debug.Print "Definizione del blocco non caricata."
Exit Sub
End If
Debug.Print "Definizione del blocco caricata."
' Definisci il punto di inserimento
nPt(0) = x / 1000
nPt(1) = y / 1000
nPt(2) = 0#
vPt = nPt
Set swMathUtil = swApp.GetMathUtility
Set swMathPoint = swMathUtil.CreatePoint(vPt)
' Inserisci un'istanza della definizione del blocco
Set blockInstance = Part.SketchManager.InsertSketchBlockInstance(blockDefinition, swMathPoint, 1, 0)
If blockInstance Is Nothing Then
Debug.Print "Istanza del blocco non inserita."
Exit Sub
End If
blockName = blockInstance.Name
Debug.Print "Istanza del blocco inserita alle coordinate: X = " & x / 1000 & " m, Y = " & y / 1000 & " m."
' Aggiungi messaggi di debug per verificare la posizione iniziale del blocco
Debug.Print "Posizione iniziale del blocco: X = " & blockInstance.Position.x & ", Y = " & blockInstance.Position.y
' Imposta direttamente la posizione del blocco
nPt(0) = x / 1000
nPt(1) = y / 1000
nPt(2) = 0#
vPt = nPt
Set swMathPoint = swMathUtil.CreatePoint(vPt)
blockInstance.Position = swMathPoint
' Aggiungi messaggi di debug per verificare la posizione finale del blocco
Debug.Print "Posizione finale del blocco: X = " & blockInstance.Position.x & ", Y = " & blockInstance.Position.y
' Adatta la visualizzazione per verificare la posizione del blocco
swDraw.ViewZoomtofit2
Debug.Print "Visualizzazione adattata."
' Aggiorna il foglio per riflettere le modifiche
Part.GraphicsRedraw2
Debug.Print "Foglio aggiornato."
End Sub