void UpdateCutData() { updateCuts = true; cutBBox.Clear(); foreach (PrintModel model in Main.main.objectPlacement.ListObjects(false)) { cutBBox.Add(model.bbox); } oldPosition = Main.main.objectPlacement.cutPositionSlider.Value; oldInclination = Main.main.objectPlacement.cutInclinationSlider.Value; oldAzimuth = Main.main.objectPlacement.cutAzimuthSlider.Value; double inclination = (double)oldInclination * Math.PI / 1800.0; double azimuth = (double)oldAzimuth * Math.PI / 1800.0; cutDirection.x = Math.Sin(inclination) * Math.Cos(azimuth); cutDirection.y = Math.Sin(inclination) * Math.Sin(azimuth); cutDirection.z = Math.Cos(inclination); RHVector3 center = cutBBox.Center; TopoPlane plane = new TopoPlane(cutDirection, center); double min = 0, max = 0, dist; RHVector3 p = new RHVector3(cutBBox.xMin, cutBBox.yMin, cutBBox.zMin); dist = plane.VertexDistance(p); max = Math.Max(dist, max); min = Math.Min(dist, min); p = new RHVector3(cutBBox.xMax, cutBBox.yMin, cutBBox.zMin); dist = plane.VertexDistance(p); max = Math.Max(dist, max); min = Math.Min(dist, min); p = new RHVector3(cutBBox.xMin, cutBBox.yMax, cutBBox.zMin); dist = plane.VertexDistance(p); max = Math.Max(dist, max); min = Math.Min(dist, min); p = new RHVector3(cutBBox.xMax, cutBBox.yMax, cutBBox.zMin); dist = plane.VertexDistance(p); max = Math.Max(dist, max); min = Math.Min(dist, min); p = new RHVector3(cutBBox.xMin, cutBBox.yMin, cutBBox.zMax); dist = plane.VertexDistance(p); max = Math.Max(dist, max); min = Math.Min(dist, min); p = new RHVector3(cutBBox.xMax, cutBBox.yMin, cutBBox.zMax); dist = plane.VertexDistance(p); max = Math.Max(dist, max); min = Math.Min(dist, min); p = new RHVector3(cutBBox.xMin, cutBBox.yMax, cutBBox.zMax); dist = plane.VertexDistance(p); max = Math.Max(dist, max); min = Math.Min(dist, min); p = new RHVector3(cutBBox.xMax, cutBBox.yMax, cutBBox.zMax); dist = plane.VertexDistance(p); max = Math.Max(dist, max); min = Math.Min(dist, min); double spos = min + 1.001 * (max - min) * (double)oldPosition / 1000.0; cutPos.x = center.x + spos * cutDirection.x; cutPos.y = center.y + spos * cutDirection.y; cutPos.z = center.z + spos * cutDirection.z; }
public void CutMesh(Submesh mesh, RHVector3 normal, RHVector3 point,int defaultFaceColor) { TopoPlane plane = new TopoPlane(normal, point); bool drawEdges = Main.threeDSettings.ShowEdges; foreach (TopoEdge e in edges) e.algHelper = 0; // Mark drawn edges, so we insert them only once foreach (TopoTriangle t in triangles) { int side = plane.testTriangleSideFast(t); if (side == -1) { mesh.AddTriangle(t.vertices[0].pos, t.vertices[1].pos, t.vertices[2].pos, (t.bad ? Submesh.MESHCOLOR_ERRORFACE : defaultFaceColor)); if (drawEdges) { if (t.edges[0].algHelper == 0) { mesh.AddEdge(t.vertices[0].pos, t.vertices[1].pos, t.edges[0].connectedFaces == 2 ? Submesh.MESHCOLOR_EDGE : Submesh.MESHCOLOR_ERROREDGE); t.edges[0].algHelper = 1; } if (t.edges[1].algHelper == 0) { mesh.AddEdge(t.vertices[1].pos, t.vertices[2].pos, t.edges[1].connectedFaces == 2 ? Submesh.MESHCOLOR_EDGE : Submesh.MESHCOLOR_ERROREDGE); t.edges[1].algHelper = 1; } if (t.edges[2].algHelper == 0) { mesh.AddEdge(t.vertices[2].pos, t.vertices[0].pos, t.edges[2].connectedFaces == 2 ? Submesh.MESHCOLOR_EDGE : Submesh.MESHCOLOR_ERROREDGE); t.edges[2].algHelper = 1; } } else { if (t.edges[0].algHelper == 0 && t.edges[0].connectedFaces != 2) { mesh.AddEdge(t.vertices[0].pos, t.vertices[1].pos, Submesh.MESHCOLOR_ERROREDGE); t.edges[0].algHelper = 1; } if (t.edges[1].algHelper == 0 && t.edges[1].connectedFaces != 2) { mesh.AddEdge(t.vertices[1].pos, t.vertices[2].pos, Submesh.MESHCOLOR_ERROREDGE); t.edges[1].algHelper = 1; } if (t.edges[2].algHelper == 0 && t.edges[2].connectedFaces != 2) { mesh.AddEdge(t.vertices[2].pos, t.vertices[0].pos, Submesh.MESHCOLOR_ERROREDGE); t.edges[2].algHelper = 1; } } } else if (side == 0) { plane.addIntersectionToSubmesh(mesh, t, drawEdges, (t.bad ? Submesh.MESHCOLOR_ERRORFACE : defaultFaceColor)); } } }