Teil 13 verpasst? Dann erstmal hier weiter!
Im Teil 13 haben wir unser erstes Form gebaut, dass nicht wirklich sinnvoll war. Heute bauen wir uns eine nützliche Anwendung, die in Bauteilen Feature unterdrücken kann.
Wir bauen uns einen Dialog, in dem der Anwender wählen kann,welche Elemente er im Bauteil unterdrücken will bzw. bei welchen er die Unterdrückung aufheben will. Zuerst wieder das passende VBA-Projekt laden und dann ein neues Form erstellen.
Der Name soll frmUnterdruecken sein. Die Caption = Unterdrücken.
Jetzt fügen wir folgende Elemente hinzu:
3 Checkboxen, 1 Label und 2 Buttons.
Wenn wir die Elemente durch Drag&Drop hinzugefügt und ausgerichtet haben, können wir die Beschriftung (den Text) und den Elementname ändern. WICHTIG: Benennt die Elemente gleich wie ich, sonst musst ihr im Programmcode immer umdenken!
- Der Name der ersten Checkbox soll chbRadien sein (chb steht für CHeckBox), Caption = Radien und der Value = True, also vorgabemäßig soll der Haken gesetzt sein.
- Die Checkbox darunter chbFasen, Caption = Fasen und die letzte Checkbox Name = chbBohrung, Caption = Bohrungen, Value = False.
- Die beiden Buttons heißen btnUnterdruecken bzw. btnNichtUnterdruecken die Caption (Buttontext) seht ihr ja auch oben im Bild.
- Das Label unten Name = lblAnzahl (lbl = Label) und die Caption = Anzahl Objekte:
Die gewünschte Funktion ist, denke ich, klar: Der Anwender kann anhaken, welche Elemente im Bauteil er unterdrücken will (oder die Unterdrückung aufheben) und die eigentliche Funktion wird über den Klick auf eine der Buttons ausgeführt. Im Label unten wird einfach angezeigt, wie viele Elemente unterdrückt wurden.
Wir nutzen neben dem Form auch im Programmcode drei neue Konzepte:
- "globale" Variablen
- den Aufruf von "Unterprogrammen" inkl. Übergabe von Parametern
- Durch alle Elemente einer IPT gehen
"globale" Variablen
Bisher haben wir Variablen immer innerhalb eines Subs definiert. Das bedeutet aber auch, dass diese Variable nur innerhalb dieses Subs gültig ist (man darauf zugreifen kann) und nach dem verlassen des Subs ist die Variable wieder leer. Wenn wir auf Variablen in allen Programmen innerhalb eines Modul (oder in unserem Fall Forms) zugreifen wollen, definieren wir die Variable oberhalb der ersten Sub.
den Aufruf von "Unterprogrammen" inkl. Übergabe von Parametern
Die zweite neue Sache ist eigentlich gar nicht so neu. Wir haben uns Teil 12 bereits angesehen, wie aus einem Sub ein anderes Sub aufruft, nämlich mittels Call <Subname>
Was hier jetzt neu ist, dass wir nicht nur die Sub aufrufen, sondern dazu noch "Werte" an die aufzurufende Sub übergeben. Hier ein Beispielcode zur Verdeutlichung:
In dem Modul gibt es 2 Subs. RuftAuf ruft mittels Call die Sub Rechnen auf, und übergibt der Sub Rechnen 2 Werte nämlich Wert1 und Wert2 im Variablenformat Integer, also Ganzzahl (Übersicht Datentypen VBA).
In der Definition von Rechnen wird jetzt eben nicht nur () dahinter geschrieben wie bisher sondern wir geben an, welche Werte an diese Sub übergeben werden sollen. Dann rechnet die Sub die beiden Werte zusammen und gibt das Ergebnis in einer Msgbox aus.
Stellt sich die Frage, warum man sowas machen soll? Ich könnte dich auch in der Sub RuftAuf direkt rechnen, oder?! Ja, aber stellen wir uns vor, das wir an verschiedenen Stellen im programmcode immer wieder 2 Werte addiere und das Ergebnis als Msgbox ausgeben wollen. Wenn wir das 10 mal machen wollten, müssten wir im Hauptprogramm 10 mal die Berechnung machen. Wenn wir diese Aufgabe in ein Extra-Sub auslagern, müssen wir den Code nur einmal eingeben und können in aufrufen, sooft wir wollen!
Durch alle Elemente einer IPT gehen
Um, je nach angehaken Checkboxen, etwas zu unterdrücken in einem Bauteil müssen wir durch die Baumstruktur gehen und schauen ob ein Element dem Typ des angehakten entspricht und dann entsprechend bei Übereinstimmung unterdrücken bzw. die Unterdrückung aufheben.
Eine erste Maßnahme wäre, mittels unseres Objektuntersuchungsprogramms ein Bauteildokument zu untersuchen. Wir werden feststellen, das sich die Bauteilfeature unter Componentdefinition > Features versteckt. Wir brauchen also wieder eine For Each Schleife mittels der wir uns durch alle Features hangeln.
Hier ein Beispielcode, der die Namen der Feature nacheinander im Ausgabefenster anzeigt.
Private Sub Bauteilbaum() 'Objekt für Dokument anlegen (machen wir schon aus dem FF) Dim Doc As PartDocument Set Doc = ThisApplication.ActiveEditDocument 'Objekt für die ComponentDefinition anlegen (darin sind alle Feature 'des Bauteiles enthalten) Dim odef As ComponentDefinition Set odef = Doc.ComponentDefinition 'Jetzt kommt die For-Each Schleife, mittels derer wir durch alle Feature gehen 'und in dem Beispiel unten im Immediate-Fenster die Browsernamen ausgeben Dim oEachF As PartFeature For Each oEachF In odef.Features Debug.Print oEachF.Name Next End Sub
Jetzt sollten die grundlegenden Neuerungen in unserem Code klar sein und wir können uns daran machen, dem Form mittels Programmcode leben einzuhauchen. Hier ist das Kernstück unseres Form, das für die Elementunterdrückung zuständig ist.
Den Buttons müssen wir jeweils hinterlegen, das sie den Programmcode oben ausführen, falls die Checkbox angehakt ist. In der If-Abfrage steht jeweils der Name des jeweiligen Checkboxelements dann die Eigenschaft, die wir mittels If vergleichen wollen (Value, die entweder True (Haken gesetzt) oder False ist (kein Haken))
Um euch Tipparbeit zu ersparen, geht mittels RMT auf das Form > View Code in das Form-Codefenster und fügt dann den Code unten ein.
Dim Zaehler As Integer Private Sub btnNichtUnterdruecken_Click() Zaehler = 0 If ChbFasen.Value = True Then Call Unterdruecken(kChamferFeatureObject, False) If ChbRadien.Value = True Then Call Unterdruecken(kFilletFeatureObject, False) If chbBohrung.Value = True Then Call Unterdruecken(kHoleFeatureObject, False) End Sub Private Sub btnUnterdruecken_Click() Zaehler = 0 If ChbFasen.Value = True Then Call Unterdruecken(kChamferFeatureObject, True) If ChbRadien.Value = True Then Call Unterdruecken(kFilletFeatureObject, True) If chbBohrung.Value = True Then Call Unterdruecken(kHoleFeatureObject, True) End Sub Private Sub Unterdruecken(Elementart As ObjectTypeEnum, Zustand As Boolean) 'Diese Sub führt die unterdrückung / Unterdrückung aufheben aus 'Übergeben werden, Die Elementart (Radien, Fasen, Bohrungen), mit denen was passieren soll 'Und eine Boolsche Variable (True/false) die angibt, was passieren soll 'mit dem Element. True = unterdrücken, False = Unterdr. aufheben 'Diese Zeile ist klar, oder? 'Richtig, Inventor soll keine Meldungen bringen während der Ausführung ThisApplication.SilentOperation = True 'Auch klar Dim Doc As PartDocument Set Doc = ThisApplication.ActiveEditDocument 'Die Componentdefinition, die alle Feature enthält Dim odef As ComponentDefinition Set odef = Doc.ComponentDefinition 'Schleife, mittels der wir uns durch alle Feature hangeln Dim oEachF As PartFeature 'Tritt während des Durchlafens ein Fehler bei einem 'Element auf, soll er zum Schleifenende gehen und 'damit mit dem nächsten Element weiter machen On Error GoTo naechstes For Each oEachF In odef.Features If oEachF.Type = Elementart Then Zaehler = Zaehler + 1 'Darüber wird je nach übergebener Variable das aktulle Element 'unterdrückt oder akriviert oEachF.Suppressed = Zustand 'Der Text des Labels wir angepasst lblAnzahl.Caption = "Anzahl Objekte: " & Zaehler End If naechstes: Next ThisApplication.SilentOperation = False 'Dokument aktualisieren, damit man die Änderungen an den 'Featuren auch sieht. Doc.Update End Sub
Wenn ihr jetzt mittels F5 den Code ausführt, kommt der Dialog und dann könnt ihr Feature unterdrücken oder aktvieren, Hammer oder?! ;)
Da es kein Abbrechenknopf gibt, wird das Fenster mittels dem X-Knopf rechts oben geschlossen.
Viel programmieren musste ihr ja bisher nicht. Bitte schaut euch den Programmcode genau an und versucht ihn zu verstehen. Wer bisher alle Teile mitgemacht hat, sollte damit kein Problem haben. Eine Sache noch: Dieser Elementtyp (kChamferFeatureObject u.a.), der an die Sub Unterdruecken übergeben wird, wie kommt man da drauf in aller Welt? Denk an unsere untersuchungsprogramm und schaut euch die Dinge im Fenster genau an!
Wer will kann ja neben den 3 Elementen noch ein viertes Element in dem Dialog ergänzen und den Code anpassen. Weitere Feature, die ihr ebenfalls ergänzen könnt findet ihr unter ComponentDefinition > Features mehr als genug. Zudem könnten die Box noch ein Abbrechenknopf vertragen.
Viel Spass!
PS: Wie wir ein Form mittels eines VBA-Programms aufrufen, haben wir ja bereits in Teil 13 besprochen.
Keine Kommentare:
Kommentar veröffentlichen
War der Beitrag hilfreich oder hast du eine Ergänzung dazu?
Ist noch eine Frage offen?
Ich freue mich auf deine Rückmeldung!
Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.