Wie komme ich an Eigenschaften von Grafikobjekten?

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    Wie komme ich an Eigenschaften von Grafikobjekten?

    Hallo zusammen,

    ich möchte noch einmal das Thema aufgreifen.

    Wie komme ich nach dem markieren des Objektes an die Eigenschaften der Line oder Arc (Startpunkt / Endpunkt / Winkel usw.) ?
    Wie kann ich diese Eiegenschafen dann ändern (Farbe usw.). zB. Eine Line dauerhaft in Rot der Rest in Schwarz ?
    Kann ich an diese Objekte auch eigene Eigenschaften anhangen, zB.: ein Integer ?

    VB.NET-Quellcode

    1. 'mit Klick markieren
    2. For Each shape As Drawing2D.GraphicsPath In MyPaths_kontur
    3. If shape.IsOutlineVisible(e.X, e.Y, MyPen, Gr) = True Then
    4. tempPaths_geklickt.Add(shape)
    5. mark = True
    6. Me.Invalidate()
    7. End If
    8. Next


    Vielen Dank für Eure Hilfe :)

    ausgelagert aus CAD Zoomfunktion ~VaporiZed

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    @majachen99 Was nennst Du Grafikobjekt?
    Was genau wird dargestellt?
    Was genau wird angeklickt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo Rod,

    meine Frage ist auf dieses Beispiel bezogen:
    CAD Zoomfunktion

    In der Liste sind zB:

    VB.NET-Quellcode

    1. Sub drawDXF()
    2. MyPaths.Clear()
    3. Me.AddLine(100, 100, 200, 200)
    4. Me.AddLine(100, 0, 200, 100)
    5. Me.AddLine(200, 0, 300, 100)
    6. Me.AddLine(200, 200, 400, 400)
    7. Me.AddArc(200, 200, 150, 150, 0, 270)
    8. Me.AddEllipse(250, 300, 200, 100)
    9. Me.AddEllipse(-100, -100, 200, 200)
    10. End Sub

    Es sind lines und arcs dargestellt. Wenn ich auf das Object (Line/Arc...) klicke wird es eingefärbt.

    Wie komme ich nach dem markieren des Objektes an die Eigenschaften der Line oder Arc (Startpunkt / Endpunkt / Winkel usw.) ?
    Wie kann ich diese Eigenschafen dann ändern (Farbe usw.). zB. Eine Line dauerhaft in Rot der Rest in Schwarz ?

    VB.NET-Quellcode

    1. For Each shape As Drawing2D.GraphicsPath In MyPaths_kontur
    2. If shape.IsOutlineVisible(e.X, e.Y, MyPen, Gr) = True Then
    3. tempPaths_geklickt.Add(shape)
    4. mark = True
    5. ' If shape is line then
    6. ' Dim line as line = shape
    7. ' line.color = .....
    8. ' line.x1 = ....
    9. ' line.y1 = .....
    10. ' endif
    11. Me.Invalidate()
    12. End If
    13. Next


    Kann ich an diese Objekte auch eigene Eigenschaften anhängen, zB.: ein Integer ?

    danke :)
    Zu Objekten, und was sie können, kann man nur Aussagen machen, wenn man deren Datentyp kennt.
    Du redest zwar immer von Objekten, und zeigst auch iwelche CodeSnippets, aber um welche(n) Datentyp(en) es geht bleibt im Dunkel.

    majachen99 schrieb:

    Es sind lines und arcs dargestellt. Wenn ich auf das Object (Line/Arc...) klicke wird es eingefärbt.

    Wie komme ich nach dem markieren des Objektes an die Eigenschaften der Line oder Arc (Startpunkt / Endpunkt / Winkel usw.) ?
    Welchen Datentyp haben die Objekte, von denen hier die Rede ist? (Line/Arc... ist kein Datentyp)

    Und hier gehts vermutlich um Objekte anderen Datentyps:

    majachen99 schrieb:

    Kann ich an diese Objekte auch eigene Eigenschaften anhängen, zB.: ein Integer ?
    Welchen Datentyp haben diese Objekte - an die du Integer-Eigenschaften hängen willst?

    Wie gesagt: Ohne den Datentyp zu kennen, wird niemand eine deiner Fragen beantworten können.
    Ich hab auch kurz in den Link geguckt - aber da sind 19 Posts - das ist mir zu mühsam, mich da einzuarbeiten, und wahrscheinlich würde ich auch daraus nicht sicher schliessen können, wes Datentyps die Objekte sind, von denen hier die Rede ist.
    Deine Frage kann ich nicht beantworten, aber zwei dinge sind mir aufgefallen.

    1.

    majachen99 schrieb:

    If shape.IsOutlineVisible(e.X, e.Y, MyPen, Gr) = True

    Boolean, Vergleiche und bedingte Verzweigungen

    2.
    Integer ist ein Datentyp, keine Eigenschaft.

    Ich rate dir, ersteinmal die Grundlagen zu lernen, bevor du dich mit (relativ komplexem) Grafikkram beschäftigst.
    erstmal danke für eure Antworten.

    es geht um das Beispiel von Post 20:
    CAD Zoomfunktion

    Visual Basic-Quellcode

    1. Sub drawDXF()
    2. MyPaths.Clear()
    3. Me.AddLine(100, 100, 200, 200)
    4. Me.AddLine(100, 0, 200, 100)
    5. Me.AddLine(200, 0, 300, 100)
    6. Me.AddLine(200, 200, 400, 400)
    7. Me.AddArc(200, 200, 150, 150, 0, 270)
    8. Me.AddEllipse(250, 300, 200, 100)
    9. Me.AddEllipse(-100, -100, 200, 200)
    10. End Sub


    Im MyPaths befinden sich Lines/Arcs/Ellypsen. Diese haben Eigenschaften: Startpunkt,Endpunkt, Center ....

    Im MouseDown Event bekommt man das geklickte Item aus dem Mypath (Shape)

    VB.NET-Quellcode

    1. For Each shape As Drawing2D.GraphicsPath In MyPaths
    2. If shape.IsOutlineVisible(e.X, e.Y, MyPen, Gr) = True Then
    3. tempPaths.Add(shape)
    4. mark = True
    5. Me.Invalidate()
    6. End If
    7. Next


    Wie komme ich an die Orginal Eigenschaften vom Shape ?
    Das Mypath besteht ja aus Line/Arc ....

    ' If shape is line then
    ' Dim line as line = shape
    ' line.color = .....
    ' line.x1 = ....
    ' line.y1 = .....
    ' endif

    vielen Dank

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „majachen99“ ()

    Ich kenne zwar die Antworten auf folgende Fragen, aber ich stelle sie Dir trotzdem, denn bisher hast Du die Fragen/Anmerkungen von @ErfinderDesRades & @FormFollowsFunction ignoriert.
    Was für einen Datentyp hat MyPaths?
    MyPaths … Klingt nach Plural. Sind das mehrere Objekte vom gleichen Typ? Wenn ja, welchen Typ haben die einzelnen Elemente? Und wenn es mehrere Objekte vom Typ X gibt, welche Eigenschaften hat Typ X? Sobald Du das weißt oder gar selber recherchiert hast, kannst Du Dir Deine Fragen selber beantworten und bist viel schlauer als wenn wir Dir einfach die Lösung sagen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @VaporiZed Wenn wir schon beim Beantworten von Fragen sind:
    @majachen99 Meine Fragen aus Post #2 sind immer noch nicht beantwortet.
    Es nützt nix, wenn Du Deinen Code mit AddIRGENDWAS() permanent wiederholst, wenn das Wesentliche, die Datentypen, die Herangehensweise usw. unklar sind.
    Mag sein, dass Du Deinen Code verstehst, wir können das leider nicht, da wir ihn nicht kennen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mypath ist ein:

    VB.NET-Quellcode

    1. List(Of Drawing2D.GraphicsPath)


    er besteht aus:

    VB.NET-Quellcode

    1. Me.AddLine(100, 100, 200, 200)
    2. Me.AddLine(100, 0, 200, 100)
    3. Me.AddLine(200, 0, 300, 100)
    4. Me.AddLine(200, 200, 400, 400)
    5. Me.AddArc(200, 200, 150, 150, 0, 270)
    6. Me.AddEllipse(250, 300, 200, 100)
    7. Me.AddEllipse(-100, -100, 200, 200)


    Es wird eine angezeigte line/Arc angeklickt/markiert.


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „majachen99“ ()

    majachen99 schrieb:

    Es wird eine angezeigte line/Arc angeklickt/markiert.
    Wie ganz genau passiert das?
    Was ist das für eine Umgebung?
    ====
    Du hast ein Problem und uns um unsere Hilfe gebeten.
    Da solltest Du uns auch deutlich mehr Informationen geben, damit wir das nachvollziehen können.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    majachen99 schrieb:

    VB.NET-Quellcode

    1. List(Of Drawing2D.GraphicsPath)
    Also von meiner seite ist das eine wesentliche Information, die schoma sehr weiterhilft, um deine Frage zu beantworten - wie man nun an Eigenschaften der TeilFiguren kommt.
    Die Antwort fällt aber vlt eher wenig erfreulich aus: GraphicsPath ist eine Klasse, wo man Figuren hineinmalen kann - auch mehrere - , und er kann sie dann - als eine Zeichnung - etwa auf den Bildschirm reproduzieren.
    Die einzelnen Figuren im GraphicsPath sind aber nicht mehr identifizierbar (oder nur mit sehr großem Aufwand und Spezialkenntnissen).

    majachen99 schrieb:

    Wie komme ich an die Orginal Eigenschaften vom Shape ?
    Tja, shape ist ja ein Objekt des Datentyps GraphicsPath - (bitte guck nochmal in deinen Code: post#6, snippet#2, zeile#1).
    Was verstehst du nun unter "Original-eigenschaften"? GraphicsPath hat halt Eigenschaften - die kannste im ObjectBrowser nachgucken ( <- folge dem Link).
    Ausnahmsweise (weil das musste wirklich lernen, selber nachgucken zu können) mach ich mal Foto:

    Wie du siehst: das Set der Eigenschaften ist nicht besonders berauschend. Dann gibts noch paar Methoden, mit denen man Höhe und Breite abrufen kann, und das wars dann.

    Jo, damit stehen wir vor der Frage, was du unter "Original-Eigenschaften" verstehst.
    Wenn du gedacht hast, eine Ellipse abrufen zu können, die mit gp.AddEllipse() hineingetan wurde, wirst du enttäuscht. Im GP wird da eine komische Punkte-Sammlung gespeichert, die der GP als Ellipse auf den Bildschirm bringen kann - aber eine Ellipse als Objekt ist darin nicht mehr identifizierbar.

    Vielleicht kommt man weiter, wenn du erklärst, was du mit den "Original-Eigenschaften" eigentlich vorhast.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Die Eigenschaft PathTypes gibt ein Byte-Array zurück. Nicht sofort einsehbar, sind es diese Infos, die man »wiederherstellen« kann.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Im GraphicsPath werden die Figuren nur anhand von Punkten gespeichert (GraphicsPath.PathPoint). Die ursprünglichen Figuren lassen sich nur sehr schwer identifizieren.

    Der folgende Text basiert auf Annahmen und nicht auf Fakten:
    Ich nehme mal an, dass du bestimmte Figuren in diesem Pfad bei Klick anders färben möchtest.

    Dies tust du folgendermaßen:
    Möglichkeit 1: Für jede Farbe und jedes klickbare Objekt musst du einen eigenen GraphicsPath deklarieren, denn ein GraphicsPath kann nur alle Figuren auf einmal und auch nur eine einzige Farbe.
    Möglichkeit 2: Etwas frickiliger aber möglich, wenn du nur mit zwei Farben arbeitest. Du kannst die Grundfigur als GraphicsPath festlegen und dann anhand der Pixel berechnen auf welche Figur geklickt wurde. In den zweiten GraphicsPath in der anderen Farbe definierst du beim Klick nur die entsprechende Figur neu und zeichnest sie einfach über deinen anderen GraphicsPath drüber.

    Die zweite Möglichkeit habe ich ehrlich gesagt nie benutzt, da die erste sehr viel einfacher ist und mehr Möglichkeiten bietet. Die Berechnungen pro Klickpunkte laufen wie folgt:

    Beispiel:
    Line - macht Spaß
    Rectangle - macht Spaß
    Arc - ein bisschen weniger Spaß
    Bezier - überhaupt kein Spaß, also gar keiner

    @VaporiZed Mit dieser Info kannst du vielleicht eine Line oder ein Rectangle zurückberechnen... aber was machst du mit komplexeren Figuren(Arc, Bezier, Polygon, etc). Im Endeffekt hast du einen Haufen Punkte und ein Enum, das dir verrät, was vielleicht mal hinzugefügt wurde. Vielleicht deshalb: Wenn ich zwei Polygone hinzufüge, sagt mir mein GraphicsPath, dass er 8 Figuren enthält.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Yanbel“ ()

    @ErfinderDesRades

    Wenn
    du gedacht hast, eine Ellipse abrufen zu können, die mit
    gp.AddEllipse() hineingetan wurde, wirst du enttäuscht. Im GP wird da
    eine komische Punkte-Sammlung gespeichert, die der GP als Ellipse auf
    den Bildschirm bringen kann - aber eine Ellipse als Objekt ist darin
    nicht mehr identifizierbar.


    Genau das meinte ich mit "Original-Eigenschaften"
    An Diese komme ich ja leider so nicht wieder ran. (Arc / Elypse)

    Muss ich mir was anderes einfallen lassen .... :(
    Wenn Du schon mit AddLine-, AddEllipse-, Add…-Subs arbeitest, kannst Du doch dort auch in einem Extrafeld abspeichern, was dem GP (ggf. auch mit welchen Parametern) hinzugefügt wurde.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @majachen99 Du hast ja immer noch nicht alle Fragen beantwortet. X(
    Was willst Du denn mit diesen Eigenschaften anfangen?
    Wenn Du vielleicht mal ein paar Worte mehr schreibst (siehe Post #10) könnten wir Dir wahrscheinlich besser helfen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo @RodFromGermany,

    diese Eigenschaften möchte ich anzeigen und verändern.
    Ich möchte ein CAD Programm programmieren.
    Es werden Linien und Kreisbögen,evtl. Splines angezeigt. Diese sind in:

    Visual Basic-Quellcode

    1. List(Of Drawing2D.GraphicsPath)
    gespeichert.
    Durch klicken auf die Linien der Objekte wird das Objekt gehighlightet und dann sollen die Eigenschaften angezeigt werden.
    Diese sollen dann verändert werden ( Farbe, Mittelpunkt, EndPunkt ....).

    Hoffe das war jetzt ausführlich genug :)

    Danke Dir
    Dann wär ich aber gedanklich eher bei Vektorgrafik, bei der jede Line, jeder Kreis, … ein wirklich eigenes Objekt ist. Bei diesen Dingern werden aber nur die Eigenschaften gespeichert, das Zeichnen selber findet dann aufgrund derer Eigenschaften statt. Da wird aber kein Graphicspath oder so gespeichert, sondern eben quasi eine List(Of Zeichnungsobjekt), wobei Du dann aber selber festlegen musst, was Zeichnungsobjekt ist.
    Und der GraphicsPath selber wird dann eben aus den Objekteigenschaften generiert. Nicht andersrum.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    ich bräuchte aber Linien/Arcs/Splines in einer List(Of ???), weil ich eine bestimmte Reihenfolge brauche. Wenn ich dann noch zu jedem Element Linie/Arc ... einen String oder Int anhängen könnnte, wäre Spitze. zB.: Line.X1 = 15 und zusätzlich Line.VS = 100 .....
    Wie kann ich diese unterschiedlichen Typen speichern, anzeigen.

    Danke Dir
    Dann bist Du bei den Themen Klassennutzung und Vererbung. Du machst ne Klasse Grafikobjekt und dazu Unterklassen wie Linie, Bogen, Kreis, …, die von Grafikobjekt erben. Dann legst Du ne List(Of Grafikobjekt) an und packst dort Deine Linien etc rein. Da Linien vom Compiler durch die Vererbung als Grafikobjekte erkannt werden wird das akzeptiert. Und dann gibst Du jedem Grafikobjekt noch eine Zeichnen-Funktion an die Hand, bei der sich jedes Grafikobjekt selber um das eigene Zeichnen kümmert.
    Das wäre zumindest ein gangbarer Weg.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.