mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Merge remote-tracking branch 'origin/dev2' into lm_sla_supports_ui
This commit is contained in:
		
						commit
						b539a9148a
					
				
					 3 changed files with 45 additions and 29 deletions
				
			
		| 
						 | 
				
			
			@ -338,10 +338,9 @@ const unsigned int GLGizmoRotate::AngleResolution = 64;
 | 
			
		|||
const unsigned int GLGizmoRotate::ScaleStepsCount = 72;
 | 
			
		||||
const float GLGizmoRotate::ScaleStepRad = 2.0f * (float)PI / GLGizmoRotate::ScaleStepsCount;
 | 
			
		||||
const unsigned int GLGizmoRotate::ScaleLongEvery = 2;
 | 
			
		||||
const float GLGizmoRotate::ScaleLongTooth = 2.0f;
 | 
			
		||||
const float GLGizmoRotate::ScaleShortTooth = 1.0f;
 | 
			
		||||
const float GLGizmoRotate::ScaleLongTooth = 0.1f; // in percent of radius
 | 
			
		||||
const unsigned int GLGizmoRotate::SnapRegionsCount = 8;
 | 
			
		||||
const float GLGizmoRotate::GrabberOffset = 5.0f;
 | 
			
		||||
const float GLGizmoRotate::GrabberOffset = 0.15f; // in percent of radius
 | 
			
		||||
 | 
			
		||||
GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis)
 | 
			
		||||
    : GLGizmoBase(parent)
 | 
			
		||||
| 
						 | 
				
			
			@ -349,6 +348,10 @@ GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis)
 | 
			
		|||
    , m_angle(0.0)
 | 
			
		||||
    , m_center(0.0, 0.0, 0.0)
 | 
			
		||||
    , m_radius(0.0f)
 | 
			
		||||
    , m_snap_coarse_in_radius(0.0f)
 | 
			
		||||
    , m_snap_coarse_out_radius(0.0f)
 | 
			
		||||
    , m_snap_fine_in_radius(0.0f)
 | 
			
		||||
    , m_snap_fine_out_radius(0.0f)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -370,6 +373,10 @@ void GLGizmoRotate::on_start_dragging(const BoundingBoxf3& box)
 | 
			
		|||
{
 | 
			
		||||
    m_center = box.center();
 | 
			
		||||
    m_radius = Offset + box.radius();
 | 
			
		||||
    m_snap_coarse_in_radius = m_radius / 3.0f;
 | 
			
		||||
    m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius;
 | 
			
		||||
    m_snap_fine_in_radius = m_radius;
 | 
			
		||||
    m_snap_fine_out_radius = m_snap_fine_in_radius + m_radius * ScaleLongTooth;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GLGizmoRotate::on_update(const Linef3& mouse_ray, const Point* mouse_position)
 | 
			
		||||
| 
						 | 
				
			
			@ -385,20 +392,16 @@ void GLGizmoRotate::on_update(const Linef3& mouse_ray, const Point* mouse_positi
 | 
			
		|||
 | 
			
		||||
    double len = mouse_pos.norm();
 | 
			
		||||
 | 
			
		||||
    // snap to snap region
 | 
			
		||||
    double in_radius = (double)m_radius / 3.0;
 | 
			
		||||
    double out_radius = 2.0 * (double)in_radius;
 | 
			
		||||
    if ((in_radius <= len) && (len <= out_radius))
 | 
			
		||||
    // snap to coarse snap region
 | 
			
		||||
    if ((m_snap_coarse_in_radius <= len) && (len <= m_snap_coarse_out_radius))
 | 
			
		||||
    {
 | 
			
		||||
        double step = 2.0 * (double)PI / (double)SnapRegionsCount;
 | 
			
		||||
        theta = step * (double)std::round(theta / step);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        // snap to scale
 | 
			
		||||
        in_radius = (double)m_radius;
 | 
			
		||||
        out_radius = in_radius + (double)ScaleLongTooth;
 | 
			
		||||
        if ((in_radius <= len) && (len <= out_radius))
 | 
			
		||||
        // snap to fine snap region (scale)
 | 
			
		||||
        if ((m_snap_fine_in_radius <= len) && (len <= m_snap_fine_out_radius))
 | 
			
		||||
        {
 | 
			
		||||
            double step = 2.0 * (double)PI / (double)ScaleStepsCount;
 | 
			
		||||
            theta = step * (double)std::round(theta / step);
 | 
			
		||||
| 
						 | 
				
			
			@ -422,6 +425,10 @@ void GLGizmoRotate::on_render(const BoundingBoxf3& box) const
 | 
			
		|||
    {
 | 
			
		||||
        m_center = box.center();
 | 
			
		||||
        m_radius = Offset + box.radius();
 | 
			
		||||
        m_snap_coarse_in_radius = m_radius / 3.0f;
 | 
			
		||||
        m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius;
 | 
			
		||||
        m_snap_fine_in_radius = m_radius;
 | 
			
		||||
        m_snap_fine_out_radius = m_radius * (1.0f + ScaleLongTooth);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ::glEnable(GL_DEPTH_TEST);
 | 
			
		||||
| 
						 | 
				
			
			@ -479,8 +486,8 @@ void GLGizmoRotate::render_circle() const
 | 
			
		|||
 | 
			
		||||
void GLGizmoRotate::render_scale() const
 | 
			
		||||
{
 | 
			
		||||
    float out_radius_long = m_radius + ScaleLongTooth;
 | 
			
		||||
    float out_radius_short = m_radius + ScaleShortTooth;
 | 
			
		||||
    float out_radius_long = m_snap_fine_out_radius;
 | 
			
		||||
    float out_radius_short = m_radius * (1.0f + 0.5f * ScaleLongTooth);
 | 
			
		||||
 | 
			
		||||
    ::glBegin(GL_LINES);
 | 
			
		||||
    for (unsigned int i = 0; i < ScaleStepsCount; ++i)
 | 
			
		||||
| 
						 | 
				
			
			@ -529,14 +536,14 @@ void GLGizmoRotate::render_reference_radius() const
 | 
			
		|||
{
 | 
			
		||||
    ::glBegin(GL_LINES);
 | 
			
		||||
    ::glVertex3f(0.0f, 0.0f, 0.0f);
 | 
			
		||||
    ::glVertex3f((GLfloat)(m_radius + GrabberOffset), 0.0f, 0.0f);
 | 
			
		||||
    ::glVertex3f((GLfloat)(m_radius * (1.0f + GrabberOffset)), 0.0f, 0.0f);
 | 
			
		||||
    ::glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GLGizmoRotate::render_angle() const
 | 
			
		||||
{
 | 
			
		||||
    float step_angle = (float)m_angle / AngleResolution;
 | 
			
		||||
    float ex_radius = m_radius + GrabberOffset;
 | 
			
		||||
    float ex_radius = m_radius * (1.0f + GrabberOffset);
 | 
			
		||||
 | 
			
		||||
    ::glBegin(GL_LINE_STRIP);
 | 
			
		||||
    for (unsigned int i = 0; i <= AngleResolution; ++i)
 | 
			
		||||
| 
						 | 
				
			
			@ -552,7 +559,7 @@ void GLGizmoRotate::render_angle() const
 | 
			
		|||
 | 
			
		||||
void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) const
 | 
			
		||||
{
 | 
			
		||||
    double grabber_radius = (double)(m_radius + GrabberOffset);
 | 
			
		||||
    double grabber_radius = (double)m_radius * (1.0 + (double)GrabberOffset);
 | 
			
		||||
    m_grabbers[0].center = Vec3d(::cos(m_angle) * grabber_radius, ::sin(m_angle) * grabber_radius, 0.0);
 | 
			
		||||
    m_grabbers[0].angles(2) = m_angle;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -133,7 +133,6 @@ class GLGizmoRotate : public GLGizmoBase
 | 
			
		|||
    static const float ScaleStepRad;
 | 
			
		||||
    static const unsigned int ScaleLongEvery;
 | 
			
		||||
    static const float ScaleLongTooth;
 | 
			
		||||
    static const float ScaleShortTooth;
 | 
			
		||||
    static const unsigned int SnapRegionsCount;
 | 
			
		||||
    static const float GrabberOffset;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -152,6 +151,11 @@ private:
 | 
			
		|||
    mutable Vec3d m_center;
 | 
			
		||||
    mutable float m_radius;
 | 
			
		||||
 | 
			
		||||
    mutable float m_snap_coarse_in_radius;
 | 
			
		||||
    mutable float m_snap_coarse_out_radius;
 | 
			
		||||
    mutable float m_snap_fine_in_radius;
 | 
			
		||||
    mutable float m_snap_fine_out_radius;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    GLGizmoRotate(GLCanvas3D& parent, Axis axis);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1220,7 +1220,13 @@ void load_part(	ModelObject* model_object,
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		for ( auto object : model.objects) {
 | 
			
		||||
			for (auto volume : object->volumes) {
 | 
			
		||||
            Vec3d delta = Vec3d::Zero();
 | 
			
		||||
            if (model_object->origin_translation != Vec3d::Zero())
 | 
			
		||||
            {
 | 
			
		||||
                object->center_around_origin();
 | 
			
		||||
                delta = model_object->origin_translation - object->origin_translation;
 | 
			
		||||
            }
 | 
			
		||||
            for (auto volume : object->volumes) {
 | 
			
		||||
				auto new_volume = model_object->add_volume(*volume);
 | 
			
		||||
				new_volume->set_type(is_modifier ? ModelVolume::PARAMETER_MODIFIER : ModelVolume::MODEL_PART);
 | 
			
		||||
				boost::filesystem::path(input_file).filename().string();
 | 
			
		||||
| 
						 | 
				
			
			@ -1228,12 +1234,11 @@ void load_part(	ModelObject* model_object,
 | 
			
		|||
 | 
			
		||||
				part_names.Add(new_volume->name);
 | 
			
		||||
 | 
			
		||||
				// apply the same translation we applied to the object
 | 
			
		||||
				new_volume->mesh.translate( model_object->origin_translation(0),
 | 
			
		||||
											model_object->origin_translation(1), 
 | 
			
		||||
											model_object->origin_translation(2) );
 | 
			
		||||
				// set a default extruder value, since user can't add it manually
 | 
			
		||||
				new_volume->config.set_key_value("extruder", new ConfigOptionInt(0));
 | 
			
		||||
                if (delta != Vec3d::Zero())
 | 
			
		||||
                    new_volume->mesh.translate((float)delta(0), (float)delta(1), (float)delta(2));
 | 
			
		||||
 | 
			
		||||
                // set a default extruder value, since user can't add it manually
 | 
			
		||||
                new_volume->config.set_key_value("extruder", new ConfigOptionInt(0));
 | 
			
		||||
 | 
			
		||||
				m_parts_changed = true;
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -1446,12 +1451,12 @@ bool is_splittable_object(const bool split_part)
 | 
			
		|||
        return false;
 | 
			
		||||
 | 
			
		||||
    TriangleMeshPtrs meshptrs = volume->mesh.split();
 | 
			
		||||
    if (meshptrs.size() <= 1) {
 | 
			
		||||
        delete meshptrs.front();
 | 
			
		||||
        return false;
 | 
			
		||||
    bool splittable = meshptrs.size() > 1;
 | 
			
		||||
    for (TriangleMesh* m : meshptrs)
 | 
			
		||||
    {
 | 
			
		||||
        delete m;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
    return splittable;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void on_btn_split(const bool split_part)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue