Design tools

This commit is contained in:
John Lewin 2017-03-15 16:17:06 -07:00
parent 69a77368b5
commit 907609b587
86 changed files with 4971 additions and 4664 deletions

View file

@ -1,6 +1,7 @@
using MatterHackers.Agg;
using MatterHackers.Agg.PlatformAbstract;
using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D;
using MatterHackers.GCodeVisualizer;
using MatterHackers.Localizations;
using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling;
@ -128,8 +129,7 @@ namespace MatterHackers.MatterControl
bool showExportGCodeButton = ActiveSliceSettings.Instance.PrinterSelected || partIsGCode;
if (showExportGCodeButton)
{
string exportGCodeTextFull = string.Format("{0} G-Code", "Export as".Localize());
Button exportGCode = textImageButtonFactory.Generate(exportGCodeTextFull);
Button exportGCode = textImageButtonFactory.Generate(string.Format("{0} G-Code", "Export as".Localize()));
exportGCode.Name = "Export as GCode Button";
exportGCode.HAnchor = HAnchor.ParentLeft;
exportGCode.Cursor = Cursors.Hand;
@ -146,7 +146,6 @@ namespace MatterHackers.MatterControl
if (plugin.EnabledForCurrentPart(printItemWrapper))
{
//Create export button for each Plugin found
string exportButtonText = plugin.GetButtonText().Localize();
Button exportButton = textImageButtonFactory.Generate(exportButtonText);
@ -413,10 +412,12 @@ namespace MatterHackers.MatterControl
{
UiThread.RunOnIdle(() =>
{
SaveFileDialogParams saveParams = new SaveFileDialogParams("Save as AMF|*.amf", initialDirectory: documentsPath);
saveParams.Title = "MatterControl: Export File";
saveParams.ActionButtonLabel = "Export";
saveParams.FileName = printItemWrapper.Name;
SaveFileDialogParams saveParams = new SaveFileDialogParams("Save as AMF|*.amf", initialDirectory: documentsPath)
{
Title = "MatterControl: Export File",
ActionButtonLabel = "Export",
FileName = printItemWrapper.Name
};
Close();
FileDialog.SaveFileDialog(saveParams, onExportAmfFileSelected);
@ -449,13 +450,8 @@ namespace MatterHackers.MatterControl
}
else
{
List<MeshGroup> meshGroups = MeshFileIo.Load(printItemWrapper.FileLocation);
if (!MeshFileIo.Save(meshGroups, filePathToSave))
{
UiThread.RunOnIdle (() => {
StyledMessageBox.ShowMessageBox(null, "STL to AMF conversion failed", "Couldn't save file".Localize());
});
}
IObject3D item = Object3D.Load(printItemWrapper.FileLocation);
MeshFileIo.Save(item, filePathToSave);
}
ShowFileIfRequested(filePathToSave);
}
@ -509,8 +505,9 @@ namespace MatterHackers.MatterControl
}
else
{
List<MeshGroup> meshGroups = MeshFileIo.Load(printItemWrapper.FileLocation);
if (!MeshFileIo.Save(meshGroups, filePathToSave))
IObject3D loadedItem = Object3D.Load(printItemWrapper.FileLocation);
if (!MeshFileIo.Save(new List<MeshGroup> { loadedItem.Flatten() }, filePathToSave))
{
UiThread.RunOnIdle (() => {
StyledMessageBox.ShowMessageBox(null, "AMF to STL conversion failed", "Couldn't save file".Localize());

View file

@ -46,6 +46,7 @@ using System.IO;
using System.Threading.Tasks;
using MatterHackers.Localizations;
using MatterHackers.Agg.ImageProcessing;
using MatterHackers.DataConverters3D;
namespace MatterHackers.MatterControl
{
@ -70,6 +71,9 @@ namespace MatterHackers.MatterControl
private static bool processingThumbnail = false;
private ImageBuffer buildingThumbnailImage = new Agg.Image.ImageBuffer();
// TODO: temporarily work around exception when trying to gen thumbnails for new file type
private bool supportsThumbnails = true;
private RGBA_Bytes normalBackgroundColor = ActiveTheme.Instance.PrimaryAccentColor;
private ImageBuffer noThumbnailImage = new Agg.Image.ImageBuffer();
@ -174,11 +178,17 @@ namespace MatterHackers.MatterControl
}
printItemWrapper = value;
supportsThumbnails = false;
thumbNailHasBeenCreated = false;
if (ItemWrapper != null)
{
PrintItemWrapper.FileHasChanged.RegisterEvent(item_FileHasChanged, ref unregisterEvents);
supportsThumbnails = !string.IsNullOrEmpty(printItemWrapper.FileLocation) &&
File.Exists(printItemWrapper.FileLocation) &&
Path.GetExtension(printItemWrapper.FileLocation).ToLower() != ".mcp";
}
}
}
@ -224,11 +234,17 @@ namespace MatterHackers.MatterControl
}
}
}
public override void OnDraw(Graphics2D graphics2D)
{
if(ItemWrapper == null)
{
return;
}
//Trigger thumbnail generation if neeeded
if (!thumbNailHasBeenCreated && !processingThumbnail)
string stlHashCode = this.ItemWrapper.FileHashCode.ToString();
if (!thumbNailHasBeenCreated && !processingThumbnail && supportsThumbnails)
{
if (SetImageFast())
{
@ -419,7 +435,7 @@ namespace MatterHackers.MatterControl
return;
}
List<MeshGroup> loadedMeshGroups = MeshFileIo.Load(this.ItemWrapper.FileLocation);
IObject3D loadedItem = Object3D.Load(this.ItemWrapper.FileLocation);
RenderType renderType = GetRenderType(this.ItemWrapper.FileLocation);
@ -427,34 +443,28 @@ namespace MatterHackers.MatterControl
{
case RenderType.RAY_TRACE:
{
ThumbnailTracer tracer = new ThumbnailTracer(loadedMeshGroups, BigRenderSize.x, BigRenderSize.y);
ThumbnailTracer tracer = new ThumbnailTracer(loadedItem, BigRenderSize.x, BigRenderSize.y);
tracer.DoTrace();
bigRender = tracer.destImage;
bigRender = (tracer.destImage != null) ? tracer.destImage : new ImageBuffer(this.noThumbnailImage);
}
break;
case RenderType.PERSPECTIVE:
{
ThumbnailTracer tracer = new ThumbnailTracer(loadedMeshGroups, BigRenderSize.x, BigRenderSize.y);
ThumbnailTracer tracer = new ThumbnailTracer(loadedItem, BigRenderSize.x, BigRenderSize.y);
this.thumbnailImage = new ImageBuffer(this.buildingThumbnailImage);
this.thumbnailImage.NewGraphics2D().Clear(new RGBA_Bytes(255, 255, 255, 0));
bigRender = new ImageBuffer(BigRenderSize.x, BigRenderSize.y);
foreach (MeshGroup meshGroup in loadedMeshGroups)
foreach (IObject3D item in loadedItem.Children)
{
double minZ = double.MaxValue;
double maxZ = double.MinValue;
foreach (Mesh loadedMesh in meshGroup.Meshes)
{
tracer.GetMinMaxZ(loadedMesh, ref minZ, ref maxZ);
}
foreach (Mesh loadedMesh in meshGroup.Meshes)
{
tracer.DrawTo(bigRender.NewGraphics2D(), loadedMesh, RGBA_Bytes.White, minZ, maxZ);
}
tracer.GetMinMaxZ(item.Mesh, ref minZ, ref maxZ);
tracer.DrawTo(bigRender.NewGraphics2D(), item.Mesh, RGBA_Bytes.White, minZ, maxZ);
}
if (bigRender == null)
@ -469,7 +479,7 @@ namespace MatterHackers.MatterControl
this.thumbnailImage = new ImageBuffer(this.buildingThumbnailImage);
this.thumbnailImage.NewGraphics2D().Clear(new RGBA_Bytes(255, 255, 255, 0));
bigRender = BuildImageFromMeshGroups(loadedMeshGroups, stlHashCode, BigRenderSize);
bigRender = BuildImageFromMeshGroups(loadedItem.ToMeshGroupList(), stlHashCode, BigRenderSize);
if (bigRender == null)
{
bigRender = new ImageBuffer(this.noThumbnailImage);

View file

@ -44,6 +44,7 @@ namespace MatterHackers.RayTracer
using MatterHackers.Agg.RasterizerScanline;
using MatterHackers.Agg.VertexSource;
using MatterHackers.RayTracer.Light;
using System.Linq;
public class ThumbnailTracer
{
@ -55,6 +56,8 @@ namespace MatterHackers.RayTracer
private List<MeshGroup> loadedMeshGroups;
private bool hasOneOrMoreMesh;
private RayTracer rayTracer = new RayTracer()
{
//AntiAliasing = AntiAliasing.None,
@ -69,21 +72,32 @@ namespace MatterHackers.RayTracer
private Scene scene;
private Point2D size;
public TrackballTumbleWidget trackballTumbleWidget;
public ThumbnailTracer(List<MeshGroup> meshGroups, int width, int height)
public ThumbnailTracer(IObject3D item, int width, int height)
{
size = new Point2D(width, height);
trackballTumbleWidget = new TrackballTumbleWidget();
trackballTumbleWidget.DoOpenGlDrawing = false;
trackballTumbleWidget.LocalBounds = new RectangleDouble(0, 0, width, height);
loadedMeshGroups = meshGroups;
SetRenderPosition(loadedMeshGroups);
loadedMeshGroups = item.ToMeshGroupList();
trackballTumbleWidget.AnchorCenter();
hasOneOrMoreMesh = loadedMeshGroups.SelectMany(mg => mg.Meshes).Where(mesh => mesh != null).Any();
if (hasOneOrMoreMesh)
{
SetRenderPosition(loadedMeshGroups);
trackballTumbleWidget.AnchorCenter();
}
}
public void DoTrace()
{
if (!hasOneOrMoreMesh)
{
destImage = null;
return;
}
CreateScene();
RectangleInt rect = new RectangleInt(0, 0, size.x, size.y);
if (destImage == null || destImage.Width != rect.Width || destImage.Height != rect.Height)
@ -100,7 +114,7 @@ namespace MatterHackers.RayTracer
public void SetRenderPosition(List<MeshGroup> loadedMeshGroups)
{
trackballTumbleWidget.TrackBallController.Reset();
trackballTumbleWidget.TrackBallController.Scale = .03;
trackballTumbleWidget.TrackBallController.Scale = .03;
trackballTumbleWidget.TrackBallController.Rotate(Quaternion.FromEulerAngles(new Vector3(0, 0, MathHelper.Tau / 16)));
trackballTumbleWidget.TrackBallController.Rotate(Quaternion.FromEulerAngles(new Vector3(-MathHelper.Tau * .19, 0, 0)));
@ -436,7 +450,7 @@ namespace MatterHackers.RayTracer
public Ray GetRay(double screenX, double screenY)
{
return trackballTumbleWidget.GetRayFromScreen(new Vector2(screenX, screenY));
return trackballTumbleWidget.GetRayForLocalBounds(new Vector2(screenX, screenY));
}
}
}