426{
427 static bool properties_shown = false;
428
429 const std::string NA_TXT =
_u8L(
"N/A");
430 const char* NA_CSTR = NA_TXT.c_str();
431
432 if (viewer != nullptr) {
433 ImGuiWrapper& imgui = *wxGetApp().imgui();
434
435 imgui.set_next_window_pos(0.5f * static_cast<float>(canvas_width), static_cast<float>(canvas_height), ImGuiCond_Always, 0.5f, 1.0f);
439 ImGui::PushStyleColor(ImGuiCol_Border , ImVec4(.0f,.0f,.0f,.0f));
440 ImGui::PushStyleColor(ImGuiCol_Separator, ImVec4(1.f,1.f,1.f,.6f));
441 ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 8.0f *
m_scale);
442 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding , ImVec2(10.f, 10.f) *
m_scale);
443 ImGui::SetNextWindowBgAlpha(0.8f);
444
447
448
451 if (visible_range[1] > 0) {
452 vertex_id = static_cast<size_t>(visible_range[1]) - 1;
454 }
455 }
457
458 const ImGuiStyle&
style = ImGui::GetStyle();
459
460 char detail_buf[1024];
461 switch (view_type) {
463 if (is_extrusion)
467 else
468 strcpy(detail_buf, NA_CSTR);
469 break;
471 if (is_extrusion)
472 sprintf(detail_buf,
"%s%.2f",
_u8L(
"Height: ").c_str(), vertex.
height);
473 else
474 sprintf(detail_buf,
"%s%s",
_u8L(
"Height: ").c_str(), NA_CSTR);
475 break;
477 if (is_extrusion)
478 sprintf(detail_buf,
"%s%.2f",
_u8L(
"Width: ").c_str(), vertex.
width);
479 else
480 sprintf(detail_buf,
"%s%s",
_u8L(
"Width: ").c_str(), NA_CSTR);
481 break;
483 if (is_extrusion)
485 else
486 sprintf(detail_buf,
"%s%s",
_u8L(
"Flow: ").c_str(), NA_CSTR);
487 break;
489 sprintf(detail_buf,
"%s%.0f",
_u8L(
"Fan: ").c_str(), vertex.
fan_speed);
490 break;
492 sprintf(detail_buf,
"%s%.0f",
_u8L(
"Temperature: ").c_str(), vertex.
temperature);
493 break;
497 break;
499 sprintf(detail_buf,
"%s%d",
_u8L(
"Tool: ").c_str(), vertex.
extruder_id + 1);
500 break;
502 sprintf(detail_buf,
"%s%d",
_u8L(
"Color: ").c_str(), vertex.
color_id + 1);
503 break;
505 sprintf(detail_buf,
"%s%.0f",
_u8L(
"Acceleration: ").c_str(), vertex.
acceleration);
506 break;
508 sprintf(detail_buf,
"%s%.1f",
_u8L(
"Jerk: ").c_str(), vertex.
jerk);
509 break;
512 break;
513 default:
514 detail_buf[0] = '\0';
515 break;
516 }
517
518 std::vector<std::pair<std::string, std::string>> properties_rows;
519 float table_content_w = 0.0f;
520 if (properties_shown) {
521 float label_w = 0.0f;
522 float value_w = 0.0f;
523 properties_rows.reserve(14);
524 auto add_row = [&properties_rows, &label_w, &value_w](std::string label, std::string value) {
525 label_w = std::max(label_w, ImGui::CalcTextSize(label.c_str()).x);
526 value_w = std::max(value_w, ImGui::CalcTextSize(value.c_str()).x);
527 properties_rows.emplace_back(std::move(label), std::move(value));
528 };
529 char buff[1024];
532 if (is_extrusion) sprintf(buff, (
"%.3f " +
_u8L(
"mm")).c_str(), vertex.
width);
else strcpy(buff, NA_CSTR);
533 add_row(
_u8L(
"Width"), buff);
534 if (is_extrusion) sprintf(buff, (
"%.3f " +
_u8L(
"mm")).c_str(), vertex.
height);
else strcpy(buff, NA_CSTR);
535 add_row(
_u8L(
"Height"), buff);
536
537
538
539 if (vertex_id > 0 && (is_extrusion || vertex.
is_travel() || vertex.
is_wipe())) {
541 size_t first_id = vertex_id;
543 --first_id;
544 size_t last_id = vertex_id;
546 ++last_id;
548 for (size_t i = std::max<size_t>(first_id, 1); i <= last_id; ++i) {
551 }
552 sprintf(buff, (
"%.3f " +
_u8L(
"mm")).c_str(),
length);
553 }
554 else
555 strcpy(buff, NA_CSTR);
556 add_row(
_u8L(
"Length"), buff);
557 sprintf(buff,
"%d", vertex.
layer_id + 1);
558 add_row(
_u8L(
"Layer"), buff);
559 sprintf(buff, (
"%.1f " +
_u8L(
"mm/s")).c_str(), vertex.
feedrate);
560 add_row(
_u8L(
"Speed"), buff);
562 add_row(
_u8L(
"Acceleration"), buff);
563 sprintf(buff, (
"%.1f " +
_u8L(
"mm/s")).c_str(), vertex.
jerk);
564 add_row(
_u8L(
"Jerk"), buff);
565 if (is_extrusion) sprintf(buff, (
"%.3f " +
_u8L(
"mm³/s")).c_str(), vertex.
volumetric_rate());
else strcpy(buff, NA_CSTR);
566 add_row(
_u8L(
"Flow rate"), buff);
567 sprintf(buff,
"%.0f %%", vertex.
fan_speed);
568 add_row(
_u8L(
"Fan speed"), buff);
569 sprintf(buff, (
"%.0f " +
_u8L(
"\u2103" )).c_str(), vertex.
temperature);
570 add_row(
_u8L(
"Temperature"), buff);
572 add_row(
_u8L(
"Pressure Advance"), buff);
575 add_row(
_u8L(
"Time"), buff);
576
577 table_content_w = 2 * std::max(label_w, value_w) +
style.ItemInnerSpacing.x;
578 }
579
580
581 const float axes_spacing_x = ImGui::CalcTextSize("sp").x;
583 const float axes_width = ImGui::CalcTextSize(axes_sample).x;
584 const float axes_content_w = 3.0f * axes_width + 2.0f * axes_spacing_x;
585 const float speed_width = ImGui::CalcTextSize((
_u8L(
"Speed: ") +
"9999 ").c_str()).x;
586 const float detail_width = ImGui::CalcTextSize(detail_buf).x;
587 const float info_content_w = speed_width + detail_width;
588 const float info_group_w = std::max(axes_content_w, info_content_w);
589 const float fold_button_w = 24.0f *
m_scale;
590 const float bottom_row_w = fold_button_w +
style.ItemSpacing.x + info_group_w;
591 float speed_profile_row_w = 0.0f;
592#if ENABLE_ACTUAL_SPEED_DEBUG
593 const float table_btn_width = std::max(ImGui::CalcTextSize(
_u8L(
"Hide").c_str()).x, ImGui::CalcTextSize(
_u8L(
"Show").c_str()).x);
594 const float btn_padding_x = 8.0f *
m_scale;
595
596 if (properties_shown) {
597
598 speed_profile_row_w = table_btn_width + btn_padding_x * 2.0f +
style.ItemSpacing.x + ImGui::CalcTextSize(
_u8L(
"Actual speed profile").c_str()).x;
599 }
600#endif
601 const float properties_w = std::max(table_content_w, speed_profile_row_w);
602 const float content_w = std::max(bottom_row_w, properties_w);
603 const float window_w = std::ceil(content_w + 2.0f *
style.WindowPadding.x);
604
605
606 const float text_h = ImGui::GetTextLineHeight();
607 const float item_spacing_y =
style.ItemSpacing.y;
608 const float cell_pad_y =
style.CellPadding.y;
609 const float window_pad_h = 2.0f *
style.WindowPadding.y;
610 const float show_button_h = text_h + 2.0f * 3.0f *
m_scale;
611 const float main_row_h = 2.0f * text_h + item_spacing_y;
612 const float properties_h = static_cast<float>(properties_rows.size()) * (text_h + 2.0f * cell_pad_y) + 2.0f * cell_pad_y + 1.0f + item_spacing_y
613 + item_spacing_y + show_button_h
614 + item_spacing_y + 1.0f +
style.WindowPadding.y;
615 const float folded_window_h = std::ceil(window_pad_h + main_row_h);
616 const float unfolded_window_h = std::ceil(folded_window_h + properties_h);
617 const float window_h = properties_shown ? unfolded_window_h : folded_window_h;
618
619 ImGui::SetNextWindowSize(ImVec2(window_w, window_h), ImGuiCond_Always);
620
621 imgui.begin(std::string("ToolPosition"), ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize);
622 ImGui::AlignTextToFramePadding();
623
624 if (properties_shown) {
625 auto append_table_row = [](const std::string& label, const std::string& value) {
626 ImGui::TableNextRow();
627 ImGui::TableSetColumnIndex(0);
629 ImGui::TableSetColumnIndex(1);
631 };
632
633 if (ImGui::BeginTable("Properties", 2)) {
634 for (const auto& row : properties_rows)
635 append_table_row(row.first, row.second);
636
637 ImGui::EndTable();
638 }
639
640#if ENABLE_ACTUAL_SPEED_DEBUG
642 static float cached_table_wnd_width = 0.0f;
643 static float cached_table_wnd_scale = 0.0f;
644 ImGui::Spacing();
645
646 static bool table_shown = false;
647 imgui.push_confirm_button_style();
648 ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 3.f *
m_scale);
649 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , ImVec2(btn_padding_x, 3.f *
m_scale));
650 ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(.5f, .5f));
651 if (imgui.button((table_shown ?
_L(
"Hide") :
_L(
"Show")).c_str(), ImVec2(table_btn_width + btn_padding_x * 2.f, 0.f), actual_speed_exist))
652 table_shown = !table_shown;
653 ImGui::PopStyleVar(3);
654 imgui.pop_confirm_button_style();
655 ImGui::SameLine();
657
658 if (actual_speed_exist && table_shown) {
659 const float plot_height = 135.f *
m_scale;
660
661 if (cached_table_wnd_scale !=
m_scale) {
662
663
664
665 const float cell_pad_x = 9.f *
m_scale;
666 const float wnd_pad_x = 2.0f *
style.WindowPadding.x;
667 const float table_border_x = 6.0f *
m_scale;
668
669
670
671 const float col0_w = ImGui::CalcTextSize((
_u8L(
"Position") +
" (" +
_u8L(
"mm") +
")").c_str()).x;
672 const float col1_w = ImGui::CalcTextSize((
_u8L(
"Speed") +
" (" +
_u8L(
"mm/s") +
")").c_str()).x;
673
674 const float content_w = std::ceil(col0_w + col1_w + 4.0f * cell_pad_x + table_border_x + wnd_pad_x);
675 const float aspect_w = std::ceil(plot_height * (16.0f / 9.0f));
676
677
678 cached_table_wnd_width = std::max(content_w, aspect_w);
679 cached_table_wnd_scale =
m_scale;
680 }
681
682
683
684 const float cell_pad_y = 1.f *
m_scale;
685 const float row_height = ImGui::GetTextLineHeight() + 2.f * cell_pad_y;
686 const float rows =
static_cast<float>(m_actual_speed_imgui_widget.data.size());
687 const float table_h = row_height * (1.0f +
rows) + 2.f *
m_scale;
688 const float target_h = std::ceil(plot_height + table_h + 2.f *
style.WindowPadding.y);
689 const float min_h = ImGui::GetWindowHeight();
690 const float max_h =
static_cast<float>(canvas_height) - 8.f *
m_scale;
691 const float final_h = std::clamp(target_h, min_h, max_h);
692 const bool needs_scroll = target_h > max_h;
693 const float table_view_h = std::max(1.0f, final_h - plot_height - 2.f *
style.WindowPadding.y);
694
695
696 imgui.set_next_window_pos(ImGui::GetWindowPos().x - 5.f *
m_scale ,
static_cast<float>(canvas_height), ImGuiCond_Always, 1.0f, 1.0f);
697 ImGui::SetNextWindowSize(ImVec2(cached_table_wnd_width, final_h), ImGuiCond_Always);
698
699 imgui.begin(std::string("ToolPositionTableWnd"), ImGuiWindowFlags_NoTitleBar |
700 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove |
701 ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse);
702 ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(9.f, 1.f) *
m_scale);
703 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.f, 0.f));
704
705 ImVec4 scroll_col = ImVec4(0.77f, 0.77f, 0.77f,
m_is_dark ? .6f : 1.0f);
706 ImGui::PushStyleColor(ImGuiCol_ScrollbarBg, ImVec4(0.f, 0.f, 0.f, 0.f));
707 ImGui::PushStyleColor(ImGuiCol_ScrollbarGrabActive, scroll_col);
708 ImGui::PushStyleColor(ImGuiCol_ScrollbarGrabHovered, scroll_col);
709 ImGui::PushStyleColor(ImGuiCol_ScrollbarGrab, scroll_col);
710 ImGui::PushStyleColor(ImGuiCol_HeaderHovered ,
style.Colors[ImGuiCol_TableHeaderBg]);
711
712 const int hover_id = m_actual_speed_imgui_widget.plot("##ActualSpeedProfile", { -1.f, plot_height});
713 const ImGuiTableFlags table_flags = ImGuiTableFlags_Borders | (needs_scroll ? ImGuiTableFlags_ScrollY : 0);
714 if (ImGui::BeginTable("ToolPositionTable", 2, table_flags, ImVec2(0.0f, needs_scroll ? table_view_h : 0.0f))) {
715 char buff[1024];
716 if (needs_scroll)
717 ImGui::TableSetupScrollFreeze(0, 1);
718 ImGui::TableSetupColumn((
_u8L(
"Position") +
" (" +
_u8L(
"mm") +
")").c_str());
719 ImGui::TableSetupColumn((
_u8L(
"Speed") +
" (" +
_u8L(
"mm/s") +
")").c_str());
720 ImGui::TableHeadersRow();
721 int counter = 0;
722 for (const ActualSpeedImguiWidget::Item& item : m_actual_speed_imgui_widget.data) {
723 const bool highlight = hover_id >= 0 && (counter == hover_id || counter == hover_id + 1);
724 ImGui::TableNextRow();
725 const ImU32 row_bg_color = ImGui::GetColorU32(item.internal ? ImVec4(0.0f, 150.f / 255.0f, 136.0f / 255.f, 0.15f) : ImVec4(0.2f, 0.2f, 0.2f, 0.25f));
726 ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, row_bg_color);
727 ImGui::TableSetColumnIndex(0);
728 sprintf(buff, "%.3f", item.pos);
730 ImGui::TableSetColumnIndex(1);
731 sprintf(buff, "%.1f", item.speed);
733 ++counter;
734 }
735
736 ImGui::EndTable();
737 }
738 ImGui::PopStyleVar(2);
739 ImGui::PopStyleColor(5);
740 imgui.end();
741 }
742
743#endif
744
745 ImGui::Spacing();
746 ImGui::Separator();
747 ImGui::Dummy({0,
style.WindowPadding.y});
748 }
749
750 float draw_area_height = ImGui::GetTextLineHeight() * 2.f +
style.ItemSpacing.y;
751 ImGui::Dummy({10.f, draw_area_height});
752
753 ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 3.f *
m_scale);
754 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , ImVec2(2.f, 2.f) *
m_scale);
755 ImGui::PushStyleColor(ImGuiCol_Button , ImVec4(0, 0, 0, 0));
756 ImGui::PushStyleColor(ImGuiCol_ButtonHovered , ImVec4(84 / 255.f, 84 / 255.f, 90 / 255.f, 1.f));
757 ImGui::PushStyleColor(ImGuiCol_ButtonActive , ImVec4(84 / 255.f, 84 / 255.f, 90 / 255.f, 1.f));
758
759 const float main_wnd_height = ImGui::GetWindowHeight();
760 const float draw_start_y = main_wnd_height - draw_area_height -
style.WindowPadding.y;
761
762 ImGui::SetCursorPos(ImVec2(
style.WindowPadding.x, draw_start_y));
763
764
765 const wchar_t foldIcon = properties_shown ? ImGui::UnfoldButtonIcon : ImGui::FoldButtonIcon;
766 if (imgui.glyph_button(foldIcon, ImVec2(16.f, 16.f) *
m_scale)) {
767 properties_shown = !properties_shown;
768 static float main_wnd_height_temp = ImGui::GetWindowHeight();
769 static float first_click = true;
770 if (first_click || main_wnd_height_temp != main_wnd_height) {
771 main_wnd_height_temp = main_wnd_height;
772 first_click = false;
773 imgui.set_requires_extra_frame();
774 }
775 }
776 ImGui::PopStyleColor(3);
777 ImGui::PopStyleVar(2);
778
779 ImGui::SetCursorPos(ImVec2(
style.WindowPadding.x +
style.ItemSpacing.x + 24.f *
m_scale, draw_start_y - 1.f *
m_scale));
780
781 ImGui::BeginGroup();
782
783
784
786 int max_value = std::round(std::max(std::max(pos[0], pos[1]), pos[2]));
788 : (max_value > 9999 ? "%.1f" : max_value > 999 ? "%.2f" : "%.3f");
789
790 char xBuf[32];
792 ImGui::SameLine(0,0);
793 sprintf(xBuf, precision, pos[0]);
794 ImGui::Text("%s", xBuf);
795
796 char yBuf[32];
797 ImGui::SameLine(axes_width + axes_spacing_x);
799 ImGui::SameLine(0,0);
800 sprintf(yBuf, precision, pos[1]);
801 ImGui::Text("%s", yBuf);
802
803 char zBuf[32];
804 ImGui::SameLine(2.0f * (axes_width + axes_spacing_x));
806 ImGui::SameLine(0,0);
807 sprintf(zBuf, precision, pos[2]);
808 ImGui::Text("%s", zBuf);
809
810 ImGui::SameLine(3.0f * axes_width + 2.0f * axes_spacing_x);
811 ImGui::Dummy({0,0});
812
813 char spdBuf[128];
814 sprintf(spdBuf,
"%s%.0f ",
_u8L(
"Speed: ").c_str(), vertex.
feedrate);
816
817 if (detail_buf[0] != '\0') {
818 ImGui::SameLine(speed_width);
820 }
821 ImGui::EndGroup();
822
823 imgui.end();
824 ImGui::PopStyleColor(5);
825 ImGui::PopStyleVar(2);
826 }
827 else {
828 ImGuiWrapper& imgui = *wxGetApp().imgui();
829
830
831 imgui.set_next_window_pos(0.5f * static_cast<float>(canvas_width), static_cast<float>(canvas_height), ImGuiCond_Always, 0.5f, 1.0f);
832 ImGui::PushStyleColor(ImGuiCol_Border , ImVec4(.0f,.0f,.0f,.0f));
833 ImGui::PushStyleColor(ImGuiCol_Separator, ImVec4(1.f,1.f,1.f,.6f));
834 ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 8.0f *
m_scale);
835 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding , ImVec2(10.f, 10.f) *
m_scale);
836 ImGui::SetNextWindowBgAlpha(0.8f);
837 imgui.begin(std::string("ToolPosition"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove);
838
840
841 int max_value = std::round(std::max(std::max(
pos.x(),
pos.y()),
pos.z()));
842 auto precision = max_value > 9999 ? "%.1f" : max_value > 999 ? "%.2f" : "%.3f";
843 const float axes_width = ImGui::CalcTextSize("X 999.999sp").x;
844
845 char xBuf[32];
847 ImGui::SameLine(0,0);
848 sprintf(xBuf, precision,
pos.x());
849 ImGui::Text("%s", xBuf);
850
851 char yBuf[32];
852 ImGui::SameLine(axes_width);
854 ImGui::SameLine(0,0);
855 sprintf(yBuf, precision,
pos.y());
856 ImGui::Text("%s", yBuf);
857
858 char zBuf[32];
859 ImGui::SameLine(axes_width * 2);
861 ImGui::SameLine(0,0);
862 sprintf(zBuf, precision,
pos.z());
863 ImGui::Text("%s", zBuf);
864
865 ImGui::SameLine(axes_width * 3);
866 ImGui::Dummy({0,0});
867
868 imgui.end();
869 ImGui::PopStyleColor(2);
870 ImGui::PopStyleVar(2);
871 }
872}
#define _L(s)
Definition OBJ.cpp:34
#define style
Definition WipeTowerDialog.cpp:101
static const ColorRGBA Y()
Definition Color.hpp:146
static const ColorRGBA X()
Definition Color.hpp:145
static const ColorRGBA Z()
Definition Color.hpp:147
static const ColorRGBA WHITE()
Definition Color.hpp:142
float m_z_offset
Definition GCodeViewer.hpp:85
bool m_high_precision_gcode
Definition GCodeViewer.hpp:91
float m_scale
Definition GCodeViewer.hpp:98
Vec3f m_world_offset
Definition GCodeViewer.hpp:84
static void text_colored(const ImVec4 &color, const char *label)
Definition ImGuiWrapper.cpp:1157
static const ImVec4 COL_ORCA
Definition ImGuiWrapper.hpp:408
static ImVec4 to_ImVec4(const ColorRGB &color)
Definition ImGuiWrapper.cpp:1053
static void text(const char *label)
Definition ImGuiWrapper.cpp:1128
static const ImVec4 COL_BUTTON_HOVERED
Definition ImGuiWrapper.hpp:390
static const ImVec4 COL_BUTTON_ACTIVE
Definition ImGuiWrapper.hpp:391
static const ImVec4 COL_BUTTON_BACKGROUND
Definition ImGuiWrapper.hpp:389
const Interval & get_view_visible_range() const
Definition Viewer.cpp:282
size_t get_vertices_count() const
Definition Viewer.cpp:337
size_t get_current_vertex_id() const
Definition Viewer.cpp:347
const PathVertex & get_current_vertex() const
Definition Viewer.cpp:342
const PathVertex & get_vertex_at(size_t id) const
Definition Viewer.cpp:352
ETimeMode get_time_mode() const
Definition Viewer.cpp:102
float get_estimated_time_at(size_t id) const
Definition Viewer.cpp:362
static std::string to_string(libvgcode::EMoveType type)
Definition GCodeViewer.cpp:377
static void highlight(wxString &str)
Definition EditGCodeDialog.cpp:470
Vec3d pos(const Pt &p)
Definition ReprojectPointsOnMesh.hpp:16
double length(const Points &pts)
Definition MultiPoint.hpp:181
Eigen::Matrix< float, 3, 1, Eigen::DontAlign > Vec3f
Definition Point.hpp:65
std::string get_time_dhms(float time_in_secs)
Definition Utils.hpp:609
@ Noop
Definition Types.hpp:122
@ Seam
Definition Types.hpp:125
std::array< std::size_t, 2 > Interval
Definition Types.hpp:85
@ ColorPrint
Definition Types.hpp:94
@ Width
Definition Types.hpp:98
@ Acceleration
Definition Types.hpp:108
@ LayerTimeLogarithmic
Definition Types.hpp:102
@ PressureAdvance
Definition Types.hpp:106
@ Jerk
Definition Types.hpp:110
@ LayerTimeLinear
Definition Types.hpp:101
@ FeatureType
Definition Types.hpp:93
@ Tool
Definition Types.hpp:111
@ FanSpeed
Definition Types.hpp:103
@ VolumetricFlowRate
Definition Types.hpp:99
@ Temperature
Definition Types.hpp:104
@ Height
Definition Types.hpp:97
Vec3 convert(const Slic3r::Vec3f &v)
Definition LibVGCodeWrapper.cpp:45
size_t rows(const T &raster)
Definition MarchingSquares.hpp:171
#define _u8L(s)
Definition I18N.hpp:11
float temperature
Definition PathVertex.hpp:52
bool is_extrusion() const
Definition PathVertex.cpp:12
bool is_wipe() const
Definition PathVertex.cpp:22
float feedrate
Definition PathVertex.hpp:36
float acceleration
Definition PathVertex.hpp:100
uint8_t extruder_id
Definition PathVertex.hpp:78
float volumetric_rate() const
Definition PathVertex.hpp:131
uint32_t layer_id
Definition PathVertex.hpp:74
EMoveType type
Definition PathVertex.hpp:66
Vec3 position
Definition PathVertex.hpp:24
uint8_t color_id
Definition PathVertex.hpp:82
std::array< float, TIME_MODES_COUNT > times
Definition PathVertex.hpp:86
float height
Definition PathVertex.hpp:28
float pressure_advance
Definition PathVertex.hpp:95
float jerk
Definition PathVertex.hpp:105
uint32_t gcode_id
Definition PathVertex.hpp:70
float width
Definition PathVertex.hpp:32
float fan_speed
Definition PathVertex.hpp:48
EGCodeExtrusionRole role
Definition PathVertex.hpp:62
float layer_duration
Definition PathVertex.hpp:90
bool is_travel() const
Definition PathVertex.cpp:17