Merge pull request #4311 from larsbrubaker/master

Improving creation of fit to bounds.
This commit is contained in:
johnlewin 2019-02-26 09:06:57 -08:00 committed by GitHub
commit 2cd6455bf5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 69 additions and 75 deletions

View file

@ -35,6 +35,7 @@ using MatterHackers.MatterControl.PartPreviewWindow;
using MatterHackers.MeshVisualizer;
using MatterHackers.PolygonMesh;
using MatterHackers.VectorMath;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@ -49,10 +50,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
private AxisAlignedBoundingBox cacheAabb;
private Vector3 cacheBounds;
private Matrix4X4 cacheRequestedMatrix = new Matrix4X4();
private Matrix4X4 cacheThisMatrix;
private bool rebuildAabbCache = true;
public FitToBoundsObject3D_2()
{
@ -120,27 +118,32 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
var fitToBounds = new FitToBoundsObject3D_2();
using (fitToBounds.RebuildLock())
{
using (new CenterAndHeightMantainer(itemToFit))
var startingAabb = itemToFit.GetAxisAlignedBoundingBox();
itemToFit.Translate(-startingAabb.Center);
// add the fit item
var scaleItem = new Object3D();
fitToBounds.Children.Add(scaleItem);
scaleItem.Children.Add(itemToFit);
// create an object that just represents the bounds in the scene
var fitBounds = new Object3D()
{
var aabb = itemToFit.GetAxisAlignedBoundingBox();
var bounds = new Object3D()
{
Visible = false,
Color = new Color(Color.Red, 100),
Mesh = PlatonicSolids.CreateCube()
};
Visible = false,
Color = new Color(Color.Red, 100),
Mesh = PlatonicSolids.CreateCube()
};
// add the item that holds the bounds
fitToBounds.Children.Add(fitBounds);
// add all the children
var scaleItem = new Object3D();
fitToBounds.Children.Add(scaleItem);
scaleItem.Children.Add(itemToFit);
fitToBounds.Children.Add(bounds);
fitToBounds.boundsSize.X = startingAabb.XSize;
fitToBounds.boundsSize.Y = startingAabb.YSize;
fitToBounds.boundsSize.Z = startingAabb.ZSize;
await fitToBounds.Rebuild();
fitToBounds.boundsSize.X = aabb.XSize;
fitToBounds.boundsSize.Y = aabb.YSize;
fitToBounds.boundsSize.Z = aabb.ZSize;
await fitToBounds.Rebuild();
}
var finalAabb = fitToBounds.GetAxisAlignedBoundingBox();
fitToBounds.Translate(startingAabb.Center - finalAabb.Center);
fitToBounds.rebuildAabbCache = true;
}
return fitToBounds;
@ -169,9 +172,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
{
if (Children.Count == 2)
{
if (cacheRequestedMatrix != matrix
|| cacheThisMatrix != Matrix
|| cacheBounds != boundsSize)
if (rebuildAabbCache)
{
using (FitBounds.RebuildLock())
{
@ -179,9 +180,8 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
cacheAabb = base.GetAxisAlignedBoundingBox(matrix);
FitBounds.Visible = false;
}
cacheRequestedMatrix = matrix;
cacheThisMatrix = Matrix;
cacheBounds = boundsSize;
rebuildAabbCache = false;
}
return cacheAabb;
@ -210,7 +210,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
|| invalidateType.InvalidateType.HasFlag(InvalidateType.Mesh)
|| invalidateType.InvalidateType.HasFlag(InvalidateType.Children))
{
cacheThisMatrix = Matrix4X4.Identity;
rebuildAabbCache = true;
base.OnInvalidate(invalidateType);
}
@ -227,9 +227,6 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
AdjustChildSize(null, null);
UpdateBoundsItem();
cacheRequestedMatrix = new Matrix4X4();
var after = this.GetAxisAlignedBoundingBox();
}
}
@ -298,6 +295,8 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
FitBounds.Matrix *= Matrix4X4.CreateTranslation(
transformAabb.Center - FitBounds.GetAxisAlignedBoundingBox().Center);
}
rebuildAabbCache = true;
}
}
}

View file

@ -53,14 +53,11 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
public class FitToCylinderObject3D : TransformWrapperObject3D, IEditorDraw
{
private Vector3 boundsSize;
private AxisAlignedBoundingBox cacheAabb;
private Vector3 cacheBounds;
private bool rebuildAabbCache = true;
private Matrix4X4 cacheRequestedMatrix = new Matrix4X4();
private Matrix4X4 cacheThisMatrix;
public FitToCylinderObject3D()
{
@ -85,29 +82,33 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
var fitToBounds = new FitToCylinderObject3D();
using (fitToBounds.RebuildLock())
{
using (new CenterAndHeightMantainer(itemToFit))
var startingAabb = itemToFit.GetAxisAlignedBoundingBox();
// add the fit item
var scaleItem = new Object3D();
fitToBounds.Children.Add(scaleItem);
scaleItem.Children.Add(itemToFit);
// create an object that just represents the bounds in the scene
var fitBounds = new Object3D()
{
var aabb = itemToFit.GetAxisAlignedBoundingBox();
var bounds = new Object3D()
{
Visible = false,
Color = new Color(Color.Red, 100),
Mesh = PlatonicSolids.CreateCube()
};
Visible = false,
Color = new Color(Color.Red, 100),
Mesh = PlatonicSolids.CreateCube()
};
// add the item that holds the bounds
fitToBounds.Children.Add(fitBounds);
// add all the children
var scaleItem = new Object3D();
fitToBounds.Children.Add(scaleItem);
scaleItem.Children.Add(itemToFit);
fitToBounds.Children.Add(bounds);
fitToBounds.Diameter = Math.Sqrt(startingAabb.XSize * startingAabb.XSize + startingAabb.YSize * startingAabb.YSize);
fitToBounds.SizeZ = startingAabb.ZSize;
fitToBounds.Diameter = Math.Sqrt(aabb.XSize * aabb.XSize + aabb.YSize * aabb.YSize);
fitToBounds.boundsSize.Z = aabb.ZSize;
fitToBounds.SizeZ = startingAabb.ZSize;
fitToBounds.SizeZ = aabb.ZSize;
await fitToBounds.Rebuild();
await fitToBounds.Rebuild();
}
var finalAabb = fitToBounds.GetAxisAlignedBoundingBox();
fitToBounds.Translate(startingAabb.Center - finalAabb.Center);
fitToBounds.rebuildAabbCache = true;
}
return fitToBounds;
@ -127,9 +128,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
{
if (Children.Count == 2)
{
if (cacheRequestedMatrix != matrix
|| cacheThisMatrix != Matrix
|| cacheBounds != boundsSize)
if (rebuildAabbCache)
{
using (FitBounds.RebuildLock())
{
@ -138,8 +137,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
FitBounds.Visible = false;
}
cacheRequestedMatrix = matrix;
cacheThisMatrix = Matrix;
cacheBounds = boundsSize;
rebuildAabbCache = false;
}
return cacheAabb;
@ -168,7 +166,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
|| invalidateType.InvalidateType.HasFlag(InvalidateType.Mesh)
|| invalidateType.InvalidateType.HasFlag(InvalidateType.Children))
{
cacheThisMatrix = Matrix4X4.Identity;
rebuildAabbCache = true;
base.OnInvalidate(invalidateType);
}
@ -339,15 +337,14 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
{
var transformAabb = ItemWithTransform.GetAxisAlignedBoundingBox();
var fitAabb = FitBounds.GetAxisAlignedBoundingBox();
var fitSize = fitAabb.Size;
if (boundsSize.X != 0 && boundsSize.Y != 0 && boundsSize.Z != 0
&& (fitSize != boundsSize
|| fitAabb.Center != transformAabb.Center))
if (Diameter != 0
&& SizeZ != 0
&& (fitAabb.XSize != Diameter || fitAabb.ZSize != SizeZ))
{
FitBounds.Matrix *= Matrix4X4.CreateScale(
boundsSize.X / fitSize.X,
boundsSize.Y / fitSize.Y,
boundsSize.Z / fitSize.Z);
fitAabb.XSize / Diameter,
fitAabb.YSize / Diameter,
fitAabb.ZSize / SizeZ);
FitBounds.Matrix *= Matrix4X4.CreateTranslation(
transformAabb.Center - FitBounds.GetAxisAlignedBoundingBox().Center);
}
@ -360,6 +357,8 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
{
var test = GetCenteringTransformExpandedToRadius(UntransformedChildren, Diameter / 2);
}
rebuildAabbCache = true;
}
}
}

@ -1 +1 @@
Subproject commit 0d0a7c33939389da7dc8eedf98e408aa494cee44
Subproject commit 3c2ed0432e5c799a2ed31eb2389bae56dfa4834e

View file

@ -39,6 +39,7 @@ using MatterHackers.MatterControl.Tests.Automation;
using MatterHackers.VectorMath;
using NUnit.Framework;
using System.Linq;
using System.Threading.Tasks;
namespace MatterControl.Tests.MatterControl
{
@ -306,12 +307,7 @@ namespace MatterControl.Tests.MatterControl
}
[Test, Category("InteractiveScene")]
public void AabbCalculatedCorrectlyForPinchedFitObjects()
{
DoAabbCalculatedCorrectlyForPinchedFitObjects();
}
async void DoAabbCalculatedCorrectlyForPinchedFitObjects()
public async Task AabbCalculatedCorrectlyForPinchedFitObjects()
{
AggContext.StaticData = new FileSystemStaticData(TestContext.CurrentContext.ResolveProjectPath(4, "StaticData"));
MatterControlUtilities.OverrideAppDataLocation(TestContext.CurrentContext.ResolveProjectPath(4));
@ -401,7 +397,7 @@ namespace MatterControl.Tests.MatterControl
await pinch.Rebuild();
root.Children.Add(pinch);
var rootAabb = root.GetAxisAlignedBoundingBox();
Assert.IsTrue(rootAabb.Equals(new AxisAlignedBoundingBox(new Vector3(1, -10, -10), new Vector3(21, 10, 10)), .001));
Assert.IsTrue(rootAabb.Equals(new AxisAlignedBoundingBox(new Vector3(.5, -10, -10), new Vector3(21, 10, 10)), .001));
}
}