| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Arbeitselemente global ausblenden (2737 mal gelesen)
|
TSch Mitglied CAD/PDM Administrator
Beiträge: 102 Registriert: 26.07.2002 Sei frohgemut bei allen Dienstobliegenheiten !
|
erstellt am: 10. Feb. 2005 17:47 <-- editieren / zitieren --> Unities abgeben:
Hallo Experten ! Bevor ich wieder tagelang rumwurschtele... Ich möchte in meinem Code in einer Baugruppe ALLE (auch die von Teilen/Unterbaugruppen etc.) Arbeitselemente unsichtbar schalten. Frage an Euch Experten : Wie gehts ? Gruß Thomas
------------------ Thomas Sch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PaulSchuepbach Moderator Programmierer
Beiträge: 1005 Registriert: 01.10.2003
|
erstellt am: 10. Feb. 2005 18:19 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Zitat: Original erstellt von TSch: ... Frage an Euch Experten : Wie gehts ?
Oh, danke der Nachfrage, Thomas, uns geht's gut ! Gruesse,
Paul www.morecam.ch/cad.htm ... ach, Du hattest ja noch 'ne Frage, ausblenden aller Arbeitselemente. Das ist eigentlich ganz einfach: Du gehts mit einer Schleife durch die Baugruppe. Findest Du ein Bauteil, musst Du es oeffnen, alle Arbeitselemente (wiederum mit 'ner Schleife durch die Collection-Objekte von Arbeitsebenen, Arbeitsachsen und Arbeitspunkten) auf .Visible = False schalten und speichern. Tipp: oeffne die Dateien unsichtbar und die Macht der Performance wird mit Dir sein. Jetzt kommt der Trick: Findest Du aber ein Sub-Assembly, musst Du die obige Funktion aufrufen, die wiederum durch die gesamte Struktur durchgeht und - wird ein Bauteil gefunden, dann... alles ausbelnden (wie oben) - wird aber ein Sub-Assembly gefunden, dann wiederum die Funktion aufrufen usw. bis Du durch alles durch bist. Das nennt sich ein 'rekursiver Aufruf'.
Hoffe, das Hilft. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TSch Mitglied CAD/PDM Administrator
Beiträge: 102 Registriert: 26.07.2002 Sei frohgemut bei allen Dienstobliegenheiten !
|
erstellt am: 10. Feb. 2005 18:40 <-- editieren / zitieren --> Unities abgeben:
Hi Paul ! Freut mich, das es Euch (hoffentlich allen) gut geht Die Antwort hatte ich gefürchtet....durch alles durcheiern.. Aber macht nix, hatte nur gehofft, daß Ihr Gurus einen Trick kennt Danke für die prompte Antwort, mache mich nun "ans Werk" Charmanten Abend noch ! Thomas ------------------ Thomas Sch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 10. Feb. 2005 18:43 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Zitat: Original erstellt von PaulSchuepbach: ... Du gehts mit einer Schleife durch die Baugruppe. Findest Du ein Bauteil, musst Du es oeffnen, alle Arbeitselemente (wiederum mit 'ner Schleife durch die Collection-Objekte von Arbeitsebenen, Arbeitsachsen und Arbeitspunkten) auf .Visible = False schalten und speichern. Tipp: oeffne die Dateien unsichtbar und die Macht der Performance wird mit Dir sein...
Kommt er nicht über Occurrence.Definition an die Work -Planes, -Points, -Axes... ? Zitat: Bevor ich wieder tagelang rumwurschtele...
Wurschtle dich ruhig durch. Da lernst du wenigstens etwas dabei. Wie du eine Baugruppe rekrusiv durchsuchst findest du in Inventor SDK unter "AssemblyTree". Ist aber ApprenticeServer. Genau das Gleiche geht aber auch mit Inventor Object. ------------------ Grüße daywa1k3r Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 Inventor 2020 / VBA
|
erstellt am: 26. Feb. 2021 09:27 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Hallo zusammen, ich habe im Prinzip die gleiche Frage, jedoch habe ich bereits meinen rekursiven Aufruf integriert. Allerdings tritt ein für mich komisches Phänomen auf: Ich blende eigentlich alle Arbeitselemente in den Unerbaugruppen und den Bauteilen einer Baugruppe aus. Wenn jedoch eine Unterbaugruppe eine sellbsterstellte Arbeitsebene beinhaltet, so wird diese nicht mitausgeblendet. Die Ursprungsbenen aber schon. Dabei gehe ich eigentlich über Definition. Anbei der Codeteil im Hauptmakro: Dim Occurences As ComponentOccurrences Dim oOcc As ComponentOccurrence 'Arbeitselemente auf niedrigeren Ebenen ausblenden, wenn 'es mindestens eine Occurrence innerhalb der Definition des 'Dokuments gibt. If Doc.ComponentDefinition.Occurrences.Count > 0 Then Call ElementeAusblenden(Doc.ComponentDefinition.Occurrences) End If 'Alle Arbeitselemente auf oberster Ebene ausblenden ElementAusblenden Doc Hier jetzt noch mein rekursiver Aufruf:
'Alle Elemente in Unterbaugruppen / -bauteilen rekursiv ausblenden Private Sub ElementeAusblenden(Occurrences As ComponentOccurrences) Dim oOcc As ComponentOccurrence For Each oOcc In Occurrences 'Falls diese Occurence eine Baugruppe ist, Unterbaugruppe / Unterbauteil aufrufen If oOcc.DefinitionDocumentType = kAssemblyDocumentObject Then Call ElementeAusblenden(oOcc.SubOccurrences) End If 'I als Zählvariable Dim i As Integer 'Arbeitsebenen für aktuelle Occurrence ausblenden For i = 1 To oOcc.Definition.WorkPlanes.Count oOcc.Definition.WorkPlanes.Item(i).Visible = False Next i 'Arbeitsachsen für aktuelle Occurrence ausblenden For i = 1 To oOcc.Definition.WorkAxes.Count oOcc.Definition.WorkAxes.Item(i).Visible = False Next i 'Arbeitspunkte für aktuelle Occurrence ausblenden For i = 1 To oOcc.Definition.WorkPoints.Count oOcc.Definition.WorkPoints.Item(i).Visible = False Next i 'Skizzen für aktuelle Occurrence ausblenden For i = 1 To oOcc.Definition.Sketches.Count oOcc.Definition.Sketches.Item(i).Visible = False Next i Next End Sub Ich habe bereits .Rebuild() oder .Update() ausprobiert um die Ansicht des Modells zu aktualisieren, aber auch das ist in diesem Zusammenhang nutzlos. Die Arbeitsebenen bleiben sichtbar.
Ich wäre sehr dankbar, wenn mir jemand diesen Sachverhalt erklären könnte. Dann komme ich meiner Problemlösung vielleicht wieder einen Schritt näher. Vielen Dank!
------------------ Grüße, Kristina Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 26. Feb. 2021 10:04 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Hallo Thunja, nur kurz überflogen. Du musst den rekursiven Aufruf ans Ende deiner For Each Next Routine stellen, damit der Code zum Ausblenden der Arbeitselemente auch für die Unterbaugruppe ausgeführt wird.
Code:
For Each oOcc In Occurrences 'I als Zählvariable Dim i As Integer 'Arbeitsebenen für aktuelle Occurrence ausblenden For i = 1 To oOcc.Definition.WorkPlanes.Count oOcc.Definition.WorkPlanes.Item(i).Visible = False Next i 'Arbeitsachsen für aktuelle Occurrence ausblenden For i = 1 To oOcc.Definition.WorkAxes.Count oOcc.Definition.WorkAxes.Item(i).Visible = False Next i 'Arbeitspunkte für aktuelle Occurrence ausblenden For i = 1 To oOcc.Definition.WorkPoints.Count oOcc.Definition.WorkPoints.Item(i).Visible = False Next i 'Skizzen für aktuelle Occurrence ausblenden For i = 1 To oOcc.Definition.Sketches.Count oOcc.Definition.Sketches.Item(i).Visible = False Next i'Falls diese Occurence eine Baugruppe ist, Unterbaugruppe / Unterbauteil aufrufen If oOcc.DefinitionDocumentType = kAssemblyDocumentObject Then Call ElementeAusblenden(oOcc.SubOccurrences) End If Next
Versuchs mal so. Grüße EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 Inventor 2020 / VBA
|
erstellt am: 26. Feb. 2021 10:08 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Hallo ElBe 3D, leider hat das nicht funktioniert. Wäre auch zu schön, um wahr zu sein... Denn nach dem rekursiven Aufruf springt er am Ende für jede Ebene weiter in For-Next-Schleifen. Hab das mal in Einzelschritten durchlaufen lassen. Es ist also scheinbar egal, wo der Aufruf steht. Danke trotzdem. Möglicherweise brauche ich statt .Rebuild() oder .Update() eine andere Methode um nur die Ansicht zu aktualisieren. Ich habe nun per Einzelschritt die besagten Ebenen ebenfalls untersucht und diese werden bei Visible auf false gesetzt. Das würde ja bedeuten, dass mein Programm eigentlich schon das macht, was es soll, nur die Ansicht nichtaktualisiert wird. Zusatzinfo: Die Unterbauteile / -gruppen sind nicht ausgecheckt und dürfen auch nicht ausgecheckt werden. ------------------ Grüße, Kristina
[Diese Nachricht wurde von Thunja am 26. Feb. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 26. Feb. 2021 10:21 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Hallo Bei so alten Beiträgen eröffne vielleicht doch lieber einen neuen. Ich habe mir eine Baugruppe erstellt. Darin eine Unterbaugruppe erstellt und in dieser ein Bauteil "Klotz". In der Unterbaugruppe habe ich eine Arbeitsebene als Versatz von einer Ursprungsebene der Unterbaugruppe erstellt. Stimmt der Aufbau soweit? Mit unten stehendem Codde konnte ich den Fehler nicht reproduzieren. Bleibt nur eine einzelne Arbeitsebene sichtbar oder alle Arbeitsebenen in der Unterbaugruppe? Betrifft es nur eine einzelne Baugruppe oder alle? Bleiben die Arbeitsebenen in den Bauteilen auch sichtbar? Wird/werden die Arbeitsebenen im Browser auch als sichtbar angezeigt? Hast du mal den Code testweise extrahiert und nur so wie gepostet ausprobiert? Unterdrückst du weiter vorn im Code Fehlermeldungen mit On Error Resume Next? @EIBe 3D Es sollte keinen Unterschied machen, da der Ablauf nach der Rekursion wieder eine Ebene höher zurückkehrt und fortgesetzt wird.
Code:
Option ExplicitPrivate Sub SetWorkObjectsUnvisible() Dim Doc As AssemblyDocument Set Doc = ThisApplication.ActiveDocument Dim Occurences As ComponentOccurrences Dim oOcc As ComponentOccurrence If Doc.ComponentDefinition.Occurrences.Count > 0 Then Call ElementeAusblenden(Doc.ComponentDefinition.Occurrences) End If Doc.Update End Sub Private Sub ElementeAusblenden(Occurrences As ComponentOccurrences) Dim oOcc As ComponentOccurrence Dim i As Integer For Each oOcc In Occurrences If oOcc.DefinitionDocumentType = kAssemblyDocumentObject Then Call ElementeAusblenden(oOcc.SubOccurrences) End If For i = 1 To oOcc.Definition.WorkPlanes.Count oOcc.Definition.WorkPlanes.Item(i).Visible = False Next i For i = 1 To oOcc.Definition.WorkAxes.Count oOcc.Definition.WorkAxes.Item(i).Visible = False Next i For i = 1 To oOcc.Definition.WorkPoints.Count oOcc.Definition.WorkPoints.Item(i).Visible = False Next i For i = 1 To oOcc.Definition.Sketches.Count oOcc.Definition.Sketches.Item(i).Visible = False Next i Next End Sub
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 26. Feb. 2021 10:26 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Schau mal ob das Makro von daywa1k3r macht was du magst. Es deckt aber nur die Arbeitsebenen ab Code:
' Macro hides work planes ' recursive for all assembly components ' FX64, Igor Zupevc, 28.05.2014 Sub HideWorkPlanesRecursive() 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 SwitchWorkPlanes oAsm.ComponentDefinition, False ForAllComponents oAsm.ComponentDefinition.Occurrences, False oAsm.Update End Sub' Macro displays work planes ' recursive for all assembly components ' FX64, Igor Zupevc, 28.05.2014 Sub ShowWorkPlanesRecursive() 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 SwitchWorkPlanes oAsm.ComponentDefinition, True ForAllComponents oAsm.ComponentDefinition.Occurrences, True oAsm.Update End Sub Sub ForAllComponents(oOccs As ComponentOccurrences, bVisible As Boolean) Dim oOcc As ComponentOccurrence For Each oOcc In oOccs On Error Resume Next SwitchWorkPlanes oOcc.Definition, bVisible ForAllComponents oOcc.SubOccurrences, bVisible Next End Sub Sub SwitchWorkPlanes(oDoc As Inventor.ComponentDefinition, bVisible As Boolean) On Error Resume Next Dim oWorkPlane As WorkPlane For Each oWorkPlane In oDoc.WorkPlanes oWorkPlane.Visible = bVisible Next ThisApplication.StatusBarText = oDoc.Document.DisplayName End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 26. Feb. 2021 10:40 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Hallo zusammen, gut zu wissen, das der Code wieder zurück springt. Hatte ich so nicht auf dem Plan Davon abgesehen habe ich die Variante von Thunja und die von rkauskh getestet und beide tun bei mir erstmal was sie sollen. Habe allerdings auch keine Vault-Bauteile bei mir drinnen. Grüße
EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 Inventor 2020 / VBA
|
erstellt am: 26. Feb. 2021 10:49 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Hallo Ralf, also zu deinen Fragen: 1. Es betrifft alle Arbeitsebenen in jeglichen Unterbaugruppen, die Ursprungsbenen hingegen werden ausgeblendet. 2. + 3. Es betrifft alle BG und auch Bauteile, aber auch hier nur die manuell hinzugefügten Arbeitsebenen, nicht die Ursprungsebenen. 4. Ja, die Ebenen werden auch im Brwoser als sichtbar angezeigt. 5. Ich habe den Code bisher nicht einzeln laufen lassen, werde ich aber direkt ml umsetzen. Ergebnis lass ich dich dann wissen. 6. Ich habe kein On Error Resume next in meinem Code verbaut. Vielen Dank für deine Hilfe. Sollte ich trotzdem noch einen neuen Beitrag eröffnen? Nur so ein Gedanke: Hat es möglicherweise damit zu tun, dass ich in meinem rekursiven Aufruf "nur" mit der Occurrence arbeite? Wenn ich die Elemente auf oberster Ebene ausblende, arbeite ich direkt mit der Definition des Documents. Doc.ComponentDefinition.WorkPoints.Item(i).Visible = False ------------------ Grüße, Kristina [Diese Nachricht wurde von Thunja am 26. Feb. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 26. Feb. 2021 10:57 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Hast du mal den Code von Igor gegengetestet? Hiermit:
Code:
Sub SwitchWorkPlanes(oDoc As Inventor.ComponentDefinition, bVisible As Boolean) On Error Resume Next Dim oWorkPlane As WorkPlane Dim oWorkAxis As WorkAxis Dim oWorkPoint As WorkPoint Dim oSketch As Sketch For Each oWorkPlane In oDoc.WorkPlanes oWorkPlane.Visible = bVisible Next For Each oWorkAxis In oDoc.WorkAxes oWorkAxis.Visible = bVisible Next For Each oWorkPoint In oDoc.WorkPoints oWorkPoint.Visible = bVisible Next For Each oSketch In oDoc.Sketches oSketch.Visible = bVisible Next ThisApplication.StatusBarText = oDoc.Document.DisplayName End Sub
Kannst du ihn auf deine Bedürfnisse anpassen. Klappt zumindest hier bei allen angesprochenen Elementen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 Inventor 2020 / VBA
|
erstellt am: 26. Feb. 2021 11:05 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Getestet habe ich den noch nicht, aber der sieht schon sehr ähnlich zu dem aus, was ich habe. Allerdings geht auch Igor hier "nur" durch die oberste Ebene seiner BG oder seines BT. Das funktioniert bei mir ja. Probleme bekomme ich ja bei den Unterbaugruppen /-bauteilen. ------------------ Grüße, Kristina Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 26. Feb. 2021 11:16 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Hallo Nee, nur für's nächste Mal. Den hier machen wir hier fertig würde ich vorschlagen. Ich hab leider auch keinen Vault zur Verfügung, aber das riecht mir stark nach Abbruch des "Änderungsversuches" durch den Vault. Oder kannst du die Ebenen manuell unsichtbar schalten? Reicht es dir, wenn du die Sichtbarkeit nur in der Hauptbaugruppe ausschaltest? Dann versuche es mal mit der Objektsichtbarkeit. Die hat zwar keine Auswirkung auf die Sichtbarkeit, wenn man die eingecheckte Unterbaugruppe separat öffnet, aber vielleicht reicht es so für deine Erfordernisse. Code:
Dim Doc As AssemblyDocument Set Doc = ThisApplication.ActiveDocumentDoc.ObjectVisibility.AllWorkFeatures = False Doc.ObjectVisibility.Sketches = False
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 Inventor 2020 / VBA
|
erstellt am: 26. Feb. 2021 11:17 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Zitat: Original erstellt von EIBe 3D: Schau mal ob das Makro von daywa1k3r macht was du magst. Es deckt aber nur die Arbeitsebenen abCode:
Sub SwitchWorkPlanes(oDoc As Inventor.ComponentDefinition, bVisible As Boolean) On Error Resume Next Dim oWorkPlane As WorkPlane For Each oWorkPlane In oDoc.WorkPlanes oWorkPlane.Visible = bVisible Next ThisApplication.StatusBarText = oDoc.Document.DisplayName End Sub
Kann mir einer erklären, warum hier das oDoc so deklariert wird? oDoc As Inventor.ComponentDefinition Ich kenne bisher nur die Deklaration als ActiveDokument oder Ähnliches, aber nicht als ComponentDefinition. ------------------ Grüße, Kristina Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 26. Feb. 2021 11:28 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
zu vorherigen: igor geht auch durch alle BG-Ebenen der Aufruf des Makros erfolgt durch Sub HideWorkPlanesRecursive() bzw. Sub ShowWorkPlanesRecursive() zu nun: Er hätte auch "oCompDef" oder "oSonstWas" schreiben können. Am Ende ist es ja nur irgendeine Bezeichnung einer Variablen vom Typ ComponentDefinition Allgemein: Igors Code scheint mir gefühlt etwas schneller zu laufen da er über Enumeratoren geht. Kann ich mir natürlich auch einbilden weil irgendwo steht das Enums performanter sind. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 26. Feb. 2021 11:30 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
|
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 Inventor 2020 / VBA
|
erstellt am: 26. Feb. 2021 11:41 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
|
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 26. Feb. 2021 11:45 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Zitat: Original erstellt von rkauskh: ... Ich selbst würde es so nicht machen, da es leicht in die Irre führt.
Konnt ich mir nun nicht verkneifen Edit noch was sinnvolles:
Er greift halt direkt auf die ComponentDefinition zu welche er vorher mit oAsm.ComponentDefinition = ThisApplication.ActiveDocument.ComponentDefinition übergibt [Diese Nachricht wurde von EIBe 3D am 26. Feb. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 26. Feb. 2021 11:58 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Hallo @EIBe 3D Sie sind etwas schneller. Inventor "weiß" bei For Each das du über die gesamte Collection wanderst und kann intern dafür optimieren. Ruft man über das Item-Property auf, kann es nur das eine, einige oder alle sein. Dann wird nicht optimiert, da unklar ist für welches Szenario. Bei kleinen Collections ist der Vorteil fast vernachlässigbar. Was stimmt an dem Satz nicht? Abgesehen von ein paar Konventionen ist die Namensvergabe von Variablen völlig frei und ohne Bezug zum Objekt möglich. Ich finde es nur unsinnig mit dem Namen ein Objekt vom Typ Document zu suggerieren und tasächlich einen Typ ComponentDefinition zu haben oder nichtssagende Namen wie a, b, c zu verwenden. Wenn der Variablename einen beschreibenden Bezug zum Objekt hat, sollte der meiner Meinung auch korrekt sein. ------------------ MfG Ralf
RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 26. Feb. 2021 12:12 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
|
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 Inventor 2020 / VBA
|
erstellt am: 26. Feb. 2021 12:24 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Zitat: Original erstellt von rkauskh: Hallo@EIBe 3D Sie sind etwas schneller. Inventor "weiß" bei For Each das du über die gesamte Collection wanderst und kann intern dafür optimieren. Ruft man über das Item-Property auf, kann es nur das eine, einige oder alle sein. Dann wird nicht optimiert, da unklar ist für welches Szenario. Bei kleinen Collections ist der Vorteil fast vernachlässigbar. Was stimmt an dem Satz nicht? Abgesehen von ein paar Konventionen ist die Namensvergabe von Variablen völlig frei und ohne Bezug zum Objekt möglich. Ich finde es nur unsinnig mit dem Namen ein Objekt vom Typ Document zu suggerieren und tasächlich einen Typ ComponentDefinition zu haben oder nichtssagende Namen wie a, b, c zu verwenden. Wenn der Variablename einen beschreibenden Bezug zum Objekt hat, sollte der meiner Meinung auch korrekt sein.
In eine ähnliche Richtung ging auch meine Frage. Aber ja, ich war durch das Doc als Variablennamen zusätzlich verwirrt... Danke nochmals, ich bin nun auch dahintergekommen, dass eigentlich die Definition von einer Occurrence übergebn wird.
Leider muss ich für heute Schluss machen und kann erst am Montag weiterarbeiten, da ich sonst Stress mit meinem Arbeitgeber bekomme. Ich wünsche euch ein schönes Wochenende und schaue Montag dann nochmals den Code von Daywalker an. Eventuell kann ich damit dann doch noch etwas anfangen.
------------------ Grüße, Kristina Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 26. Feb. 2021 12:44 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Hallo @Thunja Vielleicht noch als Ergänzung. Es kann vorkommen, das Typen mehrfach existieren. Zur genauen Spezifikation reicht dann ComponentDefinition nicht aus. Daher wird die ComponentDefinition als eine ComponentDefinition von Inventor festgelegt. So ein richtig gutes Beispiel fällt mir spontan natürlich nicht ein. Aber es gibt ein Sheets Objekt als Sammlung der Blätter in einer Inventor Zeichnung und ein Sheets Objekt als Sammlung der Blätter in einer Exceldatei. Beides vom Typ Sheets, aber grundverschieden. VBA legt sich auf eines von beiden automatisch fest, aber leider meist doch falsch. Da VBA nicht hellsehen kann, muss man ihm sagen welches von beiden man meint. ------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 Inventor 2020 / VBA
|
erstellt am: 02. Mrz. 2021 15:32 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Also für mein Problem gibt es keine programmierbare Lösung, da es ein Bug von Inventor selbst ist. Deshalb lassen sich alle Ursprungsebenen (egal, auf welcher Hierarchie-Ebene in einer Baugruppe) ausblenden, jedoch die manuell hinzugefügten Ebenen nicht. Es betrifft wohl nur die Version 2020 und das Update 3.4 soll dies dann auch beheben. Ich editiere, wenn ich es getestet habe. ------------------ Grüße, Kristina Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
metalgod Mitglied Technischer Zeichner, Mädchen für alles
Beiträge: 32 Registriert: 23.09.2015 Win10x64 Prof. Intel Core i7-8700K 3,70GHz, 16GB Ram Inventor Prof. 2018 64-Bit Visual Studio 2015 Express
|
erstellt am: 15. Mrz. 2021 15:22 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Zitat: Original erstellt von Thunja: Also für mein Problem gibt es keine programmierbare Lösung, da es ein Bug von Inventor selbst ist. Deshalb lassen sich alle Ursprungsebenen (egal, auf welcher Hierarchie-Ebene in einer Baugruppe) ausblenden, jedoch die manuell hinzugefügten Ebenen nicht.
Hallo, ich glaube nicht, dass das ein Bug ist. Mit der Zeile hier:
Code: oOcc.Definition.WorkPlanes.Item(i).Visible = False
greift man auf das Objekt selbst zu. Wir befinden uns aber in einer Baugruppe, aus der wir darauf zugreifen müssen. D.h. wir müssen nicht mit dem Objekt arbeiten, sondern mit ObjectProxy, der von dem Objekt abgeleitet ist. Der Code hier funktioniert bei mir einwandfrei:
Code:
Option ExplicitPublic Sub ElementeAusblenden() If ThisApplication.ActiveDocumentType <> kAssemblyDocumentObject Then Call MsgBox("ThisApplication.ActiveDocumentType <> kAssemblyDocumentObject") Exit Sub End If Call Rekurs(ThisApplication.ActiveDocument) End Sub Private Sub Rekurs(ByRef IAM As AssemblyDocument) Dim Occs As ComponentOccurrences: Set Occs = IAM.ComponentDefinition.Occurrences Dim wAx As WorkAxis Dim wPl As WorkPlane Dim wPt As WorkPoint Dim wAxPrx As WorkAxisProxy Dim wPlPrx As WorkPlaneProxy Dim wPtPrx As WorkPointProxy Dim objPrx As Object Dim Occ As ComponentOccurrence Dim D As Document For Each D In IAM.AllReferencedDocuments For Each Occ In Occs.AllReferencedOccurrences(D) For Each wAx In D.ComponentDefinition.WorkAxes If (Not wAx.IsCoordinateSystemElement) And (Not wAx.Construction) Then ' Filter bei Bedarf anpassen Call Occ.CreateGeometryProxy(wAx, objPrx) Set wAxPrx = objPrx wAxPrx.Visible = False End If Next For Each wPl In D.ComponentDefinition.WorkPlanes If (Not wPl.IsCoordinateSystemElement) And (Not wPl.Construction) Then ' Filter bei Bedarf anpassen Call Occ.CreateGeometryProxy(wPl, objPrx) Set wPlPrx = objPrx wPlPrx.Visible = False End If Next For Each wPt In D.ComponentDefinition.WorkPoints If (Not wPt.IsCoordinateSystemElement) And (Not wPt.Construction) Then ' Filter bei Bedarf anpassen Call Occ.CreateGeometryProxy(wPt, objPrx) Set wPtPrx = objPrx wPt.Visible = False End If Next Next If D.DocumentType = kAssemblyDocumentObject Then Call Rekurs(D) Next End Sub
Weil der Code so langsam ist, könnte man auf die Rekursion verzichten. Dann gilt das Makro nur für die oberste Baugruppe. Ein Problem gibt es dennoch: die Unsichtbarkeit der Element gilt nicht für die Ansichtsdarstellung: "Hauptansicht". D.h. beim Öffnen der Baugruppe bzw. bei Aktivierung der Hauptansicht ist alles wieder sichtbar. Ich glaube nicht, dass man das in irgendeiner Weise umgehen kann. ------------------ Gruß, alex [Diese Nachricht wurde von metalgod am 15. Mrz. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 Inventor 2020 / VBA
|
erstellt am: 16. Mrz. 2021 10:14 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Guten Morgen Alex, genau das war das Problem. Meinm Vorgesetzter war der Meinung, dass man für jegliche Bauteile einer Baugruppe alle Arbeitselemente ausblenden könne, dies dann als Ansicht speichert und, wenn es jemand anders aus dem Vault öffnet, die gespeicherte Ansicht ebenfalls erhält... Da es mein Vorgesetzter war und er schon mehr Jahre Erfahrung mit dem Programm hat, habe ich ihm das so geglaubt. Vor allem, nachdem er mir das doch an seinem PC sogar gezeigt hatte. Hier lag der Fehler. In der lokalen Datei wird die Ansicht gespeichert, sodass auch auf diese Datei wider zugegriffen wird, wenn man sie lokal nicht gelöscht hat. Bis ich da hinter gekommen bin, hat es doch einige Zeit gedauert. Ich kann per Makro lediglich die Elemente auf oberster Ebene ausblenden, wenn ich nicht alle Unterdateien auschecken möchte. Man sollte niemals den Kollegen trauen... An sich funktionierte mein Code nun aber einwandfrei. Vielen Dank trotzdem für deine Hilfe.
------------------ Grüße, Kristina Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 16. Mrz. 2021 12:37 <-- editieren / zitieren --> Unities abgeben: Nur für TSch
Hallo Das dein Code langsam ist, wundert mich nicht. Du erzeugst für jedes Arbeitselement ein Proxy, egal ob sichtbar oder nicht. Dann schaltest du auch alle bereits unsichtbaren Arbeitselemente erneut unsichtbar. Würdest du vorab prüfen ob das Arbeitselement bereits unsichtbar ist, könntest du deinem Rechenknecht einiges an Arbeit ersparen. Prüfen ist in der Regel immer deutlich schneller als Werte neu setzen. Außerdem bin ich der Meinung, dass du den gleichen Effekt mit dem Deaktivieren der Objektsichtbarkeit erreichst. Da alle Sichtbarkeit deaktiviert werden soll, ist ein schrittweises Durchlaufen nicht erforderlich. Ich hatte es aber so verstanden, dass eben nicht nur die Sichtbarkeit in der obersten Baugruppe deaktiviert werden soll, sondern die Arbeitselemente sollen in den referenzierten Dokumenten deaktiviert werden. Von daher war es korrekt nicht die Proxyobjekte zu nehmen. Das da ein Vault im Spiel ist und keine Schreibrechte auf die referenzierten Dokumente existiert, kam alles erst im Nachgang. @Thunja Dein Chef hat meiner Meinung schon recht. Er deaktiviert die Objektsichtbarkeit (Ribbon "Ansicht", erster Button) aller Arbeiteselemente in der obersten Baugruppe. Anschließend erzeugt er eine neue Ansichtsdarstellung und speichert die Baugruppe. Da es ein "Überschreiben" der Sichtbarkeit in der Baugruppe ist, hat es keine Auswirkungen auf die untergeordneten Baugruppen und Bauteile. Dort ändert sich nichts, wodurch auch kein Konflikt mit dem Vault auftritt. Es sind lediglich Schreibrechte auf die oberste Baugruppe erforderlich. Ich bin mir nicht sicher, aber man kann den Vault sehr wahrscheinlich so einstellen, dass er eine bestimmte Ansicht öffnet oder die zuletzt verwendete (die beim letzten Speichern aktive). Grundsätzlich würde ich den Weg aber vermeiden und besser vor dem Einchecken die Arbeitselemente in jeder Datei unsichtbar schalten. ------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |