Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Inventor .NET
  Problem mit SelectEvent

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
Autor Thema:   Problem mit SelectEvent (1448 mal gelesen)
yamaha
Mitglied
Konstrukteur


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

Beiträge: 351
Registriert: 19.05.2004

Autocad/Inventor 2019, Windows 7 Pro 64Bit

erstellt am: 20. Feb. 2008 20:48    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 zusammen,

Für das SelectEvent gibt es als Beispiel nachfolgenden Code:
Auf VB6 funktioniert das ja auch recht schön, nur leider
in .Net eben nicht.        

Code:

' 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


Weiß jemand wo der Haken ist?

------------------
Gruß Jörn

[Diese Nachricht wurde von yamaha am 21. Feb. 2008 editiert.]

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

Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570
Laptop: Alienware m17x
Win7, Inventor2012

erstellt am: 20. Feb. 2008 22:57    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 yamaha 10 Unities + Antwort hilfreich

Was geht denn nicht?

Bitte Code-Tag benutzen. Danke!

------------------
Grüße Igor

FX64 Software Solutions

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

yamaha
Mitglied
Konstrukteur


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

Beiträge: 351
Registriert: 19.05.2004

Autocad/Inventor 2019, Windows 7 Pro 64Bit

erstellt am: 20. Feb. 2008 23:12    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 Igor,

ich habe eine dll erstellt und somit
kann ich nicht debuggen (VB.Net Express).
Ich weiß ehrlich auch nicht wo der Fehler ist.
Ich rufe oSelect.Pick(... ) usw. auf, aber
man kann nichts auswählen/select.
Sorry für die einfache Beschreibung, aber anders weiss ichs auch nicht.
Ich hatte angenommen, das das Beispiel als solches
für .Net evtl. nicht korrekt ist, und jemand der
halt so eine Selection bereits verwendet direkt weiß wo es haken kann.

------------------
Gruß Jörn

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

Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570
Laptop: Alienware m17x
Win7, Inventor2012

erstellt am: 20. Feb. 2008 23:32    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 yamaha 10 Unities + Antwort hilfreich

Hi. Ich sehe es jetzt erst. Das ist doch VB 6.0 Code. Das wird nicht laufen unter .NET. Alleine die Syntax ist anders.

------------------
Grüße Igor

FX64 Software Solutions

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

yamaha
Mitglied
Konstrukteur


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

Beiträge: 351
Registriert: 19.05.2004

Autocad/Inventor 2019, Windows 7 Pro 64Bit

erstellt am: 21. Feb. 2008 22:01    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 Igor,

da hast Du recht, so funktioniert es:

Code:

Imports Inventor
Imports System.Runtime.InteropServices

Public Class clsSelect
    ' Declare the event objects
    Private WithEvents oInteraction As InteractionEvents
    Private WithEvents oSelect As SelectEvents

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

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

        ' Create an InteractionEvents object.
        oInteraction = oAppOselect.CommandManager.CreateInteractionEvents

        ' Define that we want select events rather than mouse events.
        oInteraction.SelectionActive = True

        ' Set a reference to the select events.
        oSelect = oInteraction.SelectEvents

        ' Set the filter using the value passed in.
        oSelect.AddSelectionFilter(filter)

        ' The InteractionEvents object.
        oInteraction.Start()

        ' Loop until a selection is made.
        Do While bStillSelecting
            System.Windows.Forms.Application.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
        oSelectedEnts = oSelect.SelectedEntities
        If oSelectedEnts.Count > 0 Then
            Pick = oSelectedEnts.Item(1)
        Else
            Pick = Nothing
        End If

        ' Stop the InteractionEvents object.
        oInteraction.Stop()

        ' Clean up.
        oSelect = Nothing
        oInteraction = Nothing
    End Function

    Private Sub oSelect_OnSelect( _
        ByVal JustSelectedEntities As Inventor.ObjectsEnumerator, _
        ByVal SelectionDevice As Inventor.SelectionDeviceEnum, _
        ByVal ModelPosition As Inventor.Point, _
        ByVal ViewPosition As Inventor.Point2d, ByVal View As Inventor.View) Handles oSelect.OnSelect
        bStillSelecting = False
    End Sub

