<> <> <> <> <<>> DIRECTORY SVAssembly, SVScene, SVSceneTypes, SVSelect, SVUtility; SVSelectImpl: CEDAR PROGRAM IMPORTS SVAssembly, SVScene, SVUtility EXPORTS SVSelect = BEGIN Slice: TYPE = SVSceneTypes.Slice; AssemblyGenerator: TYPE = SVScene.AssemblyGenerator; Scene: TYPE = SVSceneTypes.Scene; <> SliceDescriptor: TYPE = SVSceneTypes.SliceDescriptor; SliceParts: TYPE = SVSceneTypes.SliceParts; SelectionClass: TYPE = SVSelect.SelectionClass; SliceDescriptorGenerator: TYPE = SVSceneTypes.SliceDescriptorGenerator; SliceDescriptorGeneratorObj: TYPE = SVSceneTypes.SliceDescriptorGeneratorObj; <<>> ChangeDonkeyTail: PROC [sliceD: SliceDescriptor, selectClass: SelectionClass] = { SELECT selectClass FROM normal => sliceD.slice.normalSelectedParts _ sliceD; hot => sliceD.slice.hotSelectedParts _ sliceD; active => sliceD.slice.activeSelectedParts _ sliceD; ENDCASE; }; NoDonkeyTail: PROC [slice: Slice, selectClass: SelectionClass] = { SELECT selectClass FROM normal => slice.normalSelectedParts _ NIL; hot => slice.hotSelectedParts _ NIL; active => slice.activeSelectedParts _ NIL; ENDCASE; }; SelectAll: PUBLIC PROC [scene: Scene, selectClass: SelectionClass] = { g: AssemblyGenerator; g _ SVScene.PrimAssembliesInScene[scene]; FOR slice: Slice _ SVScene.NextAssembly[g], SVScene.NextAssembly[g] UNTIL slice = NIL DO SelectEntireSlice[slice, scene, selectClass]; ENDLOOP; }; SelectSlice: PUBLIC PROC [sliceD: SliceDescriptor, scene: Scene, selectClass: SelectionClass] = { oldSliceD, union: SliceDescriptor; slice: Slice _ sliceD.slice; IF SVAssembly.IsEmptyParts[sliceD] THEN RETURN; oldSliceD _ FindSelectedSlice[slice, scene, selectClass]; IF oldSliceD#NIL THEN { union _ SVAssembly.UnionParts[oldSliceD, sliceD]; DeselectSlice[slice, oldSliceD.parts, scene, selectClass]; -- throw away old selection } ELSE union _ sliceD; IF selectClass = normal THEN union _ SVAssembly.AugmentParts[union, selectClass]; AppendSelection[scene, union, selectClass]; ChangeDonkeyTail[union, selectClass]; }; SelectEntireSlice: PUBLIC PROC [slice: Slice, scene: Scene, selectClass: SelectionClass] = { allParts: SliceDescriptor _ SVAssembly.NewParts[slice, NIL, [0,0,0], slice]; SelectSlice[allParts, scene, selectClass]; }; <<>> DeselectAll: PUBLIC PROC [scene: Scene, selectClass: SelectionClass] = { sliceD: SliceDescriptor; FOR selected: LIST OF SliceDescriptor _ ListSelected[scene, selectClass], selected.rest UNTIL selected = NIL DO sliceD _ selected.first; NoDonkeyTail[sliceD.slice, selectClass]; ENDLOOP; SetSelectedList[scene, NIL, selectClass]; }; DeselectAllAllClasses: PUBLIC PROC [scene: Scene] = { DeselectAll[scene, normal]; DeselectAll[scene, active]; DeselectAll[scene, hot]; }; DeselectSliceAllClasses: PUBLIC PROC [slice: Slice, scene: Scene] = { DeselectEntireSlice[slice, scene, normal]; DeselectEntireSlice[slice, scene, active]; DeselectEntireSlice[slice, scene, hot]; }; DeselectEntireSlice: PUBLIC PROC [slice: Slice, scene: Scene, selectClass: SelectionClass] = { oldD: SliceDescriptor; oldD _ FindSelectedSlice[slice, scene, selectClass]; IF oldD # NIL THEN { DeleteSelection[scene, oldD, selectClass]; NoDonkeyTail[oldD.slice, selectClass]; }; }; DeselectSlice: PUBLIC PROC [slice: Slice, parts: SliceParts, scene: Scene, selectClass: SelectionClass] = { oldD, newD, tempD: SliceDescriptor; oldD _ FindSelectedSlice[slice, scene, selectClass]; IF oldD # NIL THEN { tempD _ SVAssembly.DescriptorFromParts[slice, parts]; newD _ SVAssembly.DifferenceParts[oldD, tempD]; DeleteSelection[scene, oldD, selectClass]; NoDonkeyTail[oldD.slice, selectClass]; IF NOT SVAssembly.IsEmptyParts[newD] THEN { IF selectClass = normal THEN newD _ SVAssembly.AugmentParts[newD, selectClass]; AppendSelection[scene, newD, selectClass]; ChangeDonkeyTail[newD, selectClass]; }; }; }; <> <> <