std::list<gp_Pnt> VectorFont::Glyph::GlyphArc::Interpolate(const gp_Pnt & location, const unsigned int number_of_points ) const { std::list<gp_Pnt> points; gp_Pnt origin(location); origin.SetX( origin.X() + m_xcentre ); origin.SetY( origin.Y() + m_ycentre ); double start_angle = m_start_angle; double end_angle = m_end_angle; if (start_angle > end_angle) { end_angle += (2 * M_PI); } double increment = (end_angle - start_angle) / number_of_points; gp_Dir z_direction( 0, 0, 1 ); for (double angle = start_angle; angle <= end_angle; angle += increment) { gp_Pnt point( location.X() + m_xcentre + m_radius, location.Y() + m_ycentre, location.Z() ); gp_Trsf rotation_matrix; rotation_matrix.SetRotation( gp_Ax1(origin, z_direction), angle ); point.Transform(rotation_matrix); points.push_back(point); } return(points); }
/// find Z MAX endstop void home_z_positive() { queue_wait(); #if defined Z_MAX_PIN uint8_t denoise_count = 0; // home Z z_enable(); // hit home hard z_direction(1); while (denoise_count < 8) { // denoise if (z_max()) denoise_count++; else denoise_count = 0; // step z_step(); delay(5); unstep(); // wait until next step time delay((uint32_t) (60.0 * 1000000.0 / STEPS_PER_MM_Z / ((float) MAXIMUM_FEEDRATE_Z))); } denoise_count = 0; // back off slowly z_direction(0); while (z_max() != 0) { // step z_step(); delay(5); unstep(); // wait until next step time delay((uint32_t) (60.0 * 1000000.0 / STEPS_PER_MM_Z / ((float) SEARCH_FEEDRATE_Z))); } // set Z home TARGET t = {0, 0, 0, 0, 0}; // set position to MAX startpoint.Z = current_position.Z = (int32_t) (Z_MAX * STEPS_PER_MM_Z); // go to zero t.F = MAXIMUM_FEEDRATE_Z; enqueue(&t); #endif }
HeeksObj *VectorFont::Glyph::GlyphArc::Sketch( const gp_Pnt & location, const gp_Trsf & transformation_matrix, const float width, COrientationModifier *pOrientationModifier ) const { double start[3]; double end[3]; double centre[3]; double up[3]; gp_Pnt centre_point( location.X() + m_xcentre, location.Y() + m_ycentre, location.Z() ); gp_Pnt start_point( centre_point.X() + m_radius, centre_point.Y(), centre_point.Z() ); gp_Pnt end_point( centre_point.X() + m_radius, centre_point.Y(), centre_point.Z() ); gp_Dir z_direction( 0, 0, 1 ); if (pOrientationModifier) centre_point = pOrientationModifier->Transform(transformation_matrix, location.Distance(gp_Pnt(0.0,0.0,0.0)), centre_point, width ); if (pOrientationModifier) start_point = pOrientationModifier->Transform(transformation_matrix, location.Distance(gp_Pnt(0.0,0.0,0.0)), start_point, width ); gp_Trsf start_rotation_matrix; start_rotation_matrix.SetRotation( gp_Ax1(centre_point, z_direction), m_start_angle ); start_point.Transform(start_rotation_matrix); // Rotate to start_angle start[0] = start_point.X(); start[1] = start_point.Y(); start[2] = start_point.Z(); if (pOrientationModifier) end_point = pOrientationModifier->Transform(transformation_matrix, location.Distance(gp_Pnt(0.0,0.0,0.0)), end_point, width ); gp_Trsf end_rotation_matrix; end_rotation_matrix.SetRotation( gp_Ax1(centre_point, z_direction), m_end_angle ); end_point.Transform(end_rotation_matrix); // Rotate to start_angle end[0] = end_point.X(); end[1] = end_point.Y(); end[2] = end_point.Z(); centre[0] = centre_point.X(); centre[1] = centre_point.Y(); centre[2] = centre_point.Z(); gp_Pnt up_point( 0.0, 0.0, 1.0 ); // For counter-clockwise (always in this font format) up[0] = up_point.X(); up[1] = up_point.Y(); up[2] = up_point.Z(); HeeksObj *arc = heekscad_interface.NewArc( start, end, centre, up ); double m[16]; extract(transformation_matrix,m); arc->ModifyByMatrix(m); return(arc); } // End Sketch() method
/// find Z MIN endstop void home_z_negative() { queue_wait(); #if defined Z_MIN_PIN uint8_t denoise_count = 0; // home Z z_enable(); // hit home hard z_direction(0); while (denoise_count < 8) { // denoise if (z_min()) denoise_count++; else denoise_count = 0; // step z_step(); delay(5); unstep(); // wait until next step time delay((uint32_t) (60.0 * 1000000.0 / STEPS_PER_MM_Z / ((float) MAXIMUM_FEEDRATE_Z))); } denoise_count = 0; // back off slowly z_direction(1); while (z_min() != 0) { // step z_step(); delay(5); unstep(); // wait until next step time delay((uint32_t) (60.0 * 1000000.0 / STEPS_PER_MM_Z / ((float) SEARCH_FEEDRATE_Z))); } // set Z home startpoint.Z = current_position.Z = 0; z_disable(); #endif }