Пример #1
0
        public RHBoundingBox PrinterBoundingBox()
        {
            RHBoundingBox b = new RHBoundingBox();

            b.Add(ps.BedLeft, ps.BedFront, -0.0 * ps.PrintAreaHeight);
            b.Add(ps.BedLeft + ps.PrintAreaWidth, ps.BedFront + ps.PrintAreaDepth, 1.0 * ps.PrintAreaHeight);
            return(b);
        }
Пример #2
0
 public void Add(RHBoundingBox box)
 {
     if (box.minPoint == null)
     {
         return;
     }
     Add(box.minPoint);
     Add(box.maxPoint);
 }
Пример #3
0
        public bool IntersectsBox(RHBoundingBox box)
        {
            if (minPoint == null || box.minPoint == null)
            {
                return(false);
            }
            bool xOverlap = Overlap(minPoint.x, maxPoint.x, box.minPoint.x, box.maxPoint.x);
            bool yOverlap = Overlap(minPoint.y, maxPoint.y, box.minPoint.y, box.maxPoint.y);
            bool zOverlap = Overlap(minPoint.z, maxPoint.z, box.minPoint.z, box.maxPoint.z);

            return(xOverlap && yOverlap && zOverlap);
        }
Пример #4
0
        public RHBoundingBox ObjectsBoundingBox()
        {
            RHBoundingBox b = new RHBoundingBox();

            foreach (PrintModel model in Main.main.objectPlacement.ListObjects(false))
            {
                b.Add(model.bbox.minPoint);
                b.Add(model.bbox.maxPoint);
            }
            if (b.minPoint == null)
            {
                return(PrinterBoundingBox());
            }
            return(b);
        }
Пример #5
0
        public RHBoundingBox ObjectsBoundingBox()
        {
            RHBoundingBox b = new RHBoundingBox();

            foreach (PrintModel model in ProjectManager.Instance.CurrentProject.ModelList) // Main.main.objectPlacement.ListObjects(false))
            {
                b.Add(model.bbox.minPoint);
                b.Add(model.bbox.maxPoint);
            }
            if (b.minPoint == null)
            {
                return(PrinterBoundingBox());
            }
            return(b);
        }
Пример #6
0
        /// <summary>
        /// Convert the box range into bitpattern for a fast intersection test.
        ///
        /// </summary>
        /// <param name="box"></param>
        /// <returns></returns>
        public int RangeToBits(RHBoundingBox box)
        {
            double dx = (maxPoint.x - minPoint.x) / 10;
            double dy = (maxPoint.y - minPoint.y) / 10;
            double dz = (maxPoint.z - minPoint.z) / 10;
            int    p  = 0;
            int    i;
            double px  = minPoint.x;
            double px2 = px + dx;
            double vx  = box.minPoint.x;
            double vx2 = box.maxPoint.x;
            double py  = minPoint.y;
            double py2 = py + dy;
            double vy  = box.minPoint.y;
            double vy2 = box.maxPoint.y;
            double pz  = minPoint.z;
            double pz2 = pz + dz;
            double vz  = box.minPoint.z;
            double vz2 = box.maxPoint.z;

            for (i = 0; i < 10; i++)
            {
                if (Overlap(px, px2, vx, vx2))
                {
                    p |= 1 << i;
                }
                if (Overlap(py, py2, vy, vy2))
                {
                    p |= 1 << (10 + i);
                }
                if (Overlap(pz, pz2, vz, vz2))
                {
                    p |= 1 << (20 + i);
                }
                px   = px2;
                px2 += dx;
                py   = py2;
                py2 += dy;
                pz   = pz2;
                pz2 += dz;
            }
            return(p);
        }
Пример #7
0
        public void FitBoundingBox(RHBoundingBox box)
        {
            float     bedRadius = (float)(1.5 * Math.Sqrt((ps.PrintAreaDepth * ps.PrintAreaDepth + ps.PrintAreaHeight * ps.PrintAreaHeight + ps.PrintAreaWidth * ps.PrintAreaWidth) * 0.25));
            RHVector3 shift     = new RHVector3(-ps.BedLeft - 0.5 * ps.PrintAreaWidth, -ps.BedFront - 0.5 * ps.PrintAreaDepth, -0.5 * ps.PrintAreaHeight);

            viewCenter = box.Center.asVector3();
            distance   = defaultDistance;
            int loops = 5;

            while (loops > 0)
            {
                loops--;
                angle = 15.0 * Math.PI / 180;
                double  ratio  = (double)control.gl.Width / (double)control.gl.Height;
                Vector3 camPos = CameraPosition;
                Matrix4 lookAt = Matrix4.LookAt(camPos.X, camPos.Y, camPos.Z, viewCenter.X, viewCenter.Y, viewCenter.Z, 0, 0, 1.0f);
                Matrix4 persp;
                Vector3 dir = new Vector3();
                Vector3.Subtract(ref viewCenter, ref camPos, out dir);
                dir.Normalize();
                float dist;
                Vector3.Dot(ref dir, ref camPos, out dist);
                dist = -dist;

                float nearDist   = Math.Max(1, dist - bedRadius);
                float farDist    = Math.Max(bedRadius * 2, dist + bedRadius);
                float nearHeight = 2.0f * (float)Math.Tan(angle) * dist;

                if (control.toolParallelProjection.Checked)
                {
                    persp = Matrix4.CreateOrthographic(nearHeight * (float)ratio, nearHeight, nearDist, farDist);
                    loops = 0;
                }
                else
                {
                    persp = Matrix4.CreatePerspectiveFieldOfView((float)(angle * 2.0), (float)ratio, nearDist, farDist);
                }
                Matrix4       trans = Matrix4.Mult(lookAt, persp);
                RHVector3     min   = new RHVector3(0, 0, 0);
                RHVector3     max   = new RHVector3(0, 0, 0);
                Vector4       pos;
                RHBoundingBox bb = new RHBoundingBox();
                pos = Vector4.Transform(box.minPoint.asVector4(), trans);
                bb.Add(new RHVector3(pos));
                pos = Vector4.Transform(box.maxPoint.asVector4(), trans);
                bb.Add(new RHVector3(pos));
                Vector4 pnt = new Vector4((float)box.xMin, (float)box.yMax, (float)box.zMin, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                pnt = new Vector4((float)box.xMin, (float)box.yMax, (float)box.zMin, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                pnt = new Vector4((float)box.xMax, (float)box.yMax, (float)box.zMin, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                pnt = new Vector4((float)box.xMin, (float)box.yMax, (float)box.zMax, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                pnt = new Vector4((float)box.xMin, (float)box.yMin, (float)box.zMax, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                pnt = new Vector4((float)box.xMax, (float)box.yMin, (float)box.zMax, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                double fac = Math.Max(Math.Abs(bb.xMin), Math.Abs(bb.xMax));
                fac       = Math.Max(fac, Math.Abs(bb.yMin));
                fac       = Math.Max(fac, Math.Abs(bb.yMax));
                distance *= fac * 1.03;
                if (distance < 1)
                {
                    angle = Math.Atan(distance * Math.Tan(15.0 * Math.PI / 180.0));
                }
            }
        }
Пример #8
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);
        }