Example #1
0
        public void CalculateInfillData(ConfigSettings config,
                                        int extruderIndex,
                                        int layerIndex,
                                        LayerIsland part,
                                        Polygons bottomFillLines,
                                        Polygons sparseFillPolygons   = null,
                                        Polygons solidFillPolygons    = null,
                                        Polygons firstTopFillPolygons = null,
                                        Polygons topFillPolygons      = null,
                                        Polygons bridgePolygons       = null,
                                        Polygons bridgeAreas          = null)
        {
            double alternatingInfillAngle = config.InfillStartingAngle;

            if ((layerIndex % 2) == 0)
            {
                alternatingInfillAngle += 90;
            }

            // generate infill for the bottom layer including bridging
            foreach (Polygons bottomFillIsland in part.BottomPaths.ProcessIntoSeparateIslands())
            {
                if (layerIndex > 0)
                {
                    if (this.Support != null)
                    {
                        double infillAngle = config.SupportInterfaceLayers > 0 ? config.InfillStartingAngle : config.InfillStartingAngle + 90;
                        Infill.GenerateLinePaths(bottomFillIsland, bottomFillLines, config.ExtrusionWidth_um, config.InfillExtendIntoPerimeter_um, infillAngle);
                    }
                    else
                    {
                        SliceLayer previousLayer = this.Extruders[extruderIndex].Layers[layerIndex - 1];

                        if (bridgePolygons != null &&
                            previousLayer.BridgeAngle(bottomFillIsland, config.GetNumberOfPerimeters() * config.ExtrusionWidth_um, out double bridgeAngle, bridgeAreas))
                        {
                            // TODO: Make this code handle very complex pathing between different sizes or layouts of support under the island to fill.
                            Infill.GenerateLinePaths(bottomFillIsland, bridgePolygons, config.ExtrusionWidth_um, config.InfillExtendIntoPerimeter_um, bridgeAngle);
                        }
                        else                         // we still need to extrude at bridging speed
                        {
                            Infill.GenerateLinePaths(bottomFillIsland, bottomFillLines, config.ExtrusionWidth_um, config.InfillExtendIntoPerimeter_um, alternatingInfillAngle, 0, config.BridgeSpeed);
                        }
                    }
                }
Example #2
0
        public void CreateRequiredInsets(ConfigSettings config, int outputLayerIndex, int extruderIndex)
        {
            if (extruderIndex < this.Extruders.Count)
            {
                var startIndex = Math.Max(0, outputLayerIndex - config.NumberOfBottomLayers - 1);
                // figure out how many layers we need to calculate
                var endIndex    = outputLayerIndex + config.NumberOfTopLayers + 1;
                var threadExtra = 10;
                endIndex = (endIndex / threadExtra) * threadExtra + threadExtra;

                // now bias more in to help multi threading
                // and clamp to the number there are to make sure we can do it
                endIndex = Math.Min(endIndex, this.Extruders[extruderIndex].Layers.Count);

                // free up the insets from the previous layer
                if (startIndex > config.NumberOfBottomLayers + 1)
                {
                    SliceLayer previousLayer = this.Extruders[extruderIndex].Layers[startIndex - 2];
                    previousLayer.FreeIslandMemory();
                }

                using (new QuickTimer2("GenerateInsets"))
                {
                    for (int layerIndex = startIndex; layerIndex < endIndex; layerIndex++)
                    {
                        SliceLayer layer = this.Extruders[extruderIndex].Layers[layerIndex];

                        if (layer.Islands.Count > 0 &&
                            !layer.CreatedInsets)
                        {
                            layer.CreatedInsets = true;
                            int insetCount = config.GetNumberOfPerimeters();
                            if (config.ContinuousSpiralOuterPerimeter && (int)layerIndex < config.NumberOfBottomLayers && layerIndex % 2 == 1)
                            {
                                // Add extra insets every 2 layers when spiralizing, this makes bottoms of cups watertight.
                                insetCount += 1;
                            }

                            if (layerIndex == 0)
                            {
                                layer.GenerateInsets(config, config.FirstLayerExtrusionWidth_um, config.FirstLayerExtrusionWidth_um, insetCount);
                            }
                            else
                            {
                                layer.GenerateInsets(config, config.ExtrusionWidth_um, config.OutsideExtrusionWidth_um, insetCount);
                            }
                        }
                    }
                }

                using (new QuickTimer2("GenerateTopAndBottoms"))
                {
                    // Only generate bottom and top layers and infill for the first X layers when spiralize is chosen.
                    if (!config.ContinuousSpiralOuterPerimeter || (int)outputLayerIndex < config.NumberOfBottomLayers)
                    {
                        if (outputLayerIndex == 0)
                        {
                            this.Extruders[extruderIndex].GenerateTopAndBottoms(config, outputLayerIndex, config.FirstLayerExtrusionWidth_um, config.FirstLayerExtrusionWidth_um, config.NumberOfBottomLayers, config.NumberOfTopLayers, config.InfillExtendIntoPerimeter_um);
                        }
                        else
                        {
                            this.Extruders[extruderIndex].GenerateTopAndBottoms(config, outputLayerIndex, config.ExtrusionWidth_um, config.OutsideExtrusionWidth_um, config.NumberOfBottomLayers, config.NumberOfTopLayers, config.InfillExtendIntoPerimeter_um);
                        }
                    }
                }
            }
        }