Modifier une note sur un fond de plan Solidworks avec une macro

Bonjour j'aimerais modifier une note déjà existant dans le fond de plan afin de modifier la taille de Police

Jj'ai essayer l'enregistrement automatique de macro mais cela ne marche pas.J'arrive à faire fonctionner la macro seulement si j'édite le fond de plan en manuel et que je la lance.

Alors comment faire pour programmer la macro afin qu'elle aille travail directement sur le fond de plan ?

Salut,

Tu dois modifier ton fichier de fond de plan (.slddrt) une seule fois et le recharger ensuite dans chaque MEP.

Voir cet exemple qui fais ce que tu souhaites : http://help.solidworks.com/2017/english/api/sldworksapi/modify_and_reload_sheet_format_template_example_vb.htm

3 « J'aime »

Pour editer le fond de plan il faut utiliser la methode EditTemplate cf ce lien d'exemple http://help.solidworks.com/2016/english/api/sldworksapi/Place_Note_Behind_Drawing_Sheet_Example_VB.htm

1 « J'aime »

J'ai eu la même chose à faire.

Pour un changement de cartouche suite à une mise à jour des ems fonds de plans.

 

J'ai fait comme le dit @Remrem, J'ai écrasé l'ancien fond de plan par le nouveau puis à chaque ouverture sois cliquer sur recharger soit avec une macro comme j'ai fait.

Alors pour la macro, je ne me suis pas cassé la tête :

-Lancement de l'enregistrement de la macro

-clic droit sur "feuille 1" cliquer sur recharger puis faire OK

- arreter l'enregistrement de la macro et créer un icône pour la lancer rapidement.


fdp.jpg

Bonjour si ça peut aider, ci-dessous un bout de code qui permet de recharger un fond de plan et ce quelque soit le format initial du plan (limité à A4, A3, A2, A1). Un seul clic à effectuer une fois associé à un bouton.

Option Explicit
Public Enum swDocumentTypes_e
    swDocNONE = 0       ' Used to be TYPE_NONE

    swDocPART = 1       ' Used to be TYPE_PART

    swDocASSEMBLY = 2   ' Used to be TYPE_ASSEMBLY

    swDocDRAWING = 3    ' Used to be TYPE_DRAWING
End Enum

Dim swSheet         As SldWorks.Sheet
Dim swApp           As Object
Dim swModel         As SldWorks.ModelDoc2
Dim swDraw          As SldWorks.DrawingDoc
Dim swModelDocExt   As ModelDocExtension
Dim sTemplate       As String
Dim stemplatepath   As String
Dim Count           As Integer
Dim vSheetNameArr   As Variant
Dim vSheetName      As Variant
Dim vSheetProps     As Variant
Dim bRet            As Boolean


'Constantes
Const cDirTemplate = "..." 'Mettre le chemin d'accès aux fonds de plans sous ce format: C:\xxx\xxx\
Const cTemplateA4 = "A4.slddrt" 'A renommer si vos templates s'appelent autrement
Const cTemplateA3 = "A3.slddrt"
Const cTemplateA2 = "A2.slddrt"
Const cTemplateA1 = "A1.slddrt"


Sub main()

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
    MsgBox ("Pas de document ouvert")
    Else
        If swModel.GetType <> 3 Then
            MsgBox ("Il ne s'agît pas d'une mise en plan")
        Else
        Set swDraw = swModel
                Set swModelDocExt = swModel.Extension
        vSheetNameArr = swDraw.GetSheetNames
                For Each vSheetName In vSheetNameArr
                        bRet = swDraw.ActivateSheet(vSheetName): Debug.Assert bRet
                        Set swSheet = swDraw.GetCurrentSheet
                        vSheetProps = swSheet.GetProperties
                        If vSheetProps(0) = "7" Then 'A4
                            stemplatepath = cDirTemplate & cTemplateA3
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            stemplatepath = cDirTemplate & cTemplateA4
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            swModel.ForceRebuild3 (False)
                        ElseIf vSheetProps(0) = "8" Then 'A3
                            stemplatepath = cDirTemplate & cTemplateA4
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            stemplatepath = cDirTemplate & cTemplateA3
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            swModel.ForceRebuild3 (False) 'A2
                        ElseIf vSheetProps(0) = "9" Then
                            stemplatepath = cDirTemplate & cTemplateA4
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            stemplatepath = cDirTemplate & cTemplateA2
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            swModel.ForceRebuild3 (False)
                        ElseIf vSheetProps(0) = "10" Then 'A1
                            stemplatepath = cDirTemplate & cTemplateA4
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            stemplatepath = cDirTemplate & cTemplateA1
                            bRet = swDraw.SetupSheet4(swSheet.GetName, vSheetProps(0), 12, vSheetProps(2), vSheetProps(3), True, stemplatepath, 0#, 0#, "")
                            swModel.ForceRebuild3 (False)
            ElseIf vSheetProps(0) <> "7" Then 'Pour les formats un peu exotiques non gérés
                            If vSheetProps(0) <> "8" Then
                            If vSheetProps(0) <> "9" Then
                            If vSheetProps(0) <> "10" Then
                                MsgBox "Le fond de plan ne correspond à aucune trame connue" & vbCrLf & "Aucun changement appliqué"
                                Exit Sub
                            End If: End If: End If
                        End If
                    Next
    End If
End If
swModel.Save2 (True) 'Sauvegarde des changements
End Sub

 

1 « J'aime »

Cyril.f

pour ta macro, il fait quoi pour les questions suivantes, quand on recharge un FDP :

"renommer blocs existant oui / non ?"

"Attention des valeurs dans fonds de plans forcées / modifiées ?"

 

Bonjour,

Elle ne fait rien d'autre que recharger un fond de plan (en changeant de format car le simple recharger par le même nom de fichier slddrt ne fonctionne pas). S'il y a des blocs dans le fond de plan ajoutés par la suite ils sont supprimés (faut rajouter des traitements mais pas forcément simple à écrire puisque dépend des paramètres de chacun).

S'il ya des choses forcées faut récupérer les valeurs pour les réappliquer.

Donc en conclusion, ce bout de macro est simpliste et n'est adapté que pour des choses classiques (tous champs mappés avec une propriétés SW et aucune spécificté ajoutée dans le fond de plan). J'ai un code beaucoup plus complexe mais celui-ci est spécifique au besoin de ma société et je ne peux pas le partager simplement (très peu de commentaires et difficilement compréhensible sans connaissance de l'API SW et de vba).

J'avoue sinon que ma réponse est à coté de la demande et plus en réponse à Bart qui, je trouve, a beaucoup de boutons personnalisés pour faire la même action.

Du coup, pour scanner les notes du fond de plan c'est plus ce bout de code:

    Set swView = swDraw.GetFirstView 'Fond de plan
    Set swNote = swView.GetFirstNote
    swModel.ClearSelection2 (True)
    Do While Not swNote Is Nothing
        If swNote.GetName = "..." Then 'Trouver le nom de l'objet si tout le temps le même sinon utiliser swNote.GetText et jouer avec le contenu puis appliquer une mise en forme        
         End If
        Set swNote = swNote.GetNext
    Loop

 

1 « J'aime »

Bonjour,

Le bout de code suivant a pour effet de modifier la hauteur de texte en la multipliant par 5 de toutes les notes dont le texte est égal à TexteNote. C'est du langage CSharp, je te laisse le traduire et l'adapter à ton besoin.

SldWorks swApp;
DrawingDoc swDraw;
long j;
long count;
SolidWorks.Interop.sldworks.View swView;

swDraw = (DrawingDoc)swApp.ActiveDoc;

swView = (SolidWorks.Interop.sldworks.View)swDraw.GetFirstView();

while ((swView != null))
{
    count = swView.GetNoteCount();
    if (count > 0)
    {
        Object[] Notes = (Object[])swView.GetNotes();
        for (j = 0; j <= Notes.GetUpperBound(0); j++)
        {
            Note swNote;
            swNote = (Note)Notes[j];

            if (swNote.GetText() == "TexteNote")
            {
                swNote.SetHeight(swNote.GetHeight() * 5);
            }
        }
    }
    swView = (SolidWorks.Interop.sldworks.View)swView.GetNextView();
}

swDraw.ForceRebuild();

Cordialement,

Parfois, c'est plus simple d'enregistrer sa macro soi-même plutot que de passer par du codage ;) =)

1 « J'aime »

Bart☺ je suis à peu de chose prêt d'accord avec toi mais tout dépend quand même de l'ampleur du chantier qu'il y a à faire, le bout de code ci-dessus n'est qu'une infime partie d'un programme qui m'a permis de reprendre 48000 plans et là vaut mieux coder un peu.

Cordialement,

1 « J'aime »

Ah c'est sur que tout dépend du projet à traiter.

 

La tâche est-elle récurente ou pas.

Moi je m'en sert quand je mets mes cartouches à jour (modif de logo etc...)

Quand je reprends un ancien plan avec l'ancien cartouche, il me suffit de cliquer sur l'icône pour tout remettre au gout du jour =)

 

Sinon, MycadTools ne possède pas ce genre de choses?

Cyril.f , quand tu mets (en changeant de format car le simple recharger par le même nom de fichier slddrt ne fonctionne pas), tu peux essayer de recharger le format en mettant deux fois la même ligne car effectivement en une seule fois cela ne fonctionne pas, voici ce qu'il a fallu que je fasse sur mon prog équivalent (mais en c#) :

// On recharge le format (en 2 étapes sinon cela ne fonctionne pas)
bool boolstatus = false;
boolstatus = swDraw.SetupSheet5(feuilleName, (int)PaperSize, (int)TemplateIn, Scale1, Scale2, true, fichier2, larg, haut, "Par défaut", true);
boolstatus = swDraw.SetupSheet5(feuilleName, (int)PaperSize, (int)TemplateIn, Scale1, Scale2, true, fichier1, larg, haut, "Par défaut", true);

Cordialement,

2 « J'aime »

Bonjour

D'abord merci pour toutes vos réponses qui m'ont beaucoup aidé car je ne suis pas très bon en programmation VBA ^^'

Cette macro a pour but de travail sur un lot de 700 plans actuellement mais je souhaiterais que cela soit réutilisable à l'avenir.

 J'ai regardé avec Mycadtool/Intégration qui dois gérer le lancement de mes macros mais je ne trouve pas d'action liée au logiciel qui permet de modifier la taille de police.

Actuellement, j'arrive à programmer des boucles qui comptent le nombre de feuille puis le nombre de vue. Cependant quand j'essaie de renouveler l'opération pour les notes cela ne marche pas.

 


capture.jpg

Il semblerais qu'il faille que tu appel getnotescount avant

http://help.solidworks.com/2016/english/api/sldworksapi/SOLIDWORKS.Interop.sldworks~SOLIDWORKS.Interop.sldworks.ISketchBlockDefinition~GetNoteCount.html

 

EDIT voir egalement http://help.solidworks.com/2016/english/api/sldworksapi/get_views_and_notes_example_vb.htm

Bonjour,

Si plusieurs feuilles alors il faut 1 boucle sur les feuilles qui comprend 1 boucle sur les vues qui comprend 1 boucle sur les notes qui comprend la modification de la hauteur du texte de la note. Voir le fichier joint pour voir ce que ça donne en C# par exemple.          

Cordialement,


exemple_modif_ht_texte_note.txt
1 « J'aime »

Cependant je ne comprend pas bien la difference en vba de annotation et note

Annotation correspont t'il a la programation de l'onglet ?

car j'ai l'impression de devoir dire que je vais chercher une annotation puis une note :/

 

Bonsoir,

Une Note est un sous-type de Annotation, voir http://help.solidworks.com/2013/English/api/sldworksapi/Get_Annotation_Object_Example_VB.htm pour macro de test..

Cordialement,

For i = 0 To UBound(vSheets)                                                'boucle feuille
        vViews = vSheets(i)
       
        For j = 1 To UBound(vViews)                                             'boucle vue
        Set swView = vViews(j)


        vNote = swView.GetNotes
        vAnnotation = swView.GetAnnotations
           
                For k = 0 To UBound(vNote)                                      'boucle sur les notes
                Set swNote = vNote(k)


                Next
               
                For c = 0 To UBound(vAnnotation)
                Set swAnnotation = vAnnotation(c)
               
                Next