2009-02-27 9 views
6

Ich habe einen PathGeometry einige Pfade wie diese definiert:Schneiden von Löchern in PathGeometry

original path http://devblog.ailon.org/devblog/_stuff/wpfpathgeoquestion/original.gif

Dies ist ein vereinfachtes Beispiel. In Wirklichkeit kann es Segmente jeder Art (Linie, Bogen, Bezier) haben.

Jetzt brauche ich ein Loch von einer Art und Größe (Quadrat, Kreis, etc.) schneiden in Segmentverbindung Punkten so dass das Endergebnis etwas wie folgt aussieht:

with holes http://devblog.ailon.org/devblog/_stuff/wpfpathgeoquestion/with_holes.gif

Meine ursprüngliche Idee war, Kombinieren der ursprünglichen PathGeometry mit anderen Geometrien, die Quadrate (oder was auch immer) in den gemeinsamen Punkten enthalten, mit GeometryCombineMode.Exclude. Leider erzeugt dies leere Geometrie, wenn der Pfad nicht gefüllt ist. Und wenn es gefüllt ist, erzeugt es ein falsches Ergebnis.

So bin ich fest. In einem einfachen Beispiel mit Liniensegmenten hätte ich die Grenzpunkte im Voraus berechnen und meine Liniensegmente dort enden lassen können, aber mit Bögen und Beziers wäre das eine Art Overkill.

Hat jemand eine Idee, wie man das erreicht?

Hinweis: Ich brauche diese Löcher gelöscht (transparent), so dass ein weißes Quadrat über es nicht tun wird.

Antwort

2

Oh. Erledigt. Die Idee besteht darin, mit DrawingBrush eine OpacityMask aus Ihren Löchern zu erstellen und dann auf den Zeichenkontext zu schieben, bevor Sie PathGeometry zeichnen. Etwas wie das.

RectangleGeometry r = new RectangleGeometry(graphVisual.Bounds); 
GeometryDrawing dr = new GeometryDrawing(Brushes.Black, null, Geometry.Combine(r, bulletHoles, GeometryCombineMode.Exclude, null)); 
DrawingBrush br = new DrawingBrush(dr); 
drawingContext.PushOpacityMask(br); 

drawingContext.DrawGeometry(null, new Pen(Brushes.Green, 2), graphVisual); 

drawingContext.Pop();