Design tools
This commit is contained in:
parent
69a77368b5
commit
907609b587
86 changed files with 4971 additions and 4664 deletions
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue