Improving TransformWrapper interface and usage

This commit is contained in:
LarsBrubaker 2019-01-01 16:00:50 -08:00
parent e7c7cd86ee
commit e713d9cdd6
6 changed files with 95 additions and 98 deletions

View file

@ -1047,28 +1047,6 @@ namespace MatterHackers.MatterControl
}); });
} }
public static IObject3D SelectionAsSingleClone(IObject3D selection)
{
IEnumerable<IObject3D> items = new[] { selection };
// If SelectionGroup, operate on Children instead
if (selection is SelectionGroupObject3D)
{
items = selection.Children;
var group = new GroupObject3D();
group.Children.Modify(children =>
{
children.AddRange(items.Select(o => o.Clone()));
});
return group;
}
return selection.Clone();
}
public ApplicationController() public ApplicationController()
{ {
this.Thumbnails = new ThumbnailsConfig(); this.Thumbnails = new ThumbnailsConfig();
@ -1139,14 +1117,10 @@ namespace MatterHackers.MatterControl
(sceneItem, scene) => (sceneItem, scene) =>
{ {
var selectedItem = scene.SelectedItem; var selectedItem = scene.SelectedItem;
var replaceItems = (selectedItem is SelectionGroupObject3D) ? selectedItem.Children.ToList() : new List<IObject3D> { selectedItem };
scene.SelectedItem = null; scene.SelectedItem = null;
var selectedClone = SelectionAsSingleClone(selectedItem); var scale = new TranslateObject3D();
var tranlate = TranslateObject3D.Create(selectedClone); scale.WrapItem(selectedItem, scene.UndoBuffer);
tranlate.MakeNameNonColliding(); scene.SelectedItem = scale;
scene.UndoBuffer.AddAndDo(new ReplaceCommand(replaceItems, new List<IObject3D> { tranlate }));
scene.SelectedItem = tranlate;
return Task.CompletedTask; return Task.CompletedTask;
}, },
@ -1159,19 +1133,45 @@ namespace MatterHackers.MatterControl
(sceneItem, scene) => (sceneItem, scene) =>
{ {
var selectedItem = scene.SelectedItem; var selectedItem = scene.SelectedItem;
var replaceItems = (selectedItem is SelectionGroupObject3D) ? selectedItem.Children.ToList() : new List<IObject3D> { selectedItem };
scene.SelectedItem = null; scene.SelectedItem = null;
var selectedClone = SelectionAsSingleClone(selectedItem); var scale = new RotateObject3D_2();
var rotate = new RotateObject3D_2(selectedClone); scale.WrapItem(selectedItem, scene.UndoBuffer);
rotate.MakeNameNonColliding(); scene.SelectedItem = scale;
scene.UndoBuffer.AddAndDo(new ReplaceCommand(replaceItems, new List<IObject3D> { rotate }));
scene.SelectedItem = rotate;
return Task.CompletedTask; return Task.CompletedTask;
}, },
iconCollector: (theme) => AggContext.StaticData.LoadIcon(Path.Combine("ViewTransformControls", "rotate.png"), 16, 16, theme.InvertIcons)); iconCollector: (theme) => AggContext.StaticData.LoadIcon(Path.Combine("ViewTransformControls", "rotate.png"), 16, 16, theme.InvertIcons));
this.Graph.RegisterOperation(
typeof(IObject3D),
typeof(ScaleObject3D),
"Scale".Localize(),
(sceneItem, scene) =>
{
var selectedItem = scene.SelectedItem;
scene.SelectedItem = null;
var scale = new ScaleObject3D();
scale.WrapItem(selectedItem, scene.UndoBuffer);
scene.SelectedItem = scale;
return Task.CompletedTask;
},
iconCollector: (theme) => AggContext.StaticData.LoadIcon("scale_32x32.png", 16, 16, theme.InvertIcons));
this.Graph.RegisterOperation(
typeof(IObject3D),
typeof(MirrorObject3D),
"Mirror".Localize(),
(sceneItem, scene) =>
{
var mirror = new MirrorObject3D();
mirror.WrapSelectedItemAndSelect(scene);
return Task.CompletedTask;
},
iconCollector: (theme) => AggContext.StaticData.LoadIcon("mirror_32x32.png", 16, 16, theme.InvertIcons));
this.Graph.RegisterOperation( this.Graph.RegisterOperation(
typeof(IObject3D), typeof(IObject3D),
typeof(ComponentObject3D), typeof(ComponentObject3D),
@ -1243,39 +1243,6 @@ namespace MatterHackers.MatterControl
}, },
iconCollector: (theme) => AggContext.StaticData.LoadIcon("scale_32x32.png", 16, 16, theme.InvertIcons)); iconCollector: (theme) => AggContext.StaticData.LoadIcon("scale_32x32.png", 16, 16, theme.InvertIcons));
this.Graph.RegisterOperation(
typeof(IObject3D),
typeof(ScaleObject3D),
"Scale".Localize(),
(sceneItem, scene) =>
{
var selectedItem = scene.SelectedItem;
var replaceItems = (selectedItem is SelectionGroupObject3D) ? selectedItem.Children.ToList() : new List<IObject3D> { selectedItem };
scene.SelectedItem = null;
var selectedClone = SelectionAsSingleClone(selectedItem);
var scale = new ScaleObject3D(selectedClone);
scale.MakeNameNonColliding();
scene.UndoBuffer.AddAndDo(new ReplaceCommand(replaceItems, new List<IObject3D> { scale }));
scene.SelectedItem = scale;
return Task.CompletedTask;
},
iconCollector: (theme) => AggContext.StaticData.LoadIcon("scale_32x32.png", 16, 16, theme.InvertIcons));
this.Graph.RegisterOperation(
typeof(IObject3D),
typeof(MirrorObject3D),
"Mirror".Localize(),
(sceneItem, scene) =>
{
var mirror = new MirrorObject3D();
mirror.WrapSelectedItemAndSelect(scene);
return Task.CompletedTask;
},
iconCollector: (theme) => AggContext.StaticData.LoadIcon("mirror_32x32.png", 16, 16, theme.InvertIcons));
this.Graph.RegisterOperation( this.Graph.RegisterOperation(
typeof(IPathObject), typeof(IPathObject),
typeof(LinearExtrudeObject3D), typeof(LinearExtrudeObject3D),

View file

@ -50,15 +50,9 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
public RotateObject3D_2(IObject3D itemToRotate, double xRadians = 0, double yRadians = 0, double zRadians = 0, string name = "") public RotateObject3D_2(IObject3D itemToRotate, double xRadians = 0, double yRadians = 0, double zRadians = 0, string name = "")
: this() : this()
{ {
var aabb = itemToRotate.GetAxisAlignedBoundingBox(); WrapItem(itemToRotate);
this.RotateAbout.Origin = aabb.Center; // TODO: set the rotation
var rotateItem = new Object3D();
this.Children.Add(rotateItem);
rotateItem.Children.Add(itemToRotate);
Rebuild(null);
} }
public RotateObject3D_2(IObject3D itemToRotate, Vector3 translation, string name = "") public RotateObject3D_2(IObject3D itemToRotate, Vector3 translation, string name = "")
@ -66,6 +60,14 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
{ {
} }
public override void WrapItem(IObject3D item, UndoBuffer undoBuffer = null)
{
base.WrapItem(item, undoBuffer);
var aabb = item.GetAxisAlignedBoundingBox();
this.RotateAbout.Origin = aabb.Center;
}
public override bool CanFlatten => true; public override bool CanFlatten => true;
#region // editable properties #region // editable properties

View file

@ -57,20 +57,17 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
public ScaleObject3D(IObject3D itemToScale, Vector3 scale) public ScaleObject3D(IObject3D itemToScale, Vector3 scale)
: this() : this()
{ {
var aabb = itemToScale.GetAxisAlignedBoundingBox(); WrapItem(itemToScale);
// move our inner content to a centered position }
public override void WrapItem(IObject3D item, UndoBuffer undoBuffer = null)
{
base.WrapItem(item, undoBuffer);
var aabb = item.GetAxisAlignedBoundingBox();
var newCenter = new Vector3(aabb.Center.X, aabb.Center.Y, aabb.minXYZ.Z); var newCenter = new Vector3(aabb.Center.X, aabb.Center.Y, aabb.minXYZ.Z);
itemToScale.Translate(-newCenter); item.Translate(-newCenter);
this.Translate(newCenter); this.Translate(newCenter);
// set some state
this.ScaleRatio = scale;
var scaleItem = new Object3D();
this.Children.Add(scaleItem);
scaleItem.Children.Add(itemToScale);
Rebuild(null);
} }
public override bool CanFlatten => true; public override bool CanFlatten => true;

View file

@ -28,11 +28,13 @@ either expressed or implied, of the FreeBSD Project.
*/ */
using System; using System;
using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Linq; using System.Linq;
using MatterHackers.Agg; using MatterHackers.Agg;
using MatterHackers.Agg.UI; using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D; using MatterHackers.DataConverters3D;
using MatterHackers.DataConverters3D.UndoCommands;
using MatterHackers.Localizations; using MatterHackers.Localizations;
using MatterHackers.MatterControl.PartPreviewWindow; using MatterHackers.MatterControl.PartPreviewWindow;
using MatterHackers.MeshVisualizer; using MatterHackers.MeshVisualizer;
@ -77,6 +79,42 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
Name = "Transform Wrapper".Localize(); Name = "Transform Wrapper".Localize();
} }
public virtual void WrapItem(IObject3D item, UndoBuffer undoBuffer = null)
{
var replaceItems = (item is SelectionGroupObject3D) ? item.Children.ToList() : new List<IObject3D> { item };
IObject3D itemClone;
// If SelectionGroup, operate on Children instead
if (item is SelectionGroupObject3D)
{
IEnumerable<IObject3D> items = item.Children;
itemClone = new GroupObject3D();
itemClone.Children.Modify(children =>
{
children.AddRange(items.Select(o => o.Clone()));
});
}
else
{
itemClone = item.Clone();
}
var firstChild = new Object3D();
this.Children.Add(firstChild);
firstChild.Children.Add(itemClone);
var replace = new ReplaceCommand(replaceItems, new List<IObject3D> { this });
if (undoBuffer != null)
{
undoBuffer.AddAndDo(replace);
}
else
{
replace.Do();
}
}
public override void Flatten(UndoBuffer undoBuffer) public override void Flatten(UndoBuffer undoBuffer)
{ {
using (RebuildLock()) using (RebuildLock())

View file

@ -50,14 +50,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
public TranslateObject3D(IObject3D itemToTranslate, Vector3 translation) public TranslateObject3D(IObject3D itemToTranslate, Vector3 translation)
: this() : this()
{ {
Translation = translation; WrapItem(itemToTranslate);
var aabb = itemToTranslate.GetAxisAlignedBoundingBox();
var translateItem = new Object3D();
this.Children.Add(translateItem);
translateItem.Children.Add(itemToTranslate);
Rebuild(null);
} }
public override bool CanFlatten => true; public override bool CanFlatten => true;

@ -1 +1 @@
Subproject commit d78ab52ec3d904a480f9f61881096dc7c7b5b830 Subproject commit dfdd6ede10f6f2c680b4b7b0f0c25c22b330e97f