Edycja notatki na mapie bazowej SolidWorks za pomocą makra

Witam, chciałbym zmodyfikować już istniejącą notatkę na mapie bazowej w celu zmiany rozmiaru czcionki

Próbowałem automatycznego nagrywania makr, ale to nie działa. Mogę sprawić, że makro będzie działać tylko wtedy, gdy ręcznie edytuję plan tła i uruchamiam go.

Jak więc zaprogramować makro tak, aby działało bezpośrednio na mapie bazowej?

Witam

Wystarczy tylko raz edytować plik mapy bazowej (.slddrt), a następnie wczytać go ponownie w każdym MEP.

Zobacz ten przykład, który robi to, czego chcesz: http://help.solidworks.com/2017/english/api/sldworksapi/modify_and_reload_sheet_format_template_example_vb.htm

3 polubienia

Aby edytować mapę bazową, należy użyć metody EditTemplate, która znajduje się pod tym przykładowym linkiem http://help.solidworks.com/2016/english/api/sldworksapi/Place_Note_Behind_Drawing_Sheet_Example_VB.htm

1 polubienie

Miałem to samo do zrobienia.

Do wymiany kartridża po aktualizacji map bazowych ems.

 

Zrobiłem tak, jak mówi @Remrem, nadpisałem stary plan tła nowym, a następnie za każdym razem, gdy go otwierałem, klikałem przeładuj lub makr, tak jak to zrobiłem.

Więc jeśli chodzi o makro, nie łamałem sobie głowy:

-Rozpoczyna się nagrywanie makr

-kliknij prawym przyciskiem myszy "arkusz 1", kliknij przeładuj, a następnie naciśnij OK

- Zatrzymaj nagrywanie makra i utwórz ikonę, aby szybko je uruchomić.


fdp.jpg

Witam, jeśli to pomoże, poniżej znajduje się fragment kodu, który pozwala na ponowne załadowanie mapy bazowej niezależnie od początkowego formatu planu (ograniczonego do A4, A3, A2, A1). Wystarczy jedno kliknięcie, które zostanie wykonane po powiązaniu z przyciskiem.

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 polubienie

Cyryl.f

W przypadku makra co robi w przypadku następujących pytań po doładowaniu FDP:

"Zmienić nazwę istniejących bloków tak / nie?"

"Dbałość o wartości na tle wymuszonych/zmodyfikowanych planów?"

 

Witam

Nie robi nic poza ponownym załadowaniem mapy bazowej (poprzez zmianę formatu, ponieważ zwykłe przeładowanie z tą samą nazwą pliku slddrt nie działa). Jeśli w mapie bazowej znajdują się bloki dodane później, są one usuwane (trzeba dodać więcej przetwarzania, ale niekoniecznie jest to łatwe do napisania, ponieważ zależy to od parametrów każdego z nich).

Jeśli są rzeczy wymuszone, musisz odzyskać wartości, aby je ponownie zastosować.

Podsumowując, ten fragment makra jest uproszczony i nadaje się tylko do klasycznych rzeczy (wszystkie pola odwzorowane za pomocą właściwości SW i bez dodanego szczegółu w tle). Mam znacznie bardziej złożony kod, ale ten jest specyficzny dla potrzeb mojej firmy i nie mogę go po prostu udostępnić (bardzo mało komentarzy i trudne do zrozumienia bez znajomości SW, API i vba).

Przyznaję, że moja odpowiedź znajduje się obok prośby i bardziej w odpowiedzi dla Barta, który, jak widzę, ma wiele niestandardowych przycisków do wykonania tej samej czynności.

Tak więc, aby zeskanować notatki mapy bazowej, jest to bardziej ten fragment kodu:

    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 polubienie

Witam

Poniższy fragment kodu zmienia wysokość tekstu, mnożąc go przez 5 wszystkich notatek z tekstem równym TextNote. To język CSharp, pozwolę Ci go przetłumaczyć i dostosować do Twoich potrzeb.

Aplikacja SldWorks;
DrawingDoc swDraw;
długie j;
długa liczenie;
SolidWorks.Interop.sldworks.View swView;

swDraw = (RysunekDoc)swApp.ActiveDoc;

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

while ((swView != null))
{
    count = swView.GetNoteCount();
    if (liczba > 0)
    {
        Object[] Notatki = (Obiekt[])swView.GetNotes();
        for (j = 0; j <= Notes.GetUpperBound(0); j++)
        {
            Uwaga swUwaga;
            swNote = (Uwaga)Uwagi[j];

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

swDraw.ForceRebuild();

Pozdrowienia

Czasami łatwiej jest samodzielnie nagrać makro niż przechodzić przez kodowanie ;) =)

1 polubienie

☺ Bart: Prawie się z tobą zgadzam , ale wszystko zależy od wielkości projektu, który trzeba wykonać, powyższy fragment kodu to tylko niewielka część programu, który pozwolił mi wziąć 48000 planów, a teraz lepiej trochę kodować.

Pozdrowienia

1 polubienie

Aha, oczywiście wszystko zależy od projektu, którym się zajmujemy.

 

Czy zadanie jest powtarzalne, czy nie?

Używam go, gdy aktualizuję wkłady (modyfikacja logo itp.)

Kiedy robię stare ujęcie starym nabojem, wystarczy kliknąć ikonę, aby wszystko zaktualizować =)

 

W przeciwnym razie MycadTools nie jest właścicielem tego rodzaju rzeczy?

Cyril.f , kiedy umieścisz (zmieniając format, ponieważ proste przeładowanie przez tę samą nazwę pliku slddrt nie działa), możesz spróbować przeładować format, umieszczając ten sam wiersz dwa razy, ponieważ rzeczywiście za jednym razem to nie działa, oto co musiałem zrobić w moim równoważnym programie (ale w c#):

Przeładowujemy format (w 2 krokach, w przeciwnym razie nie zadziała)
bool boolstatus = false;
boolstatus = swDraw. ArkuszInstalacyjny5(nazwa_arkusza, (int)RozmiarPapieru, (int)TemplateIn, Scale1, Scale2, true, plik2, szerokość, góra, "Default", prawda);
boolstatus = swDraw. ArkuszInstalacyjny5(nazwa_arkusza, (int)RozmiarPapieru, (int)TemplateIn, Scale1, Scale2, true, plik1, szerokość, góra, "Default", prawda);

Pozdrowienia

2 polubienia

Witam

Przede wszystkim dziękuję za wszystkie odpowiedzi, które bardzo mi pomogły, ponieważ nie jestem zbyt dobry w programowaniu VBA^^'

To makro jest obecnie przeznaczone do pracy na partii 700 ujęć, ale chciałbym, aby w przyszłości nadawało się do wielokrotnego użytku.

 Szukałem za pomocą Mycadtool/Integracji, który powinien zarządzać uruchamianiem moich makr, ale nie mogę znaleźć żadnej akcji związanej z oprogramowaniem, które pozwala mi zmienić rozmiar czcionki.

Obecnie potrafię zaprogramować pętle, które zliczają ilość arkuszy, a następnie liczbę wyświetleń. Jednak kiedy próbuję powtórzyć operację dla nut, nie działa.

 


capture.jpg

Wygląda na to, że musisz wcześniej wywołać getnotescount

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

 

EDIT Zobacz też http://help.solidworks.com/2016/english/api/sldworksapi/get_views_and_notes_example_vb.htm

Witam

Jeśli masz wiele arkuszy, potrzebujesz 1 pętli na arkuszach, która zawiera 1 pętlę na widokach, która zawiera 1 pętlę na nutach, która obejmuje zmianę wysokości tekstu notatki. Zobacz załączony plik, aby zobaczyć, jak wygląda na przykład w języku C#.           

Pozdrowienia


exemple_modif_ht_texte_note.txt
1 polubienie

Jednak tak naprawdę nie rozumiem różnicy w vba adnotacji i notatki

Czy adnotacja odpowiada programowaniu zakładki?

bo czuję, że muszę powiedzieć, że będę szukał adnotacji, a potem notatki :/

 

Dobry wieczór

Notatka jest podtypem Adnotacji, zobacz http://help.solidworks.com/2013/English/api/sldworksapi/Get_Annotation_Object_Example_VB.htm dla makra testowego.

Pozdrowienia

Dla i = 0 TB UBound(vSheets)                                                ' arkusz pętli
        vViews = vSheets(i)
       
        Dla j = 1 TB UBound(vViews)                                             'widok pętli
        Ustaw swView = vViews(j)


        vNote = swView.GetNotes
        vAnnotation = swView.GetAnnotations
           
                Dla k = 0 TB UBound(vNote)                                      'pętla na nutach
                Ustaw swNote = vNote(k)


                Następny
               
                Dla c = 0 TB UBound(vAnnotation)
                Ustaw adnotację swAnnotation = adnotację v(c)
               
                Następny