I have this fiddle : /
This has two paths, for now, they are just rect but are actually plicated shape. I have used this code to create two rects with 'holes' in :
createRects(dataPointsPath2, 'blue');
createHoles(dataPointsCircle2);
createRects(dataPointsPath1, 'red');
createHoles(dataPointsCircle1);
What I need are the holes to be removed from the filled path so you can see the rect behind it.
How do I go about removing a shape (circle) from a filled path ?
EDIT
I have just realised, a clip path will probably work well for this, I'll try implement but if someone has any ideas I'd appreciate the help :)
I have this fiddle : https://jsfiddle/thatOneGuy/1spn8nne/1/
This has two paths, for now, they are just rect but are actually plicated shape. I have used this code to create two rects with 'holes' in :
createRects(dataPointsPath2, 'blue');
createHoles(dataPointsCircle2);
createRects(dataPointsPath1, 'red');
createHoles(dataPointsCircle1);
What I need are the holes to be removed from the filled path so you can see the rect behind it.
How do I go about removing a shape (circle) from a filled path ?
EDIT
I have just realised, a clip path will probably work well for this, I'll try implement but if someone has any ideas I'd appreciate the help :)
Share Improve this question edited Jul 29, 2016 at 11:08 altocumulus 21.6k13 gold badges64 silver badges86 bronze badges asked Jul 29, 2016 at 9:07 thatOneGuythatOneGuy 10.6k9 gold badges58 silver badges92 bronze badges 9- no, thats just putting fill of none on the circles. I want those circles to be removed from the corresponding filled paths, i.e the rectangles – thatOneGuy Commented Jul 29, 2016 at 9:13
- Oh you mean instead of having a rect + circle, you want a rect - circle ? – Tim B Commented Jul 29, 2016 at 9:15
- exactly @TimB, I think clip-path will work well, trying to implement now – thatOneGuy Commented Jul 29, 2016 at 9:17
- I'm unsure on how to implement what you have said. How to put the circle on the same path ? And how to set the direction and so on. – thatOneGuy Commented Jul 29, 2016 at 9:26
- 2 If creating your circles as a subpath is proving tricky, an alternative is to use a mask. See stackoverflow./questions/22579508/… – Paul LeBeau Commented Jul 29, 2016 at 10:05
2 Answers
Reset to default 8Here's one way to draw a rect with a hole in. It relies on the evenodd fill-rule. The circle is inside the rect it bees a hole in the rect and the blue background shows through.
<svg viewBox="0 0 250 250">
<rect width="100%" height="100%" fill="blue"/>
<path fill="#b4edb4" fill-rule="evenodd" d="M230,230H8V13h223
V236z M 120 80 a 50 50 0 1 0 0.00001 0z"/>
</svg>
@Robert Longson gave a nice answer but I was unable to duplicate it using my dataset and D3. So, thanks to @PaulLeBeau for his point about masks.
For the mask, you need a rect element, filled white for it to work. It uses this to know what to mask against(I think).
var thisMask = thisContainer.append("svg:mask")
.attr("id", board + '_mask')
thisMask.append("rect")
.attr('x', 0)
.attr('y', 0)
.attr('width', "100%")
.attr('height', "100%")
.style('fill','white')
And in the same mask element, you need the rest of the shapes you want to remove from the path.
So in my case, I wanted a collection of circles :
thisMask.selectAll('.circle')
.data(data)
.enter()
.append("circle")
.attr('cx', function(d) {
console.log('clippath', d)
return d.x
})
.attr('cy', function(d) {
return d.y
})
.attr('r', function(d) {
return d.radius
})
And that's it. I have updated the fiddle : https://jsfiddle/thatOneGuy/1spn8nne/4/