2018-06-13 14:39:33 +00:00
|
|
|
#include "GUI.hpp"
|
|
|
|
#include "GUI_ObjectParts.hpp"
|
2018-06-14 13:33:42 +00:00
|
|
|
#include "Model.hpp"
|
|
|
|
#include "wxExtensions.hpp"
|
2018-06-15 20:42:51 +00:00
|
|
|
#include "LambdaObjectDialog.hpp"
|
|
|
|
#include "../../libslic3r/Utils.hpp"
|
2018-06-13 14:39:33 +00:00
|
|
|
|
|
|
|
#include <wx/msgdlg.h>
|
2018-06-14 13:33:42 +00:00
|
|
|
#include <wx/frame.h>
|
|
|
|
#include <boost/filesystem.hpp>
|
2018-06-13 14:39:33 +00:00
|
|
|
|
|
|
|
namespace Slic3r
|
|
|
|
{
|
|
|
|
namespace GUI
|
|
|
|
{
|
2018-06-14 13:33:42 +00:00
|
|
|
bool m_parts_changed = false;
|
|
|
|
bool m_part_settings_changed = false;
|
|
|
|
|
|
|
|
bool is_parts_changed(){return m_parts_changed;}
|
|
|
|
bool is_part_settings_changed(){ return m_part_settings_changed; }
|
|
|
|
|
2018-06-14 21:31:15 +00:00
|
|
|
void load_part( wxWindow* parent, ModelObject* model_object,
|
|
|
|
wxArrayString& part_names, const bool is_modifier)
|
2018-06-13 14:39:33 +00:00
|
|
|
{
|
2018-06-14 13:33:42 +00:00
|
|
|
wxArrayString input_files;
|
|
|
|
open_model(parent, input_files);
|
|
|
|
for (int i = 0; i < input_files.size(); ++i) {
|
|
|
|
std::string input_file = input_files.Item(i).ToStdString();
|
|
|
|
|
|
|
|
Model model;
|
|
|
|
try {
|
|
|
|
model = Model::read_from_file(input_file);
|
|
|
|
}
|
|
|
|
catch (std::exception &e) {
|
|
|
|
auto msg = _(L("Error! ")) + input_file + " : " + e.what() + ".";
|
|
|
|
show_error(parent, msg);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
for ( auto object : model.objects) {
|
|
|
|
for (auto volume : object->volumes) {
|
|
|
|
auto new_volume = model_object->add_volume(*volume);
|
|
|
|
new_volume->modifier = is_modifier;
|
|
|
|
boost::filesystem::path(input_file).filename().string();
|
|
|
|
new_volume->name = boost::filesystem::path(input_file).filename().string();
|
|
|
|
|
|
|
|
part_names.Add(new_volume->name);
|
|
|
|
|
|
|
|
// apply the same translation we applied to the object
|
|
|
|
new_volume->mesh.translate( model_object->origin_translation.x,
|
|
|
|
model_object->origin_translation.y,
|
|
|
|
model_object->origin_translation.y );
|
|
|
|
// 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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-06-13 14:39:33 +00:00
|
|
|
}
|
|
|
|
|
2018-06-14 21:31:15 +00:00
|
|
|
void load_lambda( wxWindow* parent, ModelObject* model_object,
|
|
|
|
wxArrayString& part_names, const bool is_modifier)
|
|
|
|
{
|
|
|
|
auto dlg = new LambdaObjectDialog(parent);
|
|
|
|
if (dlg->ShowModal() == wxID_CANCEL) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string name = "lambda-";
|
|
|
|
TriangleMesh mesh;
|
|
|
|
|
|
|
|
auto params = dlg->ObjectParameters();
|
|
|
|
switch (params.type)
|
|
|
|
{
|
|
|
|
case LambdaTypeBox:{
|
|
|
|
mesh = make_cube(params.dim[0], params.dim[1], params.dim[2]);
|
|
|
|
name += "Box";
|
|
|
|
break;}
|
|
|
|
case LambdaTypeCylinder:{
|
|
|
|
mesh = make_cylinder(params.cyl_r, params.cyl_h);
|
|
|
|
name += "Cylinder";
|
|
|
|
break;}
|
|
|
|
case LambdaTypeSphere:{
|
|
|
|
mesh = make_sphere(params.sph_rho);
|
|
|
|
name += "Sphere";
|
|
|
|
break;}
|
|
|
|
case LambdaTypeSlab:{
|
|
|
|
const auto& size = model_object->bounding_box().size();
|
|
|
|
mesh = make_cube(size.x*1.5, size.y*1.5, params.slab_h);
|
|
|
|
// box sets the base coordinate at 0, 0, move to center of plate and move it up to initial_z
|
|
|
|
mesh.translate(-size.x*1.5 / 2.0, -size.y*1.5 / 2.0, params.slab_z);
|
|
|
|
name += "Slab";
|
|
|
|
break; }
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
mesh.repair();
|
|
|
|
|
|
|
|
auto new_volume = model_object->add_volume(mesh);
|
|
|
|
new_volume->modifier = is_modifier;
|
|
|
|
new_volume->name = name;
|
|
|
|
// set a default extruder value, since user can't add it manually
|
|
|
|
new_volume->config.set_key_value("extruder", new ConfigOptionInt(0));
|
|
|
|
|
|
|
|
part_names.Add(name);
|
|
|
|
|
|
|
|
m_parts_changed = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void on_btn_load(wxWindow* parent, bool is_modifier /*= false*/, bool is_lambda/* = false*/)
|
2018-06-14 13:33:42 +00:00
|
|
|
{
|
|
|
|
auto objects_ctrl = get_objects_ctrl();
|
|
|
|
auto item = objects_ctrl->GetSelection();
|
|
|
|
if (!item)
|
|
|
|
return;
|
|
|
|
int obj_idx = -1;
|
|
|
|
auto objects_model = get_objects_model();
|
|
|
|
if (objects_model->GetParent(item) == wxDataViewItem(0))
|
|
|
|
obj_idx = objects_model->GetIdByItem(item);
|
|
|
|
else
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (obj_idx < 0) return;
|
|
|
|
wxArrayString part_names;
|
|
|
|
ModelObjectPtrs& objects = get_objects();
|
2018-06-14 21:31:15 +00:00
|
|
|
if (is_lambda)
|
|
|
|
load_lambda(parent, objects[obj_idx], part_names, is_modifier);
|
|
|
|
else
|
|
|
|
load_part(parent, objects[obj_idx], part_names, is_modifier);
|
2018-06-14 13:33:42 +00:00
|
|
|
|
2018-06-14 19:48:06 +00:00
|
|
|
parts_changed(obj_idx);
|
2018-06-14 13:33:42 +00:00
|
|
|
|
2018-06-15 20:42:51 +00:00
|
|
|
const std::string icon_name = is_modifier ? "plugin.png" : "package.png";
|
|
|
|
auto icon = wxIcon(Slic3r::GUI::from_u8(Slic3r::var(icon_name)), wxBITMAP_TYPE_PNG);
|
2018-06-14 13:33:42 +00:00
|
|
|
for (int i = 0; i < part_names.size(); ++i)
|
2018-06-15 20:42:51 +00:00
|
|
|
objects_ctrl->Select(objects_model->AddChild(item, part_names.Item(i), icon));
|
2018-06-14 13:33:42 +00:00
|
|
|
}
|
|
|
|
|
2018-06-14 19:48:06 +00:00
|
|
|
void parts_changed(int obj_idx)
|
|
|
|
{
|
|
|
|
auto event = get_event_object_settings_changed();
|
|
|
|
if (event <= 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
wxCommandEvent e(event);
|
|
|
|
auto event_str = wxString::Format("%d %d %d", obj_idx,
|
|
|
|
is_parts_changed() ? 1 : 0,
|
|
|
|
is_part_settings_changed() ? 1 : 0);
|
|
|
|
e.SetString(event_str);
|
|
|
|
get_main_frame()->ProcessWindowEvent(e);
|
|
|
|
}
|
2018-06-13 14:39:33 +00:00
|
|
|
|
|
|
|
} //namespace GUI
|
|
|
|
} //namespace Slic3r
|