void ProcessController::MakeRaft(float &z) { vector<InFillHit> HitsBuffer; uint LayerNr = 0; float step; float size = RaftSize; Vector2f raftMin = Vector2f(Min.x - size+printOffset.x, Min.y - size+printOffset.y); Vector2f raftMax = Vector2f(Max.x + size+printOffset.x, Max.y + size+printOffset.y); Vector2f Center = (Vector2f(Max.x + size, Max.y + size)-Vector2f(Min.x + size, Min.y + size))/2+Vector2f(printOffset.x, printOffset.y); float Length = sqrtf(2)*( ((raftMax.x)>(raftMax.y)? (raftMax.x):(raftMax.y)) - ((raftMin.x)<(raftMin.y)? (raftMin.x):(raftMin.y)) )/2.0f; // bbox of object float E = 0.0f; float rot = RaftRotation/180.0f*M_PI; while(LayerNr < RaftBaseLayerCount+RaftInterfaceLayerCount) { rot = (RaftRotation+(float)LayerNr*RaftRotationPrLayer)/180.0f*M_PI; Vector2f InfillDirX(cosf(rot), sinf(rot)); Vector2f InfillDirY(-InfillDirX.y, InfillDirX.x); Vector3f LastPosition; bool reverseLines = false; if(LayerNr < RaftBaseLayerCount) step = RaftBaseDistance; else step = RaftInterfaceDistance; Vector2f P1, P2; for(float x = -Length ; x < Length ; x+=step) { P1 = (InfillDirX * Length)+(InfillDirY*x)+ Center; P2 = (InfillDirX * -Length)+(InfillDirY*x)+ Center; if(reverseLines) { Vector2f tmp = P1; P1 = P2; P2 = tmp; } // glBegin(GL_LINES); // glVertex2fv(&P1.x); // glVertex2fv(&P2.x); // Crop lines to bbox*size Vector3f point; InFillHit hit; HitsBuffer.clear(); Vector2f P3(raftMin.x, raftMin.y); Vector2f P4(raftMin.x, raftMax.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit)) //Intersect edges of bbox HitsBuffer.push_back(hit); P3 = Vector2f(raftMax.x,raftMax.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit)) HitsBuffer.push_back(hit); P4 = Vector2f(raftMax.x,raftMin.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit)) HitsBuffer.push_back(hit); P3 = Vector2f(raftMin.x,raftMin.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit)) HitsBuffer.push_back(hit); // glEnd(); if(HitsBuffer.size() == 0) // it can only be 2 or zero continue; if(HitsBuffer.size() != 2) continue; std::sort(HitsBuffer.begin(), HitsBuffer.end(), InFillHitCompareFunc); P1 = HitsBuffer[0].p; P2 = HitsBuffer[1].p; float materialRatio; if(LayerNr < RaftBaseLayerCount) materialRatio = RaftMaterialPrDistanceRatio; // move or extrude? else materialRatio = RaftInterfaceMaterialPrDistanceRatio; // move or extrude? MakeAcceleratedGCodeLine(Vector3f(P1.x,P1.y,z), Vector3f(P2.x,P2.y,z), DistanceToReachFullSpeed, materialRatio, gcode, z, MinPrintSpeedXY, MaxPrintSpeedXY, MinPrintSpeedZ, MaxPrintSpeedZ, UseIncrementalEcode, Use3DGcode, E, EnableAcceleration); reverseLines = !reverseLines; } // Set startspeed for Z-move Command g; g.Code = SETSPEED; g.where = Vector3f(P2.x, P2.y, z); g.f=MinPrintSpeedZ; g.comment = "Move Z"; g.e = E; gcode.commands.push_back(g); if(LayerNr < RaftBaseLayerCount) z+=RaftBaseThickness*LayerThickness; else z+=RaftInterfaceThickness*LayerThickness; // Move Z g.Code = ZMOVE; g.where = Vector3f(P2.x, P2.y, z); g.f=MinPrintSpeedZ; g.comment = "Move Z"; g.e = E; gcode.commands.push_back(g); LayerNr++; } }
void Model::MakeRaft(float &z) { vector<InFillHit> HitsBuffer; uint LayerNr = 0; float size = settings.Raft.Size; Vector2f raftMin = Vector2f(Min.x - size + printOffset.x, Min.y - size + printOffset.y); Vector2f raftMax = Vector2f(Max.x + size + printOffset.x, Max.y + size + printOffset.y); Vector2f Center = (Vector2f(Max.x + size, Max.y + size)-Vector2f(Min.x + size, Min.y + size))/2+Vector2f(printOffset.x, printOffset.y); float Length = sqrtf(2)*( ((raftMax.x)>(raftMax.y)? (raftMax.x):(raftMax.y)) - ((raftMin.x)<(raftMin.y)? (raftMin.x):(raftMin.y)) )/2.0f; // bbox of object float E = 0.0f; float rot; while(LayerNr < settings.Raft.Phase[0].LayerCount + settings.Raft.Phase[1].LayerCount) { Settings::RaftSettings::PhasePropertiesType *props; props = LayerNr < settings.Raft.Phase[0].LayerCount ? &settings.Raft.Phase[0] : &settings.Raft.Phase[1]; rot = (props->Rotation+(float)LayerNr * props->RotationPrLayer)/180.0f*M_PI; Vector2f InfillDirX(cosf(rot), sinf(rot)); Vector2f InfillDirY(-InfillDirX.y, InfillDirX.x); Vector3f LastPosition; bool reverseLines = false; Vector2f P1, P2; for(float x = -Length ; x < Length ; x+=props->Distance) { P1 = (InfillDirX * Length)+(InfillDirY*x) + Center; P2 = (InfillDirX * -Length)+(InfillDirY*x) + Center; if(reverseLines) { Vector2f tmp = P1; P1 = P2; P2 = tmp; } // glBegin(GL_LINES); // glVertex2fv(&P1.x); // glVertex2fv(&P2.x); // Crop lines to bbox*size Vector3f point; InFillHit hit; HitsBuffer.clear(); Vector2f P3(raftMin.x, raftMin.y); Vector2f P4(raftMin.x, raftMax.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit)) //Intersect edges of bbox HitsBuffer.push_back(hit); P3 = Vector2f(raftMax.x,raftMax.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit)) HitsBuffer.push_back(hit); P4 = Vector2f(raftMax.x,raftMin.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit)) HitsBuffer.push_back(hit); P3 = Vector2f(raftMin.x,raftMin.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit)) HitsBuffer.push_back(hit); // glEnd(); if(HitsBuffer.size() == 0) // it can only be 2 or zero continue; if(HitsBuffer.size() != 2) continue; std::sort(HitsBuffer.begin(), HitsBuffer.end(), InFillHitCompareFunc); P1 = HitsBuffer[0].p; P2 = HitsBuffer[1].p; MakeAcceleratedGCodeLine (Vector3f(P1.x,P1.y,z), Vector3f(P2.x,P2.y,z), props->MaterialDistanceRatio, gcode, E, z, settings.Slicing, settings.Hardware); reverseLines = !reverseLines; } // Set startspeed for Z-move Command g; g.Code = SETSPEED; g.where = Vector3f(P2.x, P2.y, z); g.f=settings.Hardware.MinPrintSpeedZ; g.comment = "Move Z"; g.e = E; gcode.commands.push_back(g); z += props->Thickness * settings.Hardware.LayerThickness; // Move Z g.Code = ZMOVE; g.where = Vector3f(P2.x, P2.y, z); g.f = settings.Hardware.MinPrintSpeedZ; g.comment = "Move Z"; g.e = E; gcode.commands.push_back(g); LayerNr++; } // restore the E state Command gotoE; gotoE.Code = GOTO; gotoE.e = 0; gotoE.comment = "Reset E for the remaining print"; gcode.commands.push_back(gotoE); }
vector<Vector2f> *CuttingPlane::CalcInFill (uint LayerNr, float InfillDistance, float InfillRotation, float InfillRotationPrLayer, bool DisplayDebuginFill) { int c=0; vector<InFillHit> HitsBuffer; float step = InfillDistance; vector<Vector2f> *infill = new vector<Vector2f>(); bool examine = false; float Length = sqrtf(2)*( ((Max.x)>(Max.y)? (Max.x):(Max.y)) - ((Min.x)<(Min.y)? (Min.x):(Min.y)) )/2.0f; // bbox of lines to intersect the poly with float rot = InfillRotation/180.0f*M_PI; rot += (float)LayerNr*InfillRotationPrLayer/180.0f*M_PI; Vector2f InfillDirX(cosf(rot), sinf(rot)); Vector2f InfillDirY(-InfillDirX.y, InfillDirX.x); Vector2f Center = (Max+Min)/2.0f; for(float x = -Length ; x < Length ; x+=step) { bool examineThis = true; HitsBuffer.clear(); Vector2f P1 = (InfillDirX * Length)+(InfillDirY*x)+ Center; Vector2f P2 = (InfillDirX * -Length)+(InfillDirY*x) + Center; if(DisplayDebuginFill) { glBegin(GL_LINES); glColor3f(0,0.2f,0); glVertex3f(P1.x, P1.y, Z); glVertex3f(P2.x, P2.y, Z); glEnd(); } float Examine = 0.5f; if(DisplayDebuginFill && !examine && ((Examine-0.5f)*2 * Length <= x)) { examineThis = examine = true; glColor3f(1,1,1); // Draw the line glVertex3f(P1.x, P1.y, Z); glVertex3f(P2.x, P2.y, Z); } if(offsetPolygons.size() != 0) { for(size_t p=0;p<offsetPolygons.size();p++) { for(size_t i=0;i<offsetPolygons[p].points.size();i++) { Vector2f P3 = offsetVertices[offsetPolygons[p].points[i]]; Vector2f P4 = offsetVertices[offsetPolygons[p].points[(i+1)%offsetPolygons[p].points.size()]]; Vector3f point; InFillHit hit; if (IntersectXY (P1,P2,P3,P4,hit)) HitsBuffer.push_back(hit); } } } /* else if(vertices.size() != 0) { // Fallback, collide with lines rather then polygons for(size_t i=0;i<lines.size();i++) { Vector2f P3 = vertices[lines[i].start]; Vector2f P4 = vertices[lines[i].end]; Vector3f point; InFillHit hit; if(IntersectXY(P1,P2,P3,P4,hit)) { if(examineThis) int a=0; HitsBuffer.push_back(hit); } } }*/ // Sort hits // Sort the vector using predicate and std::sort std::sort (HitsBuffer.begin(), HitsBuffer.end(), InFillHitCompareFunc); if(examineThis) { glPointSize(4); glBegin(GL_POINTS); for (size_t i=0;i<HitsBuffer.size();i++) glVertex3f(HitsBuffer[0].p.x, HitsBuffer[0].p.y, Z); glEnd(); glPointSize(1); } // Verify hits intregrety // Check if hit extists in table restart_check: for (size_t i=0;i<HitsBuffer.size();i++) { bool found = false; for (size_t j=i+1;j<HitsBuffer.size();j++) { if( ABS(HitsBuffer[i].d - HitsBuffer[j].d) < 0.0001) { found = true; // Delete both points, and continue HitsBuffer.erase(HitsBuffer.begin()+j); // If we are "Going IN" to solid material, and there's // more points, keep one of the points if (i != 0 && i != HitsBuffer.size()-1) HitsBuffer.erase(HitsBuffer.begin()+i); goto restart_check; } } if (found) continue; } // Sort hits by distance and transfer to InFill Buffer if (HitsBuffer.size() != 0 && HitsBuffer.size() % 2) continue; // There's a uneven number of hits, skip this infill line (U'll live) c = 0; // Color counter while (HitsBuffer.size()) { infill->push_back(HitsBuffer[0].p); if(examineThis) { switch(c) { case 0: glColor3f(1,0,0); break; case 1: glColor3f(0,1,0); break; case 2: glColor3f(0,0,1); break; case 3: glColor3f(1,1,0); break; case 4: glColor3f(0,1,1); break; case 5: glColor3f(1,0,1); break; case 6: glColor3f(1,1,1); break; case 7: glColor3f(1,0,0); break; case 8: glColor3f(0,1,0); break; case 9: glColor3f(0,0,1); break; case 10: glColor3f(1,1,0); break; case 11: glColor3f(0,1,1); break; case 12: glColor3f(1,0,1); break; case 13: glColor3f(1,1,1); break; } c++; glPointSize(10); glBegin(GL_POINTS); glVertex3f(HitsBuffer[0].p.x, HitsBuffer[0].p.y, Z); glEnd(); glPointSize(1); } HitsBuffer.erase(HitsBuffer.begin()); } } return infill; }
// old raft void Model::MakeRaft(GCodeState &state, double &z) { vector<Intersection> HitsBuffer; double raftSize = settings.Raft.Size; Vector3d raftMin = settings.Hardware.PrintMargin + Min; Vector3d raftMax = settings.Hardware.PrintMargin + Max + 2 * raftSize; Vector2d Center = Vector2d((raftMin.x + raftMax.x) / 2, (raftMin.y + raftMax.y) / 2); // bbox of object double Length = (std::max(raftMax.x,raftMax.y) - std::min(raftMin.x, raftMin.y))/sqrt(2.0); double rot; uint LayerNr = 0; uint layerCount = settings.Raft.Phase[0].LayerCount + settings.Raft.Phase[1].LayerCount; Settings::RaftSettings::PhasePropertiesType *props = &settings.Raft.Phase[0]; double thickness = props->Thickness * settings.Hardware.LayerThickness; double extrusionfactor = settings.Hardware.GetExtrudeFactor(thickness) * props->MaterialDistanceRatio; while(LayerNr < layerCount) { // If we finished phase 0, start phase 1 of the raft... if (LayerNr >= settings.Raft.Phase[0].LayerCount) props = &settings.Raft.Phase[1]; rot = (props->Rotation+(double)LayerNr * props->RotationPrLayer)/180.0*M_PI; Vector2d InfillDirX(cosf(rot), sinf(rot)); Vector2d InfillDirY(-InfillDirX.y, InfillDirX.x); Vector3d LastPosition; bool reverseLines = false; Vector2d P1, P2; double maxerr = 0.1*props->Distance; for(double x = -Length ; x < Length ; x+=props->Distance) { P1 = (InfillDirX * Length)+(InfillDirY*x) + Center; P2 = (InfillDirX * -Length)+(InfillDirY*x) + Center; if(reverseLines) { Vector2d tmp = P1; P1 = P2; P2 = tmp; } // glBegin(GL_LINES); // glVertex2fv(&P1.x); // glVertex2fv(&P2.x); // Crop lines to bbox*size Vector3d point; Intersection hit; HitsBuffer.clear(); Vector2d P3(raftMin.x, raftMin.y); Vector2d P4(raftMin.x, raftMax.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit,maxerr)) //Intersect edges of bbox HitsBuffer.push_back(hit); P3 = Vector2d(raftMax.x,raftMax.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit,maxerr)) HitsBuffer.push_back(hit); P4 = Vector2d(raftMax.x,raftMin.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit,maxerr)) HitsBuffer.push_back(hit); P3 = Vector2d(raftMin.x,raftMin.y); // glVertex2fv(&P3.x); // glVertex2fv(&P4.x); if(IntersectXY(P1,P2,P3,P4,hit,maxerr)) HitsBuffer.push_back(hit); // glEnd(); if(HitsBuffer.size() == 0) // it can only be 2 or zero continue; if(HitsBuffer.size() != 2) continue; std::sort(HitsBuffer.begin(), HitsBuffer.end()); P1 = HitsBuffer[0].p; P2 = HitsBuffer[1].p; state.MakeGCodeLine (Vector3d(P1.x,P1.y,z), Vector3d(P2.x,P2.y,z), Vector3d(0,0,0), 0, settings.Hardware.MaxPrintSpeedXY * 60, extrusionfactor, 0, z, settings.Slicing, settings.Hardware); reverseLines = !reverseLines; } // Set startspeed for Z-move Command g; g.Code = SETSPEED; g.where = Vector3d(P2.x, P2.y, z); g.f=settings.Hardware.MinPrintSpeedZ * 60; g.comment = "Move Z"; g.e = 0; gcode.commands.push_back(g); z += thickness; // Move Z g.Code = ZMOVE; g.where = Vector3d(P2.x, P2.y, z); g.f = settings.Hardware.MinPrintSpeedZ * 60; g.comment = "Move Z"; g.e = 0; gcode.commands.push_back(g); LayerNr++; } // restore the E state // Command gotoE; // gotoE.Code = GOTO; // gotoE.e = 0; // gotoE.comment = _("Reset E for the remaining print"); // gcode.commands.push_back(gotoE); }