Improving TransformWrapper interface and usage
This commit is contained in:
parent
e7c7cd86ee
commit
e713d9cdd6
6 changed files with 95 additions and 98 deletions
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue