<> <> <> <<>> <> DIRECTORY PETypes, PEViewer USING [DrawProc, MenuLabelRec], Rope USING [ROPE]; PathEditor: CEDAR DEFINITIONS = BEGIN OPEN PETypes; Point: TYPE = PETypes.Point; PathData: TYPE = REF ANY; MoveToProc: TYPE = PROCEDURE [p1: Point]; LineToProc: TYPE = PROCEDURE [p1: Point]; CurveToProc: TYPE = PROCEDURE [p1, p2, p3: Point]; DrawProc: TYPE = PEViewer.DrawProc; ButtonHitProc: TYPE = PROCEDURE[event: ATOM, x, y: REAL]; MenuLabel: TYPE = PEViewer.MenuLabelRec; BooleanSpecification: TYPE = {on, off, toggle}; VertexType: TYPE = {frontKnot, rearKnot, intermediateKnot, controlPoint}; CurveType: TYPE = {point, line, bezier}; <> CreatePathViewer: PROCEDURE [name: Rope.ROPE, menuLabels: LIST OF MenuLabel, buttonProc: ButtonHitProc _ NIL, redrawProc: DrawProc _ NIL] RETURNS [pathData: PathData]; <> DrawInPathViewer: PROCEDURE [pathData: PathData, drawProc: DrawProc]; <> Redraw: PUBLIC PROCEDURE [pathData: PathData, erase: BOOLEAN _ FALSE]; <> FlushImage: PROCEDURE [pathData: PathData]; <> <> <<>> NewTrajectory: PROCEDURE [pathData: PathData]; <> <<>> SetActiveTrajectory: PROCEDURE [pathData: PathData, where: Point] RETURNS [activeTrajectorySet: BOOLEAN, hitPoint: Point]; <> <<>> TrajectoryIsEmpty: PROCEDURE [pathData: PathData] RETURNS [empty: BOOLEAN]; <> DeleteActiveTrajectory: PROCEDURE [pathData: PathData]; <> <<>> GetTrajectoryFile: PROCEDURE [pathData: PathData, fileName: Rope.ROPE]; <> StoreTrajectoryFile: PUBLIC PROCEDURE [pathData: PathData, fileName: Rope.ROPE]; <> EnumerateTrajectories: PROCEDURE [pathData: PathData, moveToProc: MoveToProc, lineToProc: LineToProc, curveToProc: CurveToProc]; <> <<>> <> <<>> AddKnotToFront: PROCEDURE [pathData: PathData, position: Point]; <> AddCubicToFront: PROCEDURE [pathData: PathData, cp1, cp2, knot: Point]; <> AddKnotToRear: PROCEDURE [pathData: PathData, position: Point]; <> AddCubicToRear: PROCEDURE [pathData: PathData, cp1, cp2, knot: Point]; <> SplitSegment: PROCEDURE [pathData: PathData, where: Point]; <> AdjustSegmentSplit: PROCEDURE [pathData: PathData, where: Point]; <> ConfirmSegmentSplit: PROCEDURE[pathData: PathData]; <> AddControlPoint: PROCEDURE [pathData: PathData, where, position: Point]; <> CloseActiveTrajectory: PROCEDURE [pathData: PathData]; <> OpenActiveTrajectory: PROCEDURE [pathData: PathData]; <> <<>> StoreBetas: PROCEDURE [pathData: PathData, bias: REAL, tension: REAL]; <> SetGlobal: PROCEDURE [pathData: PathData]; <> SetLocal: PROCEDURE [pathData: PathData]; < continuously shaped splines>> <<>> SetSimplify: PROCEDURE [pathData: PathData, delta: REAL]; <> <<>> DeleteVertex: PROCEDURE [pathData: PathData, vertex: Point, collinear: BOOLEAN _ FALSE, closestVertex: VertexNode, closestSegment: SegmentNode] RETURNS [newTrajectoryList: PETypes.TrajectoryList]; <> SetActiveVertex: PROCEDURE [pathData: PathData, where: Point] RETURNS [activeVertexSet: BOOLEAN, vertex: Point]; <> GetActiveVertex: PROCEDURE [pathData: PathData] RETURNS [activeVertexSet: BOOLEAN, vertex: Point]; <> MoveActiveVertex: PROCEDURE [pathData: PathData, newPosition: Point]; <> SetContinuity: PROCEDURE [pathData: PathData, knot: Point, continuity: BooleanSpecification]; <> EnumerateActiveTrajectory: PROCEDURE [pathData: PathData, moveToProc: MoveToProc, lineToProc: LineToProc, curveToProc: CurveToProc]; <> HitTestVertices: PROCEDURE [pathData: PathData, where: Point] RETURNS [closeToVertex: BOOLEAN, vertexType: VertexType, vertex: Point]; <> HitTestCurves: PROCEDURE [pathData: PathData, where: Point] RETURNS [closeToCurve: BOOLEAN, curveType: CurveType, p0, p1, p2, p3: Point, hitPoint: Point]; <> END.