mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-04-06 00:32:05 +02:00
Compare commits
1 Commits
nightly-bu
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce10bc1f0a |
2
.github/workflows/build_deps.yml
vendored
2
.github/workflows/build_deps.yml
vendored
@@ -52,7 +52,7 @@ jobs:
|
||||
|
||||
- name: setup dev on Windows
|
||||
if: runner.os == 'Windows'
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
uses: microsoft/setup-msbuild@v3
|
||||
|
||||
- name: Get the date on Ubuntu and macOS
|
||||
if: runner.os != 'Windows'
|
||||
|
||||
2
.github/workflows/build_orca.yml
vendored
2
.github/workflows/build_orca.yml
vendored
@@ -275,7 +275,7 @@ jobs:
|
||||
# Windows
|
||||
- name: setup MSVC
|
||||
if: runner.os == 'Windows'
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
uses: microsoft/setup-msbuild@v3
|
||||
|
||||
- name: Install nsis
|
||||
if: runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||
|
||||
@@ -1654,7 +1654,7 @@ msgid "Based on PrusaSlicer and BambuStudio"
|
||||
msgstr "Basierend auf PrusaSlicer und BambuStudio"
|
||||
|
||||
msgid "STEP files"
|
||||
msgstr "STEP Dateien"
|
||||
msgstr "SETP Dateien"
|
||||
|
||||
msgid "STL files"
|
||||
msgstr "STL Dateien"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Creality",
|
||||
"version": "02.03.02.61",
|
||||
"version": "02.03.02.60",
|
||||
"force_update": "0",
|
||||
"description": "Creality configurations",
|
||||
"machine_model_list": [
|
||||
|
||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 13 KiB |
@@ -5,9 +5,9 @@
|
||||
"nozzle_diameter": "0.2;0.4;0.6;0.8",
|
||||
"machine_tech": "FFF",
|
||||
"family": "Creality",
|
||||
"bed_model": "creality_k2_buildplate_model.stl",
|
||||
"bed_model": "creality_k1_buildplate_model.stl",
|
||||
"default_bed_type": "Textured PEI Plate",
|
||||
"bed_texture": "creality_k2_buildplate_texture.png",
|
||||
"bed_texture": "creality_k1_buildplate_texture.png",
|
||||
"hotend_model": "",
|
||||
"default_materials": "Creality Generic ABS @K2-all;Creality Generic ASA @K2-all;Creality Generic PETG @K2-all;Creality Generic PLA @K2-all;Creality Generic PLA High Speed @K2-all;Creality Generic PLA Matte @K2-all;Creality Generic PLA Silk @K2-all"
|
||||
}
|
||||
@@ -196,7 +196,7 @@ void group_region_by_fuzzify(PerimeterGenerator& g)
|
||||
surfaces.push_back(&surface);
|
||||
}
|
||||
|
||||
if (cfg.type != FuzzySkinType::None && cfg.type != FuzzySkinType::Disabled_fuzzy) {
|
||||
if (cfg.type != FuzzySkinType::None) {
|
||||
g.has_fuzzy_skin = true;
|
||||
if (cfg.type != FuzzySkinType::External) {
|
||||
g.has_fuzzy_hole = true;
|
||||
|
||||
@@ -5354,10 +5354,8 @@ void GCodeProcessor::process_M1020(const GCodeReader::GCodeLine &line)
|
||||
BOOST_LOG_TRIVIAL(error) << "Invalid M1020 command (" << line.raw() << ").";
|
||||
}
|
||||
else {
|
||||
if (eid >= m_result.filaments_count) {
|
||||
if (eid >= m_result.filaments_count)
|
||||
BOOST_LOG_TRIVIAL(error) << "Invalid M1020 command (" << line.raw() << ").";
|
||||
return;
|
||||
}
|
||||
process_filament_change(eid);
|
||||
}
|
||||
}
|
||||
@@ -5385,10 +5383,8 @@ void GCodeProcessor::process_T(const std::string_view command)
|
||||
BOOST_LOG_TRIVIAL(error) << "Invalid T command (" << command << ").";
|
||||
}
|
||||
else {
|
||||
if (eid >= m_result.filaments_count) {
|
||||
if (eid >= m_result.filaments_count)
|
||||
BOOST_LOG_TRIVIAL(error) << "Invalid T command (" << command << ").";
|
||||
return;
|
||||
}
|
||||
process_filament_change(eid);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4277,10 +4277,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
||||
p = p->GetParent();
|
||||
auto *top_level_wnd = dynamic_cast<wxTopLevelWindow*>(p);
|
||||
//Orca: Set focus so hotkeys like 'tab' work when a notification is shown.
|
||||
//But don't steal focus from text input controls.
|
||||
wxWindow* focused = wxWindow::FindFocus();
|
||||
bool focus_in_text_ctrl = dynamic_cast<wxTextCtrl*>(focused) != nullptr;
|
||||
if (top_level_wnd != nullptr && top_level_wnd->IsActive() && !focus_in_text_ctrl)
|
||||
if (top_level_wnd != nullptr && top_level_wnd->IsActive())
|
||||
m_canvas->SetFocus();
|
||||
}
|
||||
m_mouse.position = pos.cast<double>();
|
||||
|
||||
@@ -750,51 +750,18 @@ wxMenuItem* MenuFactory::append_menu_item_settings(wxMenu* menu_)
|
||||
|
||||
wxMenuItem* MenuFactory::append_menu_item_change_type(wxMenu* menu)
|
||||
{
|
||||
const wxString menu_name = _L("Change type");
|
||||
|
||||
// Delete old menu item if exists
|
||||
const int item_id = menu->FindItem(menu_name);
|
||||
if (item_id != wxNOT_FOUND)
|
||||
menu->Destroy(item_id);
|
||||
|
||||
// Create submenu
|
||||
wxMenu* type_menu = new wxMenu();
|
||||
|
||||
struct TypeInfo {
|
||||
ModelVolumeType type;
|
||||
wxString label;
|
||||
};
|
||||
|
||||
std::vector<TypeInfo> types = {
|
||||
{ ModelVolumeType::MODEL_PART, _L("Part") },
|
||||
{ ModelVolumeType::NEGATIVE_VOLUME, _L("Negative Part") },
|
||||
{ ModelVolumeType::PARAMETER_MODIFIER, _L("Modifier") },
|
||||
{ ModelVolumeType::SUPPORT_BLOCKER, _L("Support Blocker") },
|
||||
{ ModelVolumeType::SUPPORT_ENFORCER, _L("Support Enforcer") }
|
||||
};
|
||||
|
||||
for (const auto& info : types) {
|
||||
wxMenuItem* item = append_menu_check_item(type_menu, wxID_ANY, info.label, "",
|
||||
[type = info.type](wxCommandEvent&) { obj_list()->set_volume_type(type); }, type_menu);
|
||||
|
||||
// Update checkmark dynamically when menu is shown - check all selected volumes
|
||||
m_parent->Bind(wxEVT_UPDATE_UI, [type = info.type](wxUpdateUIEvent& evt) {
|
||||
bool has_type = false;
|
||||
wxDataViewItemArray sels;
|
||||
obj_list()->GetSelections(sels);
|
||||
for (auto item : sels) {
|
||||
ModelVolumeType vol_type = obj_list()->GetModel()->GetVolumeType(item);
|
||||
if (vol_type == type) {
|
||||
has_type = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
evt.Check(has_type);
|
||||
}, item->GetId());
|
||||
}
|
||||
|
||||
menu->Append(wxID_ANY, menu_name, type_menu, _L("Change part type"));
|
||||
return nullptr;
|
||||
return append_menu_item(menu, wxID_ANY, _L("Change type"), "",
|
||||
[](wxCommandEvent&) { obj_list()->change_part_type(); }, "", menu,
|
||||
[]() {
|
||||
wxDataViewItemArray selections;
|
||||
obj_list()->GetSelections(selections);
|
||||
if (selections.empty()) return false;
|
||||
for (const auto& it : selections) {
|
||||
if (!(obj_list()->GetModel()->GetItemType(it) & itVolume))
|
||||
return false; // non-volume present -> disable
|
||||
}
|
||||
return true;
|
||||
}, m_parent);
|
||||
}
|
||||
|
||||
wxMenuItem* MenuFactory::append_menu_item_instance_to_object(wxMenu* menu)
|
||||
|
||||
@@ -5538,136 +5538,6 @@ void ObjectList::change_part_type()
|
||||
return;
|
||||
}
|
||||
|
||||
ModelVolumeType ObjectList::get_selected_volume_type()
|
||||
{
|
||||
ModelVolume* volume = get_selected_model_volume();
|
||||
if (volume)
|
||||
return volume->type();
|
||||
return ModelVolumeType::INVALID;
|
||||
}
|
||||
|
||||
void ObjectList::set_volume_type(ModelVolumeType new_type)
|
||||
{
|
||||
struct VolumeSelection {
|
||||
int object_idx;
|
||||
ModelVolume* volume;
|
||||
};
|
||||
|
||||
std::vector<VolumeSelection> volumes;
|
||||
auto add_volume = [&volumes](int obj_idx, ModelVolume* volume) {
|
||||
if (volume == nullptr)
|
||||
return;
|
||||
auto it = std::find_if(volumes.begin(), volumes.end(), [volume](const VolumeSelection& other) { return other.volume == volume; });
|
||||
if (it == volumes.end())
|
||||
volumes.push_back({ obj_idx, volume });
|
||||
};
|
||||
|
||||
wxDataViewItemArray sels;
|
||||
GetSelections(sels);
|
||||
for (auto item : sels) {
|
||||
wxDataViewItem volume_item = item;
|
||||
ItemType type = m_objects_model->GetItemType(item);
|
||||
if (!(type & itVolume)) {
|
||||
if ((type & itSettings) && (m_objects_model->GetItemType(m_objects_model->GetParent(item)) & itVolume))
|
||||
volume_item = m_objects_model->GetParent(item);
|
||||
else
|
||||
continue;
|
||||
}
|
||||
|
||||
const int obj_idx = m_objects_model->GetObjectIdByItem(volume_item);
|
||||
const int vol_idx = m_objects_model->GetVolumeIdByItem(volume_item);
|
||||
if (obj_idx < 0 || vol_idx < 0 || obj_idx >= m_objects->size())
|
||||
continue;
|
||||
|
||||
const int real_idx = m_objects_model->get_real_volume_index_in_3d(obj_idx, vol_idx);
|
||||
if (real_idx < 0 || real_idx >= (*m_objects)[obj_idx]->volumes.size())
|
||||
continue;
|
||||
|
||||
add_volume(obj_idx, (*m_objects)[obj_idx]->volumes[real_idx]);
|
||||
}
|
||||
|
||||
auto collect_from_canvas = [&add_volume](GLCanvas3D* canvas) {
|
||||
if (canvas == nullptr)
|
||||
return;
|
||||
const Selection& selection = canvas->get_selection();
|
||||
for (auto idx : selection.get_volume_idxs()) {
|
||||
const GLVolume* gl_volume = selection.get_volume(idx);
|
||||
if (gl_volume == nullptr || gl_volume->object_idx() < 0)
|
||||
continue;
|
||||
ModelVolume* volume = get_model_volume(*gl_volume, selection.get_model()->objects);
|
||||
add_volume(gl_volume->object_idx(), volume);
|
||||
}
|
||||
};
|
||||
|
||||
if (volumes.empty()) {
|
||||
collect_from_canvas(wxGetApp().plater()->canvas3D());
|
||||
if (volumes.empty()) {
|
||||
auto canvas_type = wxGetApp().plater()->get_current_canvas3D()->get_canvas_type();
|
||||
if (canvas_type == GLCanvas3D::ECanvasType::CanvasView3D && is_connectors_item_selected())
|
||||
collect_from_canvas(wxGetApp().plater()->get_view3D_canvas3D());
|
||||
}
|
||||
if (volumes.empty())
|
||||
return;
|
||||
}
|
||||
|
||||
const bool any_diff = std::any_of(volumes.begin(), volumes.end(),
|
||||
[new_type](const VolumeSelection& sel) { return sel.volume->type() != new_type; });
|
||||
|
||||
if (!any_diff)
|
||||
return;
|
||||
|
||||
if (new_type != ModelVolumeType::MODEL_PART) {
|
||||
std::map<int, int> total_part_cnt;
|
||||
std::map<int, int> selected_part_cnt;
|
||||
|
||||
for (const auto& sel : volumes) {
|
||||
if (total_part_cnt.find(sel.object_idx) == total_part_cnt.end()) {
|
||||
int count = 0;
|
||||
for (auto vol : (*m_objects)[sel.object_idx]->volumes)
|
||||
if (vol->type() == ModelVolumeType::MODEL_PART)
|
||||
++count;
|
||||
total_part_cnt.emplace(sel.object_idx, count);
|
||||
}
|
||||
if (sel.volume->type() == ModelVolumeType::MODEL_PART)
|
||||
++selected_part_cnt[sel.object_idx];
|
||||
}
|
||||
|
||||
for (const auto& sel : selected_part_cnt) {
|
||||
auto it = total_part_cnt.find(sel.first);
|
||||
if (it != total_part_cnt.end() && it->second > 0 && sel.second == it->second) {
|
||||
Slic3r::GUI::show_error(nullptr, _(L("The type of the last solid object part is not to be changed.")));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
take_snapshot("Change part type");
|
||||
|
||||
std::set<const ModelVolume*> changed_volumes;
|
||||
std::set<int> touched_objects;
|
||||
for (const auto& sel : volumes) {
|
||||
sel.volume->set_type(new_type);
|
||||
changed_volumes.insert(sel.volume);
|
||||
touched_objects.insert(sel.object_idx);
|
||||
}
|
||||
|
||||
wxDataViewItemArray new_selection;
|
||||
for (int obj_idx : touched_objects) {
|
||||
wxDataViewItemArray sel_items = reorder_volumes_and_get_selection(obj_idx, [&changed_volumes](const ModelVolume* volume) {
|
||||
return changed_volumes.find(volume) != changed_volumes.end();
|
||||
});
|
||||
for (const auto& item : sel_items)
|
||||
new_selection.push_back(item);
|
||||
}
|
||||
|
||||
if (!new_selection.IsEmpty()) {
|
||||
m_prevent_list_events = true;
|
||||
UnselectAll();
|
||||
SetSelections(new_selection);
|
||||
m_prevent_list_events = false;
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectList::last_volume_is_deleted(const int obj_idx)
|
||||
{
|
||||
// BBS: object (obj_idx calc in obj list) is already removed from m_objects in Plater::priv::remove().
|
||||
|
||||
@@ -414,8 +414,6 @@ public:
|
||||
|
||||
ModelVolume* get_selected_model_volume();
|
||||
void change_part_type();
|
||||
void set_volume_type(ModelVolumeType new_type);
|
||||
ModelVolumeType get_selected_volume_type();
|
||||
|
||||
void last_volume_is_deleted(const int obj_idx);
|
||||
void update_and_show_object_settings_item();
|
||||
|
||||
Reference in New Issue
Block a user