Feat: Phase 4.1/4.2 — Polyline, Polyline2D, Polyline3D, Ray, XLine render and grips

- polyline.rs: TruckConvertible/Grippable/PropertyEditable/Transformable
  for all three polyline types; Polyline2D handles bulge arcs via the
  same truck Wire path as LwPolyline; Polyline and Polyline3D use
  TruckObject::Lines for straight-segment rendering
- ray.rs: Ray renders as base→+1e6; XLine renders as ±1e6; both have
  base-point and direction grips; mirror correctly reflects direction
  vector; base X/Y/Z and Dir X/Y/Z exposed in properties panel
- traits.rs: dispatch all five new entity types through
  to_truck_entity, grips, geometry_properties, apply_geom_prop,
  apply_grip, apply_transform

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Hakan Seven 2026-04-02 18:51:38 +03:00
commit 4a93fc4949
4 changed files with 700 additions and 0 deletions

View file

@ -41,6 +41,11 @@ impl EntityTypeOps for EntityType {
EntityType::Ellipse(ellipse) => TruckConvertible::to_truck(ellipse, document),
EntityType::Spline(spline) => TruckConvertible::to_truck(spline, document),
EntityType::LwPolyline(pline) => TruckConvertible::to_truck(pline, document),
EntityType::Polyline(pl) => TruckConvertible::to_truck(pl, document),
EntityType::Polyline2D(pl) => TruckConvertible::to_truck(pl, document),
EntityType::Polyline3D(pl) => TruckConvertible::to_truck(pl, document),
EntityType::Ray(ray) => TruckConvertible::to_truck(ray, document),
EntityType::XLine(xl) => TruckConvertible::to_truck(xl, document),
EntityType::Text(text) => TruckConvertible::to_truck(text, document),
EntityType::MText(text) => TruckConvertible::to_truck(text, document),
EntityType::Leader(leader) => TruckConvertible::to_truck(leader, document),
@ -56,6 +61,11 @@ impl EntityTypeOps for EntityType {
EntityType::Arc(arc) => Grippable::grips(arc),
EntityType::Ellipse(ellipse) => Grippable::grips(ellipse),
EntityType::LwPolyline(pline) => Grippable::grips(pline),
EntityType::Polyline(pl) => Grippable::grips(pl),
EntityType::Polyline2D(pl) => Grippable::grips(pl),
EntityType::Polyline3D(pl) => Grippable::grips(pl),
EntityType::Ray(ray) => Grippable::grips(ray),
EntityType::XLine(xl) => Grippable::grips(xl),
EntityType::Point(pt) => Grippable::grips(pt),
EntityType::Spline(spline) => Grippable::grips(spline),
EntityType::Text(text) => Grippable::grips(text),
@ -89,6 +99,26 @@ impl EntityTypeOps for EntityType {
pline,
text_style_names,
)),
EntityType::Polyline(pl) => Some(PropertyEditable::geometry_properties(
pl,
text_style_names,
)),
EntityType::Polyline2D(pl) => Some(PropertyEditable::geometry_properties(
pl,
text_style_names,
)),
EntityType::Polyline3D(pl) => Some(PropertyEditable::geometry_properties(
pl,
text_style_names,
)),
EntityType::Ray(ray) => Some(PropertyEditable::geometry_properties(
ray,
text_style_names,
)),
EntityType::XLine(xl) => Some(PropertyEditable::geometry_properties(
xl,
text_style_names,
)),
EntityType::Hatch(hatch) => Some(PropertyEditable::geometry_properties(
hatch,
text_style_names,
@ -139,6 +169,11 @@ impl EntityTypeOps for EntityType {
PropertyEditable::apply_geom_prop(ellipse, field, value)
}
EntityType::LwPolyline(pline) => PropertyEditable::apply_geom_prop(pline, field, value),
EntityType::Polyline(pl) => PropertyEditable::apply_geom_prop(pl, field, value),
EntityType::Polyline2D(pl) => PropertyEditable::apply_geom_prop(pl, field, value),
EntityType::Polyline3D(pl) => PropertyEditable::apply_geom_prop(pl, field, value),
EntityType::Ray(ray) => PropertyEditable::apply_geom_prop(ray, field, value),
EntityType::XLine(xl) => PropertyEditable::apply_geom_prop(xl, field, value),
EntityType::Hatch(hatch) => PropertyEditable::apply_geom_prop(hatch, field, value),
EntityType::Point(pt) => PropertyEditable::apply_geom_prop(pt, field, value),
EntityType::Spline(spline) => PropertyEditable::apply_geom_prop(spline, field, value),
@ -160,6 +195,11 @@ impl EntityTypeOps for EntityType {
EntityType::Arc(arc) => Grippable::apply_grip(arc, grip_id, apply),
EntityType::Ellipse(ellipse) => Grippable::apply_grip(ellipse, grip_id, apply),
EntityType::LwPolyline(pline) => Grippable::apply_grip(pline, grip_id, apply),
EntityType::Polyline(pl) => Grippable::apply_grip(pl, grip_id, apply),
EntityType::Polyline2D(pl) => Grippable::apply_grip(pl, grip_id, apply),
EntityType::Polyline3D(pl) => Grippable::apply_grip(pl, grip_id, apply),
EntityType::Ray(ray) => Grippable::apply_grip(ray, grip_id, apply),
EntityType::XLine(xl) => Grippable::apply_grip(xl, grip_id, apply),
EntityType::Point(pt) => Grippable::apply_grip(pt, grip_id, apply),
EntityType::Spline(spline) => Grippable::apply_grip(spline, grip_id, apply),
EntityType::Text(text) => Grippable::apply_grip(text, grip_id, apply),
@ -181,6 +221,11 @@ impl EntityTypeOps for EntityType {
EntityType::Insert(ins) => Transformable::apply_transform(ins, t),
EntityType::Line(line) => Transformable::apply_transform(line, t),
EntityType::LwPolyline(pline) => Transformable::apply_transform(pline, t),
EntityType::Polyline(pl) => Transformable::apply_transform(pl, t),
EntityType::Polyline2D(pl) => Transformable::apply_transform(pl, t),
EntityType::Polyline3D(pl) => Transformable::apply_transform(pl, t),
EntityType::Ray(ray) => Transformable::apply_transform(ray, t),
EntityType::XLine(xl) => Transformable::apply_transform(xl, t),
EntityType::MText(text) => Transformable::apply_transform(text, t),
EntityType::Point(pt) => Transformable::apply_transform(pt, t),
EntityType::Spline(spline) => Transformable::apply_transform(spline, t),