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); }
public void Add(RHBoundingBox box) { if (box.minPoint == null) { return; } Add(box.minPoint); Add(box.maxPoint); }
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); }
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); }
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); }
/// <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); }
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)); } } }
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); }