Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  Sub aufrufen, die andere Sub beendet

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Sub aufrufen, die andere Sub beendet (2935 mal gelesen)
rkauskh
Moderator
Dipl.-Ing. (FH) Versorgungstechnik




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 18. Jan. 2009 14:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo

Kein Inventor-Problem, aber vielleicht helft ihr mir trotzdem.
Ich habe eine eigene Button-Leiste, die über AddButton gefüllt wird. Ein Button ruft eine Sub auf, die über eine Loop-Schleife am Laufen gehalten wird. Der Button bleibt gedrückt. Ins Kontextmenü habe ich mir einen Fertig-Befehl gebastelt, der die Sub beendet. Jetzt mein Problem. Klickt der User auf einen weiteren Button meiner Leiste, ohne die erste Sub vorher zu beenden, startet zwar schön die zweite Sub mit ihrer Loop-Schleife (sind 2 verschiedene), aber die erste Sub wird nicht beendet und der erste Button bleibt gedrückt. Sieht blöd aus und ich würde das gern ändern. Ich kann aber mW aus der zweiten Sub heraus nicht die erste beenden.
Geht das prinzipiell nicht? Wie könnte man sowas lösen?

------------------
MfG
RK

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

daywa1k3r
Moderator
Softwareentwickler




Sehen Sie sich das Profil von daywa1k3r an!   Senden Sie eine Private Message an daywa1k3r  Schreiben Sie einen Gästebucheintrag für daywa1k3r

Beiträge: 3497
Registriert: 01.08.2002

Alienware m17x, Win7, Inventor2012

erstellt am: 18. Jan. 2009 14:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für rkauskh 10 Unities + Antwort hilfreich

Hallo,

ich wage zu behaupten, dass du grundsätzlich was falsch machst, wenn Inhalt deiner Funktion eine Endlosschleife ist, die über das Kontextmenü beendet werden muss. Desweiterem fällt es mir schwer zu glauben, dass ein Klick auf eine Schaltfläche bzw. ein Kontextmenü überhaupt möglich ist sobald ein Inventor AddIn die Endlosschleifen dreht. Aber egal. Am einfachsten wird es für dich wohl sein, deine Schaltflächen auf Inaktiv zu schalten, sobald deine erste Funktion aufgerufen wird. Wenn du diese Funktion über dein Kontextmenü beendet hast, kannst du die Schaltflächen wieder auf aktiv schalten, und der Benutzer kann wieder darauf klicken.

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




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 18. Jan. 2009 15:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo

Danke erstmal für den Tip, werd ich ausprobieren, sobald ich gefunden habe wo und wie das geht.

Die Sub dreht in einer Schleife und "wartet" darauf das der User etwas anklickt/selektiert. Über einen Select-Filter am Select-Event werden nur Kanten und Flächen als gültige Auswahl akzeptiert und eine zweite Routine ausgeführt, die die eigentliche Arbeit erledigt. Hast du einen alternativen Vorschlag? Mir ist die Prozessorlast (ca 45%) dabei auch schon aufgefallen, die dieser "Leerlauf" erzeugt.


------------------
MfG
RK

EDIT: Ok, den Button disable hab ich gefunden. Bringt nur in meiner Version nix, da ja meine Sub in der Schleife läuft und der disable erst mit dem Ende der Sub wirksam zu werden scheint.

