MACRO SOLIDWORKS - inserisci blocco in Drawing

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:

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
 

jenuary

Utente Senior
professione: Progettista e Programmatore VB.Net
software: Solidworks
regione: Veneto
Ciao, forse ho letto in fretta e non ho capito bene dove sta la necessità. La macro funziona ma non posiziona il blocco dove vuoi tu mi sembra di capire.
Lo zero della tavola è sempre in basso a sinistra come hai detto bene, pertanto se per esempio vuoi il blocco sempre sopra al cartiglio (che si trova a destra), ad ogni formato (A4,A3,A2,A1,A0) la coordinata X di posizionamento cambia di conseguenza.
Ad inizio macro vedo che vengono ricavate le dimensioni del foglio, quindi il posizionamento del blocco sarà
X=Lunghezza foglio - delta di posizionamento rispetto la destra del foglio
Da vedere però se il fattor scala del foglio incide sul posizionamento perchè non ricordo, in caso si ricava il fattore scala che poi servirà per dividere o moltiplicare X.

@meccanicamg prova a vedere se questo approfondimento ti può aiutare, se per caso ho interpretato male la tua richiesta dimmelo e vediamo il da farsi.
 

meccanicamg

Utente Senior
professione: Mechanical engineer manager
software: SolidWorks, FreeCAD, NanoCAD5, Me10, Excel, LibreOffice
regione: Lombardia
Ciao. Quello che tu hai detto è quello che già ho scritto io.

Il problema è che il puntino di schizzo lo posiziona giusto, quindi le coordinate in funzione dei formati sono ok.

Invece il blocco non lo sposta in nessun modo....invece lo deve agganciare alle coordinate del puntino.

È questo che non va.
 

pose63

Utente Junior
professione: Tecnico
software: SolidWorks 2022 OfficePro sp5.0 EPDM Win11 Pro NVidia RTX 2000 ADA Generation
regione: Veneto
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:
Ciao,
leggermente modificata ma funziona.
 

Allegati

  • MacroInsertBlock.zip
    16 KB · Views : 6

jenuary

Utente Senior
professione: Progettista e Programmatore VB.Net
software: Solidworks
regione: Veneto
Ciao ho testato la macro, ma in effetti non sposta il blocco dopo l'inserimento. Il blocco viene sempre e comunque importato in X0,Y0, successivamente quando si va a fare lo spostamento non lo sposta secondo il punto.
Facendo il Debug non ho ancora capito il perchè, il codice sembra corretto così come scritto.
 

meccanicamg

Utente Senior
professione: Mechanical engineer manager
software: SolidWorks, FreeCAD, NanoCAD5, Me10, Excel, LibreOffice
regione: Lombardia
Scusatemi ma non ho visto i tre post ultimi.....come ho fatto a non vedere nemmeno le notifiche?
Domani la provo e poi vi fornisco feedback.
In questo mese ho provato altri modi per inserire il blocco ma senza successo ed essendo pochi file ho fatto a mano ...ma ora ho da processare molti files.
Perdonami ancora.
 

meccanicamg

Utente Senior
professione: Mechanical engineer manager
software: SolidWorks, FreeCAD, NanoCAD5, Me10, Excel, LibreOffice
regione: Lombardia
Funziona perfettamente. Grazie
 

meccanicamg

Utente Senior
professione: Mechanical engineer manager
software: SolidWorks, FreeCAD, NanoCAD5, Me10, Excel, LibreOffice
regione: Lombardia
L'unica cosa che non ho compreso è il messaggio che dice se vuoi inserire l'istanza del blocco SI/NO. Indipendentemente da cosa premo inserisce il blocco.
Ovviamente lo chiede solo una volta.
@pose63 potresti cortesemente spiegarmi cosa cambia?
 

pose63

Utente Junior
professione: Tecnico
software: SolidWorks 2022 OfficePro sp5.0 EPDM Win11 Pro NVidia RTX 2000 ADA Generation
regione: Veneto
L'unica cosa che non ho compreso è il messaggio che dice se vuoi inserire l'istanza del blocco SI/NO. Indipendentemente da cosa premo inserisce il blocco.
Ovviamente lo chiede solo una volta.
@pose63 potresti cortesemente spiegarmi cosa cambia?
non cambia nulla, c'è un primo comando senza messaggio che inserisce il blocco posizionato nelle coordinate desiderate, successivamente per inserire altre istanze del blocco viene attivato il messaggio.
 

meccanicamg

Utente Senior
professione: Mechanical engineer manager
software: SolidWorks, FreeCAD, NanoCAD5, Me10, Excel, LibreOffice
regione: Lombardia
Ok, grazie.
Ho notate che se si smrisponde Si ne mette due sovrapposti. Se metti No ne fa uno solo.
 

pose63

Utente Junior
professione: Tecnico
software: SolidWorks 2022 OfficePro sp5.0 EPDM Win11 Pro NVidia RTX 2000 ADA Generation
regione: Veneto
Ok, grazie.
Ho notate che se si smrisponde Si ne mette due sovrapposti. Se metti No ne fa uno solo.
utilizza le coordinate del primo blocco inserito, se non ti interessa inserire ulteriori istanza elimina le righe del codice

Dim resbox As VbMsgBoxResult

resbox = MsgBox("Vuoi inserire una istanza del blocco?", vbYesNo)

If resbox = vbYes Then

' 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

End If
 

meccanicamg

Utente Senior
professione: Mechanical engineer manager
software: SolidWorks, FreeCAD, NanoCAD5, Me10, Excel, LibreOffice
regione: Lombardia
utilizza le coordinate del primo blocco inserito, se non ti interessa inserire ulteriori istanza elimina le righe del codice

Dim resbox As VbMsgBoxResult

resbox = MsgBox("Vuoi inserire una istanza del blocco?", vbYesNo)

If resbox = vbYes Then

' 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

End If
Grazie mille
 

Statistiche forum

Discussioni
59,306
Messaggi
505,268
Utenti registrati
110,816
Ultimo utente registrato
emicas

Staff online

Top