Objektauswahl wie beim Dehnen / AutoCAD ObjectARX und .NET
Theo37 27. Okt. 2016, 15:50

Hallo an Alle,

ich habe mir ein kleines Programm geschrieben welches Linien an anderen Linien unterbricht. Das funktioniert jetzt so weit ganz gut. Ich wähle mit GetEntity erst die erste Linie und dann die zweite Linie dann wird diese bearbeitet und danach kann wieder eine Linie ausgewählt werden. Jetzt dachte ich es wäre schön wenn man als zweites auch mehrere Linien auswählen könnte und diese alle an der ersten Linie unterbrochen würden. Es sollte so sein wie beim Dehnen-Befehl von AutoCAD, da kann man als zweite Auswahl, einzelne Objekte wählen oder wenn man ins leere klickt wird automatisch eine Kreuzen-Auswahl an dieser Stelle gestartet und man kann mehrere Objekte auswählen. Bekomme ich dieses Auswahlverhalten irgendwie hin? Gibt's da ein Beispiel?

Gruß Theo

Ingenieur Studio HOLLAUS 28. Okt. 2016, 18:16

Zitat:
Ich wähle mit GetEntity
Zitat:
da kann man als zweite Auswahl, einzelne Objekte wählen oder wenn man ins leere klickt wird automatisch eine Kreuzen-Auswahl an dieser Stelle gestartet und man kann mehrere Objekte auswählen
Das wäre doch genau die SelectionSet Funktion, mit GetEntity kann man das nicht durchführen (oder nur sehr gewaltsam).

Theo37 31. Okt. 2016, 08:19

Ich glaube die SelectionSet-Methode erwartet die Eingabe mehrerer Objekte. Das heißt man muß die Objektwahl durch ein Return abschließen. Somit habe ich keine Möglichkeit auf die Wahl eines einzelnen Objektes zu reagieren. Das ist dann wie beim Schieben-Befehl, es wird ein Auswahlsatz gebildet und dieser wird dann verarbeitet(verschoben). Beim Dehnen-befehl ist es nicht ganz so.
Hier werden einzelne Elemente sofort bearbeitet und danach läuft die Auswahl weiter. Trotzdem ist es auch möglich mehrere Objekte auszuwählen. Mir ist klar daß das schon ein bisschen spezieller ist.
ich erwarte auch nicht eine kpl. Lösung zu bekommen. Mir würde es schon reichen eine Idee oder einen Lösungsansatz zu bekommen.
Du schreibst "oder nur sehr gewaltsam". Wie könnte diese "Gewaltsam" aussehen? Soll ich nur noch Punkte abfragen und diese auswerten? Oder soll ich mit Getentity weitermachen. oder doch getselection. Oder gibt's nen ganz anderen Lösungsweg, mit Jigs z.B.?

Danke Gruß Theo

Ingenieur Studio HOLLAUS 31. Okt. 2016, 10:50

Zitat:
Soll ich nur noch Punkte abfragen und diese auswerten?
Z.B. mit SelectionSet arbeiten, aber gleichzeitig einen Event mitlaufen haben, der auf SelectionAdded reagiert. Kommt der Event beim ersten SelectionSet-Klick, dann SelectionSet abbrechen ... da Du ein Element schon hast, anderen falls das SelectionSet weiterlaufen lassen.
Oder mit PointMonitor checken, ob beim Klick ein Element darunter liegt.
Oder mit GetEntity Punkt merken, wenn kein Element retourniert wird, dann diesen Punkt dem SelectionSet als ersten Punkt simuliert übergeben (keine Ahnung, ob das geht, ist nur als Idee hier).
Alle diese Maßnahmen können aber gestört werden, wenn man 3D drauf schaut (weil der retounierte Punkt dann anders auszuwerten ist), oder SELECTIONCYCLING aktiv wurde (der Dialog geöffnet ist), ... darum eben mein Begriff "gewaltsam", denn da läuft man die ganze Zeit den unterschiedlichen Varianten hinterher, die AutoCAD so bietet im Zuge einer Selektion.

Theo37 07. Nov. 2016, 15:54

Hallo,

ich bin bei GetEntity geblieben. Ich löse im PromptForEntityEnding-Event einen Fehler aus, den ich mit Try abfange. Bei Catch mache ich dann mit Selection weiter. Bestimmt keine schöne Lösung, funktioniert aber bisher ohne Fehler. Irgendwann mache ich auch noch ein Jig für diese Lösung, so dass der User auch noch ne Vorschau bekommt. Im Augenblick habe ich leider zu wenig Zeit und es wäre ja auch nur schön, aber nicht wirklich notwendig. Für den Fall dass es jemand interessiert, habe ich die entsprechenden Zeilen unten rein kopiert.

Gruß Theo

  AddHandler MyEditor.PromptForEntityEnding, AddressOf PFE
        Try
            Answer = MyEditor.GetEntity(Frage)
            RemoveHandler MyEditor.PromptForEntityEnding, AddressOf PFE
        Catch ex As Exception
            Dim MySelection As PromptSelectionResult
            Dim MyResult As PromptPointResult
            Dim MyOpts As PromptCornerOptions
            MyOpts = New PromptCornerOptions("Entgegengesetzte Ecke angeben:", LastPickedPoint)
            MyOpts.UseDashedLine = True
            MyResult = MyEditor.GetCorner(MyOpts)
            MySelection = MyEditor.SelectCrossingWindow(LastPickedPoint, MyResult.Value)
            If MySelection.Status = PromptStatus.OK Then
                SecondEntyIDcoll = New ObjectIdCollection
                For Each MyId In MySelection.Value.GetObjectIds
                    SecondEntyIDcoll.Add(MyId)
                Next
                RemoveHandler MyEditor.PromptForEntityEnding, AddressOf PFE
                Return True
            End If
        End Try
.
.
.
.
  Sub PFE(sender As Object, e As EditorInput.PromptForEntityEndingEventArgs)
        If e.Result.Status = PromptStatus.Error Then
            LastPickedPoint = e.Result.PickedPoint
            Throw New Exception()
        End If
    End Sub