[Diese Nachricht wurde von rkauskh am 18. Jan. 2009 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

rkauskh
Moderator
Dipl.-Ing. (FH) Versorgungstechnik




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 20. Jan. 2009 00:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo

Hab mich wieder etwas weiter belesen - Loop-Schleifen laufen immer mit maximaler Geschwindigkeit. DoEvents in der Schleife ermöglicht Windows auf andere Ereignisse in der Schleifenausführung zu reagieren. Das nur mal, falls ein anderer Unwissender hierüber stolpert.

Ich hab das Ganze aus der Inventorhilfe unter "UI Customization " - "Selection Simple", nur in etwas abgewandelter Form. Bei mir gibt es halt noch einen Eintrag "Fertig" im Kontextmenü, statt ins Leere klicken, um die Schleife zu beenden. Vorher mußte man Esc drücken, um den Befehl zu beenden. Das fand ich unpraktisch und habe daher diese Alternative eingeführt.

Wie könnte man denn eine solche Schleife aufbauen? Kannst du mir nicht den prinzipiellen Aufbau erklären? Eventuell krieg ich dann auch die deaktivierten Buttons realisiert.

Danke schonmal.

------------------
MfG
RK

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

daywa1k3r
Moderator
Softwareentwickler




Sehen Sie sich das Profil von daywa1k3r an!   Senden Sie eine Private Message an daywa1k3r  Schreiben Sie einen Gästebucheintrag für daywa1k3r

Beiträge: 3497
Registriert: 01.08.2002

Alienware m17x, Win7, Inventor2012

erstellt am: 20. Jan. 2009 10:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für rkauskh 10 Unities + Antwort hilfreich

Hallo,

ButtonDefinition.Enabled = False deaktiviert dein Button. Aber mit den Schleifen weiß ich nicht genau was du vor hast. Aber es sieht für mich so aus, wie wenn du ein Dialog brauchst (ähnlich z.B. Inventor Bohrdialog).

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




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 20. Jan. 2009 14:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo

Ich hab das Beispiel aus der Hilfe mal hier rein kopiert.

Code:
Public Sub TestSelection()
    ' Create a new clsSelect object.
    Dim oSelect As New clsSelect

    ' Call the pick method of the clsSelect object and set
    ' the filter to pick any face.
    Dim oFace As Face
    Set oFace = oSelect.Pick(kPartFaceFilter)

    ' Check to make sure an object was selected.
    If Not oFace Is Nothing Then
        ' Display the area of the selected face.
        MsgBox "Face area: " & oFace.Evaluator.Area & " cm^2"
    End If
End Sub


'*************************************************************
' The declarations and functions below need to be copied into
' a class module whose name is "clsSelect". The name can be
' changed but you'll need to change the declaration in the
' calling function "TestSelection" to use the new name.

' Declare the event objects
Private WithEvents oInteractEvents As InteractionEvents
Private WithEvents oSelectEvents As SelectEvents

' Declare a flag that's used to determine when selection stops.
Private bStillSelecting As Boolean

Public Function Pick(filter As SelectionFilterEnum) As Object
    ' Initialize flag.
    bStillSelecting = True

    ' Create an InteractionEvents object.
    Set oInteractEvents = ThisApplication.CommandManager.CreateInteractionEvents

    ' Ensure interaction is enabled.
    oInteractEvents.InteractionDisabled = False

    ' Set a reference to the select events.
    Set oSelectEvents = oInteractEvents.SelectEvents

    ' Set the filter using the value passed in.
    oSelectEvents.AddSelectionFilter filter

    ' Start the InteractionEvents object.
    oInteractEvents.Start

    ' Loop until a selection is made.
    Do While bStillSelecting
        DoEvents
    Loop

    ' Get the selected item. If more than one thing was selected,
    ' just get the first item and ignore the rest.
    Dim oSelectedEnts As ObjectsEnumerator
    Set oSelectedEnts = oSelectEvents.SelectedEntities
    If oSelectedEnts.Count > 0 Then
        Set Pick = oSelectedEnts.Item(1)
    Else
        Set Pick = Nothing
    End If

    ' Stop the InteractionEvents object.
    oInteractEvents.Stop

    ' Clean up.
    Set oSelectEvents = Nothing
    Set oInteractEvents = Nothing
End Function

Private Sub oInteractEvents_OnTerminate()
    ' Set the flag to indicate we're done.
    bStillSelecting = False
End Sub

Private Sub oSelectEvents_OnSelect(ByVal JustSelectedEntities As ObjectsEnumerator, ByVal SelectionDevice As SelectionDeviceEnum, ByVal ModelPosition As Point, ByVal ViewPosition As Point2d, ByVal View As View)
    ' Set the flag to indicate we're done.
    bStillSelecting = False
End Sub


Mein Button startet das Ganze. Jetzt soll der User einzelne Kanten oder Flächen anwählen können. Nach jedem Select wird über ein OnSelect-Event die eigentlich Sub aufgerufen und ausgeführt. Drücken von Esc aktiviert mM nach die Sub oInteractEvents_OnTerminate() und setzt den Inhalt von bStillSelecting = False, was die Abbruchbedingung für die Schleife ist. Mein Eintrag im Kontextmenü macht genau das Gleiche mit bStillSelecting, ich sehe da keinen Unterschied.

Wozu soll ein Dialog gut sein? Ich meine welchen Zweck soll er erfüllen? Ich kann dir gedanklich leider nicht folgen.

------------------
MfG
RK

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

daywa1k3r
Moderator
Softwareentwickler




Sehen Sie sich das Profil von daywa1k3r an!   Senden Sie eine Private Message an daywa1k3r  Schreiben Sie einen Gästebucheintrag für daywa1k3r

Beiträge: 3497
Registriert: 01.08.2002

Alienware m17x, Win7, Inventor2012

erstellt am: 20. Jan. 2009 14:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für rkauskh 10 Unities + Antwort hilfreich

Hallo, diese Select Klasse habe ich bereits mit Inventor 5.3 benutzt, und mir ist die Funktionsweise eigentlich bekannt. Und ich kann dir auch nicht folgen, wo eigentlich dein Problem noch ist. Wie ein Button de/aktiviert wird habe ich oben geschrieben, und das war deine Frage. Oder nicht?

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




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 20. Jan. 2009 18:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo

Wird er aber nicht. Das Deaktivieren des Buttons erfolgt erst nachdem das ganze Script beendet wurde. Also exakt zu dem Zeitpunkt, an dem er eigentlich wieder aktiv werden soll. Das ist mir dadurch aufgefallen, daß ich das enable=true am Ende mal auskommentiert habe. Der Aufruf von enabled=false erfolgt aber schon deutich bevor die Loop-Schleife beginnt. Interessiert Inventor trotzdem nicht.
Das Button deaktivieren des Buttons hatte ich schon selbst herausgefunden (s. Edit von meinem zweiten Beitrag).    und das es nix nützt.
Ich forste meinen Code nochmal durch, vielleicht war ich gestern auch einfach nur betriebsblind.

------------------
MfG
RK

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz