改造一些

This commit is contained in:
2026-08-12 00:06:44 +08:00
parent aca480d988
commit abd1b595c7
57 changed files with 883 additions and 732 deletions
+101 -56
View File
@@ -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")
});