ellipse.rs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. use std::fmt::Debug;
  2. use binrw::{BinRead, BinWrite};
  3. use diff::Diff;
  4. use crate::{
  5. field_of::FieldOf,
  6. types::{Coordinate, ObjectType, F64, U32},
  7. };
  8. use super::{ObjectCore, ObjectModifier, Translate};
  9. #[derive(BinRead, BinWrite, Clone, Debug, Diff, PartialEq)]
  10. #[diff(attr(
  11. #[derive(Debug, PartialEq)]
  12. ))]
  13. pub struct Ellipse {
  14. pub core: ObjectCore,
  15. #[brw(magic(8u32))] // Number of following fields in struct
  16. pub clockwise: U32,
  17. pub drawn_corner_a: FieldOf<Coordinate>,
  18. pub drawn_corner_b: FieldOf<Coordinate>,
  19. pub start_angle: F64, // Radians
  20. pub end_angle: F64, // Radians
  21. pub modifier: ObjectModifier,
  22. pub open_curve: U32,
  23. }
  24. impl Default for Ellipse {
  25. fn default() -> Self {
  26. Self {
  27. core: ObjectCore::default(ObjectType::Ellipse),
  28. clockwise: 0.into(),
  29. drawn_corner_a: Coordinate { x: 0.0, y: 0.0 }.into(),
  30. drawn_corner_b: Coordinate { x: 0.0, y: 0.0 }.into(),
  31. start_angle: 0.0.into(),
  32. end_angle: 0.0.into(),
  33. modifier: ObjectModifier::default(),
  34. open_curve: 0.into(),
  35. }
  36. }
  37. }
  38. impl Translate for Ellipse {
  39. fn move_absolute(&mut self, origin: Option<Coordinate>, z: Option<f64>) {
  40. origin.map(|origin| {
  41. let delta: Coordinate = origin - *self.core.origin;
  42. self.modifier.move_relative(delta);
  43. });
  44. self.core.move_absolute(origin, z);
  45. }
  46. fn move_relative(&mut self, delta: Option<Coordinate>, z: Option<f64>) {
  47. delta.map(|delta| {
  48. self.modifier.move_relative(delta);
  49. });
  50. self.core.move_relative(delta, z);
  51. }
  52. }