Die Inventor FAQ wird unterstützt von:

Inventor FAQ Logo

10.04.2017

Inventor automatisieren: Programmieren für Konstrukteure (Teil 14)

Teil 13 verpasst? Dann erstmal hier weiter!

Alle Beiträge der Serie

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.

image

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.

image

Der Name soll frmUnterdruecken sein. Die Caption = Unterdrücken.

image

Jetzt fügen wir folgende Elemente hinzu:

image

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!

image

  • 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:

  1. "globale" Variablen
  2. den Aufruf von "Unterprogrammen" inkl. Übergabe von Parametern
  3. 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.

image

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>

[image41.png]

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:

image

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.

image

Hier ein Beispielcode, der die Namen der Feature nacheinander im Ausgabefenster anzeigt.

image

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.

image

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))

image

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.

image

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?! ;)

image

image

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!

image

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!

image

PS: Wie wir ein Form mittels eines VBA-Programms aufrufen, haben wir ja bereits in Teil 13 besprochen.

Weiter zu Teil 15.

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.

Related Posts Plugin for WordPress, Blogger...
Inventor FAQ Newsletter. Emailadresse: