Cortar em furos PathGeometry
-
09-09-2019 - |
Pergunta
Eu tenho um PathGeometry definir algum caminho como este:
caminho original http://devblog.ailon.org/devblog/_stuff /wpfpathgeoquestion/original.gif
Este é um exemplo simplificado. Na realidade, pode ter segmentos de qualquer tipo (linha, arco Bezier).
Agora eu preciso cortar um buraco de algum tipo e tamanho (quadrado, círculo, etc.) no segmento de pontos comuns de modo que o resultado parece final de algo como isto:
com furos http://devblog.ailon.org/devblog/_stuff /wpfpathgeoquestion/with_holes.gif
A minha ideia inicial era combinar o PathGeometry original com outra geometria contendo quadrados (ou qualquer outro) nos pontos comuns usando GeometryCombineMode.Exclude. Infelizmente, isso produz geometria vazia se o caminho não foi preenchido. E se ela está cheia produz resultado incorreto.
Então, eu estou preso. No exemplo simples com segmentos de linha que eu poderia ter calculado a fronteira pontos iniciais e fez meus segmentos de linha termina aí, mas com arcos e Beziers esta seria uma espécie de exagero.
Alguém tem uma idéia de como conseguir isso?
Nota: eu preciso desses buracos apagados (transparente), colocando assim um quadrado branco acima ele costuma fazer.
Solução
Oh. Fez isso. A ideia é criar um OpacityMask fora de seus furos com DrawingBrush e empurre-o no contexto do desenho antes de desenhar o PathGeometry. Algo parecido com isto.
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();