End Class


Ich versteh bloß nicht wieso ich das oAppOselect übergeben muß.
Das muß doch irgendwie auch als globe Variabele deklariert werden können?

------------------
Gruß Jörn

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

Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570
Laptop: Alienware m17x
Win7, Inventor2012

erstellt am: 21. Feb. 2008 23:18    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 yamaha 10 Unities + Antwort hilfreich

Hallo Jörn,

in .NET gibt es so etwas wie globalen Variablen nicht, denn .NET basiert auf der Kapselung. Eine Klasse soll eine Einheit mit klar definierten Schnittstellen sein. Wenn du in einer Klasse ein Objekt brauchst, musst du es entweder instanzieren oder als Argument übergeben. In dem Fall der clsSelect ist der Weg über die Argumente der bessere, denn es wäre trotz automatischer Ressourcen-Bereinigung schwachsinnig jedes mal ein neues Inventor Objekt zu instanzieren sobald die Funktion aufgerufen wird. Es wäre natürlich möglich ein privates Datenfeld zu definieren, und einen Konstruktor der bei der sich bei der Instanzierung von der Klasse ein Inventor Objekt holt und den behält. Die untere Funktion könnte dann auf das Objekt zugreifen, da es ein privates Datenfeld von der gleichen Klasse ist. Man könnte den Konstruktor auch überladen und um ein Argument von Typ InventorApplication erweitern, so dass bei der Neuinstanzierung von der Klasse ein InventorObjekt übergeben werden kann. In dem Fall erhält das private Datenfeld das Inventor Objekt, und zwar ohne eine Neuinstanzierung. Da wäre dann dieses private Datenfeld eine Art von globalen Variable, aber eben nur für die Mitglieder der gleichen Klasse. Ganz davon abgesehen, dass in der Klasse eigentlich nur der CommandManager von dem Inventor-Objekt benutzt wird, so würde es auch reichen nur den CM zu übergeben. Usw. usf.

Genau so wie bei dem Umstieg von Autocad auf Inventor, wo man fast alles aus dem Autocad vergessen sollte, ist es auch bei dem Umstieg von VB bzw. VBA auf .NET. Ganz von der Syntax abgesehen, ist auch das ganze Konzept völlig anders. Aber schon mal Lob, dass du es mit VB.NET zum Laufen gebracht hast.

------------------
Grüße Igor

FX64 Software Solutions

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

yamaha
Mitglied
Konstrukteur


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

Beiträge: 351
Registriert: 19.05.2004

Autocad/Inventor 2019, Windows 7 Pro 64Bit

erstellt am: 22. Feb. 2008 12:09    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 Igor

Zitat:
Es wäre natürlich möglich ein privates Datenfeld zu definieren, und einen Konstruktor der bei der sich bei der Instanzierung von der Klasse ein Inventor Objekt holt und den behält. Die untere Funktion könnte dann auf das Objekt zugreifen, da es ein privates Datenfeld von der gleichen Klasse ist. Man könnte den Konstruktor auch überladen und um ein Argument von Typ InventorApplication erweitern, so dass bei der Neuinstanzierung von der Klasse ein InventorObjekt übergeben werden kann. In dem Fall erhält das private Datenfeld das Inventor Objekt, und zwar ohne eine Neuinstanzierung. Da wäre dann dieses private Datenfeld eine Art von globalen Variable, aber eben nur für die Mitglieder der gleichen Klasse. Ganz davon abgesehen, dass in der Klasse eigentlich nur der CommandManager von dem Inventor-Objekt benutzt wird, so würde es auch reichen nur den CM zu übergeben. Usw. usf.     

Besten Dank für die Erklärung auch wenn ich den zweiten Teil nicht versteh, aber..

Zitat:

in .NET gibt es so etwas wie globalen Variablen nicht, denn .NET basiert auf der Kapselung. Eine Klasse soll eine Einheit mit klar definierten Schnittstellen sein. Wenn du in einer Klasse ein Objekt brauchst, musst du es entweder instanzieren oder als Argument übergeben. In dem Fall der clsSelect ist der Weg über die Argumente der bessere, denn es wäre trotz automatischer Ressourcen-Bereinigung schwachsinnig jedes mal ein neues Inventor Objekt zu instanzieren sobald die Funktion aufgerufen wird.

hilft schon.

------------------
Gruß Jörn

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

yamaha
Mitglied
Konstrukteur


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

Beiträge: 351
Registriert: 19.05.2004

Autocad/Inventor 2019, Windows 7 Pro 64Bit

erstellt am: 26. Feb. 2008 22:30    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,

leider mußte ich feststellen, das obiger Code
doch nicht so ganz gut funktioniert.

1. In einer Exe und externer Zugriff auf Inventor:
  Alles OK

2. In einer DLL und in Inventor eingebunden:
  Wenn man auswählt wie vorgesehen dann OK, aber!!!
  Bricht man den Selection-Vorgang mit ESCAPE ab,
  stürzt Inventor bei irgend einer der nächsten Aktionen ab.
  Irgendwie wird das Abbrechen des Selection nicht sauber beendet.

Schade, also wenn jemand noch einen Tip hat.

Desweiten, noch ein zweiter Effekt der aufgefallen ist.
Beim Abbrechen oder Beenden von einer Funktion wird der
Button nicht zurück gesetzt (Pressed = false).

Auch hier, vielen Dank für einen Tip.

------------------
Gruß Jörn

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

Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570
Laptop: Alienware m17x
Win7, Inventor2012

erstellt am: 26. Feb. 2008 22:42    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 yamaha 10 Unities + Antwort hilfreich

Hi Jörn,

benutze mal Fehlerbehandlung nach der Loop. Möglich, dass oSelect.SelectedEntities eine Exception wirft sobald nichts selektiert wurde.

Zitat:
Original erstellt von yamaha:
Desweiten, noch ein zweiter Effekt der aufgefallen ist.
Beim Abbrechen oder Beenden von einer Funktion wird der
Button nicht zurück gesetzt (Pressed = false).

Wenn die Funktion abstürzt und keinen Wert zurückgibt, denkt Inventor, dass der Befehl weiter läuft und hat keinen Grund den Button zurück zu setzen.


------------------
Grüße Igor

FX64 Software Solutions

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

yamaha
Mitglied
Konstrukteur


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

Beiträge: 351
Registriert: 19.05.2004

Autocad/Inventor 2019, Windows 7 Pro 64Bit

erstellt am: 27. Feb. 2008 09:04    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 Igor,

Zitat:
benutze mal Fehlerbehandlung nach der Loop

Ich hatte schon mit Try... vor dem Loop versucht,
hab auch eine Fehlermeldung bekommen, abgestürzt ist
Inventor aber trotzdem. Werd nochmal etwas testen und weitere
Info geben.

Zitat:
Wenn die Funktion abstürzt und keinen Wert zurückgibt, denkt Inventor, dass der Befehl weiter läuft und hat keinen Grund den Button zurück zu setzen.

Das wäre logisch, aber "Beim Abbrechen oder Beenden von einer Funktion....."
Also läuft der Befehl ganz normal durch, bleibt der Button auch "gepresst". Beim nächsten Aufruf/Klick geht er dann auf "nicht gepresst"
Werd das nochmal mit einer ganz einfach Routine überprüfen.

------------------
Gruß Jörn

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)2020 CAD.de | Impressum | Datenschutz