Esempio n. 1
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);
        }