<> <> <> <> <> <<>> DIRECTORY Atom, Feedback, FeedbackTypes, GGCoreTypes, GGHistoryTypes, GGHistoryTypesOpaque, GGModelTypes, GGOutline, GGParent, GGParseIn, GGProps, GGSlice, GGSliceOps, GGTraj, Imager, ImagerTransformation, IO, Rope; GGSliceOpsImpl: CEDAR PROGRAM IMPORTS Atom, Feedback, GGOutline, GGParent, GGParseIn, GGProps, --GGScene,-- GGSlice, GGSliceOps, GGTraj, ImagerTransformation, IO, Rope EXPORTS GGSliceOps, GGHistoryTypes = BEGIN OPEN GGModelTypes; <<>> noteNoMore: PUBLIC BOOL _ TRUE; debugHalt: PUBLIC BOOL _ FALSE; <<>> BoundBox: TYPE = GGCoreTypes.BoundBox; Change: PUBLIC TYPE = GGHistoryTypesOpaque.Change; -- exported to GGHistoryTypes HistoryEvent: TYPE = GGHistoryTypes.HistoryEvent; HistoryProc: TYPE = GGHistoryTypes.HistoryProc; SubEvent: TYPE = GGHistoryTypes.SubEvent; SubEventObj: TYPE = GGHistoryTypes.SubEventObj; StrokeEndRec: TYPE = RECORD [end: Imager.StrokeEnd]; -- TYPE = {square, butt, round} StrokeJointRec: TYPE = RECORD [joint: Imager.StrokeJoint]; -- TYPE = {miter, bevel, round} DashedRec: TYPE = RECORD [dashed: BOOL _ FALSE, pattern: SequenceOfReal, offset, length: REAL]; SequenceOfReal: TYPE = GGCoreTypes.SequenceOfReal; ArrowRec: TYPE = RECORD [leftDown, rightUp: BOOL _ FALSE]; OrientationRec: TYPE = RECORD [or: Orientation]; TransformRec: TYPE = RECORD [transform: Imager.Transformation, editConstraints: EditConstraints]; DebugHalt: SIGNAL = CODE; <> <<>> GetType: PUBLIC PROC [slice: Slice] RETURNS [type: ATOM] = {RETURN[slice.class.type]}; GetBoundBox: PUBLIC SliceBoundBoxProc = {RETURN[slice.class.getBoundBox[slice, parts]];}; GetTransformedBoundBox: PUBLIC SliceTransformedBoundBoxProc = {RETURN[slice.class.getTransformedBoundBox[slice, selectedParts, movingParts, transform]];}; GetTightBox: PUBLIC SliceTightBoxProc = {RETURN[slice.class.getTightBox[slice, parts]];}; Copy: PUBLIC SliceCopyProc = {RETURN[slice.class.copy[slice, parts]];}; Restore: PUBLIC SliceRestoreProc = {from.class.restore[from: from, to: to];}; Unlink: PUBLIC SliceUnlinkProc = {slice.class.unlink[slice];}; BuildPath: PUBLIC SliceBuildPathProc = {slice.class.buildPath[slice, transformParts, transform, moveTo, lineTo, curveTo, conicTo, arcTo, editConstraints];}; DrawBorder: PUBLIC SliceDrawBorderProc = {slice.class.drawBorder[slice, drawParts, transformParts, transform, dc, camera, quick, editConstraints];}; DrawParts: PUBLIC SliceDrawPartsProc = {slice.class.drawParts[slice, parts, dc, camera, quick];}; DrawTransform: PUBLIC SliceDrawTransformProc = {slice.class.drawTransform[slice, parts, dc, camera, transform, editConstraints ];}; DrawSelectionFeedback: PUBLIC SliceDrawSelectionFeedbackProc = {slice.class.drawSelectionFeedback[slice, selectedParts, hotParts, dc, camera, dragInProgress, caretIsMoving, hideHot, quick];}; DrawAttractorFeedback: PUBLIC SliceDrawAttractorFeedbackProc = {slice.class.drawAttractorFeedback[slice, attractorParts, selectedParts, dragInProgress, dc, camera, editConstraints];}; AttractorFeedbackBoundBox: PUBLIC SliceAttractorFeedbackBoundBoxProc = { IF slice.class.attractorFeedbackBoundBox = NIL THEN RETURN GGSlice.NoOpAttractorFeedbackBoundBox[slice, attractorParts, selectedParts, dragInProgress, camera, editConstraints] ELSE RETURN slice.class.attractorFeedbackBoundBox[slice, attractorParts, selectedParts, dragInProgress, camera, editConstraints]; }; SaveSelections: PUBLIC SliceSaveSelectionsProc = {slice.class.saveSelections[slice, parts, selectClass];}; RemakeSelections: PUBLIC SliceRemakeSelectionsProc = { parts _ slice.class.remakeSelections[slice, selectClass]; }; Transform: PUBLIC SliceTransformProc = { oldValue: REF TransformRec _ NEW[TransformRec]; oldValue.transform _ transform; -- defer inverting the transform until undo is performed oldValue.editConstraints _ editConstraints; slice.class.transform[slice, parts, transform, editConstraints, history]; GenericPropsUndo[op: $Transform, slice: slice, parts: parts, val: oldValue, history: history]; }; Describe: PUBLIC SliceDescribeProc = {RETURN[sliceD.slice.class.describe[sliceD]];}; DescribeHit: PUBLIC SliceDescribeHitProc = {RETURN[slice.class.describeHit[slice, hitData]];}; Fileout: PUBLIC SliceFileoutProc = {slice.class.fileout[slice, f];}; Filein: PUBLIC SliceFileinProc = {RETURN[slice.class.filein[f, version, router, camera]];}; IsEmptyParts: PUBLIC SliceIsEmptyPartsProc = { RETURN[sliceD.slice.class.isEmptyParts[sliceD]];}; IsCompleteParts: PUBLIC SliceIsCompletePartsProc = { RETURN[sliceD.slice.class.isCompleteParts[sliceD]];}; NewParts: PUBLIC SliceNewPartsProc = {RETURN[slice.class.newParts[slice, hitData, mode]];}; UnionParts: PUBLIC SliceUnionPartsProc = {RETURN[partsA.slice.class.unionParts[partsA, partsB]];}; DifferenceParts: PUBLIC SliceDifferencePartsProc = { RETURN[partsA.slice.class.differenceParts[partsA, partsB]];}; MovingParts: PUBLIC SliceMovingPartsProc = {[background, overlay, rubber, drag] _ slice.class.movingParts[slice, selectedParts, editConstraints, bezierDrag];}; AugmentParts: PUBLIC SliceAugmentPartsProc = { RETURN[sliceD.slice.class.augmentParts[sliceD, selectClass]];}; AlterParts: PUBLIC SliceAlterPartsProc = { RETURN[sliceD.slice.class.alterParts[sliceD, action]];}; SetSelectedFields: PUBLIC SliceSetSelectedFieldsProc = {sliceD.slice.class.setSelectedFields[sliceD, selected, selectClass];}; PointsInDescriptor: PUBLIC SlicePointsInDescriptorProc = { RETURN[sliceD.slice.class.pointsInDescriptor[sliceD]];}; WalkPointsInDescriptor: PUBLIC SliceWalkPointsInDescriptorProc = { sliceD.slice.class.walkPointsInDescriptor[sliceD, walkProc];}; PointPairsInDescriptor: PUBLIC SlicePointPairsInDescriptorProc = {RETURN[sliceD.slice.class.pointPairsInDescriptor[sliceD]];}; SegmentsInDescriptor: PUBLIC SliceSegmentsInDescriptorProc = {RETURN[sliceD.slice.class.segmentsInDescriptor[sliceD]];}; WalkSegments: PUBLIC SliceWalkSegmentsProc = {RETURN[slice.class.walkSegments[slice, walkProc]];}; <> <> NextPoint: PUBLIC SliceNextPointProc = {RETURN[slice.class.nextPoint[slice, pointGen]];}; NextPointPair: PUBLIC SliceNextPointPairProc = {RETURN[slice.class.nextPointPair[slice, pointPairGen]];}; NextSegment: PUBLIC SliceNextSegmentProc = {[seg, transform] _ slice.class.nextSegment[slice, segGen];}; ClosestPoint: PUBLIC SliceClosestPointProc = {[bestPoint, bestDist, bestNormal, hitData, success] _ sliceD.slice.class.closestPoint[sliceD, testPoint, tolerance];}; <> ClosestJointToHitData: PUBLIC SliceClosestJointToHitDataProc = {[jointD, point, normal] _ sliceD.slice.class.closestJointToHitData[sliceD, mapPoint, testPoint, hitData];}; ClosestPointAndTangent: PUBLIC SliceClosestPointAndTangentProc = {[bestPoint, bestDist, tangent, hitData, success] _ sliceD.slice.class.closestPointAndTangent[sliceD, testPoint, tolerance];}; ClosestSegment: PUBLIC SliceClosestSegmentProc = {[bestPoint, bestDist, bestNormal, hitData, success] _ sliceD.slice.class.closestSegment[sliceD, testPoint, tolerance];}; <> FilledPathsUnderPoint: PUBLIC SliceFilledPathsUnderPointProc = { <> IF slice.class.filledPathsUnderPoint = NIL THEN RETURN GGSlice.NoOpFilledPathsUnderPoint[slice, point, tolerance] ELSE { RETURN slice.class.filledPathsUnderPoint[slice, point, tolerance]; }; }; LineIntersection: PUBLIC SliceLineIntersectionProc = {[points, pointCount] _ sliceD.slice.class.lineIntersection[sliceD, line];}; CircleIntersection: PUBLIC SliceCircleIntersectionProc = {[points, pointCount] _ sliceD.slice.class.circleIntersection[sliceD, circle];}; HitDataAsSimpleCurve: PUBLIC SliceHitDataAsSimpleCurveProc = {RETURN[slice.class.hitDataAsSimpleCurve[slice, hitData]];}; <