diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index 6f261493d..417b6154b 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -385,7 +385,6 @@ namespace MatterHackers.MatterControl Icon = AggContext.StaticData.LoadIcon("subtract_and_replace.png").SetPreMultiply(), IsEnabled = (scene) => scene.SelectedItem is SelectionGroup, }, -#if DEBUG // keep this work in progress to the editor for now new SceneSelectionSeparator(), new SceneSelectionOperation() { @@ -398,7 +397,7 @@ namespace MatterHackers.MatterControl array.Rebuild(); } }, - Icon = AggContext.StaticData.LoadIcon("array.png").SetPreMultiply(), + Icon = AggContext.StaticData.LoadIcon("array_linear.png").SetPreMultiply(), IsEnabled = (scene) => scene.HasSelection && !(scene.SelectedItem is SelectionGroup), }, new SceneSelectionOperation() @@ -412,10 +411,9 @@ namespace MatterHackers.MatterControl array.Rebuild(); } }, - Icon = AggContext.StaticData.LoadIcon("array.png").SetPreMultiply(), + Icon = AggContext.StaticData.LoadIcon("array_radial.png").SetPreMultiply(), IsEnabled = (scene) => scene.HasSelection && !(scene.SelectedItem is SelectionGroup), }, - new SceneSelectionSeparator(), new SceneSelectionOperation() { TitleResolver = () => "Advanced Array".Localize(), @@ -427,9 +425,10 @@ namespace MatterHackers.MatterControl array.Rebuild(); } }, - Icon = AggContext.StaticData.LoadIcon("array.png").SetPreMultiply(), + Icon = AggContext.StaticData.LoadIcon("array_advanced.png").SetPreMultiply(), IsEnabled = (scene) => scene.HasSelection && !(scene.SelectedItem is SelectionGroup), }, +#if DEBUG // keep this work in progress to the editor for now new SceneSelectionSeparator(), new SceneSelectionOperation() { diff --git a/DesignTools/Operations/ArrayObject3D.cs b/DesignTools/Operations/ArrayObject3D.cs index 339d55795..124a954f3 100644 --- a/DesignTools/Operations/ArrayObject3D.cs +++ b/DesignTools/Operations/ArrayObject3D.cs @@ -83,7 +83,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations { public int Count { get; set; } = 3; - public DirectionAxis Axis { get; set; } = new DirectionAxis() { Origin = new Vector3(-30, 0, 0), Normal = Vector3.UnitZ }; + public DirectionAxis Axis { get; set; } = new DirectionAxis() { Origin = Vector3.NegativeInfinity, Normal = Vector3.UnitZ }; public double Angle { get; set; } = 360; [DisplayName("Keep Within Angle")] @@ -102,31 +102,36 @@ namespace MatterHackers.MatterControl.DesignTools.Operations public void Rebuild() { + if(Axis.Origin.X == double.NegativeInfinity) + { + // make it something reasonable (just to the left of the aabb of the object) + var aabb = this.GetAxisAlignedBoundingBox(); + Axis.Origin = new Vector3(aabb.minXYZ.X - aabb.XSize / 2, aabb.Center.Y, 0); + } this.Children.Modify(list => { - IObject3D lastChild = list.First(); - var partCenter = lastChild.GetAxisAlignedBoundingBox().Center; + IObject3D first = list.First(); list.Clear(); - list.Add(lastChild); + list.Add(first); var offset = Vector3.Zero; for (int i = 1; i < Count; i++) { - var angleRadians = MathHelper.DegreesToRadians(Angle); - var nextOffset = Axis.Origin; + var next = first.Clone(); - //nextOffset Rotate(angleRadians * i); - var next = lastChild.Clone(); - next.Matrix *= Matrix4X4.CreateTranslation(nextOffset.X, nextOffset.Y, 0); + var normal = Axis.Normal.GetNormal(); + var angleRadians = MathHelper.DegreesToRadians(Angle) / Count * i; + next.Rotate(Axis.Origin, normal, angleRadians); - if (RotatePart) + if (!RotatePart) { - next.ApplyAtBoundsCenter(Matrix4X4.CreateRotationZ(angleRadians)); + next.Rotate(next.GetAxisAlignedBoundingBox().Center, normal, -angleRadians); } - lastChild = next; + list.Add(next); } }); + this.Invalidate(); } } diff --git a/DesignTools/PublicPropertyEditor.cs b/DesignTools/PublicPropertyEditor.cs index 53f9edc76..b45093552 100644 --- a/DesignTools/PublicPropertyEditor.cs +++ b/DesignTools/PublicPropertyEditor.cs @@ -89,12 +89,13 @@ namespace MatterHackers.MatterControl.DesignTools public IEnumerable SupportedTypes() => new Type[] { typeof(IRebuildable) }; - private static FlowLayoutWidget CreateSettingsRow(string labelText) + private static FlowLayoutWidget CreateSettingsRow(string labelText, string toolTipText = null) { var rowContainer = new FlowLayoutWidget(FlowDirection.LeftToRight) { HAnchor = HAnchor.Stretch, - Padding = new BorderDouble(5) + Padding = new BorderDouble(5), + ToolTipText = toolTipText }; var label = new TextWidget(labelText + ":", pointSize: 11, textColor: ActiveTheme.Instance.PrimaryTextColor) @@ -115,7 +116,13 @@ namespace MatterHackers.MatterControl.DesignTools return nameAttribute?.DisplayName ?? prop.Name; } - private void ModifyObject(View3DWidget view3DWidget, FlowLayoutWidget tabContainer, ThemeConfig theme) + private string GetDescription(PropertyInfo prop) + { + var nameAttribute = prop.GetCustomAttributes(true).OfType().FirstOrDefault(); + return nameAttribute?.Description ?? null; + } + + private void ModifyObject(View3DWidget view3DWidget, FlowLayoutWidget editControlsContainer, ThemeConfig theme) { var rebuildable = item as IRebuildable; @@ -127,6 +134,7 @@ namespace MatterHackers.MatterControl.DesignTools { Value = p.GetGetMethod().Invoke(this.item, null), DisplayName = GetDisplayName(p), + Description = GetDescription(p), PropertyType = p.PropertyType, PropertyInfo = p }); @@ -148,7 +156,7 @@ namespace MatterHackers.MatterControl.DesignTools }; rowContainer.AddChild(field.Content); - tabContainer.AddChild(rowContainer); + editControlsContainer.AddChild(rowContainer); } else if (property.Value is Vector2 vector2) { @@ -164,7 +172,7 @@ namespace MatterHackers.MatterControl.DesignTools }; rowContainer.AddChild(field.Content); - tabContainer.AddChild(rowContainer); + editControlsContainer.AddChild(rowContainer); } else if (property.Value is Vector3 vector3) { @@ -180,23 +188,63 @@ namespace MatterHackers.MatterControl.DesignTools }; rowContainer.AddChild(field.Content); - tabContainer.AddChild(rowContainer); + editControlsContainer.AddChild(rowContainer); } else if (property.Value is DirectionVector directionVector) { - FlowLayoutWidget rowContainer = CreateSettingsRow(property.DisplayName.Localize()); - - var field = new Vector3Field(); - field.Initialize(0); - field.Vector3 = directionVector.Normal; - field.ValueChanged += (s, e) => + bool simpleEdit = true; + if (simpleEdit) { - property.PropertyInfo.GetSetMethod().Invoke(this.item, new Object[] { new DirectionVector() { Normal = field.Vector3 } }); - rebuildable?.Rebuild(); - }; + FlowLayoutWidget rowContainer = CreateSettingsRow(property.DisplayName.Localize()); - rowContainer.AddChild(field.Content); - tabContainer.AddChild(rowContainer); + var dropDownList = new DropDownList("Name".Localize(), theme.Colors.PrimaryTextColor, Direction.Down, pointSize: theme.DefaultFontSize); + + var orderedItems = new string[] { "Right", "Back", "Up" }; + + foreach (var orderItem in orderedItems) + { + MenuItem newItem = dropDownList.AddItem(orderItem); + + var localOredrItem = orderItem; + newItem.Selected += (sender, e) => + { + switch(dropDownList.SelectedValue) + { + case "Right": + property.PropertyInfo.GetSetMethod().Invoke(this.item, new Object[] { new DirectionVector() { Normal = Vector3.UnitX } }); + break; + case "Back": + property.PropertyInfo.GetSetMethod().Invoke(this.item, new Object[] { new DirectionVector() { Normal = Vector3.UnitY } }); + break; + case "Up": + property.PropertyInfo.GetSetMethod().Invoke(this.item, new Object[] { new DirectionVector() { Normal = Vector3.UnitZ } }); + break; + } + + rebuildable?.Rebuild(); + }; + } + + dropDownList.SelectedLabel = "Right"; + rowContainer.AddChild(dropDownList); + editControlsContainer.AddChild(rowContainer); + } + else // edit the vector + { + FlowLayoutWidget rowContainer = CreateSettingsRow(property.DisplayName.Localize()); + + var field = new Vector3Field(); + field.Initialize(0); + field.Vector3 = directionVector.Normal; + field.ValueChanged += (s, e) => + { + property.PropertyInfo.GetSetMethod().Invoke(this.item, new Object[] { new DirectionVector() { Normal = field.Vector3 } }); + rebuildable?.Rebuild(); + }; + + rowContainer.AddChild(field.Content); + editControlsContainer.AddChild(rowContainer); + } } else if (property.Value is DirectionAxis directionAxis) { @@ -218,7 +266,7 @@ namespace MatterHackers.MatterControl.DesignTools }; originRowContainer.AddChild(originField.Content); - tabContainer.AddChild(originRowContainer); + editControlsContainer.AddChild(originRowContainer); // add in the direction FlowLayoutWidget directionRowContainer = CreateSettingsRow(property.DisplayName.Localize()); @@ -230,7 +278,18 @@ namespace MatterHackers.MatterControl.DesignTools }; directionRowContainer.AddChild(normalField.Content); - tabContainer.AddChild(directionRowContainer); + editControlsContainer.AddChild(directionRowContainer); + + // update tihs when changed + EventHandler updateData = (object s, EventArgs e) => + { + originField.Vector3 = ((DirectionAxis)property.PropertyInfo.GetGetMethod().Invoke(this.item, null)).Origin; + }; + item.Invalidated += updateData; + editControlsContainer.Closed += (s, e) => + { + item.Invalidated -= updateData; + }; } // create a int editor else if (property.Value is int intValue) @@ -247,12 +306,12 @@ namespace MatterHackers.MatterControl.DesignTools }; rowContainer.AddChild(field.Content); - tabContainer.AddChild(rowContainer); + editControlsContainer.AddChild(rowContainer); } // create a bool editor else if (property.Value is bool boolValue) { - FlowLayoutWidget rowContainer = CreateSettingsRow(property.DisplayName.Localize()); + FlowLayoutWidget rowContainer = CreateSettingsRow(property.DisplayName.Localize(), property.Description.Localize()); var field = new ToggleboxField(ApplicationController.Instance.Theme.Colors.PrimaryTextColor); field.Initialize(0); @@ -264,7 +323,7 @@ namespace MatterHackers.MatterControl.DesignTools }; rowContainer.AddChild(field.Content); - tabContainer.AddChild(rowContainer); + editControlsContainer.AddChild(rowContainer); } // create a string editor else if (property.Value is string stringValue) @@ -281,7 +340,7 @@ namespace MatterHackers.MatterControl.DesignTools rebuildable?.Rebuild(); }; rowContainer.AddChild(textEditWidget); - tabContainer.AddChild(rowContainer); + editControlsContainer.AddChild(rowContainer); } // create a enum editor else if (property.PropertyType.IsEnum) @@ -319,7 +378,7 @@ namespace MatterHackers.MatterControl.DesignTools dropDownList.SelectedLabel = property.Value.ToString().Replace('_', ' '); rowContainer.AddChild(dropDownList); - tabContainer.AddChild(rowContainer); + editControlsContainer.AddChild(rowContainer); } } @@ -330,7 +389,7 @@ namespace MatterHackers.MatterControl.DesignTools { rebuildable?.Rebuild(); }; - tabContainer.AddChild(updateButton); + editControlsContainer.AddChild(updateButton); } } } \ No newline at end of file diff --git a/PartPreviewWindow/PlatingHelper.cs b/PartPreviewWindow/PlatingHelper.cs index a81f42f15..01705c93e 100644 --- a/PartPreviewWindow/PlatingHelper.cs +++ b/PartPreviewWindow/PlatingHelper.cs @@ -273,7 +273,5 @@ namespace MatterHackers.MatterControl return true; } - - } } diff --git a/StaticData/Icons/array_advanced.png b/StaticData/Icons/array_advanced.png new file mode 100644 index 000000000..56e4656b9 Binary files /dev/null and b/StaticData/Icons/array_advanced.png differ diff --git a/StaticData/Icons/array.png b/StaticData/Icons/array_linear.png similarity index 100% rename from StaticData/Icons/array.png rename to StaticData/Icons/array_linear.png diff --git a/StaticData/Icons/array_radial.png b/StaticData/Icons/array_radial.png new file mode 100644 index 000000000..73b177f80 Binary files /dev/null and b/StaticData/Icons/array_radial.png differ diff --git a/Submodules/MatterSlice b/Submodules/MatterSlice index a2b16945b..ae67b42d3 160000 --- a/Submodules/MatterSlice +++ b/Submodules/MatterSlice @@ -1 +1 @@ -Subproject commit a2b16945b16273fa243153926b9121ec20f06911 +Subproject commit ae67b42d370677299e944d410aeb0eb01a6d248f diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 475340af7..3badb0ba9 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 475340af7062eb5ee3130d077230fdca434bd50e +Subproject commit 3badb0ba9d782ea89a0bb3a9f4f31daf54b8e4e7