![]() |
|
Bitte drücken Sie nicht mehrfach auf "Antwort speichern".
*Ist HTML- und/oder UBB-Code aktiviert, dann können Sie HTML und/oder UBB Code in Ihrem Beitrag verwenden.
Beiträge: 118 / 108 SW 2017 SP 5.0 ich bin gerade auf der Suche, möglichst flott alle Teile/Unterbaugruppen einer Baugruppe umzubenennen. Da dieser Vorgang für sämtliche Anlagen und bei jeder Revision erneut passieren muss, fällt mir eigentlich nur ein, das Ganze per Macro zu machen. Ich habe ein Macro gefunden, was in einer geöffneten Baugruppe die ausgewählte Unterkomponente automatisch umbenennt. Dim swApp As SldWorks.SldWorks Sub main() Set swModel = swApp.ActiveDoc Beiträge: 136 / 1 Fujitsu Celsius hast du es schonmal mit der funktion Pack and Go von SWX Hier kann man alle Bauteile umbenennen bzw. auch mit Suchen/Ersetzten umbennennen lassen. Du musst nur aufpassen das die Dateinamen eindeutig bleiben: Eine andere Möglichkeit wäre die Baugruppe zuerst als Part abzuspeichern. Anschließend diese Datei (enthält ja noch die Dateinamen) als Parasolid exportieren und wieder importieren. Allerdings ist dies je nach Größe der Baugruppe bzw. der komplexität dann nicht mehr sinnvoll für die "anderen Abteilungen" ------------------ Beiträge: 118 / 108 SW 2017 SP 5.0 danke für die Tipps An Pack & Go habe ich auch schon gedacht, leider ist das ziemlich aufwändig, da unsere Anlagen teilweise aus mehreren hundert Bauteilen bestehen. Diese Anlagen haben noch bis zu 20 Variationen, die über Konfigurationen realisiert wurden...müssten dann also 20x exportiert werden. Und das jedes mal, wenn die Anlage revidiert wird. Das mit Baugruppe->Teil->Parasolid ist bisher auch meine einzige Lösung. Die verschlingt aber auch viel Zeit, da alleine das Speichern einer großen Baugruppe als Teil bei uns schon ~40min. dauert (von SSD auf SSD). Bedeutet, dass man tagelang vorm Rechner sitzt um zu öffnen/speichern. Wenn ich ein Macro hätte, was mit einem Klick alle Bauteile umbenennt (meinetwegen auch vorher alle Bauteile virtuell macht), würde der Export nur einen Bruchteil der Zeit kosten. Also wenn jemand doch noch ein Tipp für das Macro hätte, wäre ich mega dankbar Beiträge: 4638 / 874 .-) schau Dir doch mal das Beispiel von Stefan an: http://solidworks.cad.de/mm_36.htm HTH Beiträge: 118 / 108 SW 2017 SP 5.0 Beiträge: 118 / 108 SW 2017 SP 5.0 Ein Problem habe ich aber noch: [Diese Nachricht wurde von Captain Feature am 13. Apr. 2021 editiert.] Beiträge: 223 / 0 HP Z4 G4 Workstation Ja. Schrieb oben schon Ralf. Du traversierst nicht. Schau dir das Beispiel oben an. In deine Sub Main gehört im Prinzip nur der Aufruf mit Übergabe der OBG als Parameter deiner rekursiven Methode (die du ja schon hast) welche all die Arbeit erledigt. Diese muss sich, wenn sie eine UBG erkennt wiederum selbst aufrufen mit Übergabe der UBG als Parameter. EIBe 3D Beiträge: 118 / 108 SW 2017 SP 5.0 Ja. Schrieb oben schon Ralf. Du traversierst nicht. Schau dir das Beispiel oben an. In deine Sub Main gehört im Prinzip nur der Aufruf mit Übergabe der OBG als Parameter deiner rekursiven Methode (die du ja schon hast) welche all die Arbeit erledigt. Diese muss sich, wenn sie eine UBG erkennt wiederum selbst aufrufen mit Übergabe der UBG als Parameter. EIBe 3D Oh Gott...ich merke immer öfter, was ich für ein blutiger Anfänger in VBA bin Ich glaube zwar, dass ich deinen Hinweis so halbwegs verstehe, aber hab wiedermal 0 Ahnung, wie ich das in VBA umsetzen soll Beiträge: 4638 / 874 .-) die Codezeilen von Stefan und Deine drei Befehle hab ich mal Q&D zusammengefasst... Sub main() swApp.CommandInProgress = True End Sub Private Function TraverseComponent(Level As Integer, swComp As Object) Dim Children As Variant HTH Beiträge: 118 / 108 SW 2017 SP 5.0 Genau so hatte ich mir das gedacht. Funktioniert einwandfrei. Jetzt gucke ich mir erst mal den Code an und versuche zu verstehen, was mir gefehlt hat (wenn man vorher noch nie mit Rekursion, traversieren etc. zu tun hatte, ist das alles nicht so aus dem Ärmel geschüttelt Beiträge: 675 / 240 SWX 2019 SP5 Ich habe mir vor einigen Jahren selbst ein ähnliches Makro zur Aufbereitung großer Zukauf-Baugruppen aus den gleichen Bausteinen zusammengestellt, das Komponenten und Unterbaugruppen virtuell macht, das Material ändert und auch Alles umbenennt. Ich habe das hier nicht gepostet, weil: Wenn ich das Makro im Einzelschritt laufen lasse, tut es. An einem bestimmten Punkt scheint entweder mein Makro oder SolidWorks selbst durcheinanderzukommen und vergibt den gleichen Dateinamen mehrmals. Selbstverständlich an nicht-identische Teile/Baugruppen. Da es das Ganze auch speichert hat man beim nächsten Laden auf einmal einige Teile doppelt und andere fehlen. Da virtuelle Teile i.d.R. nirgends anders gespeichert werden, sind die dann pfutsch. Ich will nicht ausschließen, dass irgendwo in meinem Makro ein Bug rumkrabbelt, dann wäre es aber ein sehr gerissener kleiner Käfer. Beiträge: 4638 / 874 .-) der Hinweis von Jens HTH Beiträge: 118 / 108 SW 2017 SP 5.0 Viel kaputt machen kann ich zum Glück nicht...ist immer ne lokale Kopie aus dem PDM. Ich halte euch auf dem Laufenden Beiträge: 4638 / 874 .-) HTH Beiträge: 2399 / 7 Firma: SW 2019-5.0 + PDM Prof. So etwas ähnliches habe ich ja in meinem Makro Assembly-Print-Drawings gemacht, um die Doubletten rauszufiltern. Grüße, und schönes WE, Andi ------------------ Beiträge: 869 / 264 SWX Premium 2020-Sp5 Wenn alle Dateien in einem Verzeichnis abgelegt sind, würde ich dieses komplett in eine Tabelle einlesen, eine neue Spalte mit den neuen Namen dazu schreiben und mit der Document-Manager-API die Referenzen nach Tabelle austauschen. Beiträge: 118 / 108 SW 2017 SP 5.0 ich habe es endlich geschafft, das Macro mal auf eine unserer großen Baugruppen loszulassen. Die Warnung von CAD-Maler trifft leider auch bei diesem Macro zu: Ich versuche mal die Tipps von Andi und Ralf umzusetzen ("erst Teile, dann Baugruppen" & "Protokoll erstellen") (Leider haben wir hier immer noch PDM-Workgroup( [Diese Nachricht wurde von Captain Feature am 20. Apr. 2021 editiert.] Beiträge: 4638 / 874 .-)Captain Feature
AutoCad 2017 (+ecscad)
CorelDRAW X6
Photoshop CS5
Dell Precision 5810
Windows 10 64 Bit
One Intel Xeon E5-1630 v4
NVIDIA Quadro M5000Moin
Hintergrund ist, dass wir zukünftig alle unsere Anlagen anderen Abteilungen zur Verfügung stellen müssen. Zusätzlich habe ich die Auflage, alle Teilenamen "dumm" zu machen (da im Dateinamen teilweise vertrauliche Informationen stecken).
Leider bin ich nicht besonders fit in VBA, daher wäre es genial, wenn mir jemand helfen könnte, das Macro folgendermaßen abzuändern:
- Es soll nicht nur das ausgewählte Teil/Baugruppe umbenannt werden, sondern sämtliche Teile/Unterbaugruppen und deren Teile (also alles)
- Der Dateiname soll nicht erweitert werden, sondern komplett umbenannt werden (Egal in was...z.B. Teil1, Teil2 etc.)Code:
Const SUFFIX As String = "_Renamed"
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
If Not swModel Is Nothing Then
Set swSelMgr = swModel.SelectionManager
Dim swComp As SldWorks.Component2
Set swComp = swSelMgr.GetSelectedObject6(1, -1)
If Not swComp Is Nothing Then
Dim compName As String
compName = swComp.Name2
If Not swComp.GetParent() Is Nothing Then
'if not root remove the sub-assemblies name
compName = Right(compName, Len(compName) - InStrRev(compName, "/"))
End If
If swComp.IsVirtual() Then
'if virtual remove the context assembly name
compName = Left(compName, InStr(compName, "^") - 1)
Else
'remove the index name
compName = Left(compName, InStrRev(compName, "-") - 1)
End If
Dim newCompName As String
newCompName = compName & SUFFIX
swComp.Name2 = newCompName
Else
MsgBox "Please select component to rename"
End If
Else
MsgBox "Please open assembly document"
End If
End SubChristoph Weise
Intel Xenon E5-1620
32 GB RAM
Nvidia P4000 8GB
Win 7 / 10 64-bit
SolidWorks 2020SP3
QuickPress 6.3
PortaX 2.25Hallo, versucht?
Also "Projekt_XY_Teil_1"
Ansonsten könnte es vorkommen das 2 Bauteile gleich heißen-> dann weiß SWX nichtmehr welches Bauteil gemeint ist.
Übrig bleibt ein Teil, in dem alle anderen Teile als einzelene Volumenkörper abgebildet sind. Benannt sind diese anschließend mit Importiert1 /Importiert2 / Importiert3.
Wer einen Fehler findet darf ihn behalten,
wer zwei findet kann beide behalten,
ab fünf Fehler gibs Rabatt :-)Captain Feature
AutoCad 2017 (+ecscad)
CorelDRAW X6
Photoshop CS5
Dell Precision 5810
Windows 10 64 Bit
One Intel Xeon E5-1630 v4
NVIDIA Quadro M5000Moin,
Zusätzlich wäre es super, wenn die Baugruppen weiterhin flexibel bleiben, damit man z.B. einen darin enthaltenen Kompressor auch mal bei Bedarf verschieben kann (z.B. wenn das Modell beim Kunden dazu benutzt wird, um den Betriebsraum zu planen). Über Umwege geht das bestimmt auch mit dem Einzelteil aber eleganter wäre es mit einer Baugruppe.
Ich google heute noch weiter und hoffe, dass ich mir doch irgendwie selbst ein Macro zusammenbasteln kann.
Nur als VBA Laie ist das manchmal nicht so einfach
Ralf Tide Hallo Captain
Speziell den Teil: Private Function TraverseComponent(Level As Integer, Component As Object) ' rekursive Routine, die alle Komponenten durchläuft
RalfCaptain Feature
AutoCad 2017 (+ecscad)
CorelDRAW X6
Photoshop CS5
Dell Precision 5810
Windows 10 64 Bit
One Intel Xeon E5-1630 v4
NVIDIA Quadro M5000Super Hinweis Ralf!
Genau das ist für mich immer eine Schwierigkeit (Schleifen in VBA einbauen)
Gucke ich mir gleich mal an Captain Feature
AutoCad 2017 (+ecscad)
CorelDRAW X6
Photoshop CS5
Dell Precision 5810
Windows 10 64 Bit
One Intel Xeon E5-1630 v4
NVIDIA Quadro M5000So, ich bin schon ein wenig weiter:
Das Macro funktioniert schon fast.
Es durchläuft alle Komponenten, macht alle virtuell, die noch nicht virtuell sind und benennt sie dann um.Code:
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim swCompModel As SldWorks.ModelDoc2
Dim i As Integer
Dim vComps As Variant
Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swAssy = swModel
vComps = swAssy.GetComponents(False)
If IsEmpty(vComps) Then Exit Sub
For i = 0 To UBound(vComps)
Set swComp = vComps(i)
Set swCompModel = swComp.GetModelDoc2
'RUN YOUR CODE HERE
Dim compName As String
compName = swComp.Name2
If Not swComp.GetParent() Is Nothing Then
'if not root remove the sub-assemblies name
compName = Right(compName, Len(compName) - InStrRev(compName, "/"))
End If
If swComp.IsVirtual() Then
'if virtual remove the context assembly name
compName = Left(compName, InStr(compName, "^") - 1)
Else
'if not virtual make component virtual & remove the context assembly name
boolstatus = swComp.MakeVirtual()
compName = swComp.Name2
compName = Left(compName, InStr(compName, "^") - 1)
End If
Dim newCompName As String
newCompName = "Komponente" & i + 1
swComp.Name2 = newCompName
'====================================================
Next i
End Sub
Das Macro ändert nicht die Bauteile von Unterbaugruppen.
Hat jemand eine Idee, woran das liegen kann?EIBe 3D
Xeon 3,6 32GB
Nvidia P2000
WIN10
SW2015 SP5.0
SW2017
*************
Inv2018 akt.SPCode:
... Hat jemand eine Idee, woran das liegen kann?
GrüßeCaptain Feature
AutoCad 2017 (+ecscad)
CorelDRAW X6
Photoshop CS5
Dell Precision 5810
Windows 10 64 Bit
One Intel Xeon E5-1630 v4
NVIDIA Quadro M5000Zitat:
Original erstellt von EIBe 3D:Code:
... Hat jemand eine Idee, woran das liegen kann?
Grüße
Ich gucke mir das Beispiel-Macro von Ralf/Stefan noch mal an...vllt werde ich doch noch schlau daraus Ralf Tide Hallo Captain, Code:
Ist nicht so ganz sauber, da die erste Komponente (die BG in der das Makro gestartet wurde) nicht virtuell gespeichert werden kann...
Dim i As Integer ' Zähler der Komponente
' wesentliche Teile von Stefan Berlitz http://solidworks.cad.de/mm_36.htm
Dim swApp As Object
Dim AssemblyDoc As Object
Dim Configuration As Object
Dim RootComponent As Object
' an SolidWorks anklinken und aktives Assembly holen
Set swApp = Application.SldWorks
Set AssemblyDoc = swApp.ActiveDoc
' Root-Komponente des Assemblies als Ausgangspunkt festmachen
Set Configuration = AssemblyDoc.GetActiveConfiguration()
Set RootComponent = Configuration.GetRootComponent()
' und jetzt rekursiv durch alle Ebenen
i = 0
If Not RootComponent Is Nothing Then
TraverseComponent 1, RootComponent
End If
swApp.CommandInProgress = False
' rekursive Routine, die alle Komponenten durchläuft
Dim Child As Object
Dim ChildCount As Integer
Dim Feature As Object
Dim FeatureCreatedBy As String
Dim ret As Boolean
If Not (swComp.IsVirtual()) Then
ret = swComp.MakeVirtual2(True)
End If
swComp.Name2 = "TIDE" & i
i = i + 1
' schauen, ob's ein Subassy ist und ggf. über die Kinder rüberschauen
Children = swComp.GetChildren
ChildCount = UBound(Children) + 1
For j = 0 To (ChildCount - 1)
Set Child = Children(j)
TraverseComponent Level + 1, Child
Next j
End Function
Ist aber auch nur ein Gerüst
RalfCaptain Feature
AutoCad 2017 (+ecscad)
CorelDRAW X6
Photoshop CS5
Dell Precision 5810
Windows 10 64 Bit
One Intel Xeon E5-1630 v4
NVIDIA Quadro M5000Ganz ehrlich Ralf? Du bist der Knaller!
)
CAD-Maler
AutoCAD 2016
Win 10 pro 64 bit
Intel(R) Xeon(R) CPU E5-1650 v4 @ 3.60GHz
64GB RAM
Nvidia Quadro M5000
SWx EPDMBitte teste das Ganze seeehr gründlich!
Wenn ich das Makro auf kleinere Baugruppen mit wenigen Unterbaugruppen loslasse, tut es.
Wenn ich das Makro auf große Baugruppen mit einigen Unterbaugruppen loslasse, tut es MEISTENS.
Gruß, Jens
Ralf Tide Hallo Captain, ist dringend zu beachten!
Ich zitier mich ja gerne selbst Zitat:
Ein paar Anregungen/Fragen, die mir zum Thema einfallen:
Original erstellt von Ralf Tide:
...nur ein Gerüst
Da können außer Jens und mir auch einige andere hier sicher noch Erfahrungen mit einbringen
- Vielleicht eine Abfrage ob das Teil schon "TIDE" heißt.
- Name der Komponente,
- ob die Komponente virtualisiert wurde,
- ob die Namensgebung funktioniert hat,
- wie sie neu heißt.
RalfCaptain Feature
AutoCad 2017 (+ecscad)
CorelDRAW X6
Photoshop CS5
Dell Precision 5810
Windows 10 64 Bit
One Intel Xeon E5-1630 v4
NVIDIA Quadro M5000Ok, gut zu wissen, dass ich da ein wenig aufpassen muss.
Bisher habe ich das Macro immer nur mit einer kleinen Testbaugruppe getestet.
Ich mache nachher mal ein paar Testdurchläufe mit unseren echten Baugruppen.
Aber mit der doppelt Benennung von Teilen ist natürlich gefährlich. Da werde ich besonders drauf achten.
Ralf Tide Zitat:
Mir ist was eingefallen: Wenn eine Unterbaugruppe mehrfach vorkommt, dann wird die erste Instanz beim Durchlauf virtualisiert und umbenannt. Wenn nun die darin enthaltenen Teiele auch virtualisiert und umbenannt werden, passiert dies nicht mit den Teilen der zweiten und weiteren Instanzen dieser Unterbaugruppe. Du würdest auf alle Fälle viel mehr veschiedene Komponenten erhalten als es eigentlich sind.
Original erstellt von Captain Feature:
Ich mache nachher mal ein paar Testdurchläufe mit unseren echten Baugruppen.
Abhilfe würden zwei Durchläufe bringen. Im ersten Durchlauf nur Teile virtualisieren und umbenennen und im zweiten Durchlauf in der untersten Unterbaugruppe anfangen (da wäre es hilfreich den größten Wert für Level festzuhalten) und dann nach oben durcharbeiten. Wenn da jetzt mal kein Fehler in meiner Logik ist...
RalfAndi Beck
Windows 10 Pro 64bit, i7-2600K
3,4 GHz, 16 GbRAM, Quadro K2000
250GB SSD
Home:
SW 2018-5.0
SW 2019-5.0
SW 2020-5.0
SW 2021-3.0
Passungstabelle von Heinz
Windows 10 Home 64bit,
i7-860, 3,1 GHz, 16 GbRAM, GeForce GTX 1050Ti
Samsung SSD 860EVO, 500GB
Samsung C34H892, 3440 x 1440 PixelZitat:
Original erstellt von Ralf Tide:
Du würdest auf alle Fälle viel mehr veschiedene Komponenten erhalten als es eigentlich sind.
Hallo,
ich würde beim abarbeiten ein Protokoll (Array) mitschreiben, und mir den vorherigen und neuen Namen merken.
Bei jeder neuen Komponente dann dieses Array durchforsten und schauen, ob der Name schonmal dran war. Entsprechend kann man dann die neue Namensgebung abgleichen.
Hast du kein Problem?
Such dir eins. ( Und löse es )riesi Wenn zufällig PDM bei euch im Einsatz ist, würde ich es damit machen. (Struktur verschieben, umbenennen mit Seriennummer) Dann braucht nichts programmiert werden. Captain Feature
AutoCad 2017 (+ecscad)
CorelDRAW X6
Photoshop CS5
Dell Precision 5810
Windows 10 64 Bit
One Intel Xeon E5-1630 v4
NVIDIA Quadro M5000Moin
Bei kleinen Baugruppen funktioniert alles, bei großen Baugruppen fangen komische Probleme an...teilweise wurden einige Komponenten komplett ausgelassen, andere werden zwar virtuell gemacht aber nicht umbenannt, andere werden zwar umbenannt aber in der Benennung steckt noch der alte original-Baugruppenname (nach dem ^) und 1x hat sich das Macro mit einem Fehler beendet (leider habe ich das Macro gleich noch mal gestartet, ohne nachzugucken, an welchem Teil es gelegen hat). ) laufen, daher fällt die PDM-Lösung von riesi für uns flach)
Ralf Tide Zitat:
Immerhin hat WorkgroupPDM eine API
Original erstellt von Captain Feature:
(Leider haben wir hier immer noch PDM-Workgroup( ) laufen, daher fällt die PDM-Lösung von riesi für uns flach)
...und ein Forum: https://ww3.cad.de/cgi-bin/ubb/forumdisplay.cgi?action=topics&forum=SolidWorks+Workgroup+PDM&number=233