| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Unterbaugruppe von Unterbaugruppe editieren... (1700 mal gelesen)
|
Schachinger Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2040 Registriert: 08.04.2002
|
erstellt am: 23. Jun. 2010 16:55 <-- editieren / zitieren --> Unities abgeben:
Hallo, Endlich habe ich etwas Zeit gefunden und kann mich mal ein paar Tage mit .NET für Inventor beschäftigen. Ich bin also was VB/.NET angeht noch ein relatives "Nackerbazerl" - also möge man mir bitte für den Anfang programmiertechnische Unwissenheit bzw. falsche Ausdrucksweisen nicht allzu hart anrechnen. Bei meinem derzeitigen Projekt möchte ich unter anderem verschachtelte Unterbaugruppen editieren. (Das was zwischen den Zeilen passiert lasse ich mal der Einfach halber außen vor) Verwendet wird Inventor 2009 und Visual Basic 2010 Express Zuerst mal der Code-Kopf:
Code:
Dim oApp As Inventor.Application oApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application") Dim HauptBG As Inventor.AssemblyDocument HauptBG = oApp.ActiveDocument
Dann wird nach Unterbaugruppen gesucht. Wird eine gefunden wird sie mit der folgenden Zeile editiert.
Code:
HauptBG.ComponentDefinition.Occurrences.Item(HauptBGi).Edit()
Danch gehts weiter in einem Unterprogramm...
Code:
Dim UnterBG As Inventor.AssemblyDocument UnterBG = oApp.ActiveEditDocument
Mit folgender Zeile (in einer IF-Funktion verpackt) wird geprüft ob wieder eine Unterbaugruppe vorliegt...
Code:
UnterBG.ComponentDefinition.Occurrences.Item(UnterBGi).DefinitionDocumentType.ToString = "kAssemblyDocumentObject"
Jetzt kommt der Teil den ich nicht verstehe.... Mit folgender Zeile möchte ich die Unter-Unterbaugruppe editieren. Eigedlich der selbe Aufbau wie vorher mit dem editieren der ersten Unterbaugruppe. Aber An dieser Zeile bekomme ich eine Fehlermeldung
Code:
UnterBG.ComponentDefinition.Occurrences.Item(UnterBGi).Edit()
Könnte das was damit zu tun haben das ich ich die editierete Baugruppe "UnterBG" mit "oApp.ActiveEditDocument" und nicht mit "oApp.ActiveDocument" definiert habe? Andere Sachen wie Dateinamen der Unter-Unterbaugruppe auslesen etc funktionieren auch alle (z.B.: "UnterBG.ComponentDefinition.Occurrences.Item(UnterBGi).ReferencedDocumentDescriptor.FullDocumentName.ToString") Nur mit dem .Edit hinter dem Item() gibts Probleme...Kann mir jemand weiterhelfen oder zumindest den Wink in die richtige Richtung geben? Die Fehlermeldung ist als TXT angehängt... ------------------ mfg Siegfried Schachinger http://www.tbschatz.at 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: 23. Jun. 2010 21:45 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
Hallo Was machst du denn in den Unterbaugruppen? Ist es wirklich erforderlich die UBG im Edit-Modus zu öffnen? Sonst könnte man mit einer Rekursion arbeiten. Code: Private Sub ProcessOcc()Dim oCompOcc As ComponentOccurrence oCompOcc=ThisApplication.ActiveDocument For Each oCompOcc In oCompDef.Occurrences ' Check if it's child occurrence (leaf node) If oCompOcc.SubOccurrences.Count = 0 Then 'Hier das rein, was du in der Ebene machen willst 'z.B. Namen auslesen Else 'eine Ebene tiefer springen Call processAllSubOcc(oCompOcc) ' subassembly End If Next oCompOcc = Nothing End sub ' This function is called for processing sub assembly. It is called recursively ' to iterate through the entire assembly tree. Private Sub processAllSubOcc(ByVal oCompOcc As ComponentOccurrence) Dim oSubCompOcc As ComponentOccurrence For Each oSubCompOcc In oCompOcc.SubOccurrences ' Check if it's child occurrence (leaf node) If oSubCompOcc.SubOccurrences.Count = 0 Then 'Hier das rein, was du in der Ebene machen willst 'z.B. Namen auslesen Else 'eine Ebene tiefer springen Call processAllSubOcc(oSubCompOcc) End If Next oSubCompOcc = Nothing End Sub
------------------ MfG RK Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Schachinger Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2040 Registriert: 08.04.2002
|
erstellt am: 24. Jun. 2010 10:39 <-- editieren / zitieren --> Unities abgeben:
Hallo rkauskh! Danke für den Code! Oben war zwar etwas mit den Definitionen von oCompDef und oCompOcc verwurschtelt (oCompDef sollte eine ComponentDefinition von ActiveDocument sein / oCompOcc wird erst in For Each ausgefüllt), aber das war nicht so schlimm Ein Problem hatte ich noch mit Ersatzdetailgenauigkeiten - die haben im Unterprogramm bei "oSubCompOcc.SubOccurrences.Count = 0" einen Fehler erzeugt. Da mich diese aber nicht interessieren konnte ich sie mit "oSubCompOcc.Suppressed" auch noch abfangen.. Oder gibts dafür auch eine elegantere Lösung? Was machst du denn in den Unterbaugruppen? Da wird dann z.B. geprüft ob die Unter-Unterbaugruppe ein BibliotheksBG ist bzw. ob verbaute Teile aus der Bib sind. Bei nicht-Bib-Bauteilen/Baugruppen werden dann anhand von einer extern eingelesenen TXT-Datei bestimmte Propertys ausgefüllt bzw. Werte in der fx-Liste bearbeitet. Das Ganze habe ich bisher soweit gebracht das es immer für das "ActiveDocument" funktioniert. Also Einzelbauteile über den Explorer öffnen - und alle geöffneten Bauteile werden bearbeitet bis alle abgearbeitet sind. Jetzt möchte ich das aber soweit erweitern das das Tool auf eine Hauptbaugruppe anwendbar ist und alle verwendeten Bauteile/Baugruppen bearbeitet wobei auch der Name der Unterbaugruppe eine Rolle spielen wird Ist es wirklich erforderlich die UBG im Edit-Modus zu öffnen? Eigendlich nicht. Das ist nur aus Unwissendheid über eine elegantere Lösung meinerseits so geschehen. (Das ist erst mein 4ter Tag mit VB/.NET - bisher habe ich nur einige Kleinigkeiten mit LISP programmiert.) Ich danke Dir für die schnelle Antwort und die gute Hilfe! ------------------ mfg Siegfried Schachinger http://www.tbschatz.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mssoftware Mitglied alles mögliche
Beiträge: 76 Registriert: 15.06.2005 Design Suite 2011-2016 Ultimate Microsoft Visual Studio Professional 2010<P>i7 2600K @3,4Ghz Windows 7 64bit nvidia GTX 760 16GB RAM 2x SSD256GB NAS 1TB (gespiegelt)
|
erstellt am: 24. Jun. 2010 15:05 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
Zitat: Original erstellt von Schachinger: ... Ist es wirklich erforderlich die UBG im Edit-Modus zu öffnen? Eigendlich nicht. Das ist nur aus Unwissendheid über eine elegantere Lösung meinerseits so geschehen. ... [/B]
Ich habe mal was ähnliches programmiert und habe in allen Unterbaugruppen den "Displayname" geändert. Dies wird auch im Hauptbaum dargestellt, allerdings nicht gespeichert, da die Baugruppen nicht im editiermodus waren Ich glaube ab einer bestimmten Baugruppentiefe ist die Funktion auch beim versuchten schreiben abgestürzt. Da du in die Einzelteile iprops schreiben willst, so bleibt dir meiner Meinung nach nicht anderes übrig als diese vorher in den Editiermodus zu versetzen. Vieleicht ist es sogar besser, eine Schleife durch alle Subs und dann jedes Bauteil öffnen und dann iprops schreiben und danach speichern und schließen.... Gruß Maik Schmitz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Schachinger Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2040 Registriert: 08.04.2002
|
erstellt am: 24. Jun. 2010 15:59 <-- editieren / zitieren --> Unities abgeben:
Das ich die verbauten Exemplare dann im rekursivem Unterprogramm bearbeiten muss ist mir klar. Mache ich auch jetzt mit: Code:
oSubCompOcc.Edit() 'hier passiert dann was damit.... oSubCompOcc.ExitEdit(Inventor.ExitTypeEnum.kExitToPrevious)
Das Problem bei mir war das ich vorher nicht mit "SubOccurrences" gearbeite habe sondern die Unterbaugruppe in den Editiermodus versetzt habe und dann sofort die Unter-UnterBG auch in den Editiermodus haben wollte ohne die vorherige Editierung zu beenden(weil ich mir immer über die Occurrences des ActiveEditDocuments mit einem rekursivem Unterprogramm "weiterhangeln" wollte).Ich bin es sozusagen so angegangen wie es ein User machen würde und nicht so wie man es eigentlich programmierer sollte.
------------------ mfg Siegfried Schachinger http://www.tbschatz.at 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: 24. Jun. 2010 19:31 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
Hallo Sorry, ich hatte den Code aus einem meiner Programme rauskopiert und zurechtgestutzt. Dachte ich hätte alles angepaßt, aber im Notepad fällt es mir als Nicht-Profi auch schwer den Überblick zu behalten. Die Ersatzobjekte kannst du über die Eigenschaft "IsSubstitutePart=true/false" ausfiltern, bevor du versuchst auf SubOccurrences.Count zuzugreifen. Eventuell filterst du trotzdem noch die unterdrückten Teile aus, da es sein könnte, das dort der Zugriff auf Parameter nicht funktioniert. Da du jetzt die Rekursion hast und ich mir nicht sicher bin, ob der Edit-Modus erforderlich ist für die fx-Parameter, könntest du ja innerhalb der for each Schleife jeweils in den Editmodus wechseln und wieder raus gehen. Ich würd's erstmal ohne versuchen, da das hin und her wechseln Zeit braucht. Vor allem wenn man die Aktualisierung des Grafikfensters nicht ausschaltet. Blinkt lustig. ------------------ MfG RK Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Schachinger Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2040 Registriert: 08.04.2002
|
erstellt am: 25. Jun. 2010 15:12 <-- editieren / zitieren --> Unities abgeben:
Hallo, Den Zugriff auf die fx-Parameter habe ich ohne Edit-Modus nicht realisieren können. Nur über subOccurrences bin ich nicht bis ComponentDefinition.Parameters.usw... vorgestoßen. Aber egal, mit dem Editieren innerhalb der Schleife gehts ja auch... Das Programm läuft und das ist das wichtigste Aktualisierung des Grafikfensters: Wie kann ich das denn unterdrücken? Unter oApp.ActiveView bzw. oApp.DisplayOptions konnte ich noch nix finden "oApp.ActiveView.Visible = False" kanns ja nicht wirklich sein... Das Grafikfenster bekomm ich zwar dann Grau - aber der Teilebaum wird trotzdem durchgeschüttelt.... Aber das ist ja nur kosmetischer Natur... ------------------ mfg Siegfried Schachinger http://www.tbschatz.at 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: 25. Jun. 2010 16:06 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
Hallo Naja, nur Kosmetik ist das nicht. Beim hin und her schalten muß die Ribbonleiste aktualisiert werden, die Anzeige vom Teilebrowser und im Grafikfenster müssen Bauteile transparent/deckend geschaltet werden. Also doch einiges zu rechnen. Probier mal: Code: oApp.ScreenUpdating = False
Hinterher wieder anschalten nicht vergessen. Falls du eine Try-Catch-Anweisung nutzt, setz das Anschalten in den Finally-Zweig. Auf die Parameter kommt man auch ohne Edit-Modus: Code: Dim oFx As Parameter Set oFx = oCompOcc.Definition.Parameters.Item("Name_des_Parameters") oFx.Value = 0.5
bzw. Code: Dim oFx As Parameter Set oFx = oSubCompOcc.Definition.Parameters.Item("Name_des_Parameters") oFx.Value = 0.5
Man muss natürlich bedenken, daß z.B. Blechparameter und Referenzparameter schreibgeschützt sind. Erkennt man auch im Parametereditor an der grauen Hinterlegung. ------------------ MfG RK Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Schachinger Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2040 Registriert: 08.04.2002
|
erstellt am: 26. Jun. 2010 10:39 <-- editieren / zitieren --> Unities abgeben:
Hallo rkauskh! Zum Ausschalten des Grafikfensters: oApp.ScreenUpdating funktioniert. Ich hab mal die Performance anhand einer sehr großen Baugruppe (ca. 5500 aktive Dokumente) einmal mit und einmal ohne ScreenUpdating getestet. Dier Unterschied liegt bei einer Laufzeit von fast 12 Minuten bei nur 2 Sekunden was eigendlich als Messfehler gesehen werden kann. Vermutung meinerseits: Ich denke dass auch bei "ScreenUpdation = False" im Hintergrund Menüflächen geladen werden und auch welche Bauteile transparent/deckend geschaltet werden soll berechnet wird. Das Ergebniss wird dann aber wohl nicht an die Grafikkarte weitergegeben... Dann hab ichs mal mit "deckende Komponente Aus" probiert. Mit dem Ergebniss das sie Durchlaufzeit auf 12:50 angeschwollen ist.. Wenn ich vorher Unterbaugruppen unterdrücke die für die Programmablauf unrelevant sind (ca. Halbierung der aktiven Dokumente) verringert sich die Lauftzeit um ca. 35%... Das ist mal nicht so schlecht Zum vermeiden des Edit-Modus: Also bei mir wird oSubCompOcc.Definition.Parameters.... nicht erkannt... (siehe Anhang - habs nochmal getestet) Kann das sein das das erst ab IV2010 so funktioniert? (setze IV2009 ein) Wäre schade - weil genau der Edit-Modus für die relativ lange Laufzeit verantwortlich ist...(Wobei das jetzt immer noch ca. 50x schneller ist als vorher von Hand *G*) [EDIT] Sys-Info Update [/EDIT] ------------------ mfg Siegfried Schachinger http://www.tbschatz.at [Diese Nachricht wurde von Schachinger am 26. Jun. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 26. Jun. 2010 12:12 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
Hallo Siegfried, schön dich wieder zu sehen Was die Eigenschaft Parameters betrifft wird es so sein, dass die ComponentDefinition zu dem Zeitpunkt nicht eindeutig ist. Eine Occurrence könnte AssemblyComponentOccurrennce, PartComponentOccurrence,... Je nach deiner Programmlogik könntest du den Typ prüfen: Code:
oOcc.DefinitionDocumentType = Inventor.DocumentTypeEnum.kPartDocumentObject
und entsprechend casten: Code:
(oOcc.Definition as Inventor.PartComponentDefinition).Parameters
------------------ Grüße Igor
FX64 Software Solutions - Inventor Tools 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. Jun. 2010 12:25 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
Hallo Vorgeschlagen hat er mir die Parameter an der Stelle auch nicht. Würde man die ComponentDefinition als Assembly-, SheetMetal- oder PartComponentDefinition deklarieren, würde er's auch vorschlagen. Das wäre sauberer dort jeweils den Typ zu prüfen und entsprechend zu casten, aber manchmal siegt auch der innere Schweinehund. Schade, wieder zu langsam. Könnte sein, daß ScreenUpdating beim Wechsel der Umgebungen immer wieder von Inventor angeschaltet wird und deswegen nix hilft. Eventuell könnte man auch ein DeferUpdates=true probieren, was dem Aufschieben der Aktualisierung entspricht und das Neuberechnen des Modells auf's Ende der Änderungen verschiebt. ------------------ MfG RK Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Schachinger Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2040 Registriert: 08.04.2002
|
erstellt am: 28. Jun. 2010 08:54 <-- editieren / zitieren --> Unities abgeben:
Hallo Igor, Ja, nach mehreren Versuchen an einen Inventor-VBA-Kurs teilnehmen zu können (wurde jedesmal abgesagt wegen zu wenigen Anmeldungen ) habe ich mich entschlossen mal auf eigene Faust den Sprung ins kalte VB-Wasser zu wagen. Von der Idee her habe ich deinen Vorschlag verstanden. Habs auch kurz ausprobiert aber irgendwo ist da noch ein Fehler meinserseits drinnen. Leider ist das Zeitfenster das mir für meine VB-Schwimmversuche zur Verfügung stand vorerst wieder geschlossen (Das nächste Projekt steht vor der Tür). Aber in einigen Wochen möchte ich das Programm sowiso weiterentwickeln und dann werde ich mich hier wieder melden und deinen Post weiterverfolgen Da dabei dann die eine oder andere Rückfrage entstehen wird ist eine Fortsetzung des Threads wohl auch ziemlich sicher. Danke erstmal an alle für die Unterstützung! ------------------ mfg Siegfried Schachinger http://www.tbschatz.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |