11 changed files with 441 additions and 93 deletions
@ -0,0 +1,9 @@ |
|||
# Replace the absolute path with a relative one for .json |
|||
# Note that changes are only valid in *.json.in file |
|||
file(GLOB model_dirs "${CMAKE_CURRENT_SOURCE_DIR}/*") |
|||
foreach (model_dir IN LISTS model_dirs) |
|||
if (IS_DIRECTORY ${model_dir}) |
|||
set(LOCAL_DIR ${model_dir}) |
|||
configure_file(${model_dir}/config.json.in ${model_dir}/config.json @ONLY) |
|||
endif () |
|||
endforeach () |
@ -1,6 +1,6 @@ |
|||
{ |
|||
"material": [1e5, 0.3, 1e3], |
|||
"mshFilePath": "/home/cw/MyCode/designauto/da-cmd/cmd-quasistatic-simulation/assets/cube_9743.msh", |
|||
"mshFilePath": "@LOCAL_DIR@/cube_9743.msh", |
|||
|
|||
"DBC": [ |
|||
{ |
@ -0,0 +1,379 @@ |
|||
#include "UIStaticSimState.h" |
|||
#include "imgui.h" |
|||
|
|||
#include <igl/Timer.h> |
|||
|
|||
#include <igl/file_dialog_save.h> |
|||
#include <viewer/imgui_ext.hpp> |
|||
|
|||
#include <logger.hpp> |
|||
|
|||
namespace ipc::rigid { |
|||
|
|||
void UIStaticSimState::draw_menu() { |
|||
// if (m_show_vertex_data) {
|
|||
// draw_labels_window();
|
|||
// }
|
|||
|
|||
float menu_width = 220.f * menu_scaling(); |
|||
static bool player_menu = true; |
|||
static bool settings_menu = true; |
|||
static bool collisions_menu = true; |
|||
|
|||
//--------------------------------------------------------------------------
|
|||
ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f), ImGuiCond_FirstUseEver); |
|||
ImGui::SetNextWindowSize(ImVec2(0.0f, 0.0f), ImGuiCond_FirstUseEver); |
|||
ImGui::SetNextWindowSizeConstraints( |
|||
ImVec2(menu_width, -1.0f), ImVec2(menu_width, -1.0f)); |
|||
bool _viewer_menu_visible = true; |
|||
|
|||
ImGui::Begin( |
|||
"控制菜单", &_viewer_menu_visible, |
|||
ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize); |
|||
ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.6f); |
|||
{ |
|||
const char *level_strings[] = {"trace", "debug", "info", "warning", |
|||
"error", "critical", "off"}; |
|||
int log_level = spdlog::get_level(); |
|||
// if (ImGui::Combo(
|
|||
// "log-level##logger", &log_level, level_strings,
|
|||
// CCD_IM_ARRAYSIZE(level_strings))) {
|
|||
// set_logger_level(static_cast<spdlog::level::level_enum>(log_level));
|
|||
// }
|
|||
|
|||
draw_io(); |
|||
if (gui_ctrl_.is_loaded_json) { |
|||
|
|||
if (ImGui::CollapsingHeader( |
|||
"运行", &player_menu, ImGuiTreeNodeFlags_DefaultOpen)) { |
|||
draw_simulation_player(); |
|||
} |
|||
if (gui_ctrl_.is_solved) { |
|||
ImGui::Spacing(); |
|||
if (ImGui::CollapsingHeader( |
|||
"结果", &settings_menu, ImGuiTreeNodeFlags_DefaultOpen)) |
|||
draw_settings(); |
|||
} |
|||
} |
|||
} |
|||
ImGui::PopItemWidth(); |
|||
ImGui::End(); |
|||
|
|||
//--------------------------------------------------------------------------
|
|||
if (m_has_scene) { |
|||
float legends_width = 270.f * menu_scaling(); |
|||
ImGui::SetNextWindowPos( |
|||
ImVec2(ImGui::GetIO().DisplaySize.x - legends_width, 0.0f), |
|||
ImGuiCond_FirstUseEver); |
|||
ImGui::SetNextWindowSize(ImVec2(0.0f, 0.0f), ImGuiCond_FirstUseEver); |
|||
ImGui::SetNextWindowSizeConstraints( |
|||
ImVec2(200.0f, 30.0f), ImVec2(legends_width, -1.0f)); |
|||
bool _colors_menu_visible = true; |
|||
|
|||
// ImGui::Begin(
|
|||
// "Legend", &_colors_menu_visible,
|
|||
// ImGuiWindowFlags_NoSavedSettings
|
|||
// | ImGuiWindowFlags_AlwaysAutoResize);
|
|||
// {
|
|||
// draw_legends();
|
|||
// }
|
|||
// ImGui::End();
|
|||
} |
|||
} // namespace ipc::rigid
|
|||
|
|||
void UIStaticSimState::draw_io() { |
|||
if (ImGui::Button("加载文件##IO", ImVec2(-1, 0))) { |
|||
std::string fname = igl::file_dialog_open(); |
|||
if (fname != "") { |
|||
load(fname); |
|||
} |
|||
} |
|||
if (m_has_scene) { |
|||
// if (ImGui::Button("重新加载##IO", ImVec2(-1, 0))) {
|
|||
// reload();
|
|||
// }
|
|||
ImGui::BeginChild( |
|||
"##filename", |
|||
ImVec2( |
|||
ImGui::GetWindowContentRegionWidth() * 0.9f, |
|||
ImGui::GetFontSize() * 3), |
|||
false, ImGuiWindowFlags_HorizontalScrollbar); |
|||
{ |
|||
ImGui::Text("%s", m_state.scene_file.c_str()); |
|||
ImGui::SetScrollHere(1.0f); |
|||
} |
|||
ImGui::EndChild(); |
|||
|
|||
// if (ImGui::Button("Save simulation", ImVec2(-1, 0))) {
|
|||
// std::string fname = igl::file_dialog_save();
|
|||
// save(fname);
|
|||
// }
|
|||
|
|||
// if (ImGui::Button("Save OBJ sequence", ImVec2(-1, 0))) {
|
|||
// std::string dir_name = igl::file_dialog_save();
|
|||
// if (dir_name != "") {
|
|||
// save_obj_sequence(dir_name);
|
|||
// }
|
|||
// }
|
|||
|
|||
// if (ImGui::Button("Save gltf", ImVec2(-1, 0))) {
|
|||
// std::string filename = igl::file_dialog_save();
|
|||
// if (filename != "") {
|
|||
// save_gltf(filename);
|
|||
// }
|
|||
// }
|
|||
|
|||
// if (ImGui::Button("Save screenshot", ImVec2(-1, 0))) {
|
|||
// std::string fname = igl::file_dialog_save();
|
|||
// save_screenshot(fname);
|
|||
// }
|
|||
// if (m_is_gif_recording) {
|
|||
// if (ImGui::Button("End recording", ImVec2(-1, 0))) {
|
|||
// end_recording();
|
|||
// }
|
|||
// } else if (ImGui::Button("Start recording", ImVec2(-1, 0))) {
|
|||
// std::string fname = igl::file_dialog_save();
|
|||
// start_recording(fname);
|
|||
// }
|
|||
} |
|||
} |
|||
|
|||
void UIStaticSimState::draw_simulation_player() { |
|||
int player_state = static_cast<int>(m_player_state); |
|||
|
|||
if (ImGui::Button("开始计算")) { |
|||
sp_StaticSim_->simulation(); |
|||
|
|||
gui_ctrl_.is_modified = true; |
|||
gui_ctrl_.is_solved = true; |
|||
} |
|||
// ImGui::RadioButton("开始计算##SimPlayer", &player_state, PlayerState::Playing);
|
|||
// ImGui::RadioButton("暂停##SimPlayer", &player_state, PlayerState::Paused);
|
|||
|
|||
if (ImGui::CollapsingHeader( |
|||
"边界条件设置##SimPlayer", ImGuiTreeNodeFlags_DefaultOpen)) { |
|||
// --------------------------------------------------------------------
|
|||
ImGui::Checkbox("边界包围盒", &m_bkp_has_intersections); |
|||
|
|||
// ImGui::Checkbox("受力", &m_state.m_solve_collisions);
|
|||
static float zoom = 50.0f; |
|||
static float zoom1 = 50.0f; |
|||
static float zoom2 = 50.0f; |
|||
ImGui::SliderFloat("x-受力", &zoom, -50, 50, "%.3f"); |
|||
ImGui::SliderFloat("y-受力", &zoom1, -50, 50, "%.3f"); |
|||
ImGui::SliderFloat("z-受力", &zoom2, -50, 50, "%.3f"); |
|||
} |
|||
|
|||
// ImGui::Checkbox("受力大小", &m_bkp_optimization_failed);
|
|||
// ImGui::SameLine();
|
|||
// ImGui::HelpMarker("yes - stop playing if step optimization failed.");
|
|||
|
|||
// ImGui::Checkbox("pause on collisions", &m_bkp_had_collision);
|
|||
// ImGui::SameLine();
|
|||
// ImGui::HelpMarker("yes - stop playing if step had a collision.");
|
|||
|
|||
// --------------------------------------------------------------------
|
|||
// if (ImGui::SliderInt(
|
|||
// "step##Replay", &m_state.m_num_simulation_steps, 0,
|
|||
// m_state.state_sequence.size() - 1)) {
|
|||
// replaying = true;
|
|||
// }
|
|||
|
|||
// if (ImGui::Button("结果##SimPlayer", ImVec2(-1, 0))) {
|
|||
// m_player_state = PlayerState::Playing;
|
|||
// pre_draw_loop();
|
|||
// m_player_state = PlayerState::Paused;
|
|||
// }
|
|||
// --------------------------------------------------------------------
|
|||
if (ImGui::CollapsingHeader("材料设置", ImGuiTreeNodeFlags_DefaultOpen)) { |
|||
static float f0 = 0.001f; |
|||
static float f1 = 0.001f; |
|||
static float f2 = 0.001f; |
|||
ImGui::InputFloat("杨氏模量", &f0, 0.01f, 1.0f, "%.3f"); |
|||
ImGui::InputFloat("泊松比", &f1, 0.01f, 1.0f, "%.3f"); |
|||
ImGui::InputFloat("密度", &f2, 0.01f, 1.0f, "%.3f"); |
|||
} |
|||
if (ImGui::CollapsingHeader( |
|||
"其他设置", ImGuiTreeNodeFlags_DefaultOpen)) { |
|||
static float f3 = 0.01f; |
|||
ImGui::InputFloat("时间步", &f3, 0.01f, 1.0f, "%.2f"); |
|||
} |
|||
} |
|||
|
|||
void UIStaticSimState::draw_settings() { |
|||
// auto config = m_state.get_active_config();
|
|||
// ImGui::BeginChild(
|
|||
// "##config", ImVec2(ImGui::GetWindowContentRegionWidth(), 20), false,
|
|||
// ImGuiWindowFlags_HorizontalScrollbar);
|
|||
// {
|
|||
// ImGui::TreeNodeJson(config);
|
|||
// }
|
|||
// ImGui::EndChild();
|
|||
// if (ImGui::Button("应力##IO", ImVec2(-1, 0))) {
|
|||
// std::string fname = igl::file_dialog_save();
|
|||
// if (fname != "") {
|
|||
// load(fname);
|
|||
// }
|
|||
// }
|
|||
// ImGui::Checkbox("柔顺度(compliance)", &compliance);
|
|||
|
|||
char *desc = "121.88"; |
|||
// ImGui::Text("柔顺度(compliance)");
|
|||
// sp_StaticSim_->EvaluateTarget(ssim::SimTargetOption::COMPLIANCE)(0,0);
|
|||
ImGui::TextWrapped("柔顺度 (compliance): %.3f", 12222.2); |
|||
if (ImGui::IsItemHovered()) { |
|||
// 显示工具的提示
|
|||
ImGui::BeginTooltip(); |
|||
// 使得文字的区域可以自己控制,
|
|||
// 但是这里我感觉更推荐使用:TextWrapped接口,之后的部分有提到他们的区别
|
|||
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); |
|||
ImGui::TextUnformatted(desc); |
|||
ImGui::PopTextWrapPos(); |
|||
// 结束工具提示
|
|||
ImGui::EndTooltip(); |
|||
} |
|||
// Buttons
|
|||
// std::string fname = igl::file_dialog_open();
|
|||
// if (fname != "") {
|
|||
// load(fname);
|
|||
// }
|
|||
// {
|
|||
// using Target=ssim::SimTargetOption::Target;
|
|||
// int i_target_to_set;
|
|||
// ImGui::RadioButton("位移范数",&i_target_to_set,Target::U_NORM); ImGui::SameLine();
|
|||
// ImGui::RadioButton("位移-X",&i_target_to_set,Target::UX); ImGui::SameLine();
|
|||
// ImGui::RadioButton("位移-Y",&i_target_to_set,Target::UY); ImGui::SameLine();
|
|||
// ImGui::RadioButton("位移-Z",&i_target_to_set,Target::UZ);
|
|||
// gui_ctrl_.set_target(static_cast<Target>(i_target_to_set));
|
|||
// }
|
|||
|
|||
|
|||
if (ImGui::Button("位移范数", ImVec2(-1, 0))) { |
|||
gui_ctrl_.set_target(ssim::SimTargetOption::Target::U_NORM); |
|||
} |
|||
if (ImGui::Button("位移-X", ImVec2(-1, 0))) { |
|||
gui_ctrl_.set_target(ssim::SimTargetOption::Target::UX); |
|||
} |
|||
if (ImGui::Button("位移-Y", ImVec2(-1, 0))) { |
|||
gui_ctrl_.set_target(ssim::SimTargetOption::Target::UY); |
|||
} |
|||
if (ImGui::Button("位移-Z", ImVec2(-1, 0))) { |
|||
gui_ctrl_.set_target(ssim::SimTargetOption::Target::UZ); |
|||
} |
|||
|
|||
if (ImGui::Button("应力范数", ImVec2(-1, 0))) { |
|||
gui_ctrl_.set_target(ssim::SimTargetOption::Target::S_NORM); |
|||
} |
|||
if (ImGui::Button("冯氏应力", ImVec2(-1, 0))) { |
|||
gui_ctrl_.set_target(ssim::SimTargetOption::Target::S_VON_Mises); |
|||
} |
|||
|
|||
if (ImGui::Button("应力-X", ImVec2(-1, 0))) { |
|||
gui_ctrl_.set_target(ssim::SimTargetOption::Target::SX); |
|||
} |
|||
if (ImGui::Button("应力-Y", ImVec2(-1, 0))) { |
|||
gui_ctrl_.set_target(ssim::SimTargetOption::Target::SY); |
|||
} |
|||
if (ImGui::Button("应力-Z", ImVec2(-1, 0))) { |
|||
gui_ctrl_.set_target(ssim::SimTargetOption::Target::SZ); |
|||
} |
|||
|
|||
} |
|||
|
|||
//void UIStaticSimState::draw_legends()
|
|||
//{
|
|||
// static float second_col = 100;
|
|||
// float slider_width = ImGui::GetWindowWidth() * 0.2f;
|
|||
// for (auto& data : datas_) {
|
|||
// const std::string& label = data.first;
|
|||
// const auto& ptr = data.second;
|
|||
//
|
|||
// /// visibility checkbox
|
|||
// bool tmp = ptr->visibility();
|
|||
// if (!ptr->is_com()) {
|
|||
// if (ImGui::Checkbox(("##UI-" + label).c_str(), &tmp)) {
|
|||
// ptr->visibility(tmp);
|
|||
// }
|
|||
// /// Color
|
|||
// ImGui::SameLine();
|
|||
// if (ImGui::DoubleColorEdit3(
|
|||
// (label + "##UI-color").c_str(), ptr->m_color)) {
|
|||
// ptr->recolor();
|
|||
// }
|
|||
// } else if (ImGui::Checkbox((label + "##UI-check").c_str(), &tmp)) {
|
|||
// ptr->visibility(tmp);
|
|||
// }
|
|||
//
|
|||
// /// other specific attributes
|
|||
// if (ptr->is_mesh()) {
|
|||
// ImGui::SameLine(second_col);
|
|||
// if (ImGui::Checkbox(
|
|||
// ("数据##UI-" + label).c_str(), &m_show_vertex_data)) { }
|
|||
// ptr->show_vertex_data = m_show_vertex_data;
|
|||
// ptr->update_vertex_data();
|
|||
//
|
|||
// ImGui::SameLine();
|
|||
// ImGui::PushItemWidth(slider_width);
|
|||
// {
|
|||
// float point_size = ptr->data().point_size / pixel_ratio();
|
|||
// if (ImGui::SliderFloat(
|
|||
// ("顶点##UI-scaling" + label).c_str(), &point_size,
|
|||
// 0.00f, 10.0f, "%1.f")) {
|
|||
// ptr->data().point_size = point_size * pixel_ratio();
|
|||
// }
|
|||
// }
|
|||
// ImGui::PopItemWidth();
|
|||
//
|
|||
// } else if (ptr->is_scalar_field()) {
|
|||
// ImGui::SameLine();
|
|||
// if (ImGui::Checkbox(
|
|||
// ("log##UI-" + label).c_str(), &ptr->m_use_log_scale)) {
|
|||
// ptr->recolor();
|
|||
// }
|
|||
// ImGui::SameLine();
|
|||
// bool show_iso = ptr->data().show_overlay;
|
|||
// if (ImGui::Checkbox(("isolines##UI-" + label).c_str(), &show_iso)) {
|
|||
// ptr->data().show_overlay = show_iso;
|
|||
// }
|
|||
// ImGui::SameLine();
|
|||
// bool show_faces = ptr->data().show_faces;
|
|||
// if (ImGui::Checkbox(("faces##UI-" + label).c_str(), &show_faces)) {
|
|||
// ptr->data().show_faces = show_faces;
|
|||
// }
|
|||
//
|
|||
// } // else if (ptr->is_vector_field()) {
|
|||
// // ImGui::SameLine(second_col);
|
|||
// // if (ImGui::Checkbox(
|
|||
// // ("norm##UI-" + label).c_str(), &ptr->m_normalized)) {
|
|||
// // ptr->recolor();
|
|||
// // }
|
|||
// // ImGui::SameLine();
|
|||
// // ImGui::PushItemWidth(slider_width);
|
|||
// // {
|
|||
// // float aux = float(ptr->m_scaling);
|
|||
// // if (ImGui::SliderFloat(
|
|||
// // ("scale##UI-scaling" + label).c_str(), &aux, 0.00f,
|
|||
// // 10.0f, "%1.f")) {
|
|||
// // ptr->m_scaling = double(aux);
|
|||
// // ptr->recolor();
|
|||
// // }
|
|||
// // }
|
|||
// // ImGui::PopItemWidth();
|
|||
// // } else if (ptr->is_com()) {
|
|||
// // ImGui::SameLine();
|
|||
// // ImGui::PushItemWidth(ImGui::GetWindowWidth() - 150);
|
|||
// // {
|
|||
// // float aux = float(ptr->m_scaling);
|
|||
// // if (ImGui::SliderFloat(
|
|||
// // ("scale##UI-com-scaling" + label).c_str(), &aux,
|
|||
// // 0.00f, 10.0f, "%1.1f", 1.0f)) {
|
|||
// // ptr->m_scaling = double(aux);
|
|||
// // ptr->recolor();
|
|||
// // }
|
|||
// // }
|
|||
// // ImGui::PopItemWidth();
|
|||
// // }
|
|||
// }
|
|||
//}
|
|||
|
|||
} // namespace ipc::rigid
|
Loading…
Reference in new issue