Пример #1
0
        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;
        }
Пример #2
0
        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);
        }