#![allow(async_fn_in_trait)]
use serde::{Deserialize, Serialize};
use crate::*;
pub trait SketchApi {
async fn new_sketch(
&self,
project: ProjectId,
file: FileId,
version: Version,
args: SketchArgs,
) -> Result<(SourceDelta, SceneGraphDelta, ObjectId)>;
async fn edit_sketch(
&self,
project: ProjectId,
file: FileId,
version: Version,
sketch: ObjectId,
) -> Result<SceneGraphDelta>;
async fn exit_sketch(&self, version: Version, sketch: ObjectId) -> Result<SceneGraph>;
async fn add_segment(
&self,
version: Version,
sketch: ObjectId,
segment: SegmentCtor,
label: Option<String>,
) -> Result<(SourceDelta, SceneGraphDelta)>;
async fn edit_segment(
&self,
version: Version,
sketch: ObjectId,
segment_id: ObjectId,
segment: SegmentCtor,
) -> Result<(SourceDelta, SceneGraphDelta)>;
async fn delete_segment(
&self,
version: Version,
sketch: ObjectId,
segment_id: ObjectId,
) -> Result<(SourceDelta, SceneGraphDelta)>;
async fn add_constraint(
&self,
version: Version,
sketch: ObjectId,
constraint: Constraint,
) -> Result<(SourceDelta, SceneGraphDelta)>;
async fn edit_constraint(
&self,
version: Version,
sketch: ObjectId,
constraint_id: ObjectId,
constraint: Constraint,
) -> Result<(SourceDelta, SceneGraphDelta)>;
async fn delete_constraint(
&self,
version: Version,
sketch: ObjectId,
constraint_id: ObjectId,
) -> Result<(SourceDelta, SceneGraphDelta)>;
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export, rename = "ApiSketch")]
pub struct Sketch {
pub args: SketchArgs,
pub segments: Vec<ObjectId>,
pub constraints: Vec<ObjectId>,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export)]
pub struct SketchArgs {
pub on: Plane,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export, rename = "ApiPoint")]
pub struct Point {
pub position: Point2d<Number>,
pub ctor: Option<Point2d<Expr>>,
pub owner: Option<ObjectId>,
pub freedom: Freedom,
pub constraints: Vec<ObjectId>,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export)]
pub enum Freedom {
Free,
Partial,
Fixed,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export, rename = "ApiSegment")]
pub enum Segment {
Point(Point),
Line(Line),
Arc(Arc),
Circle(Circle),
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export)]
pub enum SegmentCtor {
Point(Point2d<Expr>),
Line(LineCtor),
MidPointLine(MidPointLineCtor),
Arc(ArcCtor),
ThreePointArc(ThreePointArcCtor),
TangentArc(TangentArcCtor),
Circle(CircleCtor),
ThreePointCircle(ThreePointCircleCtor),
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export, rename = "ApiPoint2d")]
pub struct Point2d<U: std::fmt::Debug + Clone + ts_rs::TS> {
pub x: U,
pub y: U,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export, rename = "ApiLine")]
pub struct Line {
pub start: ObjectId,
pub end: ObjectId,
pub ctor: SegmentCtor,
pub ctor_applicable: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export)]
pub struct LineCtor {
pub start: Point2d<Expr>,
pub end: Point2d<Expr>,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export)]
pub struct MidPointLineCtor {
pub midpoint: Point2d<Expr>,
pub start_or_end: StartOrEnd<Point2d<Expr>>,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export, rename = "ApiStartOrEnd")]
pub enum StartOrEnd<T> {
Start(T),
End(T),
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export, rename = "ApiArc")]
pub struct Arc {
pub start: ObjectId,
pub end: ObjectId,
pub center: ObjectId,
pub ctor: SegmentCtor,
pub ctor_applicable: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export)]
pub struct ArcCtor {
pub start: Point2d<Expr>,
pub end: Point2d<Expr>,
pub center: Point2d<Expr>,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export)]
pub struct ThreePointArcCtor {
pub start: Point2d<Expr>,
pub end: Point2d<Expr>,
pub interior: Point2d<Expr>,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export)]
pub struct TangentArcCtor {
pub start: Point2d<Expr>,
pub end: Point2d<Expr>,
pub tangent: StartOrEnd<ObjectId>,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export, rename = "ApiCircle")]
pub struct Circle {
pub start: ObjectId,
pub radius: Number,
pub ctor: SegmentCtor,
pub ctor_applicable: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export)]
pub struct CircleCtor {
pub center: Point2d<Expr>,
pub radius: Expr,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export)]
pub struct ThreePointCircleCtor {
pub p1: Point2d<Expr>,
pub p2: Point2d<Expr>,
pub p3: Point2d<Expr>,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export, rename = "ApiConstraint")]
pub enum Constraint {
Coincident(Coincident),
Parallel(Parallel),
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export)]
pub struct Coincident {
points: Vec<ObjectId>,
}
#[derive(Debug, Clone, Deserialize, Serialize, ts_rs::TS)]
#[ts(export, optional_fields)]
pub struct Parallel {
lines: Vec<ObjectId>,
distance: Option<Number>,
}