Пример #1
0
    public static Dictionary <IntVector2, PieceInfo> SetupConnections(SlicingInfo sliceInfo)
    {
        var rows       = sliceInfo.rows;
        var columns    = sliceInfo.columns;
        var pieceInfos = new Dictionary <IntVector2, PieceInfo>();

        for (int col = 0; col < columns; ++col)
        {
            for (int row = 0; row < rows; ++row)
            {
                pieceInfos.Add(new IntVector2(col, row), new PieceInfo(col, row));
            }
        }

        for (int col = 0; col < columns; ++col)
        {
            for (int row = 0; row < rows; ++row)
            {
                if (col + 1 < columns)
                {
                    SetupConnectionToRight(col, row, pieceInfos);
                }

                if (row + 1 < rows)
                {
                    SetupConnectionToTop(col, row, pieceInfos);
                }
            }
        }

        return(pieceInfos);
    }
Пример #2
0
 public void RunSlice(string file)
 {
     if (procConvert != null)
     {
         MessageBox.Show("Last slice job still running. Slicing of new job is canceled.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
         return;
     }
     procConvert = new Process();
     try
     {
         SlicingInfo.Start("Skeinforge");
         SlicingInfo.SetAction("Slicing STL file ...");
         slicefile = file;
         procConvert.EnableRaisingEvents = true;
         procConvert.Exited                          += new EventHandler(ConversionExited);
         procConvert.StartInfo.FileName               = Main.IsMono ? textPython.Text : wrapQuotes(textPython.Text);
         procConvert.StartInfo.Arguments              = wrapQuotes(textSkeinforgeCraft.Text) + " " + wrapQuotes(file);
         procConvert.StartInfo.UseShellExecute        = false;
         procConvert.StartInfo.RedirectStandardOutput = true;
         procConvert.OutputDataReceived              += new DataReceivedEventHandler(OutputDataHandler);
         procConvert.StartInfo.RedirectStandardError  = true;
         procConvert.ErrorDataReceived               += new DataReceivedEventHandler(OutputDataHandler);
         procConvert.Start();
         // Start the asynchronous read of the standard output stream.
         procConvert.BeginOutputReadLine();
         procConvert.BeginErrorReadLine();
         //Main.main.tab.SelectedTab = Main.main.tabPrint;
     }
     catch (Exception e)
     {
         Main.conn.log(e.ToString(), false, 2);
     }
 }
Пример #3
0
    private void InitPlayFieldAndContainers(SlicingInfo slicingInfo, Texture2D originalTexture)
    {
        ServiceLocator.InitAllServices();

        puzzleContainer.Init(slicingInfo, originalTexture, _bgIntensity);
        pool.Init(slicingInfo);
        playFieldMover.Init();
    }
Пример #4
0
    public void Init(SlicingInfo sliceInfo, Texture2D imageToSlice, float bgIntensity)
    {
        Cleanup();

        var imgWidth  = imageToSlice.width;
        var imgHeight = imageToSlice.height;

        helperBackgroundImg.texture = imageToSlice;
        helperBackgroundImg.color   = new Color(1f, 1f, 1f, bgIntensity);

        var relativeWidth  = 1f / (float)sliceInfo.columns;
        var relativeHeight = 1f / (float)sliceInfo.rows;

        var myRect = GetComponent <RectTransform>().rect;

        ScaleToFitSourceImage(imgWidth, imgHeight, myRect);

        myRect = GetComponent <RectTransform>().rect;

        var actualWidth  = myRect.width / sliceInfo.columns;
        var actualHeight = myRect.height / sliceInfo.rows;

        for (int i = 0; i < sliceInfo.columns; ++i)
        {
            for (int j = 0; j < sliceInfo.rows; ++j)
            {
                var pieceAnchor = UnityEngine.Object.Instantiate <RectTransform>(pieceAnchorPrototype, parent: this.transform);

                var anchorPosX = (relativeWidth / 2f) + (i * relativeWidth);
                var anchorPosY = (relativeHeight / 2f) + (j * relativeHeight);
                var anchor     = new Vector2(anchorPosX, anchorPosY);

                pieceAnchor.anchorMin = anchor;
                pieceAnchor.anchorMax = anchor;

                pieceAnchor.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, actualWidth);
                pieceAnchor.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, actualHeight);

                _pieceAnchors.Add(new IntVector2(j, i), pieceAnchor);
            }
        }

        var anchorDifference = _pieceAnchors[new IntVector2(1, 1)].transform.position - _pieceAnchors[new IntVector2(0, 0)].transform.position;

        BoardContext.Instance.SetPieceDimensions(new Vector2(anchorDifference.x, anchorDifference.y));
    }
Пример #5
0
    public void Init(SlicingInfo sliceInfo)
    {
        Cleanup();

        var pieceCount = sliceInfo.rows * sliceInfo.columns;

        anchors = new Transform[pieceCount];

        poolAnchor.gameObject.SetActive(true);

        for (int i = 0; i < pieceCount; ++i)
        {
            anchors[i] = Instantiate <Transform>(poolAnchor, scrollRectContent);
        }

        Shuffle(anchors);

        poolAnchor.gameObject.SetActive(false);
    }
Пример #6
0
        public void RunSlice(string file, string profile)
        {
            if (procConvert != null)
            {
                MessageBox.Show(Trans.T("L_SKEIN_STILL_RUNNING") /*"Last slice job still running. Slicing of new job is canceled."*/, Trans.T("L_ERROR"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            profileConfig   = new SkeinConfig(BasicConfiguration.basicConf.SkeinforgeProfileDir + Path.DirectorySeparatorChar + "skeinforge_profile.csv");
            extrusionConfig = new SkeinConfig(BasicConfiguration.basicConf.SkeinforgeProfileDir + Path.DirectorySeparatorChar + "extrusion.csv");
            exportConfig    = new SkeinConfig(BasicConfiguration.basicConf.SkeinforgeProfileDir + Path.DirectorySeparatorChar + "extrusion" +
                                              Path.DirectorySeparatorChar + profile + Path.DirectorySeparatorChar + "export.csv");
            multiplyConfig = new SkeinConfig(BasicConfiguration.basicConf.SkeinforgeProfileDir + Path.DirectorySeparatorChar + "extrusion" +
                                             Path.DirectorySeparatorChar + profile + Path.DirectorySeparatorChar + "multiply.csv");
            // Set profile to extrusion

            /* cutting	False
             * extrusion	True
             * milling	False
             * winding	False
             */
            profileConfig.setValue("cutting", "False");
            profileConfig.setValue("milling", "False");
            profileConfig.setValue("extrusion", "True");
            profileConfig.setValue("winding", "False");
            profileConfig.writeModified();
            // Set used profile
            extrusionConfig.setValue("Profile Selection:", profile);
            extrusionConfig.writeModified();
            // Set export to correct values
            exportConfig.setValue("Activate Export", "True");
            exportConfig.setValue("Add Profile Extension", "False");
            exportConfig.setValue("Add Profile Name to Filename", "False");
            exportConfig.setValue("Add Timestamp Extension", "False");
            exportConfig.setValue("Add Timestamp to Filename", "False");
            exportConfig.setValue("Add Description to Filename", "False");
            exportConfig.setValue("Add Descriptive Extension", "False");
            exportConfig.writeModified();

            multiplyConfig.setValue("Activate Multiply:", "False");
            multiplyConfig.setValue("Activate Multiply: ", "False");
            multiplyConfig.setValue("Activate Multiply", "False");
            multiplyConfig.writeModified();

            string target = StlToGCode(file);

            if (File.Exists(target))
            {
                File.Delete(target);
            }
            procConvert = new Process();
            try
            {
                SlicingInfo.Start(name);
                SlicingInfo.SetAction(Trans.T("L_SLICING_STL_FILE...")); //"Slicing STL file ...");
                slicefile = file;
                procConvert.EnableRaisingEvents = true;
                procConvert.Exited += new EventHandler(ConversionExited);

                procConvert.StartInfo.FileName               = Main.IsMono ? PyPy : wrapQuotes(PyPy);
                procConvert.StartInfo.Arguments              = wrapQuotes(textSkeinforgeCraft.Text) + " " + wrapQuotes(file);
                procConvert.StartInfo.UseShellExecute        = false;
                procConvert.StartInfo.WorkingDirectory       = textWorkingDirectory.Text;
                procConvert.StartInfo.RedirectStandardOutput = true;
                procConvert.OutputDataReceived              += new DataReceivedEventHandler(OutputDataHandler);
                procConvert.StartInfo.RedirectStandardError  = true;
                procConvert.ErrorDataReceived += new DataReceivedEventHandler(OutputDataHandler);
                procConvert.Start();
                // Start the asynchronous read of the standard output stream.
                procConvert.BeginOutputReadLine();
                procConvert.BeginErrorReadLine();
                //Main.main.tab.SelectedTab = Main.main.tabPrint;
            }
            catch (Exception e)
            {
                Main.conn.log(e.ToString(), false, 2);
                RestoreConfigs();
            }
        }
Пример #7
0
        /*  public void RunSlice(string file,float centerx,float centery)
         * {
         *    if (procConvert != null)
         *    {
         *        MessageBox.Show("Last slice job still running. Slicing of new job is canceled.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
         *        return;
         *    }
         *    SlicingInfo.Start("Slic3r");
         *    SlicingInfo.SetAction("Analyzing STL file ...");
         *    try
         *    {
         *        STL stl = new STL();
         *        stl.Load(file);
         *        stl.UpdateBoundingBox();
         *        if (stl.xMin > 0 && stl.yMin > 0 && stl.xMax < Main.printerSettings.PrintAreaWidth && stl.yMax < Main.printerSettings.PrintAreaDepth)
         *        {
         *            // User assigned valid position, so we use this
         *            centerx = stl.xMin + (stl.xMax - stl.xMin) / 2;
         *            centery = stl.yMin + (stl.yMax - stl.yMin) / 2;
         *        }
         *        stl.Clear();
         *    }
         *    catch (Exception e)
         *    {
         *        Main.conn.log(e.ToString(), false, 2);
         *        SlicingInfo.Stop();
         *        return;
         *    }
         *    SlicingInfo.SetAction("Slicing STL file ...");
         *    procConvert = new Process();
         *    try
         *    {
         *    string basedir = (string)Main.main.PiMakerKey.GetValue("installPath","");
         *    string exname = "slic3r.exe";
         *    if (Environment.OSVersion.Platform == PlatformID.Unix)
         *            exname = "bin"+Path.DirectorySeparatorChar+"slic3r";
         *    if (Main.IsMac)
         *        exname = "MacOS" + Path.DirectorySeparatorChar + "slic3r";
         *    string exe = basedir + Path.DirectorySeparatorChar + "Slic3r" + Path.DirectorySeparatorChar + exname;
         *        slicefile = file;
         *        string target = StlToGCode(file);
         *        if (File.Exists(target))
         *            File.Delete(target);
         *        procConvert.EnableRaisingEvents = true;
         *        procConvert.Exited += new EventHandler(ConversionExited);
         *        procConvert.StartInfo.FileName = Main.IsMono ? exe : wrapQuotes(exe);
         *        StringBuilder sb = new StringBuilder();
         *        sb.Append("--nozzle-diameter ");
         *        sb.Append(textNozzleDiameter.Text);
         *        sb.Append(" ");
         *        sb.Append(" -o ");
         *        sb.Append(wrapQuotes(StlToGCode(file)));
         *        sb.Append(" ");
         *        if (checkRelativeE.Checked)
         *            sb.Append("--use-relative-e-distances ");
         *        if (checkComments.Checked)
         *            sb.Append("--gcode-comments ");
         *       // else
         *       //     sb.Append("--gcode-comments 0 ");
         *        sb.Append("-j ");
         *        sb.Append(textNumberOfThreads.Text);
         *        if (checkRandomizeStartingPoints.Checked)
         *            sb.Append(" --randomize-start");
         *        sb.Append(" --z-offset ");
         *        sb.Append(textZOffset.Text);
         *        sb.Append(" --filament-diameter ");
         *        sb.Append(textDiameter.Text);
         *        sb.Append(" --extrusion-multiplier ");
         *        sb.Append(textPackingDensity.Text);
         *        sb.Append(" --temperature ");
         *        sb.Append(textTemperature.Text);
         *        sb.Append(" --infill-speed ");
         *        sb.Append(textPrintFeedrate.Text);
         *        sb.Append(" --solid-infill-speed ");
         *        sb.Append(textSolidInfillSpeed.Text);
         *        sb.Append(" --travel-speed ");
         *        sb.Append(textTravelFeedrate.Text);
         *        sb.Append(" --bridge-speed ");
         *        sb.Append(textBridgeSpeed.Text);
         *        sb.Append(" --perimeter-speed ");
         *        sb.Append(textPerimeterFeedrate.Text);
         *        sb.Append(" --small-perimeter-speed ");
         *        sb.Append(textSmallPerimeterSpeed.Text);
         *        sb.Append(" --bridge-flow-ratio ");
         *        sb.Append(textBridgeFlowRatio.Text);
         *        sb.Append(" --layer-height ");
         *        sb.Append(textLayerHeight.Text);
         *        sb.Append(" --first-layer-speed ");
         *        sb.Append(textFirstLayerSpeed.Text);
         *        sb.Append(" --first-layer-height ");
         *        sb.Append(textFirstLayerHeight.Text);
         *        sb.Append(" --infill-every-layers ");
         *        sb.Append(textInfillEvery.Text);
         *        sb.Append(" --perimeters ");
         *        sb.Append(textPerimeters.Text);
         *        sb.Append(" --solid-layers ");
         *        sb.Append(textSolidLayers.Text);
         *        sb.Append(" --fill-density ");
         *        sb.Append(textFillDensity.Text);
         *        sb.Append(" --fill-angle ");
         *        sb.Append(textFillAngle.Text);
         *        sb.Append(" --fill-pattern ");
         *        sb.Append(comboFillPattern.SelectedItem);
         *        sb.Append(" --solid-fill-pattern ");
         *        sb.Append(comboSolidFillPattern.SelectedItem);
         *        sb.Append(" --retract-length ");
         *        sb.Append(textRetLength.Text);
         *        sb.Append(" --retract-speed ");
         *        sb.Append(textRetSpeed.Text);
         *        sb.Append(" --retract-restart-extra ");
         *        sb.Append(textRetExtraDistance.Text);
         *        sb.Append(" --retract-before-travel ");
         *        sb.Append(textRetMinTravel.Text);
         *        sb.Append(" --retract-lift ");
         *        sb.Append(textRetLift.Text);
         *        sb.Append(" --skirts ");
         *        sb.Append(textSkirtLoops.Text);
         *        sb.Append(" --skirt-distance ");
         *        sb.Append(textSkirtDistance.Text);
         *        sb.Append(" --skirt-height ");
         *        sb.Append(textSkirtHeight.Text);
         *        sb.Append(" --extrusion-width ");
         *        sb.Append(textExtrusionWidth.Text);
         *        sb.Append(" --brim-width ");
         *        sb.Append(textBrim.Text);
         *        sb.Append(" --support-material-threshold ");
         *        sb.Append(textOverhangTreshold.Text);
         *        sb.Append(" --support-material-pattern ");
         *        sb.Append(comboSupportPattern.SelectedItem);
         *        sb.Append(" --support-material-spacing ");
         *        sb.Append(textPatternSpacing.Text);
         *        sb.Append(" --support-material-angle ");
         *        sb.Append(textPatternAngle.Text);
         *        sb.Append(" --print-center ");
         *        sb.Append(centerx.ToString("0",GCode.format));
         *        sb.Append(",");
         *        sb.Append(centery.ToString("0", GCode.format));
         *        if (checkEnableCooling.Checked)
         *        {
         *            sb.Append(" --cooling --bridge-fan-speed ");
         *            sb.Append(textCoolBridgeFanSpeed.Text);
         *            sb.Append(" --disable-fan-first-layers ");
         *            sb.Append(textCoolDisableLayer.Text);
         *            sb.Append(" --fan-below-layer-time ");
         *            sb.Append(textCoolEnableBelow.Text);
         *            sb.Append(" --max-fan-speed ");
         *            sb.Append(textCoolMaxFanSpeed.Text);
         *            sb.Append(" --min-fan-speed ");
         *            sb.Append(textCoolMinFanSpeed.Text);
         *            sb.Append(" --min-print-speed ");
         *            sb.Append(textCoolMinPrintSpeed.Text);
         *            sb.Append(" --slowdown-below-layer-time ");
         *            sb.Append(textCoolSlowDownBelow.Text);
         *        }
         *        if (checkGenerateSupportMaterial.Checked)
         *        {
         *            sb.Append(" --support-material --support-material-tool " + comboSupportMaterialTool.SelectedIndex);
         *        }
         *        sb.Append(" --gcode-flavor ");
         *        switch (comboGCodeFlavor.SelectedIndex)
         *        {
         *            case 0:
         *            default:
         *                sb.Append("reprap");
         *                break;
         *            case 1:
         *                sb.Append("teacup");
         *                break;
         *            case 2:
         *                sb.Append("makerbot");
         *                break;
         *            case 3:
         *                sb.Append("mach3");
         *                break;
         *            case 4:
         *                sb.Append("no-extrusion");
         *                break;
         *        }
         *        sb.Append(" --first-layer-temperature ");
         *        sb.Append(textFirstLayerTemperature.Text);
         *        sb.Append(" --bed-temperature ");
         *        sb.Append(textBedTemperature.Text);
         *        sb.Append(" --first-layer-bed-temperature ");
         *        sb.Append(textFirstLayerBedTemperature.Text);
         *        if (checkFanAlwaysEnabled.Checked)
         *        {
         *            sb.Append(" --fan-always-on");
         *        }
         *        sb.Append(" --start-gcode ");
         *        sb.Append(wrapQuotes(basedir+Path.DirectorySeparatorChar+"empty.txt"));
         *        sb.Append(" --end-gcode ");
         *        sb.Append(wrapQuotes(basedir+Path.DirectorySeparatorChar+"empty.txt"));
         *        sb.Append(" ");
         *        sb.Append(wrapQuotes(file));
         *        Main.conn.log(sb.ToString(), false, 3);
         *        procConvert.StartInfo.Arguments = sb.ToString();
         *        procConvert.StartInfo.UseShellExecute = false;
         *        procConvert.StartInfo.RedirectStandardOutput = true;
         *        procConvert.OutputDataReceived += new DataReceivedEventHandler(OutputDataHandler);
         *        procConvert.StartInfo.RedirectStandardError = true;
         *        procConvert.ErrorDataReceived += new DataReceivedEventHandler(OutputDataHandler);
         *        procConvert.Start();
         *        // Start the asynchronous read of the standard output stream.
         *        procConvert.BeginOutputReadLine();
         *        procConvert.BeginErrorReadLine();
         *        //Main.main.tab.SelectedTab = Main.main.tabPrint;
         *    }
         *    catch (Exception e)
         *    {
         *        Main.conn.log(e.ToString(), false, 2);
         *    }
         * }*/
        /*  public void RunSliceExternal(string file, float centerx, float centery)
         * {
         *    if (procConvert != null)
         *    {
         *        MessageBox.Show("Last slice job still running. Slicing of new job is canceled.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
         *        return;
         *    }
         *    SlicingInfo.Start("External Slic3r");
         *    SlicingInfo.SetAction("Analyzing STL file ...");
         *    try
         *    {
         *        STL stl = new STL();
         *        stl.Load(file);
         *        stl.UpdateBoundingBox();
         *        if (stl.xMin > 0 && stl.yMin > 0 && stl.xMax < Main.printerSettings.PrintAreaWidth && stl.yMax < Main.printerSettings.PrintAreaDepth)
         *        {
         *            // User assigned valid position, so we use this
         *            centerx = stl.xMin + (stl.xMax - stl.xMin) / 2;
         *            centery = stl.yMin + (stl.yMax - stl.yMin) / 2;
         *        }
         *        stl.Clear();
         *    }
         *    catch (Exception e)
         *    {
         *        Main.conn.log(e.ToString(), false, 2);
         *        SlicingInfo.Stop();
         *        return;
         *    }
         *    SlicingInfo.SetAction("Slicing STL file ...");
         *    procConvert = new Process();
         *    try
         *    {
         *        string basedir = (string)Main.main.PiMakerKey.GetValue("installPath", "");
         *        string exname = "slic3r.exe";
         *        if (Environment.OSVersion.Platform == PlatformID.Unix)
         *            exname = "bin" + Path.DirectorySeparatorChar + "slic3r";
         *        if (Main.IsMac)
         *            exname = "MacOS" + Path.DirectorySeparatorChar + "slic3r";
         *        string exe = basedir + Path.DirectorySeparatorChar + "Slic3r" + Path.DirectorySeparatorChar + exname;
         *        if (File.Exists(BasicConfiguration.basicConf.ExternalSlic3rPath))
         *            exe = BasicConfiguration.basicConf.ExternalSlic3rPath;
         *
         *        slicefile = file;
         *        string target = StlToGCode(file);
         *        if (File.Exists(target))
         *            File.Delete(target);
         *        procConvert.EnableRaisingEvents = true;
         *        procConvert.Exited += new EventHandler(ConversionExited);
         *        procConvert.StartInfo.FileName = Main.IsMono ? exe : wrapQuotes(exe);
         *        StringBuilder sb = new StringBuilder();
         *        sb.Append("--load ");
         *        sb.Append(wrapQuotes(BasicConfiguration.basicConf.ExternalSlic3rIniFile));
         *        sb.Append(" --print-center ");
         *        sb.Append(centerx.ToString("0", GCode.format));
         *        sb.Append(",");
         *        sb.Append(centery.ToString("0", GCode.format));
         *        sb.Append(" -o ");
         *        sb.Append(wrapQuotes(StlToGCode(file)));
         *        sb.Append(" ");
         *        sb.Append(wrapQuotes(file));
         *        procConvert.StartInfo.Arguments = sb.ToString();
         *        procConvert.StartInfo.UseShellExecute = false;
         *        procConvert.StartInfo.RedirectStandardOutput = true;
         *        procConvert.OutputDataReceived += new DataReceivedEventHandler(OutputDataHandler);
         *        procConvert.StartInfo.RedirectStandardError = true;
         *        procConvert.ErrorDataReceived += new DataReceivedEventHandler(OutputDataHandler);
         *        procConvert.Start();
         *        // Start the asynchronous read of the standard output stream.
         *        procConvert.BeginOutputReadLine();
         *        procConvert.BeginErrorReadLine();
         *        //Main.main.tab.SelectedTab = Main.main.tabPrint;
         *    }
         *    catch (Exception e)
         *    {
         *        Main.conn.log(e.ToString(), false, 2);
         *    }
         * }*/

        public void RunSliceNew(string file, float centerx, float centery)
        {
            if (procConvert != null)
            {
                MessageBox.Show("Last slice job still running. Slicing of new job is canceled.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            FormPrinterSettings ps = Main.printerSettings;

            SlicingInfo.Start("Slic3r");
            SlicingInfo.SetAction("Analyzing STL file ...");
            try
            {
                STL stl = new STL();
                stl.Load(file);
                stl.UpdateBoundingBox();
                if (stl.xMin > ps.BedLeft && stl.yMin > ps.BedFront && stl.xMax < ps.BedLeft + ps.PrintAreaWidth && stl.yMax < ps.BedFront + ps.PrintAreaDepth)
                {
                    // User assigned valid position, so we use this
                    centerx = stl.xMin + (stl.xMax - stl.xMin) / 2;
                    centery = stl.yMin + (stl.yMax - stl.yMin) / 2;
                }
                stl.Clear();
            }
            catch (Exception e)
            {
                Main.conn.log(e.ToString(), false, 2);
                SlicingInfo.Stop();
                return;
            }
            SlicingInfo.SetAction("Slicing STL file ...");
            string             dir      = Main.globalSettings.Workdir;
            string             config   = dir + Path.DirectorySeparatorChar + "slic3r.ini";
            string             cdir     = Main.main.slicerPanel.slic3rDirectory;
            IniFile            ini      = new IniFile();
            BasicConfiguration b        = BasicConfiguration.basicConf;
            string             fPrinter = cdir + Path.DirectorySeparatorChar + "print" + Path.DirectorySeparatorChar + b.Slic3rPrintSettings + ".ini";

            ini.read(fPrinter);
            IniFile ini2 = new IniFile();

            ini2.read(cdir + Path.DirectorySeparatorChar + "printer" + Path.DirectorySeparatorChar + b.Slic3rPrinterSettings + ".ini");
            IniFile ini3 = new IniFile();

            ini3.read(cdir + Path.DirectorySeparatorChar + "filament" + Path.DirectorySeparatorChar + b.Slic3rFilamentSettings + ".ini");
            IniFile ini3_2 = new IniFile();

            ini3_2.read(cdir + Path.DirectorySeparatorChar + "filament" + Path.DirectorySeparatorChar + b.Slic3rFilament2Settings + ".ini");
            IniFile ini3_3 = new IniFile();

            ini3_3.read(cdir + Path.DirectorySeparatorChar + "filament" + Path.DirectorySeparatorChar + b.Slic3rFilament3Settings + ".ini");
            ini3.merge(ini3_2);
            ini3.merge(ini3_3);
            ini.add(ini2);
            ini.add(ini3);
            ini.flatten();
            ini.write(config);
            procConvert = new Process();
            try
            {
                string basedir = (string)Main.main.PiMakerKey.GetValue("installPath", "");
                string exname  = "slic3r.exe";
                if (Environment.OSVersion.Platform == PlatformID.Unix)
                {
                    exname = "slic3r.pl";
                }
                if (Main.IsMac)
                {
                    exname = "MacOS" + Path.DirectorySeparatorChar + "slic3r";
                }
                string exe = basedir + Path.DirectorySeparatorChar + "Slic3r" + Path.DirectorySeparatorChar + exname;
                if (File.Exists(BasicConfiguration.basicConf.Slic3rExecutable))
                {
                    exe = BasicConfiguration.basicConf.Slic3rExecutable;
                }

                slicefile = file;
                string target = StlToGCode(file);
                if (File.Exists(target))
                {
                    File.Delete(target);
                }
                procConvert.EnableRaisingEvents = true;
                procConvert.Exited            += new EventHandler(ConversionExited);
                procConvert.StartInfo.FileName = Main.IsMono ? exe : wrapQuotes(exe);
                StringBuilder sb = new StringBuilder();
                sb.Append("--load ");
                sb.Append(wrapQuotes(config));
                sb.Append(" --print-center ");
                sb.Append(centerx.ToString("0", GCode.format));
                sb.Append(",");
                sb.Append(centery.ToString("0", GCode.format));
                sb.Append(" -o ");
                sb.Append(wrapQuotes(StlToGCode(file)));
                sb.Append(" ");
                sb.Append(wrapQuotes(file));
                procConvert.StartInfo.Arguments              = sb.ToString();
                procConvert.StartInfo.UseShellExecute        = false;
                procConvert.StartInfo.RedirectStandardOutput = true;
                procConvert.OutputDataReceived += new DataReceivedEventHandler(OutputDataHandler);
                procConvert.StartInfo.RedirectStandardError = true;
                procConvert.ErrorDataReceived += new DataReceivedEventHandler(OutputDataHandler);
                procConvert.Start();
                // Start the asynchronous read of the standard output stream.
                procConvert.BeginOutputReadLine();
                procConvert.BeginErrorReadLine();
                //Main.main.tab.SelectedTab = Main.main.tabPrint;
            }
            catch (Exception e)
            {
                Main.conn.log(e.ToString(), false, 2);
            }
        }
 private void buttonKillSlicing_Click(object sender, EventArgs e)
 {
     Main.main.skeinforge.KillSlice();
     Main.slic3r.KillSlice();
     SlicingInfo.Stop();
 }
Пример #9
0
        /// <summary>
        /// Runs the slicer
        /// </summary>
        /// <param name="file">path to .stl file to slice</param>
        /// <param name="centerx"></param>
        /// <param name="centery"></param>
        /// <returns></returns>
        public bool RunSliceNew(string file, float centerx, float centery)
        {
            // check to make sure the slicer isn't still running from last time
            if (procConvert != null)
            {
                MessageBox.Show(Trans.T("L_LAST_SLICE_RUNNING"), Trans.T("L_ERROR"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(false);
            }

            // Make sure we have the path to the slicer and it is valid
            string exe = findSlic3rExecutable();

            if (exe == null)
            {
                MessageBox.Show(Trans.T("L_SLIC3R_NOT_FOUND"), Trans.T("L_ERROR"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(false);
            }

            // Get the print settings and add the information to the slicing info panal. Analyze the .stl
            FormPrinterSettings ps = Main.printerSettings;

            SlicingInfo.Start("Slic3r");
            SlicingInfo.SetAction(Trans.T("L_ANALYSING_STL"));
            try
            {
                STL stl = new STL();
                stl.Load(file);
                stl.UpdateBoundingBox();
                if (stl.xMin > ps.BedLeft && stl.yMin > ps.BedFront && stl.xMax < ps.BedLeft + ps.PrintAreaWidth && stl.yMax < ps.BedFront + ps.PrintAreaDepth)
                {
                    // User assigned valid position, so we use this
                    centerx = stl.xMin + (stl.xMax - stl.xMin) / 2;
                    centery = stl.yMin + (stl.yMax - stl.yMin) / 2;
                }
                stl.Clear();
            }
            catch (Exception e)
            {
                Main.connection.log(e.ToString(), false, 2);
                SlicingInfo.Stop();
                return(false);
            }



            SlicingInfo.SetAction(Trans.T("L_SLICING_STL"));
            string dir    = Main.globalSettings.Workdir;
            string config = dir + Path.DirectorySeparatorChar + "slic3r.ini";

            // Problem is somewhere here. If I uncomment the next line and get rid of the other cdir declaration than it doesn't work. But as it is right now, it won't read the
            // ini files.
            string cdir = Main.main.slicerPanel.slic3rDirectory;
            //string cdir = dir;

            IniFile ini = new IniFile();
            //BasicConfiguration b = BasicConfiguration.basicConf;
            string fPrinter = cdir + Path.DirectorySeparatorChar + "print" + Path.DirectorySeparatorChar + Main.printerModel.Slic3rPrint + ".ini";

            ini.read(fPrinter);
            IniFile ini2 = new IniFile();

            ini2.read(cdir + Path.DirectorySeparatorChar + "printer" + Path.DirectorySeparatorChar + Main.printerModel.Slic3rPrinter + ".ini");

            IniFile ini3 = new IniFile();

            ini3.read(cdir + Path.DirectorySeparatorChar + "filament" + Path.DirectorySeparatorChar + Main.printerModel.Slic3rFilament1 + ".ini");
            // IniFile ini3_2 = new IniFile();
            //if(Main.conn.numberExtruder>1)
            //    ini3_2.read(cdir + Path.DirectorySeparatorChar + "filament" + Path.DirectorySeparatorChar + Main.printerModel.Slic3rFilament2 + ".ini");
            //IniFile ini3_3 = new IniFile();
            //if (Main.conn.numberExtruder > 2)
            //    ini3_3.read(cdir + Path.DirectorySeparatorChar + "filament" + Path.DirectorySeparatorChar + Main.printerModel.Slic3rFilament3 + ".ini");
            //if (Main.conn.numberExtruder > 1)
            //    ini3.merge(ini3_2);
            //if (Main.conn.numberExtruder > 2)
            //    ini3.merge(ini3_3);
            ini.add(ini2);
            ini.add(ini3);

            // If we are in developer mode then don't add support or rafts or calibrate the height
            if (!Main.main.DeveloperMode)
            {
                ini.AddSupportandRaft();
                ini.CalibrateHeight();
            }
            ini.flatten();
            ini.write(config);
            procConvert = new Process();
            try
            {
                string basedir = (string)Main.main.repetierKey.GetValue("installPath", "");

                /*string exname = "slic3r.exe";
                 * if (Environment.OSVersion.Platform == PlatformID.Unix)
                 *  exname = "slic3r.pl";
                 * if (Main.IsMac)
                 *  exname = "MacOS" + Path.DirectorySeparatorChar + "slic3r";
                 * string exe = basedir + Path.DirectorySeparatorChar + "Slic3r" + Path.DirectorySeparatorChar + exname;
                 * if (File.Exists(BasicConfiguration.basicConf.Slic3rExecutable))
                 *  exe = BasicConfiguration.basicConf.Slic3rExecutable;*/

                slicefile = file; // TODO: Not needed??
                string target = StlToGCode(file);
                if (File.Exists(target))
                {
                    File.Delete(target);
                }
                procConvert.EnableRaisingEvents = true;
                procConvert.Exited            += new EventHandler(ConversionExited);
                procConvert.StartInfo.FileName = Main.IsMono ? exe : wrapQuotes(exe);
                StringBuilder sb = new StringBuilder();
                sb.Append("--load ");
                sb.Append(wrapQuotes(config));
                sb.Append(" --print-center ");
                sb.Append(centerx.ToString("0", GCode.format));
                sb.Append(",");
                sb.Append(centery.ToString("0", GCode.format));
                sb.Append(" -o ");
                sb.Append(wrapQuotes(StlToGCode(file)));
                sb.Append(" ");
                sb.Append(wrapQuotes(file));
                procConvert.StartInfo.Arguments              = sb.ToString();
                procConvert.StartInfo.UseShellExecute        = false;
                procConvert.StartInfo.RedirectStandardOutput = true;
                procConvert.OutputDataReceived += new DataReceivedEventHandler(OutputDataHandler);
                procConvert.StartInfo.RedirectStandardError = true;
                procConvert.ErrorDataReceived += new DataReceivedEventHandler(OutputDataHandler);
                procConvert.Start();
                // Start the asynchronous read of the standard output stream.
                procConvert.BeginOutputReadLine();
                procConvert.BeginErrorReadLine();
                //Main.main.tab.SelectedTab = Main.main.tabPrint;
            }
            catch (Exception e)
            {
                Main.connection.log(e.ToString(), false, 2);
            }
            return(true);
        }
Пример #10
0
    // This is how slicing works:
    // take the original image, and copy it in chunks - each equal to a size of a piece, including padding around the sides
    // to the new "sliced" texture. But when copying, also do a UV lookup into the array that represents the mask; and only
    // copy those pixels that are not blocked (and also take the masks's borders into consideration). So essentially bake
    // the masked pieces onto a larger texture. Then we can use that one and only texture, with different UVs, to draw every
    // single piece.

    public static IEnumerator CreateAndSaveSlicedTextureRoutine(SlicingInfo slicingInfo, Texture2D originalTexture,
                                                                Texture2D slicedTexture,
                                                                string originalTexturePath,
                                                                MaskContainer maskContainer,
                                                                Dictionary <IntVector2, PieceInfo> pieceInfos,
                                                                System.Action <float> onProgress)
    {
        //TODO maybe we could rationalize these
        var rows         = slicingInfo.rows;
        var columns      = slicingInfo.columns;
        var originalSize = new Vector2(originalTexture.width, originalTexture.height);

        var paddedPieceSize = GetPaddedPieceSize(rows, columns, originalSize);
        var pieceSize       = new Vector2((float)originalSize.x / (float)columns,
                                          (float)originalSize.y / (float)rows);
        var padding     = (paddedPieceSize - pieceSize) / 2f;
        var borderColor = Color.black;

        var paddedPixelCountX = Mathf.FloorToInt(paddedPieceSize.x);
        var paddedPixelCountY = Mathf.FloorToInt(paddedPieceSize.y);

        var piecePixels = new Color[paddedPixelCountX * paddedPixelCountY];
        var maskPixels  = new Color[MaskCreator.width * MaskCreator.height];

        onProgress(0f);

        var thingsToLoadCount = rows * columns + 1;         // "+1" for the extra step in the end, assigning textures etc.
        // this is just cosmetics- showing the loading indicator
        var thingsLoadedSoFar = 0f;

        for (int column = 0; column < columns; ++column)
        {
            for (int row = 0; row < rows; ++row)
            {
                CreateMask(maskContainer, pieceInfos, row, column, maskPixels);

                var sourceOffsetX = Mathf.RoundToInt(pieceSize.x * column - padding.x);
                var sourceOffsetY = Mathf.RoundToInt(pieceSize.y * row - padding.y);

                var destOffsetX = Mathf.RoundToInt(paddedPieceSize.x * column);
                var destOffsetY = Mathf.RoundToInt(paddedPieceSize.y * row);

                var dimensions = new Dimension
                {
                    currentRow    = row,
                    currentColumn = column,
                    rows          = rows,
                    columns       = columns
                };

                var paddingInfo = new PaddingInfo
                {
                    padding          = padding,
                    paddedPieceSize  = paddedPieceSize,
                    paddedPixelCount = new IntVector2(paddedPixelCountX, paddedPixelCountY)
                };

                TextureUtility.CopyMaskedPieceDataIntoPiecePixelsArray(dimensions, originalTexture, paddingInfo,
                                                                       new IntVector2(sourceOffsetX, sourceOffsetY),
                                                                       piecePixels, maskPixels, borderColor);

                slicedTexture.SetPixels(destOffsetX, destOffsetY, paddedPixelCountX, paddedPixelCountY, piecePixels, 0);

                thingsLoadedSoFar += 1f;
                onProgress(thingsLoadedSoFar / thingsToLoadCount);
                yield return(null);
            }
        }

        TextureUtility.ExportTexture(slicedTexture, rows, columns, originalSize, originalTexturePath);
    }
Пример #11
0
 public void RunSlice(string file, float centerx, float centery)
 {
     if (procConvert != null)
     {
         MessageBox.Show("Last slice job still running. Slicing of new job is canceled.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
         return;
     }
     SlicingInfo.Start("Slic3r");
     SlicingInfo.SetAction("Analyzing STL file ...");
     try
     {
         STL stl = new STL();
         stl.Load(file);
         stl.UpdateBoundingBox();
         if (stl.xMin > 0 && stl.yMin > 0 && stl.xMax < Main.printerSettings.PrintAreaWidth && stl.yMax < Main.printerSettings.PrintAreaDepth)
         {
             // User assigned valid position, so we use this
             centerx = stl.xMin + (stl.xMax - stl.xMin) / 2;
             centery = stl.yMin + (stl.yMax - stl.yMin) / 2;
         }
         stl.Clear();
     }
     catch (Exception e)
     {
         Main.conn.log(e.ToString(), false, 2);
         SlicingInfo.Stop();
         return;
     }
     SlicingInfo.SetAction("Slicing STL file ...");
     procConvert = new Process();
     try
     {
         string basedir = (string)Main.main.repetierKey.GetValue("installPath", "");
         string exname  = "slic3r.exe";
         if (Environment.OSVersion.Platform == PlatformID.Unix)
         {
             exname = "bin" + Path.DirectorySeparatorChar + "slic3r";
         }
         if (Main.IsMac)
         {
             exname = "MacOS" + Path.DirectorySeparatorChar + "slic3r";
         }
         string exe = basedir + Path.DirectorySeparatorChar + "Slic3r" + Path.DirectorySeparatorChar + exname;
         slicefile = file;
         procConvert.EnableRaisingEvents = true;
         procConvert.Exited            += new EventHandler(ConversionExited);
         procConvert.StartInfo.FileName = Main.IsMono ? exe : wrapQuotes(exe);
         StringBuilder sb = new StringBuilder();
         sb.Append("--nozzle-diameter ");
         sb.Append(textNozzleDiameter.Text);
         sb.Append(" ");
         if (checkNoExtrusion.Checked)
         {
             sb.Append("--no-extrusion ");
         }
         if (checkRelativeE.Checked)
         {
             sb.Append("--use-relative-e-distances ");
         }
         if (checkComments.Checked)
         {
             sb.Append("--gcode-comments ");
         }
         // else
         //     sb.Append("--gcode-comments 0 ");
         sb.Append("--z-offset ");
         sb.Append(textZOffset.Text);
         sb.Append(" --filament-diameter ");
         sb.Append(textDiameter.Text);
         sb.Append(" --extrusion-multiplier ");
         sb.Append(textPackingDensity.Text);
         sb.Append(" --temperature ");
         sb.Append(textTemperature.Text);
         sb.Append(" --infill-speed ");
         sb.Append(textPrintFeedrate.Text);
         sb.Append(" --solid-infill-speed ");
         sb.Append(textSolidInfillSpeed.Text);
         sb.Append(" --travel-speed ");
         sb.Append(textTravelFeedrate.Text);
         sb.Append(" --bridge-speed ");
         sb.Append(textBridgeSpeed.Text);
         sb.Append(" --perimeter-speed ");
         sb.Append(textPerimeterFeedrate.Text);
         sb.Append(" --small-perimeter-speed ");
         sb.Append(textSmallPerimeterSpeed.Text);
         sb.Append(" --bottom-layer-speed-ratio ");
         sb.Append(textBottomLayerRatio.Text);
         sb.Append(" --bridge-flow-ratio ");
         sb.Append(textBridgeFlowRatio.Text);
         sb.Append(" --layer-height ");
         sb.Append(textLayerHeight.Text);
         sb.Append(" --infill-every-layers ");
         sb.Append(textInfillEvery.Text);
         sb.Append(" --perimeters ");
         sb.Append(textPerimeters.Text);
         sb.Append(" --solid-layers ");
         sb.Append(textSolidLayers.Text);
         sb.Append(" --fill-density ");
         sb.Append(textFillDensity.Text);
         sb.Append(" --fill-angle ");
         sb.Append(textFillAngle.Text);
         sb.Append(" --fill-pattern ");
         sb.Append(comboFillPattern.Text);
         sb.Append(" --solid-fill-pattern ");
         sb.Append(comboSolidFillPattern.Text);
         sb.Append(" --retract-length ");
         sb.Append(textRetLength.Text);
         sb.Append(" --retract-speed ");
         sb.Append(textRetSpeed.Text);
         sb.Append(" --retract-restart-extra ");
         sb.Append(textRetExtraDistance.Text);
         sb.Append(" --retract-before-travel ");
         sb.Append(textRetMinTravel.Text);
         sb.Append(" --retract-lift ");
         sb.Append(textRetLift.Text);
         sb.Append(" --skirts ");
         sb.Append(textSkirtLoops.Text);
         sb.Append(" --skirt-distance ");
         sb.Append(textSkirtDistance.Text);
         sb.Append(" --skirt-height ");
         sb.Append(textSkirtHeight.Text);
         sb.Append(" --extrusion-width-ratio ");
         sb.Append(textExtrusionWidthRatio.Text);
         sb.Append(" --print-center ");
         sb.Append(centerx.ToString("0", GCode.format));
         sb.Append(",");
         sb.Append(centery.ToString("0", GCode.format));
         sb.Append(" --start-gcode ");
         sb.Append(wrapQuotes(basedir + Path.DirectorySeparatorChar + "empty.txt"));
         sb.Append(" --end-gcode ");
         sb.Append(wrapQuotes(basedir + Path.DirectorySeparatorChar + "empty.txt"));
         sb.Append(" ");
         sb.Append(wrapQuotes(file));
         procConvert.StartInfo.Arguments              = sb.ToString();
         procConvert.StartInfo.UseShellExecute        = false;
         procConvert.StartInfo.RedirectStandardOutput = true;
         procConvert.OutputDataReceived += new DataReceivedEventHandler(OutputDataHandler);
         procConvert.StartInfo.RedirectStandardError = true;
         procConvert.ErrorDataReceived += new DataReceivedEventHandler(OutputDataHandler);
         procConvert.Start();
         // Start the asynchronous read of the standard output stream.
         procConvert.BeginOutputReadLine();
         procConvert.BeginErrorReadLine();
         //Main.main.tab.SelectedTab = Main.main.tabPrint;
     }
     catch (Exception e)
     {
         Main.conn.log(e.ToString(), false, 2);
     }
 }
Пример #12
0
        public bool RunSliceNew(string file, float centerx, float centery)
        {
            if (procConvert != null)
            {
                MessageBox.Show(Trans.T("L_LAST_SLICE_RUNNING"), Trans.T("L_ERROR"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(false);
            }
            string exe = findSlic3rExecutable();

            if (exe == null)
            {
                MessageBox.Show(Trans.T("L_SLIC3R_NOT_FOUND"), Trans.T("L_ERROR"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(false);
            }
            FormPrinterSettings ps = Main.printerSettings;

            SlicingInfo.Start("Slic3r");
            SlicingInfo.SetAction(Trans.T("L_ANALYSING_STL"));
            try
            {
                RHBoundingBox stl = Slicer.lastBox;
                if (stl.xMin > ps.BedLeft && stl.yMin > ps.BedFront && stl.xMax < ps.BedLeft + ps.PrintAreaWidth && stl.yMax < ps.BedFront + ps.PrintAreaDepth)
                {
                    // User assigned valid position, so we use this
                    centerx = (float)(stl.xMin + (stl.xMax - stl.xMin) / 2);
                    centery = (float)(stl.yMin + (stl.yMax - stl.yMin) / 2);
                }
            }
            catch (Exception e)
            {
                Main.conn.log(e.ToString(), false, 2);
                SlicingInfo.Stop();
                return(false);
            }
            SlicingInfo.SetAction(Trans.T("L_SLICING_STL"));
            string  dir    = Main.globalSettings.Workdir;
            string  config = dir + Path.DirectorySeparatorChar + "slic3r.ini";
            string  cdir   = Main.main.slicerPanel.slic3rDirectory;
            IniFile ini    = new IniFile();
            //BasicConfiguration b = BasicConfiguration.basicConf;
            string fPrinter = cdir + Path.DirectorySeparatorChar + "print" + Path.DirectorySeparatorChar + Main.printerModel.Slic3rPrint + ".ini";

            ini.read(fPrinter);
            IniFile ini2 = new IniFile();

            ini2.read(cdir + Path.DirectorySeparatorChar + "printer" + Path.DirectorySeparatorChar + Main.printerModel.Slic3rPrinter + ".ini");
            IniFile ini3 = new IniFile();

            ini3.read(cdir + Path.DirectorySeparatorChar + "filament" + Path.DirectorySeparatorChar + Main.printerModel.Slic3rFilament1 + ".ini");
            IniFile ini3_2 = new IniFile();

            if (Main.conn.numberExtruder > 1)
            {
                ini3_2.read(cdir + Path.DirectorySeparatorChar + "filament" + Path.DirectorySeparatorChar + Main.printerModel.Slic3rFilament2 + ".ini");
            }
            IniFile ini3_3 = new IniFile();

            if (Main.conn.numberExtruder > 2)
            {
                ini3_3.read(cdir + Path.DirectorySeparatorChar + "filament" + Path.DirectorySeparatorChar + Main.printerModel.Slic3rFilament3 + ".ini");
            }
            if (Main.conn.numberExtruder > 1)
            {
                ini3.merge(ini3_2);
            }
            if (Main.conn.numberExtruder > 2)
            {
                ini3.merge(ini3_3);
            }
            ini.add(ini2);
            ini.add(ini3);
            ini.flatten();
            ini.write(config);
            procConvert = new Process();
            try
            {
                string basedir = (string)Main.main.repetierKey.GetValue("installPath", "");

                /*string exname = "slic3r.exe";
                 * if (Environment.OSVersion.Platform == PlatformID.Unix)
                 *  exname = "slic3r.pl";
                 * if (Main.IsMac)
                 *  exname = "MacOS" + Path.DirectorySeparatorChar + "slic3r";
                 * string exe = basedir + Path.DirectorySeparatorChar + "Slic3r" + Path.DirectorySeparatorChar + exname;
                 * if (File.Exists(BasicConfiguration.basicConf.Slic3rExecutable))
                 *  exe = BasicConfiguration.basicConf.Slic3rExecutable;*/
                slicefile = file;
                string target = StlToGCode(file);
                if (File.Exists(target))
                {
                    File.Delete(target);
                }
                procConvert.EnableRaisingEvents = true;
                procConvert.Exited            += new EventHandler(ConversionExited);
                procConvert.StartInfo.FileName = Main.IsMono ? exe : wrapQuotes(exe);
                StringBuilder sb = new StringBuilder();
                sb.Append("--load ");
                sb.Append(wrapQuotes(config));
                sb.Append(" --print-center ");
                sb.Append(centerx.ToString("0", GCode.format));
                sb.Append(",");
                sb.Append(centery.ToString("0", GCode.format));
                sb.Append(" -o ");
                sb.Append(wrapQuotes(StlToGCode(file)));
                sb.Append(" ");
                sb.Append(wrapQuotes(file));
                RLog.info("Slic3r command:" + exe + " " + sb.ToString());
                procConvert.StartInfo.Arguments              = sb.ToString();
                procConvert.StartInfo.UseShellExecute        = false;
                procConvert.StartInfo.RedirectStandardOutput = true;
                procConvert.OutputDataReceived += new DataReceivedEventHandler(OutputDataHandler);
                procConvert.StartInfo.RedirectStandardError = true;
                procConvert.ErrorDataReceived += new DataReceivedEventHandler(OutputDataHandler);
                procConvert.Start();
                // Start the asynchronous read of the standard output stream.
                procConvert.BeginOutputReadLine();
                procConvert.BeginErrorReadLine();
                //Main.main.tab.SelectedTab = Main.main.tabPrint;
            }
            catch (Exception e)
            {
                Main.conn.log(e.ToString(), false, 2);
            }
            return(true);
        }
        public void RunSlice(string file, string profile)
        {
            if (procConvert != null)
            {
                MessageBox.Show(Trans.T("L_SKEIN_STILL_RUNNING") /*"Last slice job still running. Slicing of new job is canceled."*/, Trans.T("L_ERROR"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            string py = PyPy;

            if (py == null)
            {
                MessageBox.Show(Trans.T("L_PYPY_NOT_FOUND"), Trans.T("L_ERROR"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            string craft = findCraft();

            if (craft == null)
            {
                MessageBox.Show(Trans.T("L_SKEINCRAFT_NOT_FOUND"), Trans.T("L_ERROR"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            string profdir = findSkeinforgeProfiles();

            if (profdir == null)
            {
                MessageBox.Show(Trans.T("L_SKEINCRAFT_PROFILES_NOT_FOUND"), Trans.T("L_ERROR"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            profileConfig   = new SkeinConfig(Path.Combine(profdir, "skeinforge_profile.csv"));
            extrusionConfig = new SkeinConfig(Path.Combine(profdir, "extrusion.csv"));
            exportConfig    = new SkeinConfig(Path.Combine(profdir, "extrusion" + Path.DirectorySeparatorChar + profile + Path.DirectorySeparatorChar + "export.csv"));
            multiplyConfig  = new SkeinConfig(Path.Combine(profdir, "extrusion" +
                                                           Path.DirectorySeparatorChar + profile + Path.DirectorySeparatorChar + "multiply.csv"));
            raftAndSupportConfig = new SkeinConfig(Path.Combine(profdir, "extrusion" +
                                                                Path.DirectorySeparatorChar + profile + Path.DirectorySeparatorChar + "raft.csv"));
            // Set profile to extrusion

            /* cutting	False
             * extrusion	True
             * milling	False
             * winding	False
             */
            profileConfig.setValue("cutting", "False");
            profileConfig.setValue("milling", "False");
            profileConfig.setValue("extrusion", "True");
            profileConfig.setValue("winding", "False");
            profileConfig.writeModified();
            // Set used profile
            extrusionConfig.setValue("Profile Selection:", profile);
            extrusionConfig.writeModified();
            // Set export to correct values
            exportConfig.setValue("Activate Export", "True");
            exportConfig.setValue("Add Profile Extension", "False");
            exportConfig.setValue("Add Profile Name to Filename", "False");
            exportConfig.setValue("Add Timestamp Extension", "False");
            exportConfig.setValue("Add Timestamp to Filename", "False");
            exportConfig.setValue("Add Description to Filename", "False");
            exportConfig.setValue("Add Descriptive Extension", "False");
            exportConfig.writeModified();

            multiplyConfig.setValue("Activate Multiply:", "False");
            multiplyConfig.setValue("Activate Multiply: ", "False");
            multiplyConfig.setValue("Activate Multiply", "False");
            multiplyConfig.writeModified();

            string target = StlToGCode(file);

            if (File.Exists(target))
            {
                File.Delete(target);
            }

            // If we are in developer mode then don't add support or rafts or calibrate the height
            if (!Main.main.DeveloperMode)
            {
                // Modify Start Code, Raft, and Support settings to reflect the current user settings
                CalibrateHeightStartGcode(profdir);
                AddRaftConfiguration(raftAndSupportConfig);
                AddSupportConfiguration(raftAndSupportConfig);
                raftAndSupportConfig.writeModified(); // write the modified raft.csv
            }

            procConvert = new Process();
            try
            {
                SlicingInfo.Start(name);
                SlicingInfo.SetAction(Trans.T("L_SLICING_STL_FILE...")); //"Slicing STL file ...");
                slicefile = file;
                procConvert.EnableRaisingEvents = true;
                procConvert.Exited += new EventHandler(ConversionExited);

                procConvert.StartInfo.FileName               = Main.IsMono ? py : wrapQuotes(py);
                procConvert.StartInfo.Arguments              = wrapQuotes(craft) + " " + wrapQuotes(file);
                procConvert.StartInfo.UseShellExecute        = false;
                procConvert.StartInfo.WorkingDirectory       = textWorkingDirectory.Text;
                procConvert.StartInfo.RedirectStandardOutput = true;
                procConvert.OutputDataReceived              += new DataReceivedEventHandler(OutputDataHandler);
                procConvert.StartInfo.RedirectStandardError  = true;
                procConvert.ErrorDataReceived += new DataReceivedEventHandler(OutputDataHandler);
                procConvert.Start();
                // Start the asynchronous read of the standard output stream.
                procConvert.BeginOutputReadLine();
                procConvert.BeginErrorReadLine();
                //Main.main.tab.SelectedTab = Main.main.tabPrint;
            }
            catch (Exception e)
            {
                Main.connection.log(e.ToString(), false, 2);
                RestoreConfigs();
            }
        }