改造一些
This commit is contained in:
@@ -23,6 +23,19 @@
|
||||
#include <vector>
|
||||
namespace renderive::web {
|
||||
namespace {
|
||||
template <class Update>
|
||||
void update_axis_state(const std::shared_ptr<Abs_Axis>& axis, Update&& update) {
|
||||
if (const auto numeric = std::dynamic_pointer_cast<Axis>(axis)) {
|
||||
numeric->update([&](Axis_Properties& state) {
|
||||
std::forward<Update>(update)(static_cast<Axis_Base_Properties&>(state));
|
||||
});
|
||||
} else if (const auto time = std::dynamic_pointer_cast<Time_Axis>(axis)) {
|
||||
time->update([&](auto& state) {
|
||||
std::forward<Update>(update)(static_cast<Axis_Base_Properties&>(state));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
double number_value(const Gallery_State& state, std::string_view id) {
|
||||
return std::get<double>(gallery_property_value(state, id));
|
||||
}
|
||||
@@ -379,15 +392,23 @@ public:
|
||||
return plot_.view_active() ? "Plot view 已激活" : "Plot view 已停用;可再次执行恢复";
|
||||
}
|
||||
if (request.id == "axis_set_start") {
|
||||
if (numeric_domain_axis_)
|
||||
numeric_domain_axis_->set_coord_start(number_value(state_, "coord_origin"));
|
||||
return "已通过 Axis::set_coord_start 应用当前起点";
|
||||
if (numeric_domain_axis_) {
|
||||
const Range range = numeric_domain_axis_->get<&Axis_Properties::coordinates>();
|
||||
const double origin = number_value(state_, "coord_origin");
|
||||
numeric_domain_axis_->set<&Axis_Properties::coordinates>(
|
||||
Range{origin, origin + range.length()});
|
||||
}
|
||||
return "轴起点已写入 Axis_Properties 状态";
|
||||
}
|
||||
if (request.id == "axis_set_length") {
|
||||
if (numeric_domain_axis_)
|
||||
numeric_domain_axis_->set_coord_length(number_value(state_, "coord_target") -
|
||||
number_value(state_, "coord_origin"));
|
||||
return "已通过 Axis::set_coord_length 应用当前跨度";
|
||||
if (numeric_domain_axis_) {
|
||||
const Range range = numeric_domain_axis_->get<&Axis_Properties::coordinates>();
|
||||
const double length = number_value(state_, "coord_target") -
|
||||
number_value(state_, "coord_origin");
|
||||
numeric_domain_axis_->set<&Axis_Properties::coordinates>(
|
||||
Range{range.origin, range.origin + length});
|
||||
}
|
||||
return "轴跨度已写入 Axis_Properties 状态";
|
||||
}
|
||||
if (request.id == "axis_probe")
|
||||
return "坐标映射、刻度步长、次刻度数与标签结果已刷新到遥测区";
|
||||
@@ -700,18 +721,20 @@ public:
|
||||
telemetry["performance_overlay_lines"] = snapshot->lines.size();
|
||||
}
|
||||
if (numeric_domain_axis_) {
|
||||
const Range range = numeric_domain_axis_->coord_range();
|
||||
const Axis_Transform transform = numeric_domain_axis_->transform();
|
||||
const Range range = transform.coordinate_range;
|
||||
const double center = range.center();
|
||||
telemetry["axis"] = {
|
||||
{"origin", range.origin}, {"target", range.target},
|
||||
{"start_coord", numeric_domain_axis_->start_coord()},
|
||||
{"end_coord", numeric_domain_axis_->end_coord()},
|
||||
{"center_pixel", numeric_domain_axis_->coord_to_pixel(center)},
|
||||
{"start_coord", range.origin},
|
||||
{"end_coord", range.target},
|
||||
{"center_pixel", transform.coord_to_pixel(center)},
|
||||
{
|
||||
"center_roundtrip", numeric_domain_axis_->pixel_to_coord(
|
||||
numeric_domain_axis_->coord_to_pixel(center))
|
||||
"center_roundtrip", transform.pixel_to_coord(
|
||||
transform.coord_to_pixel(center))
|
||||
},
|
||||
{"pixel_samples", numeric_domain_axis_->pixel_sample_count()},
|
||||
{"pixel_samples", static_cast<int>(transform.pixel_length) +
|
||||
(transform.pixel_length > 0.0 ? 1 : 0)},
|
||||
{"tick_step", numeric_domain_axis_->tick_step(range)},
|
||||
{
|
||||
"sub_tick_count", numeric_domain_axis_->sub_tick_count(
|
||||
@@ -784,7 +807,9 @@ public:
|
||||
}
|
||||
if (case_id_ == "axis_lab") {
|
||||
telemetry["axis_lab"] = {
|
||||
{"domain_axis_pixel_samples", numeric_domain_axis_ ? numeric_domain_axis_->pixel_sample_count() : 0},
|
||||
{"domain_axis_pixel_samples", numeric_domain_axis_
|
||||
? static_cast<int>(numeric_domain_axis_->transform().pixel_length) + 1
|
||||
: 0},
|
||||
{"time_axis_point_count", time_axis_ ? time_axis_->time_point_count() : 0}
|
||||
};
|
||||
}
|
||||
@@ -830,7 +855,9 @@ public:
|
||||
else
|
||||
telemetry["data_shape"] = {
|
||||
{"input_points", 0},
|
||||
{"rendered_elements", numeric_domain_axis_ ? numeric_domain_axis_->pixel_sample_count() : 0},
|
||||
{"rendered_elements", numeric_domain_axis_
|
||||
? static_cast<int>(numeric_domain_axis_->transform().pixel_length) + 1
|
||||
: 0},
|
||||
{"unit", "axis samples"}
|
||||
};
|
||||
return telemetry.dump();
|
||||
@@ -1231,66 +1258,84 @@ private:
|
||||
const int y_offset = integer_value(state_, "axis_y_offset");
|
||||
const double length_rate = number_value(state_, "axis_length_percent") / 100.0;
|
||||
if (const auto horizontal = horizontal_axis()) {
|
||||
horizontal->set_x(left + x_offset);
|
||||
horizontal->set_y(top + height + y_offset);
|
||||
horizontal->set_pixel_length(static_cast<std::size_t>(
|
||||
std::max(1, static_cast<int>(std::lround(width * length_rate)))));
|
||||
update_axis_state(horizontal, [&](Axis_Base_Properties& axis) {
|
||||
axis.x = left + x_offset;
|
||||
axis.y = top + height + y_offset;
|
||||
axis.pixel_length = static_cast<std::size_t>(
|
||||
std::max(1, static_cast<int>(std::lround(width * length_rate))));
|
||||
});
|
||||
}
|
||||
if (const auto vertical = vertical_axis()) {
|
||||
vertical->set_x(left + x_offset);
|
||||
vertical->set_y(top + y_offset);
|
||||
vertical->set_pixel_length(static_cast<std::size_t>(
|
||||
std::max(1, static_cast<int>(std::lround(height * length_rate)))));
|
||||
update_axis_state(vertical, [&](Axis_Base_Properties& axis) {
|
||||
axis.x = left + x_offset;
|
||||
axis.y = top + y_offset;
|
||||
axis.pixel_length = static_cast<std::size_t>(
|
||||
std::max(1, static_cast<int>(std::lround(height * length_rate))));
|
||||
});
|
||||
}
|
||||
if (case_id_ == "axis_lab" && time_axis_) {
|
||||
time_axis_->set_x(left);
|
||||
time_axis_->set_y(26);
|
||||
time_axis_->set_pixel_length(static_cast<std::size_t>(width));
|
||||
time_axis_->update([&](auto& axis) {
|
||||
axis.x = left;
|
||||
axis.y = 26;
|
||||
axis.pixel_length = static_cast<std::size_t>(width);
|
||||
});
|
||||
}
|
||||
}
|
||||
void apply_axis_style(const std::shared_ptr<Abs_Axis>& axis) {
|
||||
if (!axis)
|
||||
return;
|
||||
axis->set_tick_length(integer_value(state_, "tick_length"));
|
||||
axis->set_sub_tick_length(integer_value(state_, "sub_tick_length"));
|
||||
axis->set_color(color_from_hex(string_value(state_, "axis_color")));
|
||||
axis->set_locale({string_value(state_, "decimal_separator").front()});
|
||||
axis->set_unit_text(string_value(state_, "unit_text"));
|
||||
axis->set_unit_text_font({
|
||||
number_value(state_, "unit_font_size"),
|
||||
integer_value(state_, "unit_font_weight"),
|
||||
bool_value(state_, "unit_font_italic")
|
||||
update_axis_state(axis, [&](Axis_Base_Properties& value) {
|
||||
value.tick_length = integer_value(state_, "tick_length");
|
||||
value.sub_tick_length = integer_value(state_, "sub_tick_length");
|
||||
value.color = color_from_hex(string_value(state_, "axis_color"));
|
||||
value.locale = {string_value(state_, "decimal_separator").front()};
|
||||
value.unit_text = string_value(state_, "unit_text");
|
||||
value.unit_text_font = {
|
||||
number_value(state_, "unit_font_size"),
|
||||
integer_value(state_, "unit_font_weight"),
|
||||
bool_value(state_, "unit_font_italic")
|
||||
};
|
||||
value.unit_text_pen = {color_from_hex(string_value(state_, "unit_pen_color"))};
|
||||
value.unit_text_background_brush = {
|
||||
color_from_hex(string_value(state_, "unit_background_color")),
|
||||
Brush_Style::Solid
|
||||
};
|
||||
value.label_rotation_degrees = integer_value(state_, "label_rotation");
|
||||
});
|
||||
axis->set_unit_text_pen({color_from_hex(string_value(state_, "unit_pen_color"))});
|
||||
axis->set_unit_text_background_brush(
|
||||
{color_from_hex(string_value(state_, "unit_background_color")), Brush_Style::Solid});
|
||||
axis->set_label_rotation_degrees(integer_value(state_, "label_rotation"));
|
||||
}
|
||||
void apply_axes() {
|
||||
const bool horizontal = string_value(state_, "axis_orientation") == "Horizontal";
|
||||
if (const auto main = horizontal_axis())
|
||||
main->set_orientation(horizontal ? Orientation::Horizontal : Orientation::Vertical);
|
||||
update_axis_state(main, [horizontal](Axis_Base_Properties& axis) {
|
||||
axis.orientation = horizontal ? Orientation::Horizontal : Orientation::Vertical;
|
||||
});
|
||||
if (const auto other = vertical_axis())
|
||||
other->set_orientation(horizontal ? Orientation::Vertical : Orientation::Horizontal);
|
||||
update_axis_state(other, [horizontal](Axis_Base_Properties& axis) {
|
||||
axis.orientation = horizontal ? Orientation::Vertical : Orientation::Horizontal;
|
||||
});
|
||||
apply_axis_style(horizontal_axis());
|
||||
apply_axis_style(vertical_axis());
|
||||
if (case_id_ == "axis_lab")
|
||||
apply_axis_style(time_axis_);
|
||||
if (numeric_domain_axis_) {
|
||||
numeric_domain_axis_->set_coord_range({
|
||||
number_value(state_, "coord_origin"),
|
||||
number_value(state_, "coord_target")
|
||||
numeric_domain_axis_->update([&](Axis_Properties& axis) {
|
||||
axis.coordinates = {
|
||||
number_value(state_, "coord_origin"),
|
||||
number_value(state_, "coord_target")
|
||||
};
|
||||
axis.precision = std::clamp(integer_value(state_, "label_precision"), 0, 12);
|
||||
axis.wheel = bool_value(state_, "use_wheel");
|
||||
axis.drag = bool_value(state_, "use_drag");
|
||||
});
|
||||
numeric_domain_axis_->set_label_precision(integer_value(state_, "label_precision"));
|
||||
numeric_domain_axis_->set_use_wheel(bool_value(state_, "use_wheel"));
|
||||
numeric_domain_axis_->set_use_drag(bool_value(state_, "use_drag"));
|
||||
}
|
||||
if (time_axis_) {
|
||||
time_axis_->set_visible_time_point_count(integer_value(state_, "time_visible_count"));
|
||||
time_axis_->set_tick_label_spacing_px(integer_value(state_, "time_label_spacing"));
|
||||
time_axis_->set_time_format(string_value(state_, "time_format"));
|
||||
time_axis_->set_font({number_value(state_, "time_font_size"), 500, false});
|
||||
time_axis_->set_newest_at_axis_start(bool_value(state_, "time_newest_at_start"));
|
||||
time_axis_->update([&](auto& axis) {
|
||||
axis.visible_count = std::max(2, integer_value(state_, "time_visible_count"));
|
||||
axis.tick_label_spacing_px = std::max(0, integer_value(state_, "time_label_spacing"));
|
||||
axis.format = string_value(state_, "time_format");
|
||||
axis.unit_text_font = {number_value(state_, "time_font_size"), 500, false};
|
||||
axis.newest_at_start = bool_value(state_, "time_newest_at_start");
|
||||
});
|
||||
}
|
||||
apply_layout();
|
||||
}
|
||||
@@ -1415,7 +1460,7 @@ private:
|
||||
sweep_->set<&Sweep_Spectrum::Properties::interpolation_mode>(line_mode(string_value(state_, "line_interpolation")));
|
||||
}
|
||||
if (trace_ && value_axis_)
|
||||
value_axis_->set_coord_range({
|
||||
value_axis_->set<&Axis_Properties::coordinates>(Range{
|
||||
number_value(state_, "trace_value_min"),
|
||||
number_value(state_, "trace_value_max")
|
||||
});
|
||||
@@ -1426,12 +1471,12 @@ private:
|
||||
constellation_->set<&Constellation_Diagram::Properties::anchor_color>(color_from_hex(string_value(state_, "anchor_color")));
|
||||
constellation_->set<&Constellation_Diagram::Properties::point_lifetime_ms>(integer_value(state_, "point_lifetime_ms"));
|
||||
if (numeric_domain_axis_)
|
||||
numeric_domain_axis_->set_coord_range({
|
||||
numeric_domain_axis_->set<&Axis_Properties::coordinates>(Range{
|
||||
number_value(state_, "i_origin"),
|
||||
number_value(state_, "i_target")
|
||||
});
|
||||
if (value_axis_)
|
||||
value_axis_->set_coord_range({
|
||||
value_axis_->set<&Axis_Properties::coordinates>(Range{
|
||||
number_value(state_, "q_origin"),
|
||||
number_value(state_, "q_target")
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user