mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-21 21:58:03 -06:00
Tech ENABLE_ALLOW_NEGATIVE_Z-> Fixed build on non-Windows OS
This commit is contained in:
parent
1c3090b11f
commit
57199b4116
1 changed files with 32 additions and 55 deletions
|
@ -2630,8 +2630,10 @@ int Plater::priv::get_selected_volume_idx() const
|
||||||
void Plater::priv::selection_changed()
|
void Plater::priv::selection_changed()
|
||||||
{
|
{
|
||||||
// if the selection is not valid to allow for layer editing, we need to turn off the tool if it is running
|
// if the selection is not valid to allow for layer editing, we need to turn off the tool if it is running
|
||||||
if (!layers_height_allowed() && view3D->is_layers_editing_enabled())
|
if (!layers_height_allowed() && view3D->is_layers_editing_enabled()) {
|
||||||
on_action_layersediting(SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING));
|
SimpleEvent evt(EVT_GLTOOLBAR_LAYERSEDITING);
|
||||||
|
on_action_layersediting(evt);
|
||||||
|
}
|
||||||
|
|
||||||
// forces a frame render to update the view (to avoid a missed update if, for example, the context menu appears)
|
// forces a frame render to update the view (to avoid a missed update if, for example, the context menu appears)
|
||||||
view3D->render();
|
view3D->render();
|
||||||
|
@ -3069,21 +3071,19 @@ void Plater::priv::reload_from_disk()
|
||||||
int volume_idx;
|
int volume_idx;
|
||||||
|
|
||||||
// operators needed by std::algorithms
|
// operators needed by std::algorithms
|
||||||
bool operator < (const SelectedVolume& other) const { return (object_idx < other.object_idx) || ((object_idx == other.object_idx) && (volume_idx < other.volume_idx)); }
|
bool operator < (const SelectedVolume& other) const { return object_idx < other.object_idx || (object_idx == other.object_idx && volume_idx < other.volume_idx); }
|
||||||
bool operator == (const SelectedVolume& other) const { return (object_idx == other.object_idx) && (volume_idx == other.volume_idx); }
|
bool operator == (const SelectedVolume& other) const { return object_idx == other.object_idx && volume_idx == other.volume_idx; }
|
||||||
};
|
};
|
||||||
std::vector<SelectedVolume> selected_volumes;
|
std::vector<SelectedVolume> selected_volumes;
|
||||||
|
|
||||||
// collects selected ModelVolumes
|
// collects selected ModelVolumes
|
||||||
const std::set<unsigned int>& selected_volumes_idxs = selection.get_volume_idxs();
|
const std::set<unsigned int>& selected_volumes_idxs = selection.get_volume_idxs();
|
||||||
for (unsigned int idx : selected_volumes_idxs)
|
for (unsigned int idx : selected_volumes_idxs) {
|
||||||
{
|
|
||||||
const GLVolume* v = selection.get_volume(idx);
|
const GLVolume* v = selection.get_volume(idx);
|
||||||
int v_idx = v->volume_idx();
|
int v_idx = v->volume_idx();
|
||||||
if (v_idx >= 0)
|
if (v_idx >= 0) {
|
||||||
{
|
|
||||||
int o_idx = v->object_idx();
|
int o_idx = v->object_idx();
|
||||||
if ((0 <= o_idx) && (o_idx < (int)model.objects.size()))
|
if (0 <= o_idx && o_idx < (int)model.objects.size())
|
||||||
selected_volumes.push_back({ o_idx, v_idx });
|
selected_volumes.push_back({ o_idx, v_idx });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3093,13 +3093,11 @@ void Plater::priv::reload_from_disk()
|
||||||
// collects paths of files to load
|
// collects paths of files to load
|
||||||
std::vector<fs::path> input_paths;
|
std::vector<fs::path> input_paths;
|
||||||
std::vector<fs::path> missing_input_paths;
|
std::vector<fs::path> missing_input_paths;
|
||||||
for (const SelectedVolume& v : selected_volumes)
|
for (const SelectedVolume& v : selected_volumes) {
|
||||||
{
|
|
||||||
const ModelObject* object = model.objects[v.object_idx];
|
const ModelObject* object = model.objects[v.object_idx];
|
||||||
const ModelVolume* volume = object->volumes[v.volume_idx];
|
const ModelVolume* volume = object->volumes[v.volume_idx];
|
||||||
|
|
||||||
if (!volume->source.input_file.empty())
|
if (!volume->source.input_file.empty()) {
|
||||||
{
|
|
||||||
if (fs::exists(volume->source.input_file))
|
if (fs::exists(volume->source.input_file))
|
||||||
input_paths.push_back(volume->source.input_file);
|
input_paths.push_back(volume->source.input_file);
|
||||||
else
|
else
|
||||||
|
@ -3112,8 +3110,7 @@ void Plater::priv::reload_from_disk()
|
||||||
std::sort(missing_input_paths.begin(), missing_input_paths.end());
|
std::sort(missing_input_paths.begin(), missing_input_paths.end());
|
||||||
missing_input_paths.erase(std::unique(missing_input_paths.begin(), missing_input_paths.end()), missing_input_paths.end());
|
missing_input_paths.erase(std::unique(missing_input_paths.begin(), missing_input_paths.end()), missing_input_paths.end());
|
||||||
|
|
||||||
while (!missing_input_paths.empty())
|
while (!missing_input_paths.empty()) {
|
||||||
{
|
|
||||||
// ask user to select the missing file
|
// ask user to select the missing file
|
||||||
fs::path search = missing_input_paths.back();
|
fs::path search = missing_input_paths.back();
|
||||||
wxString title = _L("Please select the file to reload");
|
wxString title = _L("Please select the file to reload");
|
||||||
|
@ -3127,21 +3124,18 @@ void Plater::priv::reload_from_disk()
|
||||||
|
|
||||||
std::string sel_filename_path = dialog.GetPath().ToUTF8().data();
|
std::string sel_filename_path = dialog.GetPath().ToUTF8().data();
|
||||||
std::string sel_filename = fs::path(sel_filename_path).filename().string();
|
std::string sel_filename = fs::path(sel_filename_path).filename().string();
|
||||||
if (boost::algorithm::iequals(search.filename().string(), sel_filename))
|
if (boost::algorithm::iequals(search.filename().string(), sel_filename)) {
|
||||||
{
|
|
||||||
input_paths.push_back(sel_filename_path);
|
input_paths.push_back(sel_filename_path);
|
||||||
missing_input_paths.pop_back();
|
missing_input_paths.pop_back();
|
||||||
|
|
||||||
fs::path sel_path = fs::path(sel_filename_path).remove_filename().string();
|
fs::path sel_path = fs::path(sel_filename_path).remove_filename().string();
|
||||||
|
|
||||||
std::vector<fs::path>::iterator it = missing_input_paths.begin();
|
std::vector<fs::path>::iterator it = missing_input_paths.begin();
|
||||||
while (it != missing_input_paths.end())
|
while (it != missing_input_paths.end()) {
|
||||||
{
|
|
||||||
// try to use the path of the selected file with all remaining missing files
|
// try to use the path of the selected file with all remaining missing files
|
||||||
fs::path repathed_filename = sel_path;
|
fs::path repathed_filename = sel_path;
|
||||||
repathed_filename /= it->filename();
|
repathed_filename /= it->filename();
|
||||||
if (fs::exists(repathed_filename))
|
if (fs::exists(repathed_filename)) {
|
||||||
{
|
|
||||||
input_paths.push_back(repathed_filename.string());
|
input_paths.push_back(repathed_filename.string());
|
||||||
it = missing_input_paths.erase(it);
|
it = missing_input_paths.erase(it);
|
||||||
}
|
}
|
||||||
|
@ -3149,8 +3143,7 @@ void Plater::priv::reload_from_disk()
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
wxString message = _L("It is not allowed to change the file to reload") + " (" + from_u8(search.filename().string()) + ").\n" + _L("Do you want to retry") + " ?";
|
wxString message = _L("It is not allowed to change the file to reload") + " (" + from_u8(search.filename().string()) + ").\n" + _L("Do you want to retry") + " ?";
|
||||||
wxMessageDialog dlg(q, message, wxMessageBoxCaptionStr, wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION);
|
wxMessageDialog dlg(q, message, wxMessageBoxCaptionStr, wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION);
|
||||||
if (dlg.ShowModal() != wxID_YES)
|
if (dlg.ShowModal() != wxID_YES)
|
||||||
|
@ -3164,8 +3157,7 @@ void Plater::priv::reload_from_disk()
|
||||||
std::vector<wxString> fail_list;
|
std::vector<wxString> fail_list;
|
||||||
|
|
||||||
// load one file at a time
|
// load one file at a time
|
||||||
for (size_t i = 0; i < input_paths.size(); ++i)
|
for (size_t i = 0; i < input_paths.size(); ++i) {
|
||||||
{
|
|
||||||
const auto& path = input_paths[i].string();
|
const auto& path = input_paths[i].string();
|
||||||
|
|
||||||
wxBusyCursor wait;
|
wxBusyCursor wait;
|
||||||
|
@ -3175,8 +3167,7 @@ void Plater::priv::reload_from_disk()
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
new_model = Model::read_from_file(path, nullptr, true, false);
|
new_model = Model::read_from_file(path, nullptr, true, false);
|
||||||
for (ModelObject* model_object : new_model.objects)
|
for (ModelObject* model_object : new_model.objects) {
|
||||||
{
|
|
||||||
model_object->center_around_origin();
|
model_object->center_around_origin();
|
||||||
model_object->ensure_on_bed();
|
model_object->ensure_on_bed();
|
||||||
}
|
}
|
||||||
|
@ -3188,34 +3179,27 @@ void Plater::priv::reload_from_disk()
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the selected volumes whose source is the current file
|
// update the selected volumes whose source is the current file
|
||||||
for (const SelectedVolume& sel_v : selected_volumes)
|
for (const SelectedVolume& sel_v : selected_volumes) {
|
||||||
{
|
|
||||||
ModelObject* old_model_object = model.objects[sel_v.object_idx];
|
ModelObject* old_model_object = model.objects[sel_v.object_idx];
|
||||||
ModelVolume* old_volume = old_model_object->volumes[sel_v.volume_idx];
|
ModelVolume* old_volume = old_model_object->volumes[sel_v.volume_idx];
|
||||||
|
|
||||||
bool has_source = !old_volume->source.input_file.empty() && boost::algorithm::iequals(fs::path(old_volume->source.input_file).filename().string(), fs::path(path).filename().string());
|
bool has_source = !old_volume->source.input_file.empty() && boost::algorithm::iequals(fs::path(old_volume->source.input_file).filename().string(), fs::path(path).filename().string());
|
||||||
bool has_name = !old_volume->name.empty() && boost::algorithm::iequals(old_volume->name, fs::path(path).filename().string());
|
bool has_name = !old_volume->name.empty() && boost::algorithm::iequals(old_volume->name, fs::path(path).filename().string());
|
||||||
if (has_source || has_name)
|
if (has_source || has_name) {
|
||||||
{
|
|
||||||
int new_volume_idx = -1;
|
int new_volume_idx = -1;
|
||||||
int new_object_idx = -1;
|
int new_object_idx = -1;
|
||||||
if (has_source)
|
if (has_source) {
|
||||||
{
|
|
||||||
// take idxs from source
|
// take idxs from source
|
||||||
new_volume_idx = old_volume->source.volume_idx;
|
new_volume_idx = old_volume->source.volume_idx;
|
||||||
new_object_idx = old_volume->source.object_idx;
|
new_object_idx = old_volume->source.object_idx;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
// take idxs from the 1st matching volume
|
// take idxs from the 1st matching volume
|
||||||
for (size_t o = 0; o < new_model.objects.size(); ++o)
|
for (size_t o = 0; o < new_model.objects.size(); ++o) {
|
||||||
{
|
|
||||||
ModelObject* obj = new_model.objects[o];
|
ModelObject* obj = new_model.objects[o];
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (size_t v = 0; v < obj->volumes.size(); ++v)
|
for (size_t v = 0; v < obj->volumes.size(); ++v) {
|
||||||
{
|
if (obj->volumes[v]->name == old_volume->name) {
|
||||||
if (obj->volumes[v]->name == old_volume->name)
|
|
||||||
{
|
|
||||||
new_volume_idx = (int)v;
|
new_volume_idx = (int)v;
|
||||||
new_object_idx = (int)o;
|
new_object_idx = (int)o;
|
||||||
found = true;
|
found = true;
|
||||||
|
@ -3227,19 +3211,16 @@ void Plater::priv::reload_from_disk()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((new_object_idx < 0) && ((int)new_model.objects.size() <= new_object_idx))
|
if (new_object_idx < 0 && (int)new_model.objects.size() <= new_object_idx) {
|
||||||
{
|
|
||||||
fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name));
|
fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ModelObject* new_model_object = new_model.objects[new_object_idx];
|
ModelObject* new_model_object = new_model.objects[new_object_idx];
|
||||||
if ((new_volume_idx < 0) && ((int)new_model.objects.size() <= new_volume_idx))
|
if (new_volume_idx < 0 && (int)new_model.objects.size() <= new_volume_idx) {
|
||||||
{
|
|
||||||
fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name));
|
fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (new_volume_idx < (int)new_model_object->volumes.size())
|
if (new_volume_idx < (int)new_model_object->volumes.size()) {
|
||||||
{
|
|
||||||
old_model_object->add_volume(*new_model_object->volumes[new_volume_idx]);
|
old_model_object->add_volume(*new_model_object->volumes[new_volume_idx]);
|
||||||
ModelVolume* new_volume = old_model_object->volumes.back();
|
ModelVolume* new_volume = old_model_object->volumes.back();
|
||||||
new_volume->set_new_unique_id();
|
new_volume->set_new_unique_id();
|
||||||
|
@ -3264,11 +3245,9 @@ void Plater::priv::reload_from_disk()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fail_list.empty())
|
if (!fail_list.empty()) {
|
||||||
{
|
|
||||||
wxString message = _L("Unable to reload:") + "\n";
|
wxString message = _L("Unable to reload:") + "\n";
|
||||||
for (const wxString& s : fail_list)
|
for (const wxString& s : fail_list) {
|
||||||
{
|
|
||||||
message += s + "\n";
|
message += s + "\n";
|
||||||
}
|
}
|
||||||
wxMessageDialog dlg(q, message, _L("Error during reload"), wxOK | wxOK_DEFAULT | wxICON_WARNING);
|
wxMessageDialog dlg(q, message, _L("Error during reload"), wxOK | wxOK_DEFAULT | wxICON_WARNING);
|
||||||
|
@ -3279,8 +3258,7 @@ void Plater::priv::reload_from_disk()
|
||||||
update();
|
update();
|
||||||
|
|
||||||
// new GLVolumes have been created at this point, so update their printable state
|
// new GLVolumes have been created at this point, so update their printable state
|
||||||
for (size_t i = 0; i < model.objects.size(); ++i)
|
for (size_t i = 0; i < model.objects.size(); ++i) {
|
||||||
{
|
|
||||||
view3D->get_canvas3d()->update_instance_printable_state_for_object(i);
|
view3D->get_canvas3d()->update_instance_printable_state_for_object(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3300,8 +3278,7 @@ void Plater::priv::reload_all_from_disk()
|
||||||
reload_from_disk();
|
reload_from_disk();
|
||||||
// restore previous selection
|
// restore previous selection
|
||||||
selection.clear();
|
selection.clear();
|
||||||
for (unsigned int idx : curr_idxs)
|
for (unsigned int idx : curr_idxs) {
|
||||||
{
|
|
||||||
selection.add(idx, false);
|
selection.add(idx, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue