<> <> <> <> <> <> <> <> <<>> <> <<>> DIRECTORY Feedback, GGBasicTypes, GGCoreTypes, GGInterfaceTypes, GGModelTypes, GGParent, GGSegmentTypes, GGSequence, GGSlice, GGSliceOps, GGTraj, GGUtility, Imager, Rope; GGSequenceImpl: CEDAR PROGRAM IMPORTS Feedback, GGParent, GGSequence, GGSlice, GGSliceOps, GGTraj, GGUtility EXPORTS GGSequence = BEGIN BezierDragRecord: TYPE = GGInterfaceTypes.BezierDragRecord; BitMatrix: TYPE = GGBasicTypes.BitMatrix; BitMatrixObj: TYPE = GGBasicTypes.BitMatrixObj; BitVector: TYPE = GGBasicTypes.BitVector; BitVectorObj: TYPE = GGBasicTypes.BitVectorObj; <> Color: TYPE = Imager.Color; ControlPointGenerator: TYPE = GGModelTypes.ControlPointGenerator; ControlPointGeneratorObj: TYPE = GGModelTypes.ControlPointGeneratorObj; EditConstraints: TYPE = GGModelTypes.EditConstraints; Joint: TYPE = GGModelTypes.Joint; JointGenerator: TYPE = GGModelTypes.JointGenerator; JointGeneratorObj: TYPE = GGModelTypes.JointGeneratorObj; JointWalkProc: TYPE = GGSequence.JointWalkProc; Point: TYPE = GGBasicTypes.Point; PointAndDone: TYPE = GGModelTypes.PointAndDone; PointWalkProc: TYPE = GGModelTypes.PointWalkProc; SegAndIndex: TYPE = GGSequence.SegAndIndex; Segment: TYPE = GGSegmentTypes.Segment; SegmentGenerator: TYPE = GGModelTypes.SegmentGenerator; SegmentGeneratorObj: TYPE = GGModelTypes.SegmentGeneratorObj; SegmentWalkProc: TYPE = GGSequence.SegmentWalkProc; SelectionClass: TYPE = GGSegmentTypes.SelectionClass; SequenceGenerator: TYPE = GGSequence.SequenceGenerator; SequenceGeneratorObj: TYPE = GGSequence.SequenceGeneratorObj; SequenceOfReal: TYPE = GGCoreTypes.SequenceOfReal; Slice: TYPE = GGModelTypes.Slice; SliceDescriptor: TYPE = GGModelTypes.SliceDescriptor; SliceParts: TYPE = GGModelTypes.SliceParts; StrokeEnd: TYPE = Imager.StrokeEnd; Traj: TYPE = GGModelTypes.Traj; TrajData: TYPE = GGModelTypes.TrajData; TrajEnd: TYPE = GGModelTypes.TrajEnd; TrajParts: TYPE = GGModelTypes.TrajParts; TrajPartsObj: TYPE = GGModelTypes.TrajPartsObj; TrajPartType: TYPE = GGModelTypes.TrajPartType; Problem: PUBLIC SIGNAL [msg: Rope.ROPE] = Feedback.Problem; <> CreateFromSegments: PUBLIC PROC [traj: TrajData, startSeg, endSeg: NAT] RETURNS [seq: TrajParts] = { < endSeg is allowed, in which case the segment sequence wraps around.>> <> <> segCount, temp: NAT; IF startSeg >= traj.segCount OR endSeg >= traj.segCount THEN ERROR; IF startSeg = endSeg THEN {seq _ CreateFromSegment[traj, startSeg]; RETURN}; IF traj.role = open THEN { IF startSeg > endSeg THEN {temp _ startSeg; startSeg _ endSeg; endSeg _ temp}; segCount _ endSeg - startSeg + 1; } ELSE { IF startSeg = (endSeg + 1) MOD traj.segCount THEN {seq _ CreateComplete[traj]; RETURN}; segCount _ ((endSeg - startSeg + traj.segCount) MOD traj.segCount) + 1; }; seq _ NEW[TrajPartsObj _ [ segments: NewBitVector[traj.segCount], joints: NewBitVector[GGTraj.HiJointTraj[traj] + 1], controlPoints: NewBitMatrix[traj], segCount: segCount, controlPointCount: 0, -- will be updated by FillInControlPoints jointCount: 0 -- will be updated by FillInJoints ]]; IF startSeg < endSeg THEN { FOR i: NAT IN [startSeg..endSeg] DO seq.segments[i] _ TRUE; ENDLOOP; FillInJoints[seq]; FillInControlPoints[seq]; } ELSE { FOR i: NAT IN [startSeg..traj.segCount) DO seq.segments[i] _ TRUE; ENDLOOP; FOR i: NAT IN [0..endSeg] DO seq.segments[i] _ TRUE; ENDLOOP; FillInJoints[seq]; FillInControlPoints[seq]; }; }; CreateJointToJoint: PUBLIC PROC [traj: TrajData, startJoint, endJoint: NAT] RETURNS [seq: TrajParts] = { <> temp, hiJoint: NAT; hiJoint _ GGTraj.HiJointTraj[traj]; IF traj.role = open AND startJoint = 0 AND endJoint = hiJoint THEN { seq _ CreateComplete[traj]; RETURN}; IF traj.role = open OR startJoint < endJoint THEN { IF startJoint > endJoint THEN {temp _ startJoint; startJoint _ endJoint; endJoint _ temp}; IF startJoint < 0 OR endJoint > hiJoint THEN ERROR; seq _ NEW[TrajPartsObj _ [ segments: NewBitVector[traj.segCount], joints: NewBitVector[hiJoint+1], controlPoints: NewBitMatrix[traj], segCount: endJoint - startJoint, controlPointCount: 0, -- initialized by FillInControlPoints jointCount: endJoint - startJoint + 1 ]]; FOR i: NAT IN [startJoint..endJoint) DO seq.segments[i] _ TRUE; seq.joints[i] _ TRUE; ENDLOOP; seq.joints[endJoint] _ TRUE; } ELSE { IF startJoint = endJoint THEN {seq _ CreateFromJoint[traj, startJoint]; RETURN}; <> seq _ NEW[TrajPartsObj _ [ segments: NewBitVector[traj.segCount], joints: NewBitVector[hiJoint+1], controlPoints: NewBitMatrix[traj], segCount: traj.segCount - startJoint + endJoint, controlPointCount: 0, jointCount: traj.segCount - startJoint + endJoint + 1 ]]; FOR i: NAT IN [startJoint..traj.segCount) DO seq.segments[i] _ TRUE; seq.joints[i] _ TRUE; ENDLOOP; FOR i: NAT IN [0..endJoint) DO seq.segments[i] _ TRUE; seq.joints[i] _ TRUE; ENDLOOP; seq.joints[endJoint] _ TRUE; }; FillInControlPoints[seq]; -- after all is said and done }; CreateEmpty: PUBLIC PROC [traj: TrajData] RETURNS [seq: TrajParts] = { seq _ NEW[TrajPartsObj _ [ segments: NewBitVector[traj.segCount], joints: NewBitVector[GGTraj.HiJointTraj[traj]+1], controlPoints: NewBitMatrix[traj], segCount: 0, controlPointCount: 0, jointCount: 0 ]]; }; CreateComplete: PUBLIC PROC [traj: TrajData] RETURNS [seq: TrajParts] = { <> jointCount: NAT _ GGTraj.HiJointTraj[traj] + 1; seq _ NEW[TrajPartsObj _ [ segments: NewBitVector[traj.segCount], joints: NewBitVector[jointCount], controlPoints: NewBitMatrix[traj], segCount: traj.segCount, controlPointCount: 0, -- set by FillInControlPoints jointCount: jointCount ]]; FOR i: NAT IN [0..GGTraj.HiSegmentTraj[traj]] DO seq.segments[i] _ TRUE; seq.joints[i] _ TRUE; ENDLOOP; seq.joints[jointCount-1] _ TRUE; -- will be redundant for open trajectories FillInControlPoints[seq]; -- after all is said and done }; CreateFromJoint: PUBLIC PROC [traj: TrajData, jointNum: NAT] RETURNS [seq: TrajParts] = { seq _ CreateEmpty[traj]; seq.joints[jointNum] _ TRUE; seq.jointCount _ 1; }; CreateFromSegment: PUBLIC PROC [traj: TrajData, segNum: NAT] RETURNS [seq: TrajParts] = { seq _ CreateEmpty[traj]; seq.segments[segNum] _ TRUE; seq.segCount _ 1; FillInJoints[seq]; FillInControlPoints[seq]; -- after all is said and done }; CreateSimpleFromSegment: PUBLIC PROC [traj: TrajData, segNum: NAT] RETURNS [seq: TrajParts] = { seq _ CreateEmpty[traj]; seq.segments[segNum] _ TRUE; seq.segCount _ 1; }; CreateFromControlPoint: PUBLIC PROC [traj: TrajData, segNum: NAT, controlPointNum: NAT] RETURNS [seq: TrajParts] = { seq _ CreateEmpty[traj]; seq.controlPoints[segNum][controlPointNum] _ TRUE; seq.controlPointCount _ 1; }; Copy: PUBLIC PROC [seq: TrajParts] RETURNS [copy: TrajParts] = { IF seq=NIL THEN RETURN[NIL]; <> copy _ NEW[TrajPartsObj _ [ segments: NewBitVector[seq.segments.len], joints: NewBitVector[seq.joints.len], controlPoints: NewBitMatrixFromSeq[seq], segCount: seq.segCount, controlPointCount: seq.controlPointCount, jointCount: seq.jointCount ]]; FOR i: NAT IN [0..seq.segments.len) DO copy.segments[i] _ seq.segments[i]; ENDLOOP; FOR i: NAT IN [0..seq.joints.len) DO copy.joints[i] _ seq.joints[i]; ENDLOOP; FOR i: NAT IN [0..seq.controlPoints.len) DO cpCount: NAT _ seq.controlPoints[i].len; FOR j: NAT IN [0..cpCount) DO copy.controlPoints[i][j] _ seq.controlPoints[i][j]; ENDLOOP; ENDLOOP; }; CreateEmptySeq: PRIVATE PROC [seq: TrajParts] RETURNS [copy: TrajParts] = { IF seq=NIL THEN RETURN[NIL]; copy _ NEW[TrajPartsObj _ [ segments: NewBitVector[seq.segments.len], joints: NewBitVector[seq.joints.len], controlPoints: NewBitMatrixFromSeq[seq], segCount: 0, controlPointCount: 0, jointCount: 0 ]]; }; <<>> <> <<>> <> <> <> <> <<};>> <<>> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <> <> <<}>> <> <> <> <> <<};>> <<};>> <> <> <> <> <> <> <> <> <> <> <<};>> <> <<};>> <> <<};>> <> <> <> <> <> <> <<};>> <> <<};>> <<};>> <<>> <> <> <> <> <<>> <> <> <> <> <<>> <> <> <> <> <> <> <<};>> <> <<};>> <> <<};>> <<>> <> <> <> <> <> <> <> <> <> <> <> <> <<};>> <> < bBox.hiX THEN bBox.hiX _ hiX;>> <> < bBox.hiY THEN bBox.hiY _ hiY;>> <<};>> <<>> <> <<>> <> <> <> <> <> <> <