forked from MatterHackers/MatterSlice
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmultiVolumes.cs
91 lines (80 loc) · 4 KB
/
multiVolumes.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
This file is part of MatterSlice. A commandline utility for
generating 3D printing GCode.
Copyright (C) 2013 David Braam
Copyright (c) 2014, Lars Brubaker
MatterSlice is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using MatterSlice.ClipperLib;
namespace MatterHackers.MatterSlice
{
using Polygon = List<IntPoint>;
using Polygons = List<List<IntPoint>>;
public static class MultiVolumes
{
public static void RemoveVolumesIntersections(List<SliceVolumeStorage> volumes)
{
//Go trough all the volumes, and remove the previous volume outlines from our own outline, so we never have overlapped areas.
for (int volumeToRemoveFromIndex = volumes.Count-1; volumeToRemoveFromIndex >= 0; volumeToRemoveFromIndex--)
{
for (int volumeToRemoveIndex = volumeToRemoveFromIndex - 1; volumeToRemoveIndex >= 0; volumeToRemoveIndex--)
{
for (int layerIndex = 0; layerIndex < volumes[volumeToRemoveFromIndex].layers.Count; layerIndex++)
{
SliceLayer layerToRemoveFrom = volumes[volumeToRemoveFromIndex].layers[layerIndex];
SliceLayer layerToRemove = volumes[volumeToRemoveIndex].layers[layerIndex];
for (int partToRemoveFromIndex = 0; partToRemoveFromIndex < layerToRemoveFrom.parts.Count; partToRemoveFromIndex++)
{
for (int partToRemove = 0; partToRemove < layerToRemove.parts.Count; partToRemove++)
{
layerToRemoveFrom.parts[partToRemoveFromIndex].outline = layerToRemoveFrom.parts[partToRemoveFromIndex].outline.CreateDifference(layerToRemove.parts[partToRemove].outline);
}
}
}
}
}
}
//Expand each layer a bit and then keep the extra overlapping parts that overlap with other volumes.
//This generates some overlap in dual extrusion, for better bonding in touching parts.
public static void OverlapMultipleVolumesSlightly(List<SliceVolumeStorage> volumes, int overlap)
{
if (volumes.Count < 2 || overlap <= 0)
{
return;
}
for (int layerIndex = 0; layerIndex < volumes[0].layers.Count; layerIndex++)
{
Polygons fullLayer = new Polygons();
for (int volIdx = 0; volIdx < volumes.Count; volIdx++)
{
SliceLayer layer1 = volumes[volIdx].layers[layerIndex];
for (int p1 = 0; p1 < layer1.parts.Count; p1++)
{
fullLayer = fullLayer.CreateUnion(layer1.parts[p1].outline.Offset(20));
}
}
fullLayer = fullLayer.Offset(-20);
for (int volumeIndex = 0; volumeIndex < volumes.Count; volumeIndex++)
{
SliceLayer layer1 = volumes[volumeIndex].layers[layerIndex];
for (int partIndex = 0; partIndex < layer1.parts.Count; partIndex++)
{
layer1.parts[partIndex].outline = fullLayer.CreateIntersection(layer1.parts[partIndex].outline.Offset(overlap / 2));
}
}
}
}
}
}