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;
 }
Example #2
0
 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));
         }
     }
 }