Files
OneCAD-Draft/src/modules/view/plot_window.rs
T
Karim Jerbi 02c470aac7 feat(pdf): searchable text layer with per-style subset font embedding
Real BT/Tj text objects ride alongside the vector outlines (Tr 3,
zero visual change): runs preserved at layout time, TTF styles embedded
as allsorts subsets with ToUnicode, width-matched Tm, clip-culled.
WireModel literals moved to ..Default::default() tails.
2026-10-01 23:30:35 +01:00

108 lines
3.2 KiB
Rust

// PLOTWINDOW command — pick two corners to define the plot window area.
//
// In both model and paper space the host stores the picked rectangle for the
// plot dialog; committing the dialog persists it to layout PlotSettings.
use crate::command::{CadCommand, CmdResult};
use crate::scene::model::wire_model::WireModel;
use glam::DVec3;
use crate::t;
pub struct PlotWindowCommand {
p1: Option<DVec3>,
}
impl PlotWindowCommand {
pub fn new() -> Self {
Self { p1: None }
}
}
impl CadCommand for PlotWindowCommand {
fn name(&self) -> &'static str {
"PLOTWINDOW"
}
fn prompt(&self) -> String {
if self.p1.is_none() {
t!("PLOTWINDOW Specify first corner of plot window:").into_owned()
} else {
t!("PLOTWINDOW Specify opposite corner:").into_owned()
}
}
fn on_point(&mut self, pt: DVec3) -> CmdResult {
match self.p1 {
None => {
self.p1 = Some(pt);
CmdResult::NeedPoint
}
Some(p1) => CmdResult::SetPlotWindow { p1, p2: pt },
}
}
fn on_enter(&mut self) -> CmdResult {
CmdResult::Cancel
}
fn window_corner_pick(&self) -> bool {
// Free rectangle corners — exempt from Ortho/Polar (#363/#291 class).
true
}
fn on_mouse_move(&mut self, pt: DVec3) -> Option<WireModel> { let pt = pt.as_vec3();
let p1 = self.p1?.as_vec3();
// Draw the selection rectangle.
Some(WireModel {
bg_adapt: None,
point_marker: None,
taper_widths: Vec::new(),
pattern_stations: Vec::new(),
world_width: 0.0,
depth_override: None,
display_visible: true,
snap_only: false,
plot_visible: true,
fill_is_3d: false,
fill_is_2d_solid: false,
render_instance: None,
pick_tris: Vec::new(),
pick_tris_low: Vec::new(),
dash_from_start: false,
dash_align_end: None,
text_verts: Vec::new(),
name: "plotwindow_preview".into(),
points: vec![
[p1.x, p1.y, p1.z],
[pt.x, p1.y, p1.z],
[pt.x, p1.y, p1.z],
[pt.x, pt.y, pt.z],
[pt.x, pt.y, pt.z],
[p1.x, pt.y, pt.z],
[p1.x, pt.y, pt.z],
[p1.x, p1.y, p1.z],
],
points_low: Vec::new(),
color: WireModel::CYAN,
selected: false,
pattern_length: 0.0,
pattern: [0.0; 8],
line_weight_px: 1.0,
snap_pts: vec![],
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
plinegen: true,
fill_tris: vec![],
fill_tris_low: Vec::new(),
..Default::default()
})
}
}
// ── Autocomplete registry ─────────────────────────────────
inventory::submit!(crate::command::CommandRegistration { names: &["PLOTWINDOW"] }); // PlotWindowCommand