forked from 1b-agent/opencadstudio-upstream
feat(blocks): implement WBLOCK dialog and unify dialog buttons and radio builders
This commit is contained in:
1 parent
dddf60d79e
commit
1a6279e841
33 files changed
+1308
-45
No files matched your search
@@ -157,3 +157,109 @@ pub fn normalize_to_origin(out: &mut CadDocument) {
|
||||
crate::scene::view::dispatch::apply_transform(entity, &shift);
|
||||
}
|
||||
}
|
||||
|
||||
/// One-shot point picker for the Write Block dialog's "Pick point" button.
|
||||
pub struct WblockPickBasePointCommand;
|
||||
|
||||
impl crate::command::CadCommand for WblockPickBasePointCommand {
|
||||
fn name(&self) -> &'static str {
|
||||
"WBLOCK"
|
||||
}
|
||||
|
||||
fn prompt(&self) -> String {
|
||||
crate::t!("WBLOCK Specify insertion base point:").into_owned()
|
||||
}
|
||||
|
||||
fn on_point(&mut self, pt: glam::DVec3) -> crate::command::CmdResult {
|
||||
crate::command::CmdResult::Dispatch(format!("WBLOCK_POINT_PICKED {} {} {}", pt.x, pt.y, pt.z))
|
||||
}
|
||||
|
||||
fn on_enter(&mut self) -> crate::command::CmdResult {
|
||||
crate::command::CmdResult::Dispatch("WBLOCK_POINT_CANCELLED".to_string())
|
||||
}
|
||||
|
||||
fn on_escape(&mut self) -> crate::command::CmdResult {
|
||||
crate::command::CmdResult::Dispatch("WBLOCK_POINT_CANCELLED".to_string())
|
||||
}
|
||||
}
|
||||
|
||||
/// Build a standalone `CadDocument` from an explicit list of entity handles,
|
||||
/// applying `base_point` translation and `unit` insertion units.
|
||||
pub fn extract_entities_to_doc_with_base(
|
||||
src: &CadDocument,
|
||||
handles: &[acadrust::Handle],
|
||||
base_point: glam::DVec3,
|
||||
unit: i16,
|
||||
) -> Result<CadDocument, String> {
|
||||
let mut out = CadDocument::new();
|
||||
out.header.insertion_units = unit;
|
||||
extract_entities_into(src, handles, &mut out)?;
|
||||
if base_point != glam::DVec3::ZERO {
|
||||
let shift = crate::command::EntityTransform::Affine(
|
||||
acadrust::types::Transform::from_translation(acadrust::types::Vector3::new(
|
||||
-base_point.x,
|
||||
-base_point.y,
|
||||
-base_point.z,
|
||||
)),
|
||||
);
|
||||
for entity in out.entities_mut() {
|
||||
crate::scene::view::dispatch::apply_transform(entity, &shift);
|
||||
}
|
||||
}
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use acadrust::entities::Line;
|
||||
use acadrust::types::Vector3;
|
||||
|
||||
#[test]
|
||||
fn test_extract_entities_with_base_point_and_units() {
|
||||
let mut doc = CadDocument::new();
|
||||
let mut line = Line::new();
|
||||
line.start = Vector3::new(10.0, 20.0, 0.0);
|
||||
line.end = Vector3::new(30.0, 40.0, 0.0);
|
||||
let h = doc.add_entity(EntityType::Line(line)).unwrap();
|
||||
|
||||
let out = extract_entities_to_doc_with_base(
|
||||
&doc,
|
||||
&[h],
|
||||
glam::DVec3::new(10.0, 20.0, 0.0),
|
||||
4, // Millimeters
|
||||
)
|
||||
.expect("extract should succeed");
|
||||
|
||||
assert_eq!(out.header.insertion_units, 4);
|
||||
assert_eq!(out.entities().count(), 1);
|
||||
let e = out.entities().next().unwrap();
|
||||
if let EntityType::Line(l) = e {
|
||||
assert!((l.start.x - 0.0).abs() < 1e-6);
|
||||
assert!((l.start.y - 0.0).abs() < 1e-6);
|
||||
assert!((l.end.x - 20.0).abs() < 1e-6);
|
||||
assert!((l.end.y - 20.0).abs() < 1e-6);
|
||||
} else {
|
||||
panic!("Expected Line entity");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extract_block_to_doc() {
|
||||
let mut doc = CadDocument::new();
|
||||
let mut line = Line::new();
|
||||
line.start = Vector3::new(1.0, 2.0, 0.0);
|
||||
line.end = Vector3::new(3.0, 4.0, 0.0);
|
||||
let h = doc.add_entity(EntityType::Line(line)).unwrap();
|
||||
|
||||
let mut block_record = acadrust::tables::BlockRecord::new("MY_BLOCK".to_string());
|
||||
block_record.entity_handles.push(h);
|
||||
let _ = doc.block_records.add(block_record);
|
||||
|
||||
let out = extract_block_to_doc(&doc, "MY_BLOCK").expect("block extract should succeed");
|
||||
assert_eq!(out.entities().count(), 1);
|
||||
|
||||
assert!(extract_block_to_doc(&doc, "NON_EXISTENT").is_err());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user