commit
b8c126e6f6
6 changed files with 20 additions and 152 deletions
|
|
@ -136,20 +136,6 @@ namespace MatterHackers.MatterControl
|
|||
|
||||
if (object3D != null)
|
||||
{
|
||||
if (object3D.Mesh == null && object3D.HasChildren)
|
||||
{
|
||||
object3D = new Object3D()
|
||||
{
|
||||
ItemType = Object3DTypes.Model,
|
||||
Mesh = MeshFileIo.DoMerge(object3D.ToMeshGroupList(), new MeshOutputSettings())
|
||||
};
|
||||
}
|
||||
|
||||
if (object3D.Mesh == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bool RenderOrthographic = UserSettings.Instance.get(UserSettingsKey.ThumbnailRenderingMode) == "orthographic";
|
||||
|
||||
var thumbnail = ThumbnailEngine.Generate(
|
||||
|
|
|
|||
|
|
@ -128,117 +128,6 @@ namespace MatterHackers.MatterControl
|
|||
return discreetVolumes;
|
||||
}
|
||||
|
||||
public static Mesh[] SplitIntoMeshesOnOrthographicZ(Mesh meshToSplit, Vector3 buildVolume, Action<double, string> reportProgress)
|
||||
{
|
||||
// check if the part is bigger than the build plate (if it is we need to use that as our size)
|
||||
AxisAlignedBoundingBox partBounds = meshToSplit.GetAxisAlignedBoundingBox();
|
||||
|
||||
buildVolume.x = Math.Max(buildVolume.x, partBounds.XSize + 2);
|
||||
buildVolume.y = Math.Max(buildVolume.y, partBounds.YSize + 2);
|
||||
buildVolume.z = Math.Max(buildVolume.z, partBounds.ZSize + 2);
|
||||
|
||||
// Find all the separate objects that are on the plate
|
||||
// Create a 2D image the size of the printer bed at some scale with the parts draw on it top down
|
||||
|
||||
double scaleFactor = 5;
|
||||
ImageBuffer partPlate = new ImageBuffer((int)(buildVolume.x * scaleFactor), (int)(buildVolume.y * scaleFactor));
|
||||
Vector2 renderOffset = new Vector2(buildVolume.x / 2, buildVolume.y / 2) - new Vector2(partBounds.Center.x, partBounds.Center.y);
|
||||
|
||||
PolygonMesh.Rendering.OrthographicZProjection.DrawTo(partPlate.NewGraphics2D(), meshToSplit, renderOffset, scaleFactor, RGBA_Bytes.White);
|
||||
|
||||
reportProgress?.Invoke(.2, "");
|
||||
|
||||
//ImageIO.SaveImageData("test part plate 0.png", partPlate);
|
||||
// expand the bounds a bit so that we can collect all the vertices and polygons within each bound
|
||||
Dilate.DoDilate3x3Binary(partPlate, 1);
|
||||
//ImageIO.SaveImageData("test part plate 1.png", partPlate);
|
||||
|
||||
// trace all the bounds of the objects on the plate
|
||||
PolyTree polyTreeForPlate = FindDistictObjectBounds(partPlate);
|
||||
if (polyTreeForPlate == null)
|
||||
{
|
||||
Mesh[] singleMesh = new Mesh[1];
|
||||
singleMesh[0] = meshToSplit;
|
||||
return singleMesh;
|
||||
}
|
||||
|
||||
// get all the discrete areas that are polygons so we can search them
|
||||
Polygons discreteAreas = new Polygons();
|
||||
GetAreasRecursive(polyTreeForPlate, discreteAreas);
|
||||
if (discreteAreas.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else if (discreteAreas.Count == 1)
|
||||
{
|
||||
Mesh[] singleMesh = new Mesh[1];
|
||||
singleMesh[0] = meshToSplit;
|
||||
return singleMesh;
|
||||
}
|
||||
|
||||
Graphics2D graphics2D = partPlate.NewGraphics2D();
|
||||
graphics2D.Clear(RGBA_Bytes.Black);
|
||||
Random rand = new Random();
|
||||
foreach (Polygon polygon in discreteAreas)
|
||||
{
|
||||
graphics2D.Render(PlatingHelper.PolygonToPathStorage(polygon), new RGBA_Bytes(rand.Next(128, 255), rand.Next(128, 255), rand.Next(128, 255)));
|
||||
}
|
||||
|
||||
reportProgress?.Invoke(.5, "");
|
||||
|
||||
//ImageIO.SaveImageData("test part plate 2.png", partPlate);
|
||||
|
||||
// add each of the separate bounds polygons to new meshes
|
||||
Mesh[] discreteMeshes = new Mesh[discreteAreas.Count];
|
||||
for (int i = 0; i < discreteAreas.Count; i++)
|
||||
{
|
||||
discreteMeshes[i] = new Mesh();
|
||||
}
|
||||
|
||||
foreach (Face face in meshToSplit.Faces)
|
||||
{
|
||||
bool faceDone = false;
|
||||
// figure out which area one or more of the vertices are in add the face to the right new mesh
|
||||
foreach (FaceEdge faceEdge in face.FaceEdges())
|
||||
{
|
||||
Vector2 position = new Vector2(faceEdge.FirstVertex.Position.x, faceEdge.FirstVertex.Position.y);
|
||||
position += renderOffset;
|
||||
position *= scaleFactor;
|
||||
|
||||
for (int areaIndex = discreteAreas.Count - 1; areaIndex >= 0; areaIndex--)
|
||||
{
|
||||
if (PointInPolygon(discreteAreas[areaIndex], new IntPoint((int)position.x, (int)position.y)))
|
||||
{
|
||||
var faceVertices = new List<IVertex>();
|
||||
foreach (FaceEdge faceEdgeToAdd in face.FaceEdges())
|
||||
{
|
||||
var newVertex = discreteMeshes[areaIndex].CreateVertex(faceEdgeToAdd.FirstVertex.Position);
|
||||
faceVertices.Add(newVertex);
|
||||
}
|
||||
|
||||
discreteMeshes[areaIndex].CreateFace(faceVertices.ToArray());
|
||||
faceDone = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (faceDone)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
reportProgress?.Invoke(.8, "");
|
||||
|
||||
for (int i = 0; i < discreteMeshes.Count(); i++)
|
||||
{
|
||||
Mesh mesh = discreteMeshes[i];
|
||||
}
|
||||
|
||||
return discreteMeshes;
|
||||
}
|
||||
|
||||
public static bool PointInPolygon(Polygon polygon, IntPoint testPosition)
|
||||
{
|
||||
int numPoints = polygon.Count;
|
||||
|
|
|
|||
|
|
@ -251,7 +251,7 @@ namespace MatterHackers.MeshVisualizer
|
|||
renderType = value;
|
||||
foreach(var renderTransfrom in Scene.VisibleMeshes(Matrix4X4.Identity))
|
||||
{
|
||||
renderTransfrom.MeshData.MarkAsChanged();
|
||||
renderTransfrom.Mesh.MarkAsChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -613,14 +613,15 @@ namespace MatterHackers.MeshVisualizer
|
|||
|
||||
public bool IsActive { get; set; } = true;
|
||||
|
||||
RGBA_Bytes lastDrawColor;
|
||||
private void DrawObject(IObject3D object3D, Matrix4X4 transform, bool parentSelected)
|
||||
{
|
||||
foreach(MeshAndTransform meshAndTransform in object3D.VisibleMeshes(transform))
|
||||
foreach(MeshRenderData renderData in object3D.VisibleMeshes(transform))
|
||||
{
|
||||
bool isSelected = parentSelected ||
|
||||
Scene.HasSelection && (object3D == Scene.SelectedItem || Scene.SelectedItem.Children.Contains(object3D));
|
||||
|
||||
RGBA_Bytes drawColor = object3D.Color;
|
||||
RGBA_Bytes drawColor = renderData.Color;
|
||||
if(object3D.OutputType == PrintOutputTypes.Support)
|
||||
{
|
||||
drawColor = new RGBA_Bytes(RGBA_Bytes.Yellow, 120);
|
||||
|
|
@ -632,11 +633,14 @@ namespace MatterHackers.MeshVisualizer
|
|||
|
||||
if (drawColor.Alpha0To1 == 0)
|
||||
{
|
||||
int extruderIndex = Math.Max(0, object3D.ExtruderIndex);
|
||||
drawColor = isSelected ? GetSelectedExtruderColor(extruderIndex) : GetExtruderColor(extruderIndex);
|
||||
drawColor = lastDrawColor;
|
||||
}
|
||||
else
|
||||
{
|
||||
lastDrawColor = drawColor;
|
||||
}
|
||||
|
||||
GLHelper.Render(meshAndTransform.MeshData, drawColor, meshAndTransform.Matrix, RenderType);
|
||||
GLHelper.Render(renderData.Mesh, drawColor, renderData.Matrix, RenderType);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2383,9 +2383,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
|
|||
UserSettings.Instance.set("defaultRenderSetting", meshViewerWidget.RenderType.ToString());
|
||||
foreach (var meshAndTransform in scene.VisibleMeshes(Matrix4X4.Identity))
|
||||
{
|
||||
meshAndTransform.MeshData.MarkAsChanged();
|
||||
meshAndTransform.Mesh.MarkAsChanged();
|
||||
// change the color to be the right thing
|
||||
GLMeshTrianglePlugin glMeshPlugin = GLMeshTrianglePlugin.Get(meshAndTransform.MeshData, (faceEdge) =>
|
||||
GLMeshTrianglePlugin glMeshPlugin = GLMeshTrianglePlugin.Get(meshAndTransform.Mesh, (faceEdge) =>
|
||||
{
|
||||
Vector3 normal = faceEdge.ContainingFace.normal;
|
||||
normal = Vector3.TransformVector(normal, meshAndTransform.Matrix).GetNormal();
|
||||
|
|
|
|||
|
|
@ -136,22 +136,14 @@ namespace MatterHackers.MatterControl
|
|||
|
||||
await contentResult.MeshLoaded;
|
||||
|
||||
List<MeshGroup> loadedMeshGroups = contentResult.Object3D?.ToMeshGroupList();
|
||||
var loadedMeshGroups = contentResult.Object3D.VisibleMeshes(Matrix4X4.Identity).ToList();
|
||||
if (loadedMeshGroups?.Count > 0)
|
||||
{
|
||||
bool firstMeshGroup = true;
|
||||
AxisAlignedBoundingBox aabb = null;
|
||||
foreach (MeshGroup meshGroup in loadedMeshGroups)
|
||||
AxisAlignedBoundingBox aabb = loadedMeshGroups[0].Mesh.GetAxisAlignedBoundingBox(loadedMeshGroups[0].Matrix);
|
||||
|
||||
for (int i = 1; i < loadedMeshGroups.Count; i++)
|
||||
{
|
||||
if (firstMeshGroup)
|
||||
{
|
||||
aabb = meshGroup.GetAxisAlignedBoundingBox();
|
||||
firstMeshGroup = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
aabb = AxisAlignedBoundingBox.Union(aabb, meshGroup.GetAxisAlignedBoundingBox());
|
||||
}
|
||||
aabb = AxisAlignedBoundingBox.Union(aabb, loadedMeshGroups[i].Mesh.GetAxisAlignedBoundingBox(loadedMeshGroups[i].Matrix));
|
||||
}
|
||||
|
||||
RectangleDouble bounds2D = new RectangleDouble(aabb.minXYZ.x, aabb.minXYZ.y, aabb.maxXYZ.x, aabb.maxXYZ.y);
|
||||
|
|
@ -176,12 +168,9 @@ namespace MatterHackers.MatterControl
|
|||
Stroke rectOutline = new Stroke(rect, strokeWidth);
|
||||
partGraphics2D.Render(rectOutline, RGBA_Bytes.DarkGray);
|
||||
|
||||
foreach (MeshGroup meshGroup in loadedMeshGroups)
|
||||
foreach (var meshGroup in loadedMeshGroups)
|
||||
{
|
||||
foreach (Mesh loadedMesh in meshGroup.Meshes)
|
||||
{
|
||||
PolygonMesh.Rendering.OrthographicZProjection.DrawTo(partGraphics2D, loadedMesh, new Vector2(-bounds2D.Left + PartMarginMM, -bounds2D.Bottom + textSpaceMM + PartMarginMM), PixelPerMM, RGBA_Bytes.Black);
|
||||
}
|
||||
PolygonMesh.Rendering.OrthographicZProjection.DrawTo(partGraphics2D, meshGroup.Mesh, meshGroup.Matrix, new Vector2(-bounds2D.Left + PartMarginMM, -bounds2D.Bottom + textSpaceMM + PartMarginMM), PixelPerMM, RGBA_Bytes.Black);
|
||||
}
|
||||
partGraphics2D.Render(typeFacePrinter, RGBA_Bytes.Black);
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 592850ee8828c9527f265147f77964a61db18241
|
||||
Subproject commit 8527327fcdd703f5eb2836b54ebff8559e625e07
|
||||
Loading…
Add table
Add a link
Reference in a new issue