diff --git a/DesignTools/Operations/CurveObject3D.cs b/DesignTools/Operations/CurveObject3D.cs index 618f6bf24..2d0c1717a 100644 --- a/DesignTools/Operations/CurveObject3D.cs +++ b/DesignTools/Operations/CurveObject3D.cs @@ -55,6 +55,10 @@ namespace MatterHackers.MatterControl.DesignTools Rebuilding = true; ResetMeshWrappers(); + // remember the current matrix then clear it so the parts will rotate at the original wrapped position + var currentMatrix = Matrix; + Matrix = Matrix4X4.Identity; + var meshWrapper = this.Descendants() .Where((obj) => obj.OwnerID == this.ID).ToList(); @@ -80,25 +84,53 @@ namespace MatterHackers.MatterControl.DesignTools var radius = Diameter / 2; var circumference = MathHelper.Tau * radius; var rotationCenter = new Vector2(aabb.minXYZ.X, aabb.maxXYZ.Y + radius); - foreach (var items in meshWrapper.Select((mw) => (Original: mw.Children.First(), Transformed: mw))) + foreach (var object3Ds in meshWrapper.Select((mw) => (Original: mw.Children.First(), Curved: mw))) { - var transformedMesh = items.Transformed.Mesh; - var originalMesh = items.Original.Mesh; - var itemMatrix = items.Original.WorldMatrix(this); - var invItemMatrix = itemMatrix; - invItemMatrix.Invert(); + // split edges to make it curve better + /*if(false) + { + var maxXLength = aabb.XSize / AngleDegrees; + // chop any segment that is too short in x + for (int i = transformedMesh.MeshEdges.Count - 1; i >= 0; i--) + { + var edgeToSplit = transformedMesh.MeshEdges[i]; + var start = edgeToSplit.VertexOnEnd[0].Position; + var end = edgeToSplit.VertexOnEnd[1].Position; + var edgeXLength = Math.Abs(end.X - start.X); + int numberOfDivides = (int)(edgeXLength / maxXLength); + if (numberOfDivides > 1) + { + for (int j = 1; j < numberOfDivides - 1; j++) + { + IVertex newVertex; + MeshEdge newMeshEdge; + transformedMesh.SplitMeshEdge(edgeToSplit, out newVertex, out newMeshEdge); + var otherIndex = newMeshEdge.GetVertexEndIndex(newVertex); + var ratio = (numberOfDivides - j) / (double)numberOfDivides; + newVertex.Position = start + (end - start) * ratio; + edgeToSplit = newMeshEdge; + start = edgeToSplit.VertexOnEnd[0].Position; + end = edgeToSplit.VertexOnEnd[1].Position; + } + } + } + }*/ + + var originalMatrix = object3Ds.Original.WorldMatrix(this); + var cuvedMesh = object3Ds.Curved.Mesh; + var originalMesh = object3Ds.Original.Mesh; // make sure we are working with a copy - if (transformedMesh == originalMesh) + if (cuvedMesh == originalMesh) { // Make sure the mesh we are going to copy is in a good state to be copied (so we maintain vertex count) originalMesh.CleanAndMergeMesh(CancellationToken.None); - transformedMesh = Mesh.Copy(originalMesh, CancellationToken.None); - items.Transformed.Mesh = transformedMesh; + cuvedMesh = Mesh.Copy(originalMesh, CancellationToken.None); + object3Ds.Curved.Mesh = cuvedMesh; } for (int i = 0; i < originalMesh.Vertices.Count; i++) { - var matrix = items.Original.WorldMatrix(this); + var matrix = originalMatrix; if (!BendCcw) { // rotate around so it wil bend correctly @@ -115,14 +147,17 @@ namespace MatterHackers.MatterControl.DesignTools rotatePosition.Z = worldPosition.Z; matrix.Invert(); var worldWithBend = rotatePosition + new Vector3(aabb.minXYZ.X, radius + aabb.maxXYZ.Y, 0); - transformedMesh.Vertices[i].Position = Vector3.Transform(worldWithBend, matrix); + cuvedMesh.Vertices[i].Position = Vector3.Transform(worldWithBend, matrix); } - transformedMesh.MarkAsChanged(); - transformedMesh.CalculateNormals(); + cuvedMesh.MarkAsChanged(); + cuvedMesh.CalculateNormals(); } } + // set the matrix back + Matrix = currentMatrix; + Rebuilding = false; } diff --git a/DesignTools/Operations/PinchObject3D.cs b/DesignTools/Operations/PinchObject3D.cs index a49de79cd..d2c939570 100644 --- a/DesignTools/Operations/PinchObject3D.cs +++ b/DesignTools/Operations/PinchObject3D.cs @@ -52,22 +52,26 @@ namespace MatterHackers.MatterControl.DesignTools Rebuilding = true; ResetMeshWrappers(); + // remember the current matrix then clear it so the parts will rotate at the original wrapped position + var currentMatrix = Matrix; + Matrix = Matrix4X4.Identity; + var meshWrapper = this.Descendants() .Where((obj) => obj.OwnerID == this.ID).ToList(); // reset the positions before we take the aabb foreach (var items in meshWrapper.Select((mw) => (Original: mw.Children.First(), - Transformed: mw))) + Pinched: mw))) { - var transformedMesh = items.Transformed.Mesh; + var pinchedMesh = items.Pinched.Mesh; var originalMesh = items.Original.Mesh; - for (int i = 0; i < transformedMesh.Vertices.Count; i++) + for (int i = 0; i < pinchedMesh.Vertices.Count; i++) { - transformedMesh.Vertices[i].Position = originalMesh.Vertices[i].Position; + pinchedMesh.Vertices[i].Position = originalMesh.Vertices[i].Position; } - transformedMesh.MarkAsChanged(); + pinchedMesh.MarkAsChanged(); } var aabb = this.GetAxisAlignedBoundingBox(); @@ -110,6 +114,9 @@ namespace MatterHackers.MatterControl.DesignTools transformedMesh.MarkAsChanged(); transformedMesh.CalculateNormals(); + + // set the matrix back + Matrix = currentMatrix; Rebuilding = false; } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index f60efdfa6..cab0505ff 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit f60efdfa6d0c926083aa67e8528b1866509641d0 +Subproject commit cab0505ff8b0b5ce83f8fb8f7a1da2d923144ffc