Improving path coordinates

This commit is contained in:
Lars Brubaker 2023-12-01 16:11:09 -08:00
parent 07b16a2047
commit cf608735bc
10 changed files with 85 additions and 75 deletions

View file

@ -100,7 +100,7 @@ namespace MatterHackers.MatterControl
// this is for when base is working with generic meshes
//IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && !(sceneContext.Scene.SelectedItem.IsPathObject()),
// this is for when only IPathObjects are working correctly
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem.DescendantsAndSelf().Where(i => i is IPathObject3D).Any(),
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem.DescendantsAndSelf().Where(i => i is IPathProvider).Any(),
};
}
@ -391,7 +391,7 @@ namespace MatterHackers.MatterControl
},
Icon = (theme) => StaticData.Instance.LoadIcon("inflate_path.png", 16, 16).GrayToColor(theme.TextColor).SetPreMultiply(),
HelpTextGetter = () => "A path must be selected".Localize().Stars(),
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem is IPathObject3D,
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem is IPathProvider,
};
}
@ -405,15 +405,13 @@ namespace MatterHackers.MatterControl
{
var scene = sceneContext.Scene;
var sceneItem = scene.SelectedItem;
var pathObject = sceneItem as IPathObject3D;
var pathObject = sceneItem as IPathProvider;
if (pathObject != null)
{
var extrude = new LinearExtrudeObject3D();
var itemClone = sceneItem.Clone();
extrude.Children.Add(itemClone);
extrude.Matrix = itemClone.Matrix;
itemClone.Matrix = Matrix4X4.Identity;
scene.SelectedItem = null;
scene.UndoBuffer.AddAndDo(new ReplaceCommand(new[] { sceneItem }, new[] { extrude }));
@ -424,7 +422,7 @@ namespace MatterHackers.MatterControl
},
Icon = (theme) => StaticData.Instance.LoadIcon("linear_extrude.png", 16, 16).GrayToColor(theme.TextColor).SetPreMultiply(),
HelpTextGetter = () => "A path must be selected".Localize().Stars(),
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem is IPathObject3D,
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem is IPathProvider,
};
}
@ -438,7 +436,7 @@ namespace MatterHackers.MatterControl
{
var scene = sceneContext.Scene;
var sceneItem = scene.SelectedItem;
var pathObject = sceneItem as IPathObject3D;
var pathObject = sceneItem as IPathProvider;
if (pathObject != null)
{
var revolve = new RevolveObject3D();
@ -457,7 +455,7 @@ namespace MatterHackers.MatterControl
},
Icon = (theme) => StaticData.Instance.LoadIcon("revolve.png", 16, 16).GrayToColor(theme.TextColor).SetPreMultiply(),
HelpTextGetter = () => "A path must be selected".Localize().Stars(),
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem is IPathObject3D,
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem is IPathProvider,
};
}
@ -549,7 +547,7 @@ namespace MatterHackers.MatterControl
},
Icon = (theme) => StaticData.Instance.LoadIcon("outline.png", 16, 16).GrayToColor(theme.TextColor).SetPreMultiply(),
HelpTextGetter = () => "A path must be selected".Localize().Stars(),
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem is IPathObject3D,
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem is IPathProvider,
};
}
@ -609,7 +607,7 @@ namespace MatterHackers.MatterControl
},
Icon = (theme) => StaticData.Instance.LoadIcon("smooth_path.png", 16, 16).GrayToColor(theme.TextColor).SetPreMultiply(),
HelpTextGetter = () => "A path must be selected".Localize().Stars(),
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem is IPathObject3D,
IsEnabled = (sceneContext) => sceneContext.Scene.SelectedItem != null && sceneContext.Scene.SelectedItem is IPathProvider,
};
}
@ -702,7 +700,7 @@ namespace MatterHackers.MatterControl
// all are path items
if (includePaths
&& selectedItem.VisibleMeshes().Count() > 1
&& selectedItem.VisibleMeshes().All(i => i is IPathObject3D))
&& selectedItem.VisibleMeshes().All(i => i is IPathProvider))
{
return true;
}
@ -888,7 +886,7 @@ namespace MatterHackers.MatterControl
TitleGetter = () => "Combine".Localize(),
Action = (sceneContext) =>
{
if (sceneContext.Scene.SelectedItem.VisibleMeshes().All(o => o is IPathObject3D))
if (sceneContext.Scene.SelectedItem.VisibleMeshes().All(o => o is IPathProvider))
{
new MergePathObject3D("Combine".Localize(), ClipperLib.ClipType.ctUnion).WrapSelectedItemAndSelect(sceneContext.Scene);
}
@ -1055,7 +1053,7 @@ namespace MatterHackers.MatterControl
TitleGetter = () => "Intersect".Localize(),
Action = (sceneContext) =>
{
if (sceneContext.Scene.SelectedItem.VisibleMeshes().All(o => o is IPathObject3D))
if (sceneContext.Scene.SelectedItem.VisibleMeshes().All(o => o is IPathProvider))
{
new MergePathObject3D("Intersect".Localize(), ClipperLib.ClipType.ctIntersection).WrapSelectedItemAndSelect(sceneContext.Scene);
}
@ -1079,7 +1077,7 @@ namespace MatterHackers.MatterControl
return false;
}
if (item is IPathObject3D pathObject)
if (item is IPathProvider pathObject)
{
return pathObject.MeshIsSolidObject;
}
@ -1339,7 +1337,7 @@ namespace MatterHackers.MatterControl
TitleGetter = () => "Subtract".Localize(),
Action = (sceneContext) =>
{
if (sceneContext.Scene.SelectedItem.VisibleMeshes().All(o => o is IPathObject3D))
if (sceneContext.Scene.SelectedItem.VisibleMeshes().All(o => o is IPathProvider))
{
new SubtractPathObject3D().WrapSelectedItemAndSelect(sceneContext.Scene);
}

View file

@ -44,7 +44,7 @@ using Polygons = System.Collections.Generic.List<System.Collections.Generic.List
namespace MatterHackers.MatterControl.DesignTools
{
public class FindSliceObject3D : OperationSourceContainerObject3D, IPropertyGridModifier, IPathObject3D
public class FindSliceObject3D : OperationSourceContainerObject3D, IPropertyGridModifier, IPathProvider
{
public FindSliceObject3D()
{
@ -87,7 +87,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
var newPathObject = new CustomPathObject3D();
var vertexStorage = new VertexStorage(this.GetVertexSource());
var vertexStorage = new VertexStorage(this.GetRawPath());
newPathObject.PathForEditing.SvgDString = vertexStorage.SvgDString;
newPathObject.Rebuild();
@ -198,7 +198,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
}
public IVertexSource GetVertexSource()
public IVertexSource GetRawPath()
{
return VertexStorage;
}

View file

@ -184,14 +184,14 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
public static void FlattenToPathObject(this IObject3D item, UndoBuffer undoBuffer)
{
var pathItem = item as IPathObject3D;
if (pathItem?.GetVertexSource() != null)
var pathItem = item as IPathProvider;
if (pathItem?.GetRawPath() != null)
{
using (item.RebuildLock())
{
var newPathObject = new CustomPathObject3D();
var vertexStorage = new VertexStorage(pathItem.GetVertexSource());
var vertexStorage = new VertexStorage(pathItem.GetRawPath());
newPathObject.PathForEditing.SvgDString = vertexStorage.SvgDString;
newPathObject.CopyProperties(item, Object3DPropertyFlags.All);
@ -216,15 +216,15 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
public static void DrawPath(this IObject3D item)
{
var pathItem = item as IPathObject3D;
if (pathItem?.GetVertexSource() != null)
var pathItem = item as IPathProvider;
if (pathItem?.GetRawPath() != null)
{
bool first = true;
var lastPosition = Vector2.Zero;
var maxXYZ = item.GetAxisAlignedBoundingBox().MaxXYZ;
maxXYZ = maxXYZ.Transform(item.Matrix.Inverted);
var firstMove = Vector2.Zero;
foreach (var vertex in pathItem.GetVertexSource().Vertices())
foreach (var vertex in pathItem.GetRawPath().Vertices())
{
var position = vertex.Position;
if (first)
@ -273,15 +273,15 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
{
AxisAlignedBoundingBox box = AxisAlignedBoundingBox.Empty();
var pathItem = item as IPathObject3D;
var pathItem = item as IPathProvider;
if (pathItem?.GetVertexSource() != null)
if (pathItem?.GetRawPath() != null)
{
var lastPosition = Vector2.Zero;
var maxXYZ = item.GetAxisAlignedBoundingBox().MaxXYZ;
maxXYZ = maxXYZ.Transform(item.Matrix.Inverted);
foreach (var vertex in pathItem.GetVertexSource().Vertices())
foreach (var vertex in pathItem.GetRawPath().Vertices())
{
var position = vertex.Position;

View file

@ -41,7 +41,7 @@ using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl.DesignTools.Primitives
{
public class CustomPathObject3D : Object3D, IEditorDraw, IStaticThumbnail, IPathObject3D, IPrimaryOperationsSpecifier
public class CustomPathObject3D : Object3D, IEditorDraw, IStaticThumbnail, IPathProvider, IPrimaryOperationsSpecifier
{
public static double MinEdgeSize = .001;
@ -85,7 +85,7 @@ namespace MatterHackers.MatterControl.DesignTools.Primitives
return PathObject3DAbstract.GetOperations(this.GetType());
}
public virtual IVertexSource GetVertexSource()
public virtual IVertexSource GetRawPath()
{
return PathForEditing;
}

View file

@ -43,7 +43,7 @@ using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl.DesignTools.Operations
{
public class MergePathObject3D : OperationSourceContainerObject3D, IEditorDraw, IObject3DControlsProvider, IPrimaryOperationsSpecifier, IPathObject3D
public class MergePathObject3D : OperationSourceContainerObject3D, IEditorDraw, IObject3DControlsProvider, IPrimaryOperationsSpecifier, IPathProvider
{
private ClipperLib.ClipType clipType;
private string operationName;
@ -101,7 +101,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
}
// set the mesh to show the path
this.Mesh = this.GetVertexSource().Extrude(Constants.PathPolygonsHeight);
this.Mesh = this.GetRawPath().Extrude(Constants.PathPolygonsHeight);
UiThread.RunOnIdle(() =>
{
@ -118,7 +118,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
SourceContainer.Visible = true;
RemoveAllButSource();
var participants = SourceContainer.VisiblePaths();
var participants = SourceContainer.VisiblePathProviders();
var first = participants.First();
var firstObject3D = first as Object3D;
if (participants.Count() < 2)
@ -135,7 +135,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
return;
}
var resultsVertexSource = first.GetVertexSource().Transform(firstObject3D.WorldMatrix(this));
var resultsVertexSource = first.GetTransformedPath(this);
var totalOperations = participants.Count() - 1;
double amountPerOperation = 1.0 / totalOperations;
@ -143,15 +143,15 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
foreach (var item in participants)
{
IVertexSource itemPath = item.GetTransformedPath(this);
if (item != first
&& item.GetVertexSource() != null)
&& itemPath != null)
{
var itemObject3D = item as Object3D;
var itemVertexSource = item.GetVertexSource().Transform(itemObject3D.WorldMatrix(this));
this.CopyProperties(firstObject3D, Object3DPropertyFlags.Color);
resultsVertexSource = resultsVertexSource.MergePaths(itemVertexSource, clipType);
resultsVertexSource = resultsVertexSource.MergePaths(itemPath, clipType);
ratioCompleted += amountPerOperation;
reporter?.Invoke(ratioCompleted, null);
@ -168,7 +168,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
return PathObject3DAbstract.GetOperations(this.GetType());
}
public IVertexSource GetVertexSource()
public IVertexSource GetRawPath()
{
return VertexStorage;
}

View file

@ -40,21 +40,21 @@ using System.Collections.Generic;
namespace MatterControlLib.DesignTools.Operations.Path
{
public abstract class PathObject3DAbstract : Object3D, IEditorDraw, IPrimaryOperationsSpecifier, IPathObject3D
public abstract class PathObject3DAbstract : Object3D, IEditorDraw, IPrimaryOperationsSpecifier, IPathProvider
{
public void DrawEditor(Object3DControlsLayer layer, DrawEventArgs e)
public virtual void DrawEditor(Object3DControlsLayer layer, DrawEventArgs e)
{
this.DrawPath();
}
public AxisAlignedBoundingBox GetEditorWorldspaceAABB(Object3DControlsLayer layer)
public virtual AxisAlignedBoundingBox GetEditorWorldspaceAABB(Object3DControlsLayer layer)
{
return this.GetWorldspaceAabbOfDrawPath();
}
public VertexStorage VertexStorage { get; set; } = new VertexStorage();
public virtual IVertexSource GetVertexSource()
public virtual IVertexSource GetRawPath()
{
return VertexStorage;
}
@ -92,7 +92,7 @@ namespace MatterControlLib.DesignTools.Operations.Path
}
}
public IEnumerable<SceneOperation> GetOperations()
public virtual IEnumerable<SceneOperation> GetOperations()
{
return GetOperations(GetType());
}

View file

@ -139,7 +139,7 @@ namespace MatterHackers.MatterControl.DesignTools
private double cacheHeight;
public override IVertexSource GetVertexSource()
public override IVertexSource GetRawPath()
{
var paths = this.CombinedVisibleChildrenPaths();
if (paths == null)
@ -231,7 +231,7 @@ namespace MatterHackers.MatterControl.DesignTools
});
// and create the base
var vertexSource = GetVertexSource();
var vertexSource = GetRawPath();
// Convert VertexSource into expected Polygons
Polygons polygonShape = (vertexSource == null) ? null : vertexSource.CreatePolygons();
@ -302,7 +302,7 @@ namespace MatterHackers.MatterControl.DesignTools
{
var outsidePolygons = new Polygons();
// remove all holes from the polygons so we only center the major outlines
var polygons = GetVertexSource().CreatePolygons();
var polygons = GetRawPath().CreatePolygons();
polygons = polygons.GetCorrectedWinding();
foreach (var polygon in polygons)
@ -430,7 +430,7 @@ namespace MatterHackers.MatterControl.DesignTools
changeSet.Add(nameof(ExtrusionHeight), BaseType != BaseTypes.None);
changeSet.Add(nameof(Style), BaseType != BaseTypes.Circle);
var vertexSource = GetVertexSource();
var vertexSource = GetRawPath();
var meshSource = this.Descendants<IObject3D>().Where((i) => i.Mesh != null);
changeSet.Add(nameof(CalculationHeight), vertexSource == null && meshSource.Where(m => m.Mesh != null).Any());
@ -456,9 +456,9 @@ namespace MatterHackers.MatterControl.DesignTools
public void DrawEditor(Object3DControlsLayer layer, DrawEventArgs e)
{
if (GetVertexSource() != null)
if (GetRawPath() != null)
{
layer.World.RenderPathOutline(CalcTransform(), GetVertexSource(), Agg.Color.Red, 5);
layer.World.RenderPathOutline(CalcTransform(), GetRawPath(), Agg.Color.Red, 5);
// turn the lighting back on
GL.Enable(EnableCap.Lighting);
@ -467,10 +467,10 @@ namespace MatterHackers.MatterControl.DesignTools
public AxisAlignedBoundingBox GetEditorWorldspaceAABB(Object3DControlsLayer layer)
{
if (GetVertexSource() != null)
if (GetRawPath() != null)
{
// TODO: Untested.
return layer.World.GetWorldspaceAabbOfRenderPathOutline(CalcTransform(), GetVertexSource(), 5);
return layer.World.GetWorldspaceAabbOfRenderPathOutline(CalcTransform(), GetRawPath(), 5);
}
return AxisAlignedBoundingBox.Empty();
}

View file

@ -132,12 +132,12 @@ namespace MatterHackers.MatterControl.DesignTools
public override bool MeshIsSolidObject => Output == OutputDimensions.Output3D;
public override IVertexSource GetVertexSource()
{
public override IVertexSource GetRawPath()
{
if (Output == OutputDimensions.Output2D)
{
return this.CombinedVisibleChildrenPaths();
}
return VertexStorage;
}
return null;
}
@ -241,6 +241,7 @@ namespace MatterHackers.MatterControl.DesignTools
};
list.Add(lineObject);
var letterPaths = new List<IVertexSource>();
foreach (var letter in textToWrite.ToCharArray())
{
var style = new StyledTypeFace(ApplicationController.GetTypeFace(this.Font), pointSize);
@ -285,10 +286,9 @@ namespace MatterHackers.MatterControl.DesignTools
};
if (Output == OutputDimensions.Output2D)
{
var pathObject = this as PathObject3DAbstract;
pathObject.VertexStorage = new VertexStorage(
new VertexSourceApplyTransform(
new VertexStorage(scaledLetterPrinter), Affine.NewTranslation(offset.X, offset.Y)));
var letterPath = new VertexSourceApplyTransform(new VertexStorage(scaledLetterPrinter),
Affine.NewTranslation(offset.X, offset.Y));
letterPaths.Add(letterPath);
}
offset.X += letterPrinter.GetSize(letter.ToString()).X * mmPerPoint;
break;
@ -302,6 +302,11 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
if (Output == OutputDimensions.Output2D)
{
this.VertexStorage = new VertexStorage(new CombinePaths(letterPaths));
}
for (var i = list.Count - 1; i >= 0; i--)
{
if (list[i].Children.Count == 0)
@ -370,17 +375,25 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
public void DrawEditor(Object3DControlsLayer object3DControlLayer, DrawEventArgs e)
public override void DrawEditor(Object3DControlsLayer object3DControlLayer, DrawEventArgs e)
{
this.DrawPath();
if (Output == OutputDimensions.Output2D)
{
this.DrawPath();
}
}
public AxisAlignedBoundingBox GetEditorWorldspaceAABB(Object3DControlsLayer layer)
public override AxisAlignedBoundingBox GetEditorWorldspaceAABB(Object3DControlsLayer layer)
{
return this.GetWorldspaceAabbOfDrawPath();
}
if (Output == OutputDimensions.Output2D)
{
return this.GetWorldspaceAabbOfDrawPath();
}
public IEnumerable<SceneOperation> GetOperations()
return AxisAlignedBoundingBox.Empty();
}
public override IEnumerable<SceneOperation> GetOperations()
{
if (Output == OutputDimensions.Output2D)
{

View file

@ -46,7 +46,7 @@ using System.Threading.Tasks;
namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
{
public class SubtractPathObject3D : OperationSourceContainerObject3D, IEditorDraw, IObject3DControlsProvider, IPrimaryOperationsSpecifier, IPathObject3D
public class SubtractPathObject3D : OperationSourceContainerObject3D, IEditorDraw, IObject3DControlsProvider, IPrimaryOperationsSpecifier, IPathProvider
{
public SubtractPathObject3D()
{
@ -123,9 +123,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
}
// set the mesh to show the path
if (this.GetVertexSource() != null)
if (this.GetRawPath() != null)
{
var extrudeMesh = this.GetVertexSource().Extrude(Constants.PathPolygonsHeight);
var extrudeMesh = this.GetRawPath().Extrude(Constants.PathPolygonsHeight);
if (extrudeMesh.Vertices.Count() > 5)
{
this.Mesh = extrudeMesh;
@ -175,14 +175,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
var removeVisibleItems = parentOfSubtractTargets.Children
.Where((i) => SelectedChildren
.Contains(i.ID))
.SelectMany(c => c.VisiblePaths())
.SelectMany(c => c.VisiblePathProviders())
.ToList();
var keepItems = parentOfSubtractTargets.Children
.Where((i) => !SelectedChildren
.Contains(i.ID));
var keepVisibleItems = keepItems.SelectMany(c => c.VisiblePaths()).ToList();
var keepVisibleItems = keepItems.SelectMany(c => c.VisiblePathProviders()).ToList();
if (removeVisibleItems.Any()
&& keepVisibleItems.Any())
@ -195,12 +195,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
foreach (var keep in keepVisibleItems)
{
var keepObject3D = keep as Object3D;
var resultsVertexSource = keep.GetVertexSource().Transform(keepObject3D.Matrix);
var resultsVertexSource = keep.GetTransformedPath(this);
foreach (var remove in removeVisibleItems)
{
var removeObject3D = remove as Object3D;
resultsVertexSource = resultsVertexSource.MergePaths(remove.GetVertexSource().Transform(removeObject3D.Matrix), ClipperLib.ClipType.ctDifference);
resultsVertexSource = resultsVertexSource.MergePaths(remove.GetTransformedPath(this), ClipperLib.ClipType.ctDifference);
// report our progress
ratioCompleted += amountPerOperation;
@ -216,7 +215,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
}
else
{
this.GetVertexSource().MergePaths(resultsVertexSource, ClipperLib.ClipType.ctUnion);
this.GetRawPath().MergePaths(resultsVertexSource, ClipperLib.ClipType.ctUnion);
}
}
@ -261,7 +260,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
return PathObject3DAbstract.GetOperations(this.GetType());
}
public IVertexSource GetVertexSource()
public IVertexSource GetRawPath()
{
return VertexStorage;
}

@ -1 +1 @@
Subproject commit 65ed18943d895a552136fff3e82bd16809a0b8f5
Subproject commit d69357cc53c5e83c4722353de3c2030ef84e2475