Die Inventor FAQ wird unterstützt von:

Inventor FAQ Logo

13.03.2017

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

Teil 9 verpasst? Dann erstmal hier weiter!

Alle Beiträge der Serie

In Teil 9 haben wir uns mit dem Drucken beschäftigt. Ich denke, "die Hausaufgaben" waren kein Problem. Die Abfrage ob ReferencedDocuments oder AllReferencedDocuments machen wir wie in der Public Sub SkizzeUnsichtbar.

Antwort = MsgBox("Auch Unterkomponenten (Ja) oder nur erste Ebene (Nein)", vbYesNo)
    If Antwort = vbYes Then …
    If Antwort = vbCancel Then …

Alles Schwarz: oDrgPrintMgr.AllColorsAsBlack = True

Heute schauen wir uns ein paar kleinere Tools für die Zeichnung an. Wir werden ein kleines Programm schreiben, das Bemaßungen löscht, die keiner Geometrie zugeordnet sind (die werden rosa dargestellt). Das zweite Programm zentriert alle Bemaßungstexte.

Zuvor aber ein kleines Hilfsprogramm, dass uns als Programmierer das Untersuchen von Objekten vereinfacht und in jeden "Programmierwerkzeugkasten" gehört. Mein "Objektuntersuchenprogramm" (siehe auch hier). So schaut es aus:

Sub Infos_auslesen()
   Dim obj As Object
   On Error GoTo Keine_Auswahl
    'Überwachung auf obj erstellen oder Lokal Fenster öffnen um obj zu untersuchen
    Set obj = ThisApplication.ActiveDocument.SelectSet(1)
    GoTo halt
Keine_Auswahl:
    Set obj = ThisApplication.ActiveDocument
halt:
    'Sorgt dafür das hier die Ausführung angehalten wird
     Stop
End Sub

Das Programm zeigt im Lokalfenster (VBA-Editor: Ansicht > Lokal-Fenster) Infos zum gewählten Inventorobjekt an oder wenn nichts gewählt wurde, Infos zum aktuellen Dokument. Das macht es euch sehr einfach, Objekte zu untersuchen und deren Eigenschaften anzuschauen.

Öffne wie immer den VBA-Editor und lade dein Benutzer-IVB-Projekt. Kopiere den Quelltext oben in dein Projekt. Öffne eine Zeichnung und führe das Programm aus ohne vorher etwas in der Zeichnung auszuwählen (auch nicht das Blatt!).

image

Im Lokalfenster findest du einen Eintrag Obj der dir das aktuelle Zeichnungsobjekt anzeigt.

Wähle jetzt das Zeichnungsblatt an (es wird rot umrandet wenn es gewählt ist) und führe das Programm nochmals aus. So kannst du das Blattobjekt untersuchen:

image

Und nun wähle eine Bemaßung aus und mache das gleiche:

image

