| 163 | |
| 164 | |
| 165 | std::vector<TopoDS_Edge> DrawProjectSplit::splitEdges(std::vector<TopoDS_Edge> edges, std::vector<splitPoint> splits) |
| 166 | { |
| 167 | std::vector<TopoDS_Edge> result; |
| 168 | std::vector<TopoDS_Edge> newEdges; |
| 169 | std::vector<splitPoint> edgeSplits; //splits for current edge |
| 170 | int iEdge = 0; //current edge index |
| 171 | int iSplit = 0; //current splitindex |
| 172 | int ii = 0; //i value of current split |
| 173 | int endEdge = edges.size(); |
| 174 | int endSplit = splits.size(); |
| 175 | int imax = std::numeric_limits<int>::max(); |
| 176 | |
| 177 | while (iEdge < endEdge) { |
| 178 | if (iSplit < endSplit) { |
| 179 | ii = splits[iSplit].i; |
| 180 | } else { |
| 181 | ii = imax; |
| 182 | } |
| 183 | if (ii == iEdge) { |
| 184 | edgeSplits.push_back(splits[iSplit]); |
| 185 | iSplit++; |
| 186 | } else if (ii > iEdge) { |
| 187 | if (!edgeSplits.empty()) { //save *iedge's splits |
| 188 | newEdges = split1Edge(edges[iEdge], edgeSplits); |
| 189 | result.insert(result.end(), newEdges.begin(), newEdges.end()); |
| 190 | edgeSplits.clear(); |
| 191 | } else { |
| 192 | result.push_back(edges[iEdge]); //save *iedge |
| 193 | } |
| 194 | iEdge++; //next edge |
| 195 | } else if (iEdge > ii) { |
| 196 | iSplit++; |
| 197 | } |
| 198 | } |
| 199 | |
| 200 | if (!edgeSplits.empty()) { //handle last batch |
| 201 | newEdges = split1Edge(edges[iEdge], edgeSplits); |
| 202 | result.insert(result.end(), newEdges.begin(), newEdges.end()); |
| 203 | edgeSplits.clear(); |
| 204 | } |
| 205 | |
| 206 | return result; |
| 207 | } |
| 208 | |
| 209 | |
| 210 | std::vector<TopoDS_Edge> DrawProjectSplit::split1Edge(TopoDS_Edge e, std::vector<splitPoint> splits) |