SolidWorks MakroMania - Blattformate austauschen

SolidWorks MakroMania ist eine Beispielsammlung einiger Makros, die Ihnen eine Vorstellung davon geben soll, was man auch schon mit Makros in SolidWorks alles anstellen kann. Der Code des Makros sollte so gut dokumentiert sein, dass Sie damit ohne weitere Anleitung verstehen, was gemacht wird.

< voriges
MakroMania
Übersicht


nächstes >

Nummer 29
Blattformate austauschen

Download
ZIP, 24 KB

Ich übernehme keine Haftung für die korrekte Funktion der Routinen oder irgendwelcher Schäden bei der Anwendung dieser Beispiele. Das gesamte Risiko trägt der Benutzer selbst. - Sorry, muss sein.

Das Makro tauscht die Blattformate (also praktisch die Zeichenfläche) für alle Blätter der aktiven Zeichnung aus. Dabei ist im Makro der Pfad zu den "neuen" Blattformaten fest verankert und muss für Ihre Umgebung angepasst werden. Nach erfolgreichem Änderung wird die Zeichnung unter dem aktuellen Namen gespeichert.

ACHTUNG: mit diesem Makro kann nicht die Zeichnungsvorlage geändert werden, das ist nicht möglich, da diese nur für neue Zeichnungen genutzt wird. Alle Blätter sind nachher auf "benutzerdefiniert" umgestellt, wenn Sie die "normalen" A-A0 Einstellungen benötigen ändern Sie unten die entsprechenden Calls ab oder nutzen das abgewandelte Makro, dass die Standardvorlagen erneut lädt

Das Makro ist darauf ausgelegt in Batchmodus mit PAC4SWX zu arbeiten, um Blattvorlage automatisiert auszutauschen. Dies kann z.B. notwendig sein, wenn das Firmenlogo geändert wird oder am Schriftkopf geändert wurde. Das Makro läuft aber auch, wenn es aus SolidWorks gestartet wird und müsste auch mit dem TaskPlaner laufen (aber nicht getestet); aber besser wäre es natürlich, Sie benutzen PAC4SWX


' **********************************************************************
' * BITTE die Pfade und Dateinamen für die Blattformate anpassen
' **********************************************************************
' * PLEASE change the path/filename for the sheet templates (see below)
' **********************************************************************

' *
' * Makro tauscht die Blattformate (also praktisch die Zeichenfläche)
' * für alle Blätter der aktiven Zeichnung aus. Dabei ist im Makro der
' * Pfad zu den "neuen" Blattformaten fest verankert und muss für Ihre
' * Umgebung angepasst werden. Nach erfolgreichem Änderung wird die
' * Zeichnung unter dem aktuellen Namen gespeichert.
' * ACHTUNG: mit diesem Makro kann NICHT die Zeichnungsvorlage geändert
' * werden, das ist nicht möglich, da diese nur für neue Zeichnungen
' * genutzt wird. Alle Blätter sind nachher auf "benutzerdefiniert"
' * umgestellt, wenn Sie die "normalen" A-A0 Einstellungen benötigen
' * ändern Sie unten die entsprechenden Calls ab oder nutzen das
' * abgewandelte Makro, dass die Standardvorlagen erneut lädt
' *
' * Das Makro ist darauf ausgelegt in Batchmodus mit PAC4SWX zu arbeiten,
' * um Blattvorlage automatisiert auszutauschen. Dies kann z.B. notwendig
' * sein, wenn das Firmenlogo geändert wird oder am Schriftkopf geändert
' * wurde. Das Makro läuft aber auch, wenn es aus SolidWorks gestartet
' * wird und müsste auch mit dem TaskPlaner laufen (aber nicht getestet);
' * aber besser wäre es natürlich, Sie benutzen PAC4SWX
' *
' * Macro changes the sheetformat (= the "paper" of your drawing) for
' * all sheets of the active drawing. You have to adjust the path and
' * the file names to the new sheet formats. After successfully changing
' * the sheetformat the drawing is saved with its current name.
' * ATTENTION: you CAN'T change the drawing template, this is not
' * possible. So with this macro you can't update document properties.
' * All sheet formats will be "userdefinied" after updating with this
' * macro. If you want to have the "standard" A-A0 formats and not
' * userdefinied you have to change the macro accordingly or use its
' * "compagnion" which reloads a standard sheettemplate
' *
' * This macro is intended to be used with PAC4SWX for batch reloading
' * of sheetformats, in case you changed you sheetformat with a new
' * company logo, new title block layout or similar. But it will also
' * word if fired from the GUI (taskplaner not tested, but should work;
' * but I would like to see you using PAC4SWX instead of taskplaner ;-))
' *
' * PAC4SWX - http://swtools.cad.de/prog_pac.htm
' *

' * 17.12.2003 Stefan Berlitz
' * SolidWorks Solution Partner
' * http://swtools.cad.de
' * Inoffizielle deutsche SolidWorks Hilfeseite
' * http://solidworks.cad.de
' *
' **********************************************************************

Dim msgtext(6) As String    ' some texts for multi-language support

Sub main()

    Dim sheetformatpath(12) As String
    Dim sheetformatdir As String

    ' choose active language
    ' und die Spracheinstellung überprüfen
    CheckLanguage

    ' ************ EDIT path and file name HERE ************************

    ' After editing the sheetformats delete the next line or comment it
    ' Bitte nach dem Editieren der nächste Zeile löschen oder auskommentieren
    If MsgBox(msgtext(6), vbOKOnly, "Please Edit Macro") = vbOK Then End

    ' Path to directory with sheetformats
    sheetformatdir = "q:\solidworks\sw2003\china\"

    ' path to the various sheet formats from A to A0, you may also use
    ' full pathnames, but if they are all in teh same subdir it's easier this way
    ' Vollständigen Pfad für die verschiedenen Blattformate
    sheetformatpath(0) = sheetformatdir & "temp_a.slddrt"
    sheetformatpath(1) = sheetformatdir & "temp_av.slddrt"
    sheetformatpath(2) = sheetformatdir & "temp_b.slddrt"
    sheetformatpath(3) = sheetformatdir & "temp_c.slddrt"
    sheetformatpath(4) = sheetformatdir & "temp_d.slddrt"
    sheetformatpath(5) = sheetformatdir & "temp_e.slddrt"
    sheetformatpath(6) = sheetformatdir & "temp_a4.slddrt"
    sheetformatpath(7) = sheetformatdir & "temp_a4v.slddrt"
    sheetformatpath(8) = sheetformatdir & "temp_a3.slddrt"
    sheetformatpath(9) = sheetformatdir & "temp_a2.slddrt"
    sheetformatpath(10) = sheetformatdir & "temp_a1.slddrt"
    sheetformatpath(11) = sheetformatdir & "temp_a0.slddrt"
    ' already user defined
    ' ist schon benutzerdefiniert
    sheetformatpath(12) = sheetformatdir & "blank.slddrt"

    ' ************************* EDIT END *******************************



    ' zunächst mal ein paar Deklarartionen die gebraucht werden
    Dim SwApp As Object
    Dim DrawingDoc As Object
    Dim Sheet As Object

    Dim Titel As String
    Dim Datei As String
    Dim temp As String
    Dim pfad As String
    Dim msgtxt As String

    Dim Name As String
    Dim paperSize As Long
    Dim templateIn As Long
    Dim scale1 As Double
    Dim scale2 As Double
    Dim firstAngle As Boolean
    Dim templateName As String
    Dim Width As Double
    Dim Height As Double
    Dim propertyViewName As String

    Dim i As Long
    Dim AnzahlBl As Long
    Dim SheetNames As Variant
    Dim SheetProperties As Variant

    Const swDocDRAWING = 3
    Const swDwgTemplateCustom = 12
    Const swDwgTemplateNone = 13

    ' an SolidWorks anhängen
    ' attach to SolidWorks
    Set SwApp = CreateObject("SldWorks.Application")

    Set DrawingDoc = SwApp.ActiveDoc

    If DrawingDoc Is Nothing Then
        ' check if document is open
        ' dann war gar kein Dokument geöffnet, wie soll da was funktionieren
        MsgBox msgtext(0)
        Exit Sub
    End If

    If (DrawingDoc.GetType <> swDocDRAWING) Then
        ' check if document is a drawing
        ' wenn keine Zeichnung aktiv wird das Makro wieder beendet
        MsgBox msgtext(1)
        Exit Sub
    End If


    ' get sheet count and traverse all sheets to reload sheetfromat
    '
    ' die Anzahl der Blätter holen, und dann in der Schleife eines nach
    ' dem anderen neues Blattformat laden. Dazu Handle auf das aktuelle Blatt holen
    AnzahlBl = DrawingDoc.GetSheetCount
    SheetNames = DrawingDoc.GetSheetNames

    ' reset error messages
    ' Fehlermeldung zurücksetzen
    msgtxt = ""

    For i = 0 To AnzahlBl - 1
        ' activate next sheet
        ' das nächste Blatt aktivieren
        If DrawingDoc.ActivateSheet(SheetNames(i)) Then
            ' attach to sheet object
            ' Objektzeiger für das Blatt holen
            Set Sheet = DrawingDoc.GetCurrentSheet
            SheetProperties = Sheet.GetProperties

            ' first we have to set the sheet to use "no sheetformat", for SolidWorks
            ' wont reload a sheetformat if it is the same name as before
            ' und im ersten Schritt das Blatt erst einmal ganz ohne Vordruck
            ' setzen, da SolidWorks das Blattformat nicht tauscht, wenn es
            ' vorher und nachher gleich heißt!
            Name = Sheet.GetName
            paperSize = SheetProperties(0)
            ' set NO SHEETFORMAT
            ' Hier jetzt erst einmal KEIN Format setzen
            templateIn = swDwgTemplateNone
            scale1 = SheetProperties(2)
            scale2 = SheetProperties(3)
            firstAngle = CBool(SheetProperties(4))
            ' no sheetformat = no path
            ' infolgedessen auch keinen Blattformatpfad
            templateName = ""
            ' but we need the sheet size
            ' aber dann brauchen wir die Blattgröße
            Width = SheetProperties(5)
            Height = SheetProperties(6)
            propertyViewName = Sheet.CustomPropertyView

            retval = DrawingDoc.SetupSheet4( _
                        Name, _
                        paperSize, _
                        templateIn, _
                        scale1, _
                        scale2, _
                        firstAngle, _
                        templateName, _
                        Width, _
                        Height, _
                        propertyViewName)
            If retval = False Then
                msgtxt = msgtxt & msgtext(2) & vbCrLf
            Else

                ' and now we set the new sheetformat; it is necessary to set
                ' USER DEFINIED sheetformat for SolidWorks will look for the
                ' standard templates temp_??.slddrt in your spefified folder
                ' if using the standard sheet sizes.
                ' und dann das neue Blattformat (Vorlage) einsetzen
                ' benutzerdefinierte Format einstellen, da ansonsten IMMER nach
                ' den entsprechenden Vordrucken temp_??.slddrt im eingestellten
                ' Blattformatverzeichnis gesucht wird
                templateIn = swDwgTemplateCustom

                ' get correct sheetformat for this size depending on the
                ' papersize, this will allow aleady userdefined sheetformats
                ' to properly be reloaded
                ' zur Blattgröße passenden Vordruck raussuchen, das passiert
                ' aufgrund der Blattgröße, damit auch Blätter, die bereits
                ' benutzerdefiniert sind, korrekt nachgeladen werden
                paperSize = GetSheetSizeFromPaperSize(Width, Height)
                templateName = sheetformatpath(paperSize)

                retval = DrawingDoc.SetupSheet4( _
                            Name, _
                            paperSize, _
                            templateIn, _
                            scale1, _
                            scale2, _
                            firstAngle, _
                            templateName, _
                            Width, _
                            Height, _
                            propertyViewName)
                If retval = False Then
                    ' Fehler: konnte neuen Vordruck nicht laden
                    ' ERROR : can't load new sheetformat
                    msgtxt = msgtxt & msgtext(3) & templateName & vbCrLf
                Else

                    ' everything worked fine, no message here for automation
                    ' dann hat ja alles geklappt

                    ' save the document without backup
                    ' und das Dokument noch speichern
                    If DrawingDoc.Save2(True) > 0 Then
                        ' error saving file
                        ' Fehler beim Speichern
                        msgtxt = msgtxt & msgtext(5) & vbCrLf
                    End If

                End If

            End If
        Else
            msgtxt = msgtxt & msgtext(4) & Name & vbCrLf
        End If
    Next i

    ' und noch die Zusammenfassung übers Speichern ausgeben
    If Len(msgtxt) Then
        MsgBox msgtxt
    End If

End Sub

Private Sub CheckLanguage()

    ' check which language to apply. To make another language
    ' copy one of the CASE fileds and make your changes
    '
    ' Hier ausgucken welche Sprache benutzt wird. Um weitere
    ' Sprachen zu unterstützen unten einer der CASE Bereiche
    ' kopieren Anpassungen machen und aufrufen

    Set SwApp = CreateObject("SldWorks.Application") ' set by Sub main()
    Select Case SwApp.GetCurrentLanguage
    Case "german"
        msgtext(0) = "Kein Dokument offen, was sollte ich denn wohl tun?"
        msgtext(1) = "Nur sinnvoll bei Zeichnungen"
        msgtext(2) = "*** FEHLER: konnte Blatt nicht zurücksetzen "
        msgtext(3) = "*** FEHLER: konnte Blatt nicht auf neuen Vordruck setzen. Vordruck vorhanden? "
        msgtext(4) = "*** FEHLER: konnte Blatt nicht aktivieren "
        msgtext(5) = "*** FEHLER: konnte Dokument nicht speichern "
        msgtext(6) = "Bitte erst das Makro anpassen, dazu auf Extras/Makros/Editieren klicken"
'    Case "english"
        ' english is default, so change there
'    Case "spanish"
'    Case "french"
'    Case "italian"
'    Case "japanese"
    Case Else
        ' english is default
        msgtext(0) = "Nothing opened, so what should I look at?"
        msgtext(1) = "Only useful with drawing"
        msgtext(2) = "*** ERROR: can't reset sheet "
        msgtext(3) = "*** ERROR: can't set new sheetformat for drawing. Sheetformat file exists? "
        msgtext(4) = "*** ERROR: cant activate sheet "
        msgtext(5) = "*** ERROR: cant save document "
        msgtext(6) = "Please edit macro first (Extras/Macros/Edit)"
    End Select

End Sub

Function GetSheetSizeFromPaperSize(SheetWidth, SheetHeight)
    ' Function returns the SheetSize constant based on the width and heigth
    ' useful for userdefined sheetformats
    ' Funktion ermittelt die Blattgröße (als Konstante) aus der Breite und
    ' Höhe des Blattes; nützlich für benutzerdefierte Blattformate

    Const swDwgPaperAsize = 0
    Const swDwgPaperAsizeVertical = 1
    Const swDwgPaperBsize = 2
    Const swDwgPaperCsize = 3
    Const swDwgPaperDsize = 4
    Const swDwgPaperEsize = 5
    Const swDwgPaperA4size = 6
    Const swDwgPaperA4sizeVertical = 7
    Const swDwgPaperA3size = 8
    Const swDwgPaperA2size = 9
    Const swDwgPaperA1size = 10
    Const swDwgPaperA0size = 11
    Const swDwgPapersUserDefined = 12

    If (Round(SheetWidth, 4) = 0.2794) And (Round(SheetHeight, 4) = 0.2159) Then
        GetSheetSizeFromPaperSize = swDwgPaperAsize
    ElseIf (Round(SheetWidth, 4) = 0.2159) And (Round(SheetHeight, 4) = 0.2794) Then
        GetSheetSizeFromPaperSize = swDwgPaperAsizeVertical
    ElseIf (Round(SheetWidth, 4) = 0.4318) And (Round(SheetHeight, 4) = 0.2794) Then
        GetSheetSizeFromPaperSize = swDwgPaperBsize
    ElseIf (Round(SheetWidth, 4) = 0.5588) And (Round(SheetHeight, 4) = 0.4318) Then
        GetSheetSizeFromPaperSize = swDwgPaperCsize
    ElseIf (Round(SheetWidth, 4) = 0.8636) And (Round(SheetHeight, 4) = 0.5588) Then
        GetSheetSizeFromPaperSize = swDwgPaperDsize
    ElseIf (Round(SheetWidth, 4) = 1.1176) And (Round(SheetHeight, 4) = 0.8636) Then
        GetSheetSizeFromPaperSize = swDwgPaperEsize
    ElseIf (Round(SheetWidth, 4) = 0.297) And (Round(SheetHeight, 4) = 0.21) Then
        GetSheetSizeFromPaperSize = swDwgPaperA4size
    ElseIf (Round(SheetWidth, 4) = 0.21) And (Round(SheetHeight, 4) = 0.297) Then
        GetSheetSizeFromPaperSize = swDwgPaperA4sizeVertical
    ElseIf (Round(SheetWidth, 4) = 0.42) And (Round(SheetHeight, 4) = 0.297) Then
        GetSheetSizeFromPaperSize = swDwgPaperA3size
    ElseIf (Round(SheetWidth, 4) = 0.594) And (Round(SheetHeight, 4) = 0.42) Then
        GetSheetSizeFromPaperSize = swDwgPaperA2size
    ElseIf (Round(SheetWidth, 4) = 0.841) And (Round(SheetHeight, 4) = 0.594) Then
        GetSheetSizeFromPaperSize = swDwgPaperA1size
    ElseIf (Round(SheetWidth, 4) = 1.189) And (Round(SheetHeight, 4) = 0.841) Then
        GetSheetSizeFromPaperSize = swDwgPaperA0size
    Else
        GetSheetSizeFromPaperSize = swDwgPapersUserDefined
    End If

End Function


Zurück zum Seitenanfang

hr.gif (4491 Byte)

counter Kritik und Anregungen bitte an Stefan Berlitz. Letzte Änderung dieser Seite am Donnerstag, 01. Februar 2007 17:40