internal static void PostRender(bool saveData = true) { if (saveData) { if (PrintJob.SelectedPrinter is AtumV20Printer || PrintJob.SelectedPrinter is AtumV15Printer) { PrintJob.SelectedPrinter = new AtumV15Printer() { CorrectionFactorX = PrintJob.SelectedPrinter.CorrectionFactorX, CorrectionFactorY = PrintJob.SelectedPrinter.CorrectionFactorY, Description = PrintJob.SelectedPrinter.Description, DisplayName = PrintJob.SelectedPrinter.DisplayName, PrinterXYResolution = PrintJob.SelectedPrinter.PrinterXYResolution, Projectors = PrintJob.SelectedPrinter.Projectors, Properties = PrintJob.SelectedPrinter.Properties, TrapeziumCorrectionInputA = PrintJob.SelectedPrinter.TrapeziumCorrectionInputA, TrapeziumCorrectionInputB = PrintJob.SelectedPrinter.TrapeziumCorrectionInputB, TrapeziumCorrectionInputC = PrintJob.SelectedPrinter.TrapeziumCorrectionInputC, TrapeziumCorrectionInputD = PrintJob.SelectedPrinter.TrapeziumCorrectionInputD, TrapeziumCorrectionInputE = PrintJob.SelectedPrinter.TrapeziumCorrectionInputE, TrapeziumCorrectionInputF = PrintJob.SelectedPrinter.TrapeziumCorrectionInputF, TrapeziumCorrectionSideA = PrintJob.SelectedPrinter.TrapeziumCorrectionSideA, TrapeziumCorrectionSideB = PrintJob.SelectedPrinter.TrapeziumCorrectionSideB, TrapeziumCorrectionSideC = PrintJob.SelectedPrinter.TrapeziumCorrectionSideC, TrapeziumCorrectionSideD = PrintJob.SelectedPrinter.TrapeziumCorrectionSideD, TrapeziumCorrectionSideE = PrintJob.SelectedPrinter.TrapeziumCorrectionSideE, TrapeziumCorrectionSideF = PrintJob.SelectedPrinter.TrapeziumCorrectionSideF, }; PrintJob.SelectedPrinter.CreateProperties(); PrintJob.SelectedPrinter.CreateProjectors(); PrintJob.Option_TurnProjectorOff = PrintJob.Option_TurnProjectorOn = true; } else if (PrintJob.SelectedPrinter is AtumDLPStation5 || PrintJobManager.SelectedPrinter is LoctiteV10) { PrintJob.SelectedPrinter = new AtumV15Printer() { CorrectionFactorX = PrintJob.SelectedPrinter.CorrectionFactorX, CorrectionFactorY = PrintJob.SelectedPrinter.CorrectionFactorY, Description = PrintJob.SelectedPrinter.Description, DisplayName = PrintJob.SelectedPrinter.DisplayName, PrinterXYResolution = PrintJob.SelectedPrinter.PrinterXYResolution, Projectors = PrintJob.SelectedPrinter.Projectors, Properties = PrintJob.SelectedPrinter.Properties, TrapeziumCorrectionInputA = PrintJob.SelectedPrinter.TrapeziumCorrectionInputA, TrapeziumCorrectionInputB = PrintJob.SelectedPrinter.TrapeziumCorrectionInputB, TrapeziumCorrectionInputC = PrintJob.SelectedPrinter.TrapeziumCorrectionInputC, TrapeziumCorrectionInputD = PrintJob.SelectedPrinter.TrapeziumCorrectionInputD, TrapeziumCorrectionInputE = PrintJob.SelectedPrinter.TrapeziumCorrectionInputE, TrapeziumCorrectionInputF = PrintJob.SelectedPrinter.TrapeziumCorrectionInputF, TrapeziumCorrectionSideA = PrintJob.SelectedPrinter.TrapeziumCorrectionSideA, TrapeziumCorrectionSideB = PrintJob.SelectedPrinter.TrapeziumCorrectionSideB, TrapeziumCorrectionSideC = PrintJob.SelectedPrinter.TrapeziumCorrectionSideC, TrapeziumCorrectionSideD = PrintJob.SelectedPrinter.TrapeziumCorrectionSideD, TrapeziumCorrectionSideE = PrintJob.SelectedPrinter.TrapeziumCorrectionSideE, TrapeziumCorrectionSideF = PrintJob.SelectedPrinter.TrapeziumCorrectionSideF, ProjectorResolutionX = 1920, ProjectorResolutionY = 1080, }; PrintJob.Option_TurnProjectorOff = PrintJob.Option_TurnProjectorOn = false; } //var printjobFolderName = Helpers.StringHelper.RemoveDiacritics(PrintJob.Name); //var slicePath = Path.Combine(PrintJob.SlicesPath, printjobFolderName); if (!PrintJob.SlicesPath.Contains(".zip")) { PrintJob.SlicesPath = Path.Combine(PrintJob.SlicesPath, "slices.zip"); } Debug.WriteLine("Total slice time: " + _stopWatch.ElapsedMilliseconds); // Debug.WriteLine(DateTime.Now); MemoryHelpers.ForceGCCleanup(); //save printjob xml file var pathPrinterJobXml = Path.Combine((new FileInfo(PrintJob.SlicesPath).Directory.FullName), "printjob.apj"); var serializer = new System.Xml.Serialization.XmlSerializer(typeof(DAL.Print.PrintJob)); using (var streamWriter = new StreamWriter(pathPrinterJobXml, false)) { serializer.Serialize(streamWriter, PrintJob); } } try { _zipStream.Flush(); _zipStream.Close(); _zipStream.Dispose(); _tempFileStream.Close(); } catch { } RemoveModelClones(); //copy org vectors to undopoints for (var object3dIndex = ObjectView.Objects3D.Count - 1; object3dIndex > 0; object3dIndex--) { var object3d = ObjectView.Objects3D[object3dIndex]; if (!(object3d is GroundPane)) { var stlModel = object3d as STLModel3D; stlModel.RevertTriangleSnapshotPoints(); stlModel.ClearSliceIndexes(); if (stlModel.SupportBasementStructure != null) { stlModel.SupportBasementStructure.MoveTranslation = new Vector3Class(); } stlModel.UpdateBoundries(); stlModel.UpdateBinding(); } } PrintJob.PostRenderCompleted = true; _cancelRendering = false; }
private static int RenderSliceThread(object sliceInfoObject) { var sliceInfo = (Slices.Slice)sliceInfoObject; try { if (PerformanceSettingsManager.Settings.PrintJobGenerationMaxMemoryLimitEnabled) { while ((Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024) > Managers.PerformanceSettingsManager.Settings.PrintJobGenerationMaxMemory) { Thread.Sleep(1000); GC.Collect(); GC.Collect(); LoggingManager.WriteToLog("Render Engine", "Memory management", "Waiting for free memory"); } } var modelsToSliceCount = 0; foreach (var object3d in ObjectView.Objects3D) { var supportZPolys = new List <List <SlicePolyLine3D> >(); if (object3d is STLModel3D && (!(object3d is GroundPane))) { var stlModel = (STLModel3D)object3d; modelsToSliceCount++; } } Slices.Slice slice = new Slices.Slice(sliceInfo.SliceIndex, new List <SlicePolyLine3D>(), new List <List <SlicePolyLine3D> >(), new List <SlicePolyLine3D>(), sliceInfo.SliceHeight); slice.ModelPolyTrees = new List <PolyTree> [modelsToSliceCount]; slice.ModelBleedingPolyTrees = new List <PolyTree> [modelsToSliceCount]; slice.SupportPolyTrees = new List <PolyTree> [modelsToSliceCount]; var currentModelIndex = 0; foreach (var object3d in ObjectView.Objects3D) { var supportZPolys = new List <List <SlicePolyLine3D> >(); if (object3d is STLModel3D && (!(object3d is GroundPane))) { var stlModel = (STLModel3D)object3d; if (!_cancelRendering) { foreach (var supportCone in stlModel.TotalObjectSupportCones) { if (supportCone != null) { if (supportCone is SupportConeV2) { } else { if (!supportCone.Hidden) { supportZPolys.Add(GetZIntersectionsSupport(supportCone, sliceInfo.SliceHeight)); } } } } if (sliceInfo.SliceHeight <= (UserProfileManager.UserProfile.SupportEngine_Basement_Thickness * PrintJob.Material.ShrinkFactor) && stlModel.SupportBasement && stlModel.SupportBasementStructure != null) { foreach (var triangle in stlModel.SupportBasementStructure.Triangles[0]) { triangle.CalcMinMaxZ(); } var supportBasementZPolys = GetZPolys(stlModel.SupportBasementStructure, stlModel.SupportBasementStructure.SliceIndexes, sliceInfo.SliceHeight); supportZPolys.Add(GetZIntersections(supportBasementZPolys, sliceInfo.SliceHeight)); } } List <SlicePolyLine3D> modelZPolys = null; List <SlicePolyLine3D> modelBleedingZPolys = null; if (!_cancelRendering) { modelZPolys = GetZIntersections(GetZPolys(stlModel, stlModel.SliceIndexes, sliceInfo.SliceHeight), sliceInfo.SliceHeight); //post processing plugins foreach (var plugin in PluginManager.LoadedPlugins) { if (plugin.HasPostSliceMethod && (plugin.PostSliceActionType & Plugins.PluginTypes.PostSliceActionType.Bleeding) == Plugins.PluginTypes.PostSliceActionType.Bleeding && sliceInfo.SliceHeight > PrintJob.Material.BleedingOffset && PrintJob.Material.BleedingOffset > 0f ) { modelBleedingZPolys = plugin.PostSlice(stlModel, sliceInfo.SliceHeight + (float)PrintJob.Material.BleedingOffset, Plugins.PluginTypes.PostSliceActionType.Bleeding); } } } if (!_cancelRendering) { using (var modelWithSupportSlice = new Slices.Slice(sliceInfo.SliceIndex, modelZPolys, supportZPolys, modelBleedingZPolys, sliceInfo.SliceHeight)) { modelWithSupportSlice.ConvertModelIntersectionsToPolyTrees(sliceInfo.SliceHeight, RenderEngine.PrintJob.SelectedPrinter, PrintJobManager.CurrentPrintJobSettings.Material, PrintJobManager.CurrentPrintJobSettings.Material.SupportProfiles.First(), null, null); modelWithSupportSlice.ConvertSupportIntersectionsToPolyTrees(sliceInfo.SliceHeight, RenderEngine.PrintJob.SelectedPrinter); slice.ModelPolyTrees[currentModelIndex] = new List <PolyTree>(); slice.ModelPolyTrees[currentModelIndex].AddRange(modelWithSupportSlice.ModelPolyTrees[0]); slice.SupportPolyTrees[currentModelIndex] = new List <PolyTree>(); slice.SupportPolyTrees[currentModelIndex].AddRange(modelWithSupportSlice.SupportPolyTrees[0]); foreach (var supportCone in stlModel.TotalObjectSupportCones) { if (supportCone is SupportConeV2) { var supportConeV2 = (SupportConeV2)supportCone; if (supportConeV2.SliceContours.ContainsKey(sliceInfo.SliceHeight)) { slice.SupportPolyTrees[currentModelIndex].Add(supportConeV2.SliceContours[sliceInfo.SliceHeight]); foreach (var interlinkConnectionIndex in supportConeV2.InterlinkConnections) { if (interlinkConnectionIndex.Value != null) { foreach (var interlinkConnection in interlinkConnectionIndex.Value) { if (interlinkConnection != null && interlinkConnection.SliceContours != null && interlinkConnection.SliceContours.ContainsKey(sliceInfo.SliceHeight)) { slice.SupportPolyTrees[currentModelIndex].Add(interlinkConnection.SliceContours[sliceInfo.SliceHeight]); } } } } } } } if (modelBleedingZPolys != null && modelBleedingZPolys.Count > 0) { if (sliceInfo.SliceHeight < 1f) { } modelWithSupportSlice.ConvertModelBleedingIntersectionsToPolyTrees(sliceInfo.SliceHeight, RenderEngine.PrintJob.SelectedPrinter); slice.ModelBleedingPolyTrees[currentModelIndex] = new List <PolyTree>(); slice.ModelBleedingPolyTrees[currentModelIndex].AddRange(modelWithSupportSlice.ModelBleedingPolyTrees[0]); } } } currentModelIndex++; } } //output to printjob if (!_cancelRendering) { var validSlice = RenderSliceToPNG(slice); if (PrintJob.Material.XYSmoothingEnabled) { var xySmoothingSlice = RenderSliceToXYSmootingPNG(slice); } if (sliceInfo.SliceIndex % 50 == 0) { MemoryHelpers.ForceGCCleanup(); } lock (_totalProcessedSlicesLock) { TotalProcessedSlices++; } if (TotalProcessedSlices == TotalAmountSlices) { #region Calculate Volume var layerThickness = RenderEngine.PrintJob.Material.LT2; var currentPixelVolume = Math.Pow(RenderEngine.PrintJob.SelectedPrinter.PrinterXYResolutionAsInt / 1000f, 2); RenderEngine.PrintJob.TotalPrintVolume = (float)Math.Ceiling((decimal)(currentPixelVolume * (layerThickness / 1000f) * RenderEngine.TotatAmountofActivePixel)); #endregion Debug.WriteLine("Total slices with white pixels: " + (TotalAmountSlices - _emptyPNGs.Count).ToString()); PostRender(); RenderToPrintjobCompleted?.Invoke(PrintJob, null); } } } catch (Exception exc) { } return(sliceInfo.SliceIndex); }