Een notitie op een Solidworks-basiskaart bewerken met een macro

Hallo, ik wil graag een reeds bestaande notitie in de basiskaart wijzigen om de lettergrootte te wijzigen

Ik heb de automatische macro-opname geprobeerd, maar het werkt niet. Ik kan de macro alleen aan het werk krijgen als ik het achtergrondplan handmatig bewerk en start.

Dus hoe programmeer je de macro zodat deze direct op de basiskaart aan het werk gaat?

Hallo

U hoeft uw basismapbestand (.slddrt) slechts één keer te bewerken en vervolgens in elk MEP opnieuw te laden.

Zie dit voorbeeld dat doet wat je wilt: http://help.solidworks.com/2017/english/api/sldworksapi/modify_and_reload_sheet_format_template_example_vb.htm

3 likes

Om de basiskaart te bewerken moet je de EditTemplate methode gebruiken, zie deze voorbeeldlink http://help.solidworks.com/2016/english/api/sldworksapi/Place_Note_Behind_Drawing_Sheet_Example_VB.htm

1 like

Ik had hetzelfde te doen.

Voor een vervanging van de cartridge na een update van de ems-basiskaarten.

 

Ik deed wat @Remrem zegt, ik overschreef het oude achtergrondplan met het nieuwe en elke keer dat ik het opende, klik op opnieuw laden of met een macro zoals ik deed.

Dus voor de macro heb ik mijn hersens niet gepijnigd:

-Macro-opname start

-klik met de rechtermuisknop op "Blad 1", klik op herladen en druk vervolgens op OK

- Stop met het opnemen van de macro en maak een pictogram om deze snel te starten.


fdp.jpg

Hallo als het helpt, hieronder vindt u een codefragment waarmee u een basiskaart opnieuw kunt laden, ongeacht het oorspronkelijke formaat van het plan (beperkt tot A4, A3, A2, A1). Slechts één klik die eenmaal aan een knop is gekoppeld.

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 like

Cyril.f

voor uw macro, wat doet het voor de volgende vragen, wanneer u een FDP oplaadt:

"Bestaande blokken hernoemen ja / nee?"

"Let op waarden in achtergronden van geforceerde / gewijzigde plannen?"

 

Hallo

Het doet niets anders dan een basemap herladen (door het formaat te wijzigen omdat simpelweg herladen met dezelfde slddrt-bestandsnaam niet werkt). Als er blokken in de basiskaart zijn die later worden toegevoegd, worden ze verwijderd (je moet meer verwerking toevoegen, maar niet per se gemakkelijk te schrijven, omdat het afhangt van de parameters van elk blok).

Als er geforceerde dingen zijn, moet je de waarden terugkrijgen om ze opnieuw toe te passen.

Dus tot slot, dit stukje macro is simplistisch en is alleen geschikt voor klassieke dingen (alle velden zijn in kaart gebracht met een SW-eigenschap en geen specificiteit toegevoegd op de achtergrond). Ik heb een veel complexere code, maar deze is specifiek voor de behoeften van mijn bedrijf en ik kan deze niet eenvoudig delen (zeer weinig opmerkingen en moeilijk te begrijpen zonder kennis van de SW API en vba).

Ik geef toe dat mijn antwoord naast het verzoek staat en meer als reactie op Bart die, vind ik, veel aangepaste knoppen heeft om dezelfde actie uit te voeren.

Dus, om de noten van de basiskaart te scannen is het meer dit stukje 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 like

Hallo

Het volgende codefragment verandert de hoogte van de tekst door deze te vermenigvuldigen met 5 van alle notities met tekst die gelijk is aan TextNote. Het is CSharp-taal, ik laat het je vertalen en aanpassen aan je behoeften.

SldWorks swApp;
TekenDoc swDraw;
lange j;
lange telling;
SolidWorks.Interop.sldworks.View swView;

swDraw = (DrawingDoc)swApp.ActiveDoc;

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

terwijl ((swView != null))
{
    count = swView.GetNoteCount();
    als (tel > 0)
    {
        Object[] Notes = (Object[])swView.GetNotes();
        voor (j = 0; j <= Notes.GetUpperBound(0); j++)
        {
            Let op: swNote;
            swNote = (Opmerking)Opmerkingen[j];

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

swDraw.ForceRebuild();

Vriendelijke groeten

Soms is het gemakkelijker om je macro zelf op te nemen in plaats van te coderen ;) =)

1 like

☺ Bart Ik ben het vrijwel met je eens , maar het hangt allemaal af van de grootte van het project dat moet worden gedaan, het bovenstaande stukje code is slechts een klein onderdeel van een programma waarmee ik 48000 plannen kon nemen en nu is het beter om een beetje te coderen.

Vriendelijke groeten

1 like

Oh, het hangt natuurlijk allemaal af van het project dat moet worden aangepakt.

 

Is de taak terugkerend of niet?

Ik gebruik het wanneer ik mijn cartridges update (logo-wijziging enz...)

Als ik een oude foto maak met de oude cartridge, hoef ik alleen maar op het pictogram te klikken om alles up-to-date te brengen =)

 

Anders heeft MycadTools dit soort dingen niet?

Cyril.f , wanneer je (door het wijzigen van het formaat, omdat de eenvoudige herladen door dezelfde slddrt bestandsnaam niet werkt), kunt u proberen om het formaat opnieuw te laden door het plaatsen van dezelfde regel twee keer, want inderdaad in één keer werkt het niet, hier is wat ik moest doen op mijn equivalente programma (maar in c#):

We herladen het formaat (in 2 stappen anders werkt het niet)
bool boolstatus = onwaar;
boolstatus = swDraw. SetupSheet5(sheetName, (int)PaperSize, (int)TemplateIn, Scale1, Scale2, true, file2, width, top, "Default", true);
boolstatus = swDraw. SetupSheet5(sheetName, (int)PaperSize, (int)TemplateIn, Scale1, Scale2, true, file1, width, top, "Default", true);

Vriendelijke groeten

2 likes

Hallo

Allereerst bedankt voor al je antwoorden die me veel hebben geholpen, want ik ben niet erg goed in VBA-programmeren^^'

Deze macro is bedoeld om te werken aan een batch van 700 foto's momenteel, maar ik zou graag willen dat het herbruikbaar is in de toekomst.

 Ik heb gekeken met Mycadtool/Integration die de lancering van mijn macro's zou moeten beheren, maar ik kan geen actie vinden met betrekking tot de software waarmee ik de lettergrootte kan wijzigen.

Momenteel kan ik lussen programmeren die het aantal vellen tellen en vervolgens het aantal weergaven. Als ik de handeling echter probeer te herhalen voor de notities, werkt het niet.

 


capture.jpg

Het lijkt erop dat je getnotescount eerder moet aanroepen

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

 

EDIT zie ook http://help.solidworks.com/2016/english/api/sldworksapi/get_views_and_notes_example_vb.htm

Hallo

Als er meerdere vellen zijn, heb je 1 lus op de vellen nodig, inclusief 1 lus op de aanzichten, inclusief 1 lus op de noten, inclusief het wijzigen van de toonhoogte van de noottekst. Bekijk het bijgevoegde bestand om te zien hoe het er bijvoorbeeld uitziet in C#.           

Vriendelijke groeten


exemple_modif_ht_texte_note.txt
1 like

Ik begrijp echter niet echt het verschil in vba van annotatie en noot

Komt annotatie overeen met de programmering van het tabblad?

omdat ik het gevoel heb dat ik moet zeggen dat ik op zoek ga naar een annotatie en dan een opmerking :/

 

Goedenavond

Een notitie is een subtype van annotatie, zie http://help.solidworks.com/2013/English/api/sldworksapi/Get_Annotation_Object_Example_VB.htm voor testmacro.

Vriendelijke groeten

Voor i = 0 TB UBound(vSheets)                                                'lus blad
        vViews = vSheets(i)
       
        Voor j = 1 TB UBound(vViews)                                             'loop view
        Stel swView = vViews(j) in


        vNote = swView.GetNotes
        vAnnotatie = swView.GetAnnotations
           
                Voor k = 0 TB UBound(vNote)                                      'lus op de noten
                Stel swNote in = vNote(k)


                Volgend
               
                Voor c = 0 TB UBound(vAnnotatie)
                Stel swAnnotatie in = vAnnotatie(c)
               
                Volgend