refactor(commands): per-entity MassProps + TextContent traits
Two free helpers in app/commands.rs lived as big match-on-EntityType blocks: massprop_entity (Circle/Arc/Line/LwPolyline/Ellipse area + perimeter + centroid, ~140 lines) and entity_text_content / replace_entity_text (Text/MText/AttributeDefinition/AttributeEntity). Move each to its own trait in entities/traits.rs and implement per-entity: MassPropsCalc — Circle, Arc, Line, LwPolyline, Ellipse TextContent — Text, MText, AttributeDefinition, AttributeEntity EntityTypeOps gets dispatch shims that route to the trait via the existing macro, so callsites just call entity.mass_props() / entity.text_content() / entity.replace_text(search, rep). The remaining free helpers in commands.rs (entity_list_details, entity_extra_info, entity_type_name, build_data_extraction_csv) are single-command formatting helpers tightly coupled to LIST / EXTRACT / text-format output. Distributing them as per-entity methods would inflate every entity file with command-side formatting concerns without making the command-side any cleaner — left in place. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
40180e9089
commit
e78321190a
10 changed files with 266 additions and 193 deletions
|
|
@ -244,3 +244,29 @@ impl Transformable for Arc {
|
|||
apply_transform(self, t);
|
||||
}
|
||||
}
|
||||
|
||||
impl crate::entities::traits::MassPropsCalc for acadrust::entities::Arc {
|
||||
fn mass_props(&self) -> crate::entities::traits::MassProps {
|
||||
use std::f64::consts::TAU;
|
||||
let r = self.radius;
|
||||
let span = {
|
||||
let s = (self.end_angle - self.start_angle).rem_euclid(TAU);
|
||||
if s < 1e-6 {
|
||||
TAU
|
||||
} else {
|
||||
s
|
||||
}
|
||||
};
|
||||
// Sector area (pie slice)
|
||||
let area = 0.5 * r * r * span;
|
||||
let arc_len = r * span;
|
||||
// Centroid of arc (chord midpoint direction)
|
||||
let mid_rad = self.start_angle + span / 2.0;
|
||||
crate::entities::traits::MassProps {
|
||||
area,
|
||||
perimeter: arc_len,
|
||||
cx: self.center.x + r * mid_rad.cos(),
|
||||
cy: self.center.y + r * mid_rad.sin(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue