FIX:import single_svg and split it(default)
jira: none Change-Id: I1d59a41fa7392fa3659ceae36c81a92d5f9dd5c6
This commit is contained in:
parent
e3330c6fba
commit
0e84f6acc7
|
@ -178,6 +178,8 @@ void AppConfig::set_defaults()
|
||||||
set_bool("enable_lod", true);
|
set_bool("enable_lod", true);
|
||||||
if (get("enable_opengl_multi_instance").empty())
|
if (get("enable_opengl_multi_instance").empty())
|
||||||
set_bool("enable_opengl_multi_instance", true);
|
set_bool("enable_opengl_multi_instance", true);
|
||||||
|
if (get("import_single_svg_and_split").empty())
|
||||||
|
set_bool("import_single_svg_and_split", true);
|
||||||
if (get("user_bed_type").empty())
|
if (get("user_bed_type").empty())
|
||||||
set_bool("user_bed_type", true);
|
set_bool("user_bed_type", true);
|
||||||
if (get("grabber_size_factor").empty())
|
if (get("grabber_size_factor").empty())
|
||||||
|
|
|
@ -374,7 +374,11 @@ void CreateObjectJob::process(Ctl &ctl)
|
||||||
if (m_input.base->shape.projection.use_surface) m_input.base->shape.projection.use_surface = false;
|
if (m_input.base->shape.projection.use_surface) m_input.base->shape.projection.use_surface = false;
|
||||||
|
|
||||||
// auto was_canceled = ::was_canceled(ctl, *m_input.base);
|
// auto was_canceled = ::was_canceled(ctl, *m_input.base);
|
||||||
m_result = create_mesh(*m_input.base);
|
if (m_input.base->merge_shape || !m_input.base->text_lines.empty()) { // || m_input.base->shape.shapes_with_ids.size() > 20
|
||||||
|
m_result = create_mesh(*m_input.base);
|
||||||
|
} else {
|
||||||
|
m_results = create_meshs(*m_input.base);
|
||||||
|
}
|
||||||
|
|
||||||
// Create new object
|
// Create new object
|
||||||
// calculate X,Y offset position for lay on platter in place of
|
// calculate X,Y offset position for lay on platter in place of
|
||||||
|
@ -407,7 +411,7 @@ void CreateObjectJob::finalize(bool canceled, std::exception_ptr &eptr)
|
||||||
{
|
{
|
||||||
if (!_finalize(canceled, eptr, *m_input.base)) return;
|
if (!_finalize(canceled, eptr, *m_input.base)) return;
|
||||||
// only for sure
|
// only for sure
|
||||||
if (m_result.empty()) {
|
if (m_result.empty() && m_results.empty()) {
|
||||||
create_message("Can't create empty object.");
|
create_message("Can't create empty object.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -425,13 +429,28 @@ void CreateObjectJob::finalize(bool canceled, std::exception_ptr &eptr)
|
||||||
new_object->name = m_input.base->volume_name;
|
new_object->name = m_input.base->volume_name;
|
||||||
new_object->add_instance(); // each object should have at list one instance
|
new_object->add_instance(); // each object should have at list one instance
|
||||||
|
|
||||||
ModelVolume *new_volume = new_object->add_volume(std::move(m_result));
|
if (!m_result.empty()) {
|
||||||
// set a default extruder value, since user can't add it manually
|
ModelVolume *new_volume = new_object->add_volume(std::move(m_result));
|
||||||
new_volume->config.set_key_value("extruder", new ConfigOptionInt(0));
|
// set a default extruder value, since user can't add it manually
|
||||||
|
new_volume->config.set_key_value("extruder", new ConfigOptionInt(0));
|
||||||
// write emboss data into volume
|
// write emboss data into volume
|
||||||
m_input.base->write(*new_volume);
|
m_input.base->write(*new_volume);
|
||||||
|
} else if (!m_results.empty()) {
|
||||||
|
int index = 0;
|
||||||
|
for (auto shape : m_input.base->shape.shapes_with_ids) {
|
||||||
|
if (shape.expoly.empty())
|
||||||
|
continue;
|
||||||
|
ModelVolume *new_volume = new_object->add_volume(std::move(m_results[index]));
|
||||||
|
// set a default extruder value, since user can't add it manually
|
||||||
|
new_volume->config.set_key_value("extruder", new ConfigOptionInt(0));
|
||||||
|
//donot write emboss data into volume
|
||||||
|
new_volume->name = new_object->name + "_" + std::to_string(index);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
create_message("CreateObjectJob:unknown error.");
|
||||||
|
}
|
||||||
// set transformation
|
// set transformation
|
||||||
Slic3r::Geometry::Transformation tr(m_transformation);
|
Slic3r::Geometry::Transformation tr(m_transformation);
|
||||||
new_object->instances.front()->set_transformation(tr);
|
new_object->instances.front()->set_transformation(tr);
|
||||||
|
@ -632,6 +651,26 @@ TriangleMesh create_mesh(DataBase &input)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<TriangleMesh> create_meshs(DataBase &input)
|
||||||
|
{
|
||||||
|
std::vector<TriangleMesh> meshs;
|
||||||
|
|
||||||
|
// NOTE: SHAPE_SCALE is applied in ProjectZ
|
||||||
|
double scale = input.shape.scale;
|
||||||
|
double depth = input.shape.projection.depth / scale;
|
||||||
|
auto projectZ = std::make_unique<ProjectZ>(depth);
|
||||||
|
float offset = input.is_outside ? -SAFE_SURFACE_OFFSET : (SAFE_SURFACE_OFFSET - input.shape.projection.depth);
|
||||||
|
if (input.from_surface.has_value()) offset += *input.from_surface;
|
||||||
|
Transform3d tr = Eigen::Translation<double, 3>(0., 0., static_cast<double>(offset)) * Eigen::Scaling(scale);
|
||||||
|
ProjectTransform project(std::move(projectZ), tr);
|
||||||
|
|
||||||
|
for (auto shape : input.shape.shapes_with_ids) {
|
||||||
|
if (shape.expoly.empty()) continue;
|
||||||
|
meshs.emplace_back(TriangleMesh(polygons2model(shape.expoly, project)));
|
||||||
|
}
|
||||||
|
return meshs;
|
||||||
|
}
|
||||||
|
|
||||||
void create_volume(
|
void create_volume(
|
||||||
TriangleMesh &&mesh, const ObjectID &object_id, const ModelVolumeType type, const std::optional<Transform3d> &trmat, const DataBase &data, unsigned char gizmo_type)
|
TriangleMesh &&mesh, const ObjectID &object_id, const ModelVolumeType type, const std::optional<Transform3d> &trmat, const DataBase &data, unsigned char gizmo_type)
|
||||||
{
|
{
|
||||||
|
@ -967,9 +1006,13 @@ bool start_update_volume(DataUpdate &&data, const ModelVolume &volume, const Sel
|
||||||
return execute_job(std::move(job));
|
return execute_job(std::move(job));
|
||||||
#endif // EXECUTE_UPDATE_ON_MAIN_THREAD
|
#endif // EXECUTE_UPDATE_ON_MAIN_THREAD
|
||||||
}
|
}
|
||||||
|
bool is_merge_shape_before_create_object() {
|
||||||
|
return GUI::wxGetApp().app_config->get_bool("import_single_svg_and_split") ? false : true;
|
||||||
|
}
|
||||||
|
|
||||||
bool start_create_object_job(const CreateVolumeParams &input, DataBasePtr emboss_data, const Vec2d &coor)
|
bool start_create_object_job(const CreateVolumeParams &input, DataBasePtr emboss_data, const Vec2d &coor)
|
||||||
{
|
{
|
||||||
|
emboss_data->merge_shape = input.merge_shape;
|
||||||
const Pointfs & bed_shape = input.build_volume.printable_area();
|
const Pointfs & bed_shape = input.build_volume.printable_area();
|
||||||
DataCreateObject m_input{std::move(emboss_data), coor, input.camera, bed_shape, input.gizmo_type, input.angle};
|
DataCreateObject m_input{std::move(emboss_data), coor, input.camera, bed_shape, input.gizmo_type, input.angle};
|
||||||
|
|
||||||
|
@ -1025,17 +1068,20 @@ bool start_create_volume_without_position(CreateVolumeParams &input, DataBasePtr
|
||||||
const ModelObjectPtrs &objects = selection.get_model()->objects;
|
const ModelObjectPtrs &objects = selection.get_model()->objects;
|
||||||
|
|
||||||
// No selected object so create new object
|
// No selected object so create new object
|
||||||
if (selection.is_empty() || object_idx < 0 || static_cast<size_t>(object_idx) >= objects.size())
|
if (selection.is_empty() || object_idx < 0 || static_cast<size_t>(object_idx) >= objects.size()){
|
||||||
// create Object on center of screen
|
// create Object on center of screen
|
||||||
// when ray throw center of screen not hit bed it create object on center of bed
|
// when ray throw center of screen not hit bed it create object on center of bed
|
||||||
|
input.merge_shape = is_merge_shape_before_create_object();
|
||||||
return start_create_object_job(input, std::move(data), screen_center);
|
return start_create_object_job(input, std::move(data), screen_center);
|
||||||
|
}
|
||||||
// create volume inside of selected object
|
// create volume inside of selected object
|
||||||
Vec2d coor;
|
Vec2d coor;
|
||||||
const Camera &camera = wxGetApp().plater()->get_camera();
|
const Camera &camera = wxGetApp().plater()->get_camera();
|
||||||
input.gl_volume = find_closest(selection, screen_center, camera, objects, &coor);
|
input.gl_volume = find_closest(selection, screen_center, camera, objects, &coor);
|
||||||
if (input.gl_volume == nullptr)
|
if (input.gl_volume == nullptr) {
|
||||||
|
input.merge_shape = is_merge_shape_before_create_object();
|
||||||
return start_create_object_job(input, std::move(data), screen_center);
|
return start_create_object_job(input, std::move(data), screen_center);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
return start_create_volume_on_surface_job(input, std::move(data), coor);
|
return start_create_volume_on_surface_job(input, std::move(data), coor);
|
||||||
}
|
}
|
||||||
|
@ -1097,6 +1143,7 @@ bool start_create_volume_on_surface_job(CreateVolumeParams &input, DataBasePtr d
|
||||||
// object. After right click, object is selected and object_idx is set
|
// object. After right click, object is selected and object_idx is set
|
||||||
// also hit must exist. But there is options to add text by object list
|
// also hit must exist. But there is options to add text by object list
|
||||||
if (!hit.has_value()) { // modify by bbs
|
if (!hit.has_value()) { // modify by bbs
|
||||||
|
input.merge_shape = is_merge_shape_before_create_object();
|
||||||
return start_create_object_job(input, std::move(data), mouse_pos); // return on_bad_state(std::move(data), object);
|
return start_create_object_job(input, std::move(data), mouse_pos); // return on_bad_state(std::move(data), object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1114,9 +1161,11 @@ bool start_create_volume(CreateVolumeParams &input, DataBasePtr data, const Vec2
|
||||||
if (data == nullptr) return false;
|
if (data == nullptr) return false;
|
||||||
if (!check(input)) return false;
|
if (!check(input)) return false;
|
||||||
|
|
||||||
if (input.gl_volume == nullptr || !input.gl_volume->selected)
|
if (input.gl_volume == nullptr || !input.gl_volume->selected) {
|
||||||
|
input.merge_shape = is_merge_shape_before_create_object();
|
||||||
// object is not under mouse position soo create object on plater
|
// object is not under mouse position soo create object on plater
|
||||||
return start_create_object_job(input, std::move(data), mouse_pos);
|
return start_create_object_job(input, std::move(data), mouse_pos);
|
||||||
|
}
|
||||||
else { // modify by bbs
|
else { // modify by bbs
|
||||||
return start_create_volume_on_surface_job(input, std::move(data), mouse_pos);
|
return start_create_volume_on_surface_job(input, std::move(data), mouse_pos);
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,6 +69,7 @@ public:
|
||||||
std::shared_ptr<std::atomic<bool>> cancel;
|
std::shared_ptr<std::atomic<bool>> cancel;
|
||||||
// shape to emboss
|
// shape to emboss
|
||||||
EmbossShape shape;
|
EmbossShape shape;
|
||||||
|
bool merge_shape{true};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DataCreateVolumeUtil : public DataBase // modfiy bu bbs //struct DataCreateVolume : public DataBase
|
struct DataCreateVolumeUtil : public DataBase // modfiy bu bbs //struct DataCreateVolume : public DataBase
|
||||||
|
@ -124,6 +125,7 @@ struct DataUpdate
|
||||||
std::optional<float> distance = {};
|
std::optional<float> distance = {};
|
||||||
// Wanted additionl rotation around Z of new created volume
|
// Wanted additionl rotation around Z of new created volume
|
||||||
std::optional<float> angle = {};
|
std::optional<float> angle = {};
|
||||||
|
bool merge_shape{true};
|
||||||
};
|
};
|
||||||
struct DataCreateObject
|
struct DataCreateObject
|
||||||
{
|
{
|
||||||
|
@ -251,6 +253,7 @@ class CreateObjectJob : public JobNew
|
||||||
{
|
{
|
||||||
DataCreateObject m_input;
|
DataCreateObject m_input;
|
||||||
TriangleMesh m_result;
|
TriangleMesh m_result;
|
||||||
|
std::vector<TriangleMesh> m_results;
|
||||||
Transform3d m_transformation;
|
Transform3d m_transformation;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -318,6 +321,7 @@ static ExPolygons create_shape(DataBase &input);
|
||||||
static TriangleMesh create_mesh_per_glyph(DataBase &input);
|
static TriangleMesh create_mesh_per_glyph(DataBase &input);
|
||||||
static TriangleMesh try_create_mesh(DataBase &input);
|
static TriangleMesh try_create_mesh(DataBase &input);
|
||||||
static TriangleMesh create_mesh(DataBase &input);
|
static TriangleMesh create_mesh(DataBase &input);
|
||||||
|
static std::vector<TriangleMesh> create_meshs(DataBase &input);
|
||||||
static indexed_triangle_set cut_surface_to_its(const ExPolygons &shapes, const Transform3d &tr, const SurfaceVolumeData::ModelSources &sources, DataBase &input);
|
static indexed_triangle_set cut_surface_to_its(const ExPolygons &shapes, const Transform3d &tr, const SurfaceVolumeData::ModelSources &sources, DataBase &input);
|
||||||
static TriangleMesh cut_per_glyph_surface(DataBase &input1, const SurfaceVolumeData &input2);
|
static TriangleMesh cut_per_glyph_surface(DataBase &input1, const SurfaceVolumeData &input2);
|
||||||
static TriangleMesh cut_surface(DataBase &input1, const SurfaceVolumeData &input2);
|
static TriangleMesh cut_surface(DataBase &input1, const SurfaceVolumeData &input2);
|
||||||
|
|
|
@ -1174,6 +1174,9 @@ wxWindow* PreferencesDialog::create_general_page()
|
||||||
auto item_show_shells_in_preview_settings = create_item_checkbox(_L("Always show shells in preview"), page,
|
auto item_show_shells_in_preview_settings = create_item_checkbox(_L("Always show shells in preview"), page,
|
||||||
_L("Always show shells or not in preview view tab.If change value,you should reslice."), 50,
|
_L("Always show shells or not in preview view tab.If change value,you should reslice."), 50,
|
||||||
"show_shells_in_preview");
|
"show_shells_in_preview");
|
||||||
|
auto item_import_single_svg_and_split = create_item_checkbox(_L("Import a single SVG and split it"), page,
|
||||||
|
_L("Import a single SVG and then split it to several parts."), 50,
|
||||||
|
"import_single_svg_and_split");
|
||||||
auto enable_lod_settings = create_item_checkbox(_L("Improve rendering performance by lod"), page,
|
auto enable_lod_settings = create_item_checkbox(_L("Improve rendering performance by lod"), page,
|
||||||
_L("Improved rendering performance under the scene of multiple plates and many models."), 50,
|
_L("Improved rendering performance under the scene of multiple plates and many models."), 50,
|
||||||
"enable_lod");
|
"enable_lod");
|
||||||
|
@ -1264,6 +1267,7 @@ wxWindow* PreferencesDialog::create_general_page()
|
||||||
sizer_page->Add(_3d_settings, 0, wxTOP | wxEXPAND, FromDIP(20));
|
sizer_page->Add(_3d_settings, 0, wxTOP | wxEXPAND, FromDIP(20));
|
||||||
sizer_page->Add(item_mouse_zoom_settings, 0, wxTOP, FromDIP(3));
|
sizer_page->Add(item_mouse_zoom_settings, 0, wxTOP, FromDIP(3));
|
||||||
sizer_page->Add(item_show_shells_in_preview_settings, 0, wxTOP, FromDIP(3));
|
sizer_page->Add(item_show_shells_in_preview_settings, 0, wxTOP, FromDIP(3));
|
||||||
|
sizer_page->Add(item_import_single_svg_and_split, 0, wxTOP, FromDIP(3));
|
||||||
sizer_page->Add(enable_opengl_multi_instance_rendering, 0, wxTOP, FromDIP(3));
|
sizer_page->Add(enable_opengl_multi_instance_rendering, 0, wxTOP, FromDIP(3));
|
||||||
sizer_page->Add(enable_lod_settings, 0, wxTOP, FromDIP(3));
|
sizer_page->Add(enable_lod_settings, 0, wxTOP, FromDIP(3));
|
||||||
sizer_page->Add(item_grabber_size_settings, 0, wxTOP, FromDIP(3));
|
sizer_page->Add(item_grabber_size_settings, 0, wxTOP, FromDIP(3));
|
||||||
|
|
Loading…
Reference in New Issue