Merge pull request #3346 from larsbrubaker/design_tools
Making Curve and Pinch maintain their initial coordinate system for s…
This commit is contained in:
commit
485952380f
3 changed files with 61 additions and 19 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit f60efdfa6d0c926083aa67e8528b1866509641d0
|
||||
Subproject commit cab0505ff8b0b5ce83f8fb8f7a1da2d923144ffc
|
||||
Loading…
Add table
Add a link
Reference in a new issue