Hallo danuberacer,
ich hoffe, ich habe dein Beispielszenario richtig verstanden und umsetzen können.
Es ist mit Sicherheit noch nicht jedes Szenario getestet, dafür fehlt mir die Zeit.
Auch kann vieles noch erweitert werden (z. B. Konfigurationen und Ansichten wählen, ...).
Zumindest sollte es einen guten Start für dein Vorhaben darstellen.
Probiere es einfach mal aus.
Grüße und viel Erfolg!
Dimi
**************************************************************************************
' Makro Name: CreateViewsFromSelectedCompInDrawing
' Version: 1.0
' Ersteller: Dimitrie Kuhn
' Datum: 07.12.2016
' Dieses Makro fügt die "*Vorderseite" aller selektierten Komponenten (Teile, Baugruppen) einer Baugruppe in eine bereits geöffnete Zeichnung ein.
' Der Maßstab jeder eingefügten Ansicht wird auf "1:1" gesetzt.
' Startvoraussetzungen:
' 1. Es darf nur eine Zeichnung geöffnet sein (Ansichten werden auf aktivem Zeichenblatt platziert).
' 2. Eine Baugruppe muss geöffnet und aktiv sein.
' 3. Auf der Baugruppe muss mindestens ein Teil oder eine Baugruppe selektiert sein.
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim myModel As Variant
Dim myModels() As ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim countSel As Long
Dim swComp As SldWorks.Component2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View
Dim strOpenDrw As String
Dim countOpenDrw As Integer
Dim CompPathNames() As String
Dim LocX As Double
Dim LocY As Double
Dim i As Integer
Dim iRet As Integer
Dim longstatus As Long
Sub main()
' An SolidWorks anbinden
Set swApp = Application.SldWorks
' An aktives Dokument anbinden
Set swModel = swApp.ActiveDoc
' Prüfen ob eine Baugruppe geoeffnet ist, wenn nicht -> abbrechen
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
swApp.SendMsgToUser2 "Bitte öffnen/aktivieren Sie eine Baugruppe und selektieren Sie Komponenten (Teile und Baugruppen).", swMbWarning, swMbOk
GoTo Abbrechen
End If
' An SelectionMgr anbinden
Set swSelMgr = swModel.SelectionManager
' Ermitteln wieviel selektiert wurde
countSel = swSelMgr.GetSelectedObjectCount2(-1)
' Wenn nichts selektiert wurde -> abbrechen
If countSel = 0 Then
swApp.SendMsgToUser2 "Bitte selektiere Komponenten (Teile und Baugruppen)", swMbWarning, swMbOk
GoTo Abbrechen
End If
' Array initialisieren
ReDim CompPathNames(0)
' Prüfe für jedes selektierte Objekt ...
For i = 1 To countSel
' Wenn selektiertes Objekt eine Komponente (Teil, Baugruppe) ist, tue ...
If swSelMgr.GetSelectedObjectType3(i, -1) = swSelectType_e.swSelCOMPONENTS Then
' An Komponente anbinden
Set swComp = swSelMgr.GetSelectedObject6(i, -1)
' Arraygröße um eins erweitern
ReDim Preserve CompPathNames(UBound(CompPathNames) + 1)
' Array an letzter Stelle mit Pfad+Dateiname+Endung füllen (Index(0) bleibt leer!)
CompPathNames(UBound(CompPathNames)) = swComp.GetPathName
End If
Next i
' Speichere alle (im Arbeitsspeicher) geöffneten Dokumente in ein Array des Types "ModelDoc2"
myModels = swApp.GetDocuments
' Setze Zählervariable für geöffnete Zeichnungen auf "0"
countOpenDrw = 0
' Für jede Datei in "myModels" tue ...
For Each myModel In myModels
' Wenn Datei vom Typ "swDocDRAWING" und wenn Datei sichtbar (eigenes Fenster, bzw. offen) tue ...
If myModel.GetType = SwConst.swDocumentTypes_e.swDocDRAWING And myModel.Visible = True Then
' Speichere den Titel der Datei
strOpenDrw = myModel.GetTitle
' Zähler hochsetzen
countOpenDrw = countOpenDrw + 1
End If
Next
' Wenn mehr oder weniger als eine Zeichnung geöffnet ist -> abbrechen
If countOpenDrw <> 1 Then
swApp.SendMsgToUser2 "Es sind " & countOpenDrw & " Zeichnungen geöffnet." & Chr(13) & "Es darf nur eine Zeichnung geöffnet sein!", swMbWarning, swMbOk
GoTo Abbrechen
End If
' User fragen ob Ansichten tatsächlich in die jeweilige Zeichnung auf dem benannten Blatt platziert werden sollen
iRet = swApp.SendMsgToUser2("Sollen die Ansichten in die Zeichnungsdatei: " & strOpenDrw & " eingefügt werden?", swMbQuestion, swMbYesNo)
' Wenn Antwort = Nein, dann abbrechen
If iRet = swMbHitNo Then GoTo Abbrechen
' Dokument (Zeichnung) aktivieren
Set swDraw = swApp.ActivateDoc2(strOpenDrw, False, longstatus)
' Positionsvariablen auf "0" setzen
LocX = 0
LocY = 0
' Für jede Komponente (Teil, Baugruppe) tue ...
For i = 1 To UBound(CompPathNames)
' Position ändern
LocX = LocX + 0.075
LocY = LocY + 0.05
' Zeichenansicht "*Vorderseite" aus Komponente erstellen und positionieren
Set swView = swDraw.CreateDrawViewFromModelView3(CompPathNames(i), "*Vorderseite", LocX, LocY, 0)
' Maßstab auf "1:1" setzen
swView.ScaleDecimal = 1
Next i
' Wiederaufbau der Zeichnung
swDraw.ForceRebuild3 True
Abbrechen:
' Objekte (Speicher) freigeben
Set swSelMgr = Nothing
Set swView = Nothing
Set swDraw = Nothing
Set swComp = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
[Diese Nachricht wurde von dimikuhn am 29. Jan. 2017 editiert.]
[Diese Nachricht wurde von dimikuhn am 29. Jan. 2017 editiert.]
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP