2009-02-27 19 views
6

I tienen un PathGeometry definir algún camino como éste:agujeros de corte en PathGeometry

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

Este es un ejemplo simplificado. En realidad, puede tener segmentos de cualquier tipo (Línea, Arco, Bézier).

ahora tengo que cortar un agujero de algún tipo y tamaño (cuadrado, círculo, etc.) en los puntos de conjuntos de segmentos por lo que el resultado final es como la siguiente:

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

Mi idea inicial era combinar el PathGeometry original con otros cuadrados que contengan Geometry (o lo que sea) en los puntos de unión usando GeometryCombineMode.Exclude. Desafortunadamente, esto produce una geometría vacía si la ruta no se llena. Y si está lleno, produce un resultado incorrecto.

Así que estoy atascado. En un ejemplo simple con segmentos de línea, podría haber calculado los puntos fronterizos por adelantado y hacer que mis segmentos de línea terminaran ahí, pero con arcos y beziers sería una especie de exageración.

¿Alguien tiene una idea de cómo lograr esto?

Nota: Necesito estos agujeros borrados (transparentes) por lo que colocar un cuadro blanco encima no servirá.

Respuesta

2

Oh. Lo hizo. La idea es crear un OpacityMask de tus agujeros usando DrawingBrush y luego presionarlo en el contexto de dibujo antes de dibujar el PathGeometry. Algo como esto.

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();