Da siehst du u.a., dass eine Bemaßung eine Eigenschaft "Attached" hat die angibt, ob die Bemaßung am einem Geometrieobjekt angeheftet ist. (Es gibt noch einige mehr, wie etwa ob Bemaßung der Maßtext unsichtbar gemacht wurde (HideValue) und viele andere. Die API-Hilfe beschreibt dir alle Eigenschaften. Suche nach dem Objektname der hinter Obj bei Typ steht. Du kannst dazu Texte über das Kontextmenü rauskopieren.

image

Die Kopie fügst du in ein Notepad (oder besser weil viel leistungsfähiger Notepad++) Fenster ein, wo du den Text hinter Object/ nochmals kopierst und in den API-Hilfe im Register Index einfügst.

image

image

In der Hilfe findest du neben der Beschreibung der Eigenschaften (Properties) auch die Methoden, die du auf das Objekt anwenden kannst. Zur Erinnerung: Methoden sind "Befehle" mit denen du objektspezifisch Funktionen auf eben dieses Objekt ausführen kannst.

Bemaßung, die nicht einer Geometrie zugeordnet ist, löschen

Unser erstes Beispiel soll alle Bemaßungen löschen, die keiner Geometrie zugeordnet sind. Um das überhaupt probieren zu können, müssen wir eine Bemaßung mit den grünen Griffen von der Geometrie wegziehen. Das sollte dann so aussehen:

image

Hier der gesamte Quelltext des Programmes:

Public Sub LoescheNichtzugeordneteMasse()
    
    Dim oDoc As DrawingDocument
    Set oDoc = ThisApplication.ActiveDocument
    
    'Aktuelles Zeichungsblatt definieren
    Dim oSheet As Sheet
    Set oSheet = oDoc.ActiveSheet
    
    'Bemaßungsobjektreferenz
    Dim oDrawingDim As DrawingDimension
    
    'Gehe durch alle Maße und prüfe, ob die Bemaßung einer Geometrie zugeordnet ist. Wenn nein, dann löschen
    For Each oDrawingDim In oSheet.DrawingDimensions
        If oDrawingDim.Attached = False Then
            Call oDrawingDim.Delete
        End If
    Next
End Sub

Der erste Block ist unser üblicher Objektverweis auf das aktuelle Dokument im Inventor, das eine Zeichnung sein muss, da oDoc als DrawingDocument (und nicht als Document) definiert ist! Fehler werden in dem Code nicht abgefangen, aber die Fehlerbehandlung haben wir ja bereits besprochen, ebenso wie deren Wichtigkeit!

Dann definieren wir ein Sheetobjekt (Set oSheet = oDoc.ActiveSheet), das für das aktuelle Zeichnungsblatt steht. Das Blatt enthält u.a. alle Bemaßungen, die darauf enthalten sind.

Wir wollen etwas mit Bemaßungen anstellen, also definieren wir auch dazu ein Objekt (Dim oDrawingDim As DrawingDimension) ohne im aber etwas zuzuweisen (set …), das kommt erst in der Schleife unten.

Jetzt gehen wir mit einer For Each Schleife durch alle Maße auf dem Sheet. Wie man darauf kommt? Wir haben das Sheetobjekt untersucht und darin gibt es einen Eintrag für alle Bemaßungen auf dem Blatt. Deswegen ist das Untersuchen der Objekte, die du programmiertechnisch verändern willst. Mit Hilfe der dort angezeigten Eigenschaften und der in der API-Hilfe passenden Methoden kannst du dir selbst viele Dinge selbst erarbeiten!

image

Wenn die Dimension nicht attached ist dann wird sie mit der Methode delete gelöscht.

Bemaßungstext zentrieren

Hier das zweite Programm:

Public Sub MasstexteZentrieren()
    
    Dim oDoc As DrawingDocument
    Set oDoc = ThisApplication.ActiveDocument

    
    Dim oSheet As Sheet
    Set oSheet = oDoc.ActiveSheet

    Dim oDrawingDim As DrawingDimension

    For Each oDrawingDim In oSheet.DrawingDimensions
        If TypeOf oDrawingDim Is LinearGeneralDimension Or _
           TypeOf oDrawingDim Is AngularGeneralDimension Then
            Call oDrawingDim.CenterText
        End If
    Next
End Sub

Es ist im Prinzip das gleiche, wie Programm eins. Trotzdem gibt es drei neue Dinge. Zum einen ist im If ein Or drin im Schema

If A OR B then.

Zudem ist nach dem Or ein _. Mit einem Unterstrich kann man dem Programmcode sagen, das der Zeilenumbruch als eine Zeile zu sehen ist. So können lange Zeilen in 2 Zeilen aufgeteilt werden. Die Zeile ohne _ würde so aussehen:

If TypeOf oDrawingDim Is LinearGeneralDimension Or TypeOf oDrawingDim Is AngularGeneralDimension Then

Die andere Neuerung ist TypeOf mit dem man vergleichen kann, ob ein Objekt zu einem bestimmten Typ gehört. Auszug aus der Hilfe dazu:

Ein Ausdruck der Form TypeOf Objektname Is Objekttyp. Objektname ist ein beliebiger Objektverweis, und Objekttyp ist ein beliebiger gültiger Objekttyp. Der Ausdruck ergibt True, wenn Objektname dem Objekttyp entspricht, der durch Objekttyp angegeben wird. Andernfalls ist das Ergebnis False.

Wir wollen den Text nur bei Linearen- und Winkelbemaßungen zentrieren.

Um das Programm zu testen, müsst ihr den Maßtext aus der Mitte ziehen…

image

… und das Programm starten. Der Text wird wieder zentriert.

Das Wichtige in diesem 10. Teil unseres kleines Kurses ist sicherlich das erste Programm, zum untersuchen von Objekten. Damit könnt ihr Objekte betrachten, mit denen ihr etwas machen wollt. Wenn ihr über die Programmierung etwas ändern wollt, muss es dazu eine Eigenschaft geben oder eine Methode!

Bis zum nächsten mal!

Weiter zu Teil 11!

1 Kommentar:

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: