| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: IV2015/2016 Browser Baugruppe (1660 mal gelesen)
|
Frank_Schalla Ehrenmitglied CAD_SYSTEMBETREUER
Beiträge: 1732 Registriert: 06.04.2002 DELL M6800 Cad Admin Methodikentwickler 3D
|
erstellt am: 27. Mai. 2015 09:55 <-- editieren / zitieren --> Unities abgeben:
Hallo Weil das rekursive durchlaufen einer Baugruppe sehr langsam ist möchte ich folgendes tun. Alle Objekte (ab dem ersten Komponenteneintrag normalerweise der 5te) auswählen und das Kommando "Fixiert" aufrufen. Im Moment bekomme ich jedoch die Auswahl der Browsernodes nicht hin Hat jemand eine Idee ?? Danke Frank
------------------ ************************************ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2013/2015 Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 27. Mai. 2015 11:42 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
|
muellc Ehrenmitglied V.I.P. h.c. ICT Specialist
Beiträge: 3501 Registriert: 30.11.2006
|
erstellt am: 27. Mai. 2015 12:17 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
Hallo Frank, ich habe vor längerer Zeit mal dieses Makro zum fixieren hier aus dem Forum bekommen, vielleicht hilft dir das. Code:
Sub Markierte_Bauteile_Fixieren() 'and suppress constraints If ThisApplication.Documents.Count = 0 Then MsgBox "Die Baugruppe öffnen.", vbExclamation, "Keine Baugruppe" Exit Sub End If If ThisApplication.ActiveDocumentType <> kAssemblyDocumentObject Then MsgBox "Die Baugruppe öffnen.", vbExclamation, "Keine Baugruppe" Exit Sub End If Dim oAsm As AssemblyDocument Set oAsm = ThisApplication.ActiveDocument If oAsm.SelectSet.Count = 0 Then MsgBox "Es sind keine Komponenten selektiert" Exit Sub End IfDim oDoc As AssemblyDocument Set oDoc = ThisApplication.ActiveDocument Dim oSel As SelectSet Set oSel = oDoc.SelectSet Dim oObject As Object Dim oCompOccsEnum As ComponentOccurrencesEnumerator Dim oCompOcc As ComponentOccurrence Dim oPattern As OccurrencePatternElement Dim oConstraint As Object For Each oObject In oSel If TypeOf oObject Is OccurrencePattern Then For Each oPattern In oObject.OccurrencePatternElements For Each oCompOcc In oPattern.Occurrences If oCompOcc.SubOccurrences.Count = 0 Then If oCompOcc.DefinitionDocumentType = kPartDocumentObject Then If oCompOcc.IsSubstituteOccurrence = False Then oCompOcc.Grounded = True For Each oConstraint In oCompOcc.Constraints oConstraint.Suppressed = True Next End If End If Else oCompOcc.Grounded = True For Each oConstraint In oCompOcc.Constraints oConstraint.Suppressed = True Next Call AllSubOccs(oCompOcc) End If Next Next Else If oObject.SubOccurrences.Count = 0 Then If oObject.DefinitionDocumentType = kPartDocumentObject Then If oObject.IsSubstituteOccurrence = False Then oObject.Grounded = True For Each oConstraint In oObject.Constraints oConstraint.Suppressed = True Next End If End If Else oObject.Grounded = True For Each oConstraint In oObject.Constraints oConstraint.Suppressed = True Next Call AllSubOccs(oObject) End If End If Next End Sub Sub AllSubOccs(ByVal oCompOcc As ComponentOccurrence) Dim oSubCompOcc As ComponentOccurrence Dim oProp As Property Dim sValue As String Dim oConstraint As Object On Error Resume Next For Each oSubCompOcc In oCompOcc.SubOccurrences If oSubCompOcc.SubOccurrences.Count = 0 Then If oSubCompOcc.DefinitionDocumentType = kPartDocumentObject Then If oSubCompOcc.IsSubstituteOccurrence = False Then oSubCompOcc.Grounded = True For Each oConstraint In oSubCompOcc.Constraints oConstraint.Suppressed = True Next End If Else oSubCompOcc.Grounded = True For Each oConstraint In oSubCompOcc.Constraints oConstraint.Suppressed = True Next Call AllSubOccs(oSubCompOcc) End If End If Next End Sub
------------------ Gruß, Gandhi "Dem guten Frager ist schon halb geantwortet" - Friedrich Nietzsche Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frank_Schalla Ehrenmitglied CAD_SYSTEMBETREUER
Beiträge: 1732 Registriert: 06.04.2002 DELL M6800 Cad Admin Methodikentwickler 3D
|
erstellt am: 27. Mai. 2015 12:37 <-- editieren / zitieren --> Unities abgeben:
Erstmal danke für eure Antworten. Genau hier ist der Punkt. " If oAsm.SelectSet.Count = 0 Then MsgBox "Es sind keine Komponenten selektiert" Exit Sub End If" das wäre eine interaktive Auswahl des Anwenders vorher. Ich muss jedoch alle Komponenten per VBA im Browser vorher auswählen und da hakts
------------------ ************************************ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BernoAn Mitglied
Beiträge: 172 Registriert: 16.01.2014
|
erstellt am: 27. Mai. 2015 13:08 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
Hallo Ein Script welches alles im Browser fixiert, ohne selekt! Code:
Public Sub KomponentenFixieren() If ThisApplication.Documents.Count = 0 Then MsgBox "Die Baugruppe öffnen.", vbExclamation, "Keine Baugruppe" Exit Sub End If If ThisApplication.ActiveDocumentType <> kAssemblyDocumentObject Then MsgBox "Die Baugruppe öffnen.", vbExclamation, "Keine Baugruppe" Exit Sub End If Dim oAsm As AssemblyDocument Set oAsm = ThisApplication.ActiveDocument ForAllComponents oAsm.ComponentDefinition.Occurrences End Sub Public Sub KomponentenFixierungAufheben() If ThisApplication.Documents.Count = 0 Then MsgBox "Die Baugruppe öffnen.", vbExclamation, "Keine Baugruppe" Exit Sub End If If ThisApplication.ActiveDocumentType <> kAssemblyDocumentObject Then MsgBox "Die Baugruppe öffnen.", vbExclamation, "Keine Baugruppe" Exit Sub End If Dim oAsm As AssemblyDocument Set oAsm = ThisApplication.ActiveDocument ForAllComponentsFree oAsm.ComponentDefinition.Occurrences End Sub ' Hilfsfunktionen ---------------------------------------------------------------------------------------------------- Sub ForAllComponents(oOccs As ComponentOccurrences) Dim oOcc As ComponentOccurrence For Each oOcc In oOccs On Error Resume Next oOcc.Grounded = True If oOcc.Constraints.Count > 0 Then For Each oConstraint In oOcc.Constraints oConstraint.Suppressed = True Next End If ThisApplication.StatusBarText = oOcc.Name If Err.Number <> 0 Then Err.Number = 0 GoTo NEXTCOMP End If NEXTCOMP: ForAllComponents oOcc.SubOccurrences Next End Sub Sub ForAllComponentsFree(oOccs As ComponentOccurrences) Dim oOcc As ComponentOccurrence For Each oOcc In oOccs On Error Resume Next oOcc.Grounded = False If oOcc.Constraints.Count > 0 Then For Each oConstraint In oOcc.Constraints oConstraint.Suppressed = False Next End If ThisApplication.StatusBarText = oOcc.Name If Err.Number <> 0 Then Err.Number = 0 GoTo NEXTCOMP End If NEXTCOMP: ForAllComponentsFree oOcc.SubOccurrences Next End Sub
Gruß Berno Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Ehrenmitglied V.I.P. h.c. Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 27. Mai. 2015 13:09 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
|
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2013/2015 Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 27. Mai. 2015 13:17 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
|
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2013/2015 Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 27. Mai. 2015 13:44 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
Hallo Frank, Ich hab mal einen Code aus den Beispielen ein bisschen umgedichtet. Er wählt den angegebenen BrowserNode aus und selectiert das Teil. Ich denke mal, ne Schleife drum herum bekommst du ohne weiteres hin. Code: Sub SelectBrowserNodes() Dim oAssDoc As AssemblyDocument Set oAssDoc = ThisApplication.ActiveDocument Dim oOcc As ComponentOccurrence Set oOcc = oAssDoc.ComponentDefinition.Occurrences.Item(5) 'Hier die zu selectierende Nummer Dim oNativeBrowserNodeDef As NativeBrowserNodeDefinition Set oNativeBrowserNodeDef = oAssDoc.BrowserPanes.GetNativeBrowserNodeDefinition(oOcc) Dim oTopBrowserNode As BrowserNode Set oTopBrowserNode = oAssDoc.BrowserPanes.ActivePane.TopNode Dim oTargetNode As BrowserNode Set oTargetNode = oTopBrowserNode.AllReferencedNodes(oNativeBrowserNodeDef).Item(1) oTargetNode.DoSelect End Sub
------------------ MFG Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Ehrenmitglied V.I.P. h.c. Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 27. Mai. 2015 13:44 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
Zitat: Original erstellt von Chris 31: Wenn ich das nicht völlig falsch interpretiere, dann durchlaufen doch beide geposteten Codes rekursiv die Baugruppe, was ja nicht erwünscht war.
Wie interpretierst du es denn? Hilf mal, oder auch Frank, denn drei haben es bisher schon falsch interpretiert :) Berno, dein Code, jedoch ein wenig gesäubert und umstrukturiert: Code:
Sub KomponentenFixieren() If MeineBaugruppe Is Nothing Then Exit Sub ForAllComponents MeineBaugruppe.ComponentDefinition.Occurrences, True End Sub Sub KomponentenFixierungAufheben() If MeineBaugruppe Is Nothing Then Exit Sub ForAllComponents MeineBaugruppe.ComponentDefinition.Occurrences, False End Sub Function MeineBaugruppe() As Inventor.AssemblyDocument If ThisApplication.Documents.Count = 0 Then MsgBox "Die Baugruppe öffnen.", vbExclamation, "Keine Baugruppe" Exit Function End If If ThisApplication.ActiveDocumentType <> kAssemblyDocumentObject Then MsgBox "Die Baugruppe öffnen.", vbExclamation, "Keine Baugruppe" Exit Function End If Set MeineBaugruppe = ThisApplication.ActiveDocument End Function Sub ForAllComponents(oOccs As ComponentOccurrences, KomponenteFixieren As Boolean) For Each oOcc In oOccs On Error Resume Next oOcc.Grounded = KomponenteFixieren For Each oConstraint In oOcc.Constraints oConstraint.Suppressed = KomponenteFixieren Next ThisApplication.StatusBarText = oOcc.Name ForAllComponents oOcc.SubOccurrences, KomponenteFixieren Next End Sub
------------------ Grüße Igor FX64 Software Solutions - Inventor Tools FX64 LambdaSpect - Lichtsimulation mit Autodesk Inventor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2013/2015 Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 27. Mai. 2015 14:26 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
Zitat: Original erstellt von Frank_Schalla: Hallo Weil das rekursive durchlaufen einer Baugruppe sehr langsam ist möchte ich folgendes tun. Alle Objekte (ab dem ersten Komponenteneintrag normalerweise der 5te) auswählen und das Kommando "Fixiert" aufrufen. Im Moment bekomme ich jedoch die Auswahl der Browsernodes nicht hin Hat jemand eine Idee ?? Danke Frank
Er möchte doch durch Auswahl der Browsernodes durch die Baugruppe gehen. ------------------ MFG Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Ehrenmitglied V.I.P. h.c. Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 27. Mai. 2015 14:44 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
|
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2013/2015 Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 27. Mai. 2015 14:49 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
Zitat: Original erstellt von daywa1k3r:
Ich verstehe den Umweg über die Browsernodes nicht. Aber egal, sofern der Vorschlag funktioniert muss ich ja auch nicht
Den Umweg verstehe ich auch nicht, aber ich hab auch nur versucht, auf seine eigentliche Frage: Wie wähle ich die Browsernodes aus? zu antworten. ------------------ MFG Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Ehrenmitglied V.I.P. h.c. Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 27. Mai. 2015 15:08 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
Zitat: Original erstellt von Chris 31:
Den Umweg verstehe ich auch nicht, aber ich hab auch nur versucht, auf seine eigentliche Frage: Wie wähle ich die Browsernodes aus? zu antworten.
So gesehen hätte das auch gereicht: Code:
Sub SelectBrowserNodes2() ThisApplication.ActiveDocument.SelectSet.Select ThisApplication.ActiveDocument.ComponentDefinition.Occurrences.Item(5) End Sub
Aber gut, der Node ist selektiert und was dann? Alle Nodes unter diesem Node müssen selektiert werden (nur die erste Ebene)? Um die dann zu fixieren? Lässt mir irgendwie keine Ruhe ------------------ Grüße Igor
FX64 Software Solutions - Inventor Tools FX64 LambdaSpect - Lichtsimulation mit Autodesk Inventor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frank_Schalla Ehrenmitglied CAD_SYSTEMBETREUER
Beiträge: 1732 Registriert: 06.04.2002 DELL M6800 Cad Admin Methodikentwickler 3D
|
erstellt am: 28. Mai. 2015 08:02 <-- editieren / zitieren --> Unities abgeben:
Hi erst mal Danke für eure Antworten. Hi Igor Wegen "Den Umweg verstehe ich auch nicht, aber ich hab auch nur versucht, auf seine eigentliche Frage: Wie wähle ich die Browsernodes aus? zu antworten." Tja weil die DIVA da wieder völlig ander von der Performance tickt Ich habe eine Baugruppe wo ingesamt 3000 unique components drin sind. Die Knoten der ersten Ebene sollen nun fixiert werden. Dauer per der bekannten recursiven VBA Methode bei mir ca. 2 Minuten. Wenn man nun mal einfach im Browser alles unterhalb der IV Rep Folders (also Views/Pos/LOD) markiert (interaktiv) und dann RMT Fixiert anwählt dauerts genau 8 Sekunden. Deshalb der Ansatz in die Richtung for each node in asm.nodes (alles nach 5 wählen) und dann selectset ground ------------------ ************************************ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Ehrenmitglied V.I.P. h.c. Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 28. Mai. 2015 09:08 <-- editieren / zitieren --> Unities abgeben: Nur für Frank_Schalla
Hallo Frank, klar ist nur die erste Ebene viel schneller als die rekursive Methode. Wird aber nichts mit den Nodes zu tun haben. Das Makro selektiert alles ab den ersten Node. Alternativ kannst du ja testen die eine Zeile innerhalb der Schleife aus- und die andere ein- zu kommentieren. Da dürfte kein Nachteil in der Ausführungsgeschwindigkeit entstehen. Code:
Sub SelectBrowserNodes3() Dim StartNode As Integer Dim oAsm As Inventor.AssemblyDocument Set oAsm = ThisApplication.ActiveDocument For StartNode = 5 To oAsm.ComponentDefinition.Occurrences.Count 'Hier StartNode festlegen 'oAsm.ComponentDefinition.Occurrences.Item(StartNode).Grounded = True oAsm.SelectSet.Select oAsm.ComponentDefinition.Occurrences.Item(StartNode) Next End Sub
------------------ Grüße Igor FX64 Software Solutions - Inventor Tools FX64 LambdaSpect - Lichtsimulation mit Autodesk Inventor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frank_Schalla Ehrenmitglied CAD_SYSTEMBETREUER
Beiträge: 1732 Registriert: 06.04.2002 DELL M6800 Cad Admin Methodikentwickler 3D
|
erstellt am: 28. Mai. 2015 10:59 <-- editieren / zitieren --> Unities abgeben:
|