mehr als eine Farbe in einem NSBezierPath?

  • mehr als eine Farbe in einem NSBezierPath?

    okay,
    ich weiß, dass alle Pfad-Elemente in einem NSBezierPath immer mit der zuletzt gesetzten Farbe gezeichnet werden. Sprich, das Vorgehen

    - stroke Farbe a setzen
    - eine Linie malen
    - stroke Methode aufrufen

    - stroke Farbe b setzen
    - eine weitere Linie zeichnen
    - stroke Methode des selben NSBezierPaths aufrufen

    ... führt NICHT dazu, dass die erste Linie in Farbe a und die zweite in Farbe b gemalt wird.

    Genau das hätt ich aber gern.

    Nun weiß ich, dass die stroke- (und auch fill-) Farbe ja über eine Methode von NSColor (nicht etwa von NSBezierPath) gesetzt wird und im aktuellen GraphicsContext gespeichert wird.
    Leider hilft aber auch das vorherige Speichern des GraphicsContexts nichts, sprich, das hier:

    - aktuellen GraphicsContext sichern
    - stroke Farbe a setzen
    - eine Linie malen
    - stroke Methode aufrufen

    - gesicherten GraphicsContext zurückholen
    - stroke Farbe b setzen
    - eine weitere Linie zeichnen
    - stroke Methode des selben NSBezierPaths aufrufen

    ... tut genauso wenig.

    Ist die einzige Lösung, ZWEI unabhängige NSBezierPaths anzulegen? Aber dann verstehe ich eins nicht: die stroke Farbe wird ja eben NICHT im NSBezierPath gesetzt, sondern über eine NSColor Methode. Wie sagen ich denn dann dem ersten NSBezierPath, dass er bitteschön Farbe a haben soll und dem zweiten, dass er Farbe b haben soll?

    Danke für eure Mithilfe & viele Grüße,
    Stefan.
  • RE: mehr als eine Farbe in einem NSBezierPath?

    Pfade haben überhaupt keine Farbe. Die Farbe hat der GC. Jedwede weitere Ausgabe wird in der entsprechenden Farbe vorgenommen.

    Quellcode

    1. path = ...
    2. [[NSColor redColor] set];
    3. [path stroke];
    4. path = ...
    5. [[NSColor blackColor] set];
    6. [path stroke];
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: mehr als eine Farbe in einem NSBezierPath?

    ja, so dacht ichs mir auch.
    geht aber nicht.
    beide teile haben die selbe farbe, nämlich die letz gesetzte.
    steht auch so im cocoa drawing guide, dass immer nur die zuletzt gesetzt für alles benutzt wird.
    daher meine frage...
  • RE: mehr als eine Farbe in einem NSBezierPath?

    erzeugst du auch unterschiedliche pfade?

    oder bastelst du nur neue liniensegmente an einen bestehenden Pfad und lässt ihn neu zeichnen?

    anm:

    also nur mal so nebenbei...
    eine instanz von einem NSBezierPath ist nur ein samelsorium von vektoren

    mit jedem lineToPoint: etc fügst du nur einen weiteren vektor hinzu
    dann kann man noch lustige optionen mitgeben wie zb linien dicke, ecken radius etc...

    und irgendwann wenn du es brauchst schickst du innerhalb eines drawing focus dieser instanz eine "stroke" message und _alle_ vektoren die in der instanz gespeichert sind werden mit der aktiven farbe des contextes gezeichnet...

    willst du "gleichzeitig" verschiedenfarbige vektoren zeichnen mußt du natürlich unterschiedliche instanzen von NSBezierPath verwenden oder aber den Bezierpfad _komplett_ neu aufbauen

    sonst übermalt sich der pfad immer wieder selbst mit der nächsten farbe
    snafu
    :() { :|: &};:
    sometimes i dream in hex
    Obey gravity! Because its a law!
  • RE: mehr als eine Farbe in einem NSBezierPath?

    AHA!
    Mir scheint, jetzt kommen wir der Sache näher...
    In der Tat: ich habe EIN NSBezierPath Objekt, setze die erste Farbe, habe moveToPoint und lineToPoint Aufrufe, dann ein stroke Aufruf für die erste Linie.
    Dann (mit dem selben NSBezierPath!) geht es weiter: setze die zweite Farbe, wieder moveToPoint, lineToPoint, stroke.
    Hier, zusammengerafft, als Auszug:

    Quellcode

    1. NSBezierPath* thePath = [NSBezierPath bezierPath];
    2. // realColor und imagColor holen (hier weggelassen)
    3. [realColor setStroke]; // Farbe setzen
    4. [thePath moveToPoint:NSMakePoint(0.0, 0.0)];
    5. [thePath lineToPoint:NSMakePoint(bounds.size.width, bounds.size.height)];
    6. [thePath stroke];
    7. [imagColor setStroke]; // Farbe setzen
    8. [thePath moveToPoint:NSMakePoint(0.0, bounds.size.height)];
    9. [thePath lineToPoint:NSMakePoint(bounds.size.width, 0.0)];
    10. [thePath stroke];
    Alles anzeigen

    Irgendwas fehlt hier, aber ich weiß nicht, was...
  • RE: mehr als eine Farbe in einem NSBezierPath?

    Nochmal: Du setzt die Farbe nicht im Pfad, sondern im Context. Wen du *irgendwann* -set machst, wird jeder -stroke danach in der Farbe erscheinen, auch dann wenn du beim Erzeugen des Pfades eine ganz andere Farbe hattest. Pfade haben *nichts* mit Pfaden zu tun.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: mehr als eine Farbe in einem NSBezierPath?

    genau.
    schrieb ich ja eingangs selbst:

    Nun weiß ich, dass die stroke- (und auch fill-) Farbe ja über eine Methode von NSColor (nicht etwa von NSBezierPath) gesetzt wird und im aktuellen GraphicsContext gespeichert wird.

    okay. ich hätte noch dazu schreiben können: "... und nicht im Pfad", dann wäre es 150%ig klar gewesen.

    Die "removeAllPoints" Methode kannte ich noch nicht, fand über sie bisher auch nichts beim Lesen des Cocoa Drawing Guides. Daher: DANKE, Michael, für den Tipp! :)

    VG,
    Stefan.
  • RE: mehr als eine Farbe in einem NSBezierPath?

    Original von MetaWops
    Die "removeAllPoints" Methode kannte ich noch nicht, fand über sie bisher auch nichts beim Lesen des Cocoa Drawing Guides.

    In den Guides können ja auch nicht alle Methoden besprochen werden. Da geht es ja mehr um das Grundsätzliche. Für die Feinheiten muss man dann schon auch mal in die Dokumentation der einzelnen Klassen, die man verwendet, rein schauen und einfach auch mal ein wenig "herumspielen".

    Michael
  • RE: mehr als eine Farbe in einem NSBezierPath?

    Klar. Mach ich auch.

    Aber so etwas Grundsätzliches wie "und wenn Sie zwei Linien mit unterschiedlichen Farben malen wollen, dann nehmen Sie dazwischen mal die removeAllPoints Methode" hätte ich schon mal erwartet. Woher soll man das denn wissen?! ;)

    Aber nun ist ja alles gut. Habs eingebaut und es funktioniert. Ist echt ein Spitzenforum hier mit den superschnellen Antworten! :)

    Stefan.
  • RE: mehr als eine Farbe in einem NSBezierPath?

    Klar. Mach ich auch.

    Aber so etwas Grundsätzliches wie "und wenn Sie zwei Linien mit unterschiedlichen Farben malen wollen, dann nehmen Sie dazwischen mal die removeAllPoints Methode" hätte ich schon mal erwartet. Woher soll man das denn wissen?! ;)

    Aber nun ist ja alles gut. Habs eingebaut und es funktioniert. Ist echt ein Spitzenforum hier mit den superschnellen Antworten!

    Stefan.


    Braucht man ja auch nicht zu wissen, aber man sollt wissen was man gerade mit dem Objekt macht das man verändert. Ich glaube du bist dir nicht richtig im klaren was du machst. Du hast genau genommen einmal mit Farbe A einen Teilpfad gezeichnet und ihn dann später mit Farbe B übermalt, dann eben den ganzen Pfad. Wenn du zwei Objekte genommen hättest wäre das Problem nicht Aufgetaucht. Über denke nochmal jeden einzehlen Schritt den du gemacht hast, dann fällt es dir sicher auf.
    Und noch was eine NSColor kann auch aus einem Image als pattern bestehen welches dann 16 mio Farben haben kann (nützt dir aber nicht viel (+ (NSColor *)colorWithPatternImage:(NSImage *)image))
  • RE: mehr als eine Farbe in einem NSBezierPath?

    Sorry, du hast es noch nicht kapiert. Das hat mit -removeAllPoints nichts zu tun:

    Quellcode

    1. NSBezierPath* thePath1 = [NSBezierPath bezierPath];
    2. [[NSColor redColor] setStroke]; // Farbe setzen
    3. [thePath moveToPoint:NSMakePoint(0.0, 0.0)];
    4. [[NSColor blueColor] setStroke]; // Farbe setzen
    5. [thePath lineToPoint:NSMakePoint(bounds.size.width, bounds.size.height)];
    6. [[NSColor greenColor] setStroke]; // Farbe setzen
    7. NSBezierPath* thePath2 = [NSBezierPath bezierPath];
    8. [[NSColor yellowColor] setStroke]; // Farbe setzen
    9. [thePath moveToPoint:NSMakePoint(0.0, bounds.size.height)];
    10. [[NSColor blackColor] setStroke]
    11. [thePath lineToPoint:NSMakePoint(bounds.size.width, 0.0)];
    12. [[NSColor blueColor] setStroke]
    13. [thePath1 stroke];
    14. [[NSColor grayColor] setStroke]
    15. [thePath2 stroke];
    Alles anzeigen
    In welcher Farbe werden die Pfade gemalt?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: mehr als eine Farbe in einem NSBezierPath?

    @Amin/Tom9811:
    Das war jetzt leider erstmal nicht kompilierbar (und auch im Kopf nicht lösbar), da Du thePath1 anlegst, aber später auch "thePath" verwendest, was der Compiler nicht kannte.

    Ich *vermute*, Du meintest im ersten Block immer thePath1 und im zweiten Block immer thePath2, gell?

    Unter dieser Voraussetzung wird die erste Linie in blau gezeichnet, die zweite in grau.

    Danke für Deine Mühe und den Code -- sehr erleuchtend!

    Stefan.
  • RE: mehr als eine Farbe in einem NSBezierPath?

    Wer ist Amin?

    Selbstverständlich war das so gemeint. Und es ist eben im Kopf ganz einfach lösbar. Vor dem -stroke wird jeweils eine Farbe gesetzt und in dieser und nur in dieser wird gezeichnet. Welche Farben im CG gesetzt sind, während du die Pfade erzeugst (die du dir aus dem Internet laden kannst, aus einer Datei holst, beim Programmstart erzeugt hast usw. usf.), spielt keine Rolle. Darauf wollte ich gerade hinaus!
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?