diff --git a/MatterControlLib/ApplicationView/SceneOperations.cs b/MatterControlLib/ApplicationView/SceneOperations.cs index 830fb6408..51f76359e 100644 --- a/MatterControlLib/ApplicationView/SceneOperations.cs +++ b/MatterControlLib/ApplicationView/SceneOperations.cs @@ -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); } diff --git a/MatterControlLib/DesignTools/Operations/FindSliceObject3D.cs b/MatterControlLib/DesignTools/Operations/FindSliceObject3D.cs index a574c7724..b49783bb5 100644 --- a/MatterControlLib/DesignTools/Operations/FindSliceObject3D.cs +++ b/MatterControlLib/DesignTools/Operations/FindSliceObject3D.cs @@ -44,7 +44,7 @@ using Polygons = System.Collections.Generic.List { @@ -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; } diff --git a/MatterControlLib/DesignTools/Operations/Path/PathObject3DAbstract.cs b/MatterControlLib/DesignTools/Operations/Path/PathObject3DAbstract.cs index 4f0e1f36d..43e4afe89 100644 --- a/MatterControlLib/DesignTools/Operations/Path/PathObject3DAbstract.cs +++ b/MatterControlLib/DesignTools/Operations/Path/PathObject3DAbstract.cs @@ -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 GetOperations() + public virtual IEnumerable GetOperations() { return GetOperations(GetType()); } diff --git a/MatterControlLib/DesignTools/Primitives/BaseObject3D.cs b/MatterControlLib/DesignTools/Primitives/BaseObject3D.cs index 31c7c8399..4ca34c295 100644 --- a/MatterControlLib/DesignTools/Primitives/BaseObject3D.cs +++ b/MatterControlLib/DesignTools/Primitives/BaseObject3D.cs @@ -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().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(); } diff --git a/MatterControlLib/DesignTools/Primitives/TextObject3D.cs b/MatterControlLib/DesignTools/Primitives/TextObject3D.cs index 354add8b1..394dd6dac 100644 --- a/MatterControlLib/DesignTools/Primitives/TextObject3D.cs +++ b/MatterControlLib/DesignTools/Primitives/TextObject3D.cs @@ -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(); 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 GetOperations() + return AxisAlignedBoundingBox.Empty(); + } + + public override IEnumerable GetOperations() { if (Output == OutputDimensions.Output2D) { diff --git a/MatterControlLib/PartPreviewWindow/View3D/Actions/SubtractPathObject3D.cs b/MatterControlLib/PartPreviewWindow/View3D/Actions/SubtractPathObject3D.cs index f677ac71b..137fb2c0d 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/Actions/SubtractPathObject3D.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/Actions/SubtractPathObject3D.cs @@ -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; } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 65ed18943..d69357cc5 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 65ed18943d895a552136fff3e82bd16809a0b8f5 +Subproject commit d69357cc53c5e83c4722353de3c2030ef84e2475