Bonjour,
Après l'ouverture d'un plan, je souhaiterais réalisé plusieurs étapes suivantes:
1- Vérifier le format du plan (A4H, A3H...)
2-Suivant le format de la feuille ajouter une annotation (avec texte en rouge et case rectangulaire autour) avec des coordonnées différentes suivant le format
3-Boucler sur la feuille suivante.
Pour l'instant j'arrive à créer la note dans une feuille mais en noir sans case et sans cadre rectangulaire autour et je souhaiterais donc de l'aide pour cette 1ère modification:
A-) Modifier le texte en rouge et case rectangulaire autour
B-)Un exemple ou les fonction à utiliser pour lancer mon code suivant le format de la feuille
C-) un exemple qui boucle sur plusieurs feuilles
Avec ses différents éléments j'espère enfin pouvoir réalisé cette macro malgré mon niveau débutant en VBA.
Mon code très simpliste à ce jour:
Option Explicit
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim str As String
' Constant enumerators
Const swDocPART = 1
Const swDocASSEMBLY = 2
Const swDocDRAWING = 3
Set swApp = CreateObject("SldWorks.Application")
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
' If no model currently loaded, then exit
Exit Sub
End If
' Determine the document type
' If the document is not a drawing, then send a message to the user
If (swModel.GetType <> swDocDRAWING) Then
swApp.SendMsgToUser ("Macro only used for drawings")
Exit Sub
End If
' Compose text string with carriage return
str = "Traçabilité" + Chr(10) + "Matière"
' Insert note at (x=0.138m,y=0.285m) on the sheet
swModel.CreateText str, 0.138, 0.285, 0.5, 0.005, 0
End Sub
Merci d'avance pour toutes les contributions qui m'aideront à avancer sur ce sujet.
Je me répond tout seul pour la boucle:
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim str As String
'i = 0
' Constant enumerators
Const swDocPART = 1
Const swDocASSEMBLY = 2
Const swDocDRAWING = 3
Set swApp = CreateObject("SldWorks.Application")
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
' If no model currently loaded, then exit
Exit Sub
End If
' Determine the document type
' If the document is not a drawing, then send a message to the user
If (swModel.GetType <> swDocDRAWING) Then
'swApp.SendMsgToUser ("Utiliser cette macro uniquement pour une MEP")
MsgBox "Utiliser cette macro uniquement pour une MEP.", vbCritical, "Mauvais type de document ouverth"
Exit Sub
End If
' Compose text string with carriage return
str = "Traçabilité" + Chr(10) + "Matière"
'SD modif on boucle sur chaque feuille
Set Document = swApp.ActiveDoc ' On récupère le document d'ouvert
Set swSht = Document.GetCurrentSheet
sThisSheet = swSht.GetName
iSheets = Document.GetSheetCount
sSheetNames = Document.GetSheetNames
For i = 0 To iSheets - 1
MsgBox i
If sSheetNames(i) <> sThisSheet Then
Document.ActivateSheet sSheetNames(i)
End If
' Insert note at (x=0.138m,y=0.285m) on the sheet
swModel.CreateText str, 0.138, 0.285, 0.5, 0.005, 0
Next i
End Sub
Reste encore le format à vérifier et la mise en forme de la note (couleur + case)
Pour la couleur, il me semble qu'il faut mettre l'objet dans un calque spécifique (en tout cas, c'est ce que j'ai fait quand j'en eu besoin).
Quand j'ai besoin de faire une macro, souvent je passe par l'enregistreur, ça permet de récupérer facilement des bouts de code sur les opérations de base Par exemple pour créer la case autour du texte, si la case fait partie de l'annotation (rubrique contour).
stefbeno J'ai essayé l'enregistreur pour créer une note avec Texte + couleur + cadre et résultat: une macro vide...
A moins que mon enregistreur déconne cela n'a malheureusement pas été très probant...
Mais merci quand même pour le conseil.
Bonjour,
Tu dois pouvoir t'aider du code ci-dessous pour faire ce que tu souhaites (attention, je ne me suis pas occupé de la gestion des erreurs), je ne change que la position du texte suivant le format mais tu peux aussi changer le texte, pour cela tu définis une variable string que tu rempli avec le texte voulu dans chaque "Case" puis tu transfert cette variable dans la fonction "insertionNote" à la place du texte en dur. Je n'ai pas commenté le code mais je sais que tu vas savoir le lire.
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSketchBlockDef As SldWorks.SketchBlockDefinition
Dim swBlockInst As SldWorks.SketchBlockInstance
Dim swSketchMgr As SldWorks.SketchManager
Dim swModelDocExt As SldWorks.ModelDocExtension
Dim swSheet As SldWorks.Sheet
Dim mySheet As SldWorks.Sheet
Dim paperSize As swDwgPaperSizes_e
Dim myBlockDefinition As Object
Dim vSheetNames As Variant
Dim bRet As Boolean
Dim i As Long
Dim swMathUtil As SldWorks.MathUtility
Dim swMathPoint As SldWorks.MathPoint
Dim width As Double
Dim height As Double
Dim nPt(2) As Double
Dim vPt As Variant
Dim posX As Double
Dim posY As Double
Dim nomDuBloc As String
Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swSheet = swDraw.GetCurrentSheet
vSheetNames = swDraw.GetSheetNames
For i = 0 To UBound(vSheetNames)
swDraw.ActivateSheet (vSheetNames(i))
Set mySheet = swDraw.GetCurrentSheet
paperSize = mySheet.GetSize(width, height)
Select Case paperSize
Case 0
posX = 0.038
posY = 0.285
Case 1
posX = 0.138
posY = 0.285
Case 2
posX = 0.038
posY = 0.185
Case 3
posX = 0.038
posY = 0.105
Case 4
posX = 0.008
posY = 0.2
Case 5
posX = 0.008
posY = 0.15
Case 6
posX = 0.008
posY = 0.007
Case 7
posX = 0.06
posY = 0.18
Case 8
posX = 0.23
posY = 0.03
'Ainsi de suite jusqu'à Case 12
'...
Case Else
Exit Sub
End Select
insertionNote swModel, posX, posY, "Mon test d'insertion d'une note"
swDraw.GraphicsRedraw2
Next i
swDraw.ActivateSheet (swSheet.GetName)
End Sub
Sub insertionNote(swModel As ModelDoc2, X As Double, Y As Double, monTexte As String)
Dim myNote As Note
Dim myAnnotation As Annotation
Dim boolstatus As Boolean
Set myNote = swModel.insertNote(monTexte)
If Not myNote Is Nothing Then
boolstatus = myNote.SetBalloon(4, 0)
Set myAnnotation = myNote.GetAnnotation()
If Not myAnnotation Is Nothing Then
boolstatus = myAnnotation.SetPosition(X, Y, 0)
End If
End If
ListeCalque swDraw, myAnnotation
End Sub
Sub ListeCalque(swModel As DrawingDoc, myAnnotation As Annotation)
Dim swLayerMgr As SldWorks.LayerMgr
Dim vLayerArr As Variant
Dim vLayer As Variant
Dim swLayer As SldWorks.Layer
Dim noteLayer As Integer
Dim layerExist As Boolean
Set swLayerMgr = swModel.GetLayerManager
vLayerArr = swLayerMgr.GetLayerList
For Each vLayer In vLayerArr
Set swLayer = swLayerMgr.GetLayer(vLayer)
If swLayer.Name = "NotesRouge" Then
layerExist = True
Else
layerExist = False
End If
Next
If layerExist = True Then
myAnnotation.Layer = "NotesRouge"
Else
noteLayer = swLayerMgr.AddLayer("NotesRouge", "Calque pour les notes rouge", RGB(255, 0, 0), 0, 0)
myAnnotation.Layer = "NotesRouge"
End If
End Sub
Cordialement,
2 « J'aime »
Merci d.roger une fois de plus!
J'arrive à la fin de cette macro mais il reste 2 petits soucis à régler:
- je souhaite grossir la police de texte de la note, et je ne trouve rien dans l'aide permettant de grossir cette note (http://help.solidworks.com/2018/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.inote_members.html).
A moins que je passe à côté...
- Enfin pour la couleur cela ne fonctionne pas. il me créer bien le calque avec la couleur mais l'annotation prends la couleurs gris...
Et en mode création annotation manuel, dans le bon calque (rouge) l'annotation est rouge mais passe en gris à la validation. Je pense que cela vient plus d'une option SW mais je ne trouve pas laquelle.
Sinon la macro fonctionne parfaitement et j'ai réussi à en comprendre la grande majorité et même à la modifier avec suppression des "case" j'ai juste appliquer une soustraction de la position X et Y par rapport à la taille de la feuille ce qui me place l'annotation en haut à gauche de chaque feuille comme je le voulais et plus simplement.
Bonjour,
Pour la taille de police de la note tu peux remplacer le Sub insertionNote par celui-ci :
Sub insertionNote(swModel As ModelDoc2, X As Double, Y As Double, monBloc As String)
Dim myNote As Note
Dim myAnnotation As Annotation
Dim swTextFormat As SldWorks.TextFormat
Dim boolstatus As Boolean
Set myNote = swModel.insertNote(monBloc)
If Not myNote Is Nothing Then
boolstatus = myNote.SetBalloon(4, 0)
Set myAnnotation = myNote.GetAnnotation()
If Not myAnnotation Is Nothing Then
boolstatus = myAnnotation.SetPosition(X, Y, 0)
Set swTextFormat = myAnnotation.GetTextFormat(1)
swTextFormat.CharHeight = 0.02
swTextFormat.Bold = True
swTextFormat.Italic = True
boolstatus = myAnnotation.SetTextFormat(1, False, swTextFormat)
End If
End If
ListeCalque swDraw, myAnnotation
End Sub
Cela permet de mettre une taille de texte (ici 0.02 m) et aussi de mettre en italique et en gras si tu veux, d'autres options ICI.
Pour la couleur, cela vient effectivement probablement d'une option de SW mais je n'ai pas réussi à trouver laquelle pour le moment, sur mon PC la couleur reste bien en rouge...
Cordialement,
1 « J'aime »
Merci beaucoup d.roger pour ton aide précieuse sur le sujet.
J'en étais arrivé à insérer le texte de mon côté avec les coordonnées désiré mais sans la case, la couleur et la dimension de police.
Et de plus mon code était beaucoup moins optimisé.
Pour la couleur qui n'est pas bonne je fais une demande auprès de la hotline et je verrais pourquoi cela ne fonctionne pas car il s'agit clairement d'une option quelque part puisque manuellement sans la macro cela ne fonctionne pas mieux.
Voici le code finale sans la gestion des erreures qui n'est pas forcément utile puisque lancé depuis intégration (sur une MEP uniquement)
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSketchBlockDef As SldWorks.SketchBlockDefinition
Dim swBlockInst As SldWorks.SketchBlockInstance
Dim swSketchMgr As SldWorks.SketchManager
Dim swModelDocExt As SldWorks.ModelDocExtension
Dim swSheet As SldWorks.Sheet
Dim mySheet As SldWorks.Sheet
Dim paperSize As swDwgPaperSizes_e
Dim myBlockDefinition As Object
Dim vSheetNames As Variant
Dim bRet As Boolean
Dim i As Long
Dim swMathUtil As SldWorks.MathUtility
Dim swMathPoint As SldWorks.MathPoint
Dim width As Double
Dim height As Double
Dim nPt(2) As Double
Dim vPt As Variant
Dim posX As Double
Dim posY As Double
Dim nomDuBloc As String
Dim swTextFormat As SldWorks.TextFormat
Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swSheet = swDraw.GetCurrentSheet
vSheetNames = swDraw.GetSheetNames
For i = 0 To UBound(vSheetNames)
'modifier ici le décalage en X et Y par rapport à l'angle en haut à gauche
posX = 0.11
posY = 0.013
swDraw.ActivateSheet (vSheetNames(i))
Set mySheet = swDraw.GetCurrentSheet
paperSize = mySheet.GetSize(width, height)
posX = width - posX
posY = height - posY
insertionNote swModel, posX, posY, "Traçabilité matière"
swDraw.GraphicsRedraw2
Next i
swDraw.ActivateSheet (swSheet.GetName)
End Sub
Sub insertionNote(swModel As ModelDoc2, X As Double, Y As Double, monBloc As String)
Dim myNote As Note
Dim myAnnotation As Annotation
Dim swTextFormat As SldWorks.TextFormat
Dim boolstatus As Boolean
Set myNote = swModel.InsertNote(monBloc)
If Not myNote Is Nothing Then
boolstatus = myNote.SetBalloon(4, 0)
Set myAnnotation = myNote.GetAnnotation()
If Not myAnnotation Is Nothing Then
boolstatus = myAnnotation.SetPosition(X, Y, 0)
Set swTextFormat = myAnnotation.GetTextFormat(1)
swTextFormat.CharHeight = 0.008
swTextFormat.Bold = True
swTextFormat.Italic = True
boolstatus = myAnnotation.SetTextFormat(1, False, swTextFormat)
End If
End If
ListeCalque swDraw, myAnnotation
End Sub
Sub ListeCalque(swModel As DrawingDoc, myAnnotation As Annotation)
Dim swLayerMgr As SldWorks.LayerMgr
Dim vLayerArr As Variant
Dim vLayer As Variant
Dim swLayer As SldWorks.Layer
Dim noteLayer As Integer
Dim layerExist As Boolean
Set swLayerMgr = swModel.GetLayerManager
vLayerArr = swLayerMgr.GetLayerList
For Each vLayer In vLayerArr
Set swLayer = swLayerMgr.GetLayer(vLayer)
If swLayer.Name = "NotesRouge" Then
layerExist = True
Else
layerExist = False
End If
Next
If layerExist = True Then
myAnnotation.Layer = "NotesRouge"
Else
noteLayer = swLayerMgr.AddLayer("NotesRouge", "Calque pour les notes rouge", RGB(255, 0, 0), 0, 0)
myAnnotation.Layer = "NotesRouge"
End If
End Sub
Merci beaucoup
2 « J'aime »
Bonjour,
Pour la couleur, vérifie que tu n'aie pas le bouton de cocher dans la barre d'outils "Format de ligne", voir ICI.
Cordialement,
1 « J'aime »
Non elle n'est pas activé, apparemment cela viendrait plus de définir la couleur de la ligne qui n'est pas sur Par défaut (case non coché ) et du coup il prends du gris.
A confirmer, car je n'ai pas eu le temps de creuser plus que ça.
Quoi qu'il en soit la couleur est moins importante que le reste je valide donc ta réponse la plus pertinente.
Bonjour,
J'ai le même problème pour les couleurs que sbadenis, as tu résoluts le problème?
Non pas résolu ce soucis.
J'ai du lancé l'affaire sans la couleur faute de temps et depuis je n'ai pas réussi à me pencher sur le problème.
Le souci ne vient pas de la macro puisque j'arrive à le reproduire à la mano.
Quand je tape mon annotation dans le calque rouge est est rouge et dès que je la valide elle passe en gris...
Par contre si tu trouve poste moi la solution, je suis preneur.