integrating offline changes

This commit is contained in:
Lars Brubaker 2023-03-10 17:15:55 -08:00
parent 121623bad3
commit 3f8eeda65b
125 changed files with 5442 additions and 5434 deletions

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2019, Lars Brubaker, John Lewin
Copyright (c) 2023, Lars Brubaker, John Lewin
All rights reserved.
Redistribution and use in source and binary forms, with or without
@ -27,101 +27,119 @@ of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
using System;
using System.Threading.Tasks;
using MatterHackers.Agg.UI;
using MatterHackers.Agg.VertexSource;
using MatterHackers.DataConverters3D;
using MatterHackers.Localizations;
using MatterHackers.MatterControl.DesignTools.Operations;
using MatterHackers.MatterControl.PartPreviewWindow;
using MatterHackers.PolygonMesh.Processors;
using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl.DesignTools
namespace MatterHackers.MatterControl.DesignTools.Primitives
{
public class BoxPathObject3D : PrimitiveObject3D, IObject3DControlsProvider, IEditorDraw
{
public BoxPathObject3D()
{
Name = "Box".Localize();
Color = Operations.Object3DExtensions.PrimitiveColors["Cube"];
}
public class BoxPathObject3D : PathObject3D, IObject3DControlsProvider, IEditorDraw, IPropertyGridModifier, IStaticThumbnail
{
public BoxPathObject3D()
{
Name = "Box".Localize();
Color = MatterHackers.MatterControl.DesignTools.Operations.Object3DExtensions.PrimitiveColors["Cube"];
}
public override string ThumbnailName => "Box";
public static double MinEdgeSize = .001;
public void DrawEditor(Object3DControlsLayer layer, DrawEventArgs e)
{
this.DrawPath();
}
public string ThumbnailName => "Box";
public AxisAlignedBoundingBox GetEditorWorldspaceAABB(Object3DControlsLayer layer)
{
return this.GetWorldspaceAabbOfDrawPath();
}
/// <summary>
/// This is the actual serialized with that can use expressions
/// </summary>
[MaxDecimalPlaces(2)]
[Slider(1, 400, Easing.EaseType.Quadratic, useSnappingGrid: true)]
public DoubleOrExpression Width { get; set; } = 20;
/// <summary>
/// This is the actual serialized with that can use expressions
/// </summary>
[MaxDecimalPlaces(2)]
[Slider(1, 400, Easing.EaseType.Quadratic, snapDistance: 1)]
public DoubleOrExpression Width { get; set; } = 20;
[MaxDecimalPlaces(2)]
[Slider(1, 400, Easing.EaseType.Quadratic, useSnappingGrid: true)]
public DoubleOrExpression Depth { get; set; } = 20;
[MaxDecimalPlaces(2)]
[Slider(1, 400, Easing.EaseType.Quadratic, snapDistance: 1)]
public DoubleOrExpression Depth { get; set; } = 20;
public bool Round { get; set; }
public static async Task<BoxPathObject3D> Create()
{
var item = new BoxPathObject3D();
await item.Rebuild();
return item;
}
[Slider(0, 20, Easing.EaseType.Quadratic, snapDistance: .1)]
public DoubleOrExpression Radius { get; set; } = 3;
public void AddObject3DControls(Object3DControlsLayer object3DControlsLayer)
{
object3DControlsLayer.AddControls(ControlTypes.MoveInZ);
object3DControlsLayer.AddWidthDepthControls(this, Width, Depth, null);
[Slider(1, 30, Easing.EaseType.Quadratic, snapDistance: 1)]
public IntOrExpression RoundSegments { get; set; } = 9;
object3DControlsLayer.AddControls(ControlTypes.MoveInZ);
object3DControlsLayer.AddControls(ControlTypes.RotateXYZ);
}
public static async Task<BoxPathObject3D> Create()
{
var item = new BoxPathObject3D();
await item.Rebuild();
return item;
}
public override async void OnInvalidate(InvalidateArgs invalidateArgs)
{
if ((invalidateArgs.InvalidateType.HasFlag(InvalidateType.Properties) && invalidateArgs.Source == this))
{
await Rebuild();
}
else if (SheetObject3D.NeedsRebuild(this, invalidateArgs))
{
await Rebuild();
}
else
{
base.OnInvalidate(invalidateArgs);
}
}
public void AddObject3DControls(Object3DControlsLayer object3DControlsLayer)
{
object3DControlsLayer.AddControls(ControlTypes.MoveInZ);
object3DControlsLayer.AddWidthDepthControls(this, Width, Depth, null);
public override Task Rebuild()
{
this.DebugDepth("Rebuild");
object3DControlsLayer.AddControls(ControlTypes.MoveInZ);
object3DControlsLayer.AddControls(ControlTypes.RotateXYZ);
}
using (RebuildLock())
{
using (new CenterAndHeightMaintainer(this))
{
bool valuesChanged = false;
var width = Width.ClampIfNotCalculated(this, .01, 10000, ref valuesChanged);
var depth = Depth.ClampIfNotCalculated(this, .01, 10000, ref valuesChanged);
VertexStorage = new VertexStorage(new RoundedRect(-width / 2, -depth / 2, width / 2, depth / 2, 0));
public override async void OnInvalidate(InvalidateArgs invalidateArgs)
{
if (invalidateArgs.InvalidateType.HasFlag(InvalidateType.Properties) && invalidateArgs.Source == this)
{
await Rebuild();
}
else if (Expressions.NeedRebuild(this, invalidateArgs))
{
await Rebuild();
}
else
{
base.OnInvalidate(invalidateArgs);
}
}
this.Mesh = VertexStorage.Extrude(Constants.PathPolygonsHeight);
}
}
public override Task Rebuild()
{
this.DebugDepth("Rebuild");
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Path));
return Task.CompletedTask;
}
}
using (RebuildLock())
{
using (new CenterAndHeightMaintainer(this))
{
bool valuesChanged = false;
var width = Width.ClampIfNotCalculated(this, MinEdgeSize, 1000000, ref valuesChanged);
var depth = Depth.ClampIfNotCalculated(this, MinEdgeSize, 1000000, ref valuesChanged);
var roundSegments = RoundSegments.ClampIfNotCalculated(this, 1, 90, ref valuesChanged);
var roundRadius = Radius.ClampIfNotCalculated(this, 0, Math.Min(width, depth) / 2, ref valuesChanged);
if (Round)
{
var roundRect = new RoundedRect(-width / 2, -depth / 2, width / 2, depth / 2, roundRadius);
roundRect.NumSegments = roundSegments;
VertexStorage = new VertexStorage(roundRect);
}
else
{
VertexStorage = new VertexStorage(new RoundedRect(-width / 2, -depth / 2, width / 2, depth / 2, 0));
}
Mesh = VertexStorage.Extrude(Constants.PathPolygonsHeight);
}
}
this.CancelAllParentBuilding();
Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Path));
return Task.CompletedTask;
}
public void UpdateControls(PublicPropertyChange change)
{
change.SetRowVisible(nameof(RoundSegments), () => Round);
change.SetRowVisible(nameof(Radius), () => Round);
}
}
}