<> <> <> <> <<>> DIRECTORY GList, Process, SVAlign, SVAssembly, SVInterfaceTypes, SVScene, SVSceneTypes, SVSelect; SVAlignImpl: CEDAR PROGRAM IMPORTS GList, Process, SVAssembly, SVScene, SVSelect EXPORTS SVAlign = BEGIN AlignBag: TYPE = SVInterfaceTypes.AlignBag; Slice: TYPE = SVSceneTypes.Slice; FeatureData: TYPE = SVInterfaceTypes.FeatureData; FeatureDataObj: TYPE = SVInterfaceTypes.FeatureDataObj; FilterSliceProc: TYPE = SVAlign.FilterSliceProc; Scene: TYPE = SVSceneTypes.Scene; SliceDescriptor: TYPE = SVSceneTypes.SliceDescriptor; SliceParts: TYPE = SVSceneTypes.SliceParts; TriggerBag: TYPE = REF TriggerBagObj; TriggerBagObj: TYPE = SVInterfaceTypes.TriggerBagObj; SVData: TYPE = SVInterfaceTypes.SVData; <> emptyTriggerBag: PUBLIC TriggerBag; emptyAlignBag: PUBLIC AlignBag; <> CreateTriggerBag: PUBLIC PROC [scene: Scene] RETURNS [triggerBag: TriggerBag] = { triggerBag _ NEW[TriggerBagObj _ [tree: scene.tree, scene: scene, slices: NIL, anchor: NIL]]; }; FlushTriggerBag: PUBLIC PROC [triggerBag: TriggerBag] = { triggerBag.slices _ NIL; triggerBag.anchor _ NIL; }; CopyTriggerBag: PUBLIC PROC [triggerBag: TriggerBag] RETURNS [copy: TriggerBag] = { copy _ CreateTriggerBag[triggerBag.scene]; copy.slices _ NARROW[GList.Copy[triggerBag.slices]]; copy.anchor _ triggerBag.anchor; }; <> FillStaticSceneBag: PUBLIC PROC [scene: Scene, sceneBag: TriggerBag] = { sceneBag.tree _ scene.tree; sceneBag.scene _ scene; AddAllAssemblies[scene, sceneBag]; }; FillDynamicSceneBag: PUBLIC PROC [scene: Scene, sceneBag: TriggerBag] = { }; <> SetStaticBags: PUBLIC PROC [svData: SVData] = { sceneBag: TriggerBag _ svData.hitTest.sceneBag; FlushTriggerBag[sceneBag]; FillStaticSceneBag[svData.scene, sceneBag]; }; SetDynamicBags: PUBLIC PROC [svData: SVData, action: ATOM] = { }; StaticToDynamicBags: PUBLIC PROC [svData: SVData] RETURNS [repaintForeground: BOOL] = { <> <> <> <> <> sceneBag: TriggerBag _ svData.hitTest.sceneBag; <> svData.hitTest.oldSceneBag _ sceneBag; sceneBag _ StaticToDynamicSceneBag[svData.scene, sceneBag]; svData.hitTest.sceneBag _ sceneBag; }; StaticToDynamicSceneBag: PROC [scene: Scene, sceneBag: TriggerBag] RETURNS [newBag: TriggerBag] = { newBag _ CopyTriggerBag[sceneBag]; RemoveMoving[scene, newBag]; <> }; DynamicToStaticBags: PUBLIC PROC [svData: SVData] RETURNS [repaintForeground: BOOL] = { sceneBag: TriggerBag; sceneBag _ svData.hitTest.sceneBag _ svData.hitTest.oldSceneBag; }; UpdateBagsForNewSlices: PUBLIC PROC [newSlices: LIST OF Slice, svData: SVData] = { SetStaticBags[svData]; }; <> AddAllAssemblies: PROC [scene: Scene, triggerBag: TriggerBag] = { primList: LIST OF Slice _ SVScene.ListOfPrimAssemblies[scene.assembly, scene]; feature: FeatureData; FOR list: LIST OF Slice _ primList, list.rest UNTIL list = NIL DO feature _ FeatureFromSlice[list.first]; AddFeature[feature, triggerBag]; ENDLOOP; }; FeatureFromSlice: PUBLIC PROC [slice: Slice, parts: SliceParts _ NIL] RETURNS [feature: FeatureData] = { sliceParts: SliceParts _ IF parts=NIL THEN SVAssembly.NewParts[slice, NIL, [0,0,0], slice].parts ELSE parts; sliceD: SliceDescriptor _ SVAssembly.DescriptorFromParts[slice, sliceParts]; feature _ NEW[FeatureDataObj]; feature.type _ slice; feature.shape _ sliceD; }; AddFeature: PROC [featureData: FeatureData, triggerBag: TriggerBag] = { Process.CheckForAbort[]; SELECT featureData.type FROM slice => { triggerBag.slices _ CONS[featureData, triggerBag.slices]; }; anchor => { triggerBag.anchor _ featureData; }; ENDCASE => ERROR; }; <> RemoveMoving: PROC [scene: Scene, triggerBag: TriggerBag] = { <> DeleteTriggersFilter[triggerBag, scene, RemoveMovingSlice]; }; RemoveMovingSlice: PROC [sliceD: SliceDescriptor, scene: Scene] RETURNS [stationary: SliceDescriptor] = { selSliceD: SliceDescriptor _ SVSelect.FindSelectedSlice[sliceD.slice, scene, normal]; background, overlay, rubber, drag, move: SliceDescriptor; IF selSliceD = NIL THEN RETURN[sliceD]; -- clearly nothing is moving [background, overlay, rubber, drag] _ SVAssembly.MovingParts[selSliceD.slice, selSliceD.parts]; move _ SVAssembly.UnionParts[rubber, drag]; stationary _ SVAssembly.DifferenceParts[sliceD, move]; }; DeleteTriggersFilter: PROC [triggerBag: TriggerBag, scene: Scene, filterSliceProc: FilterSliceProc] = { <> sliceD, newSliceD: SliceDescriptor; sliceFeatures: LIST OF FeatureData _ triggerBag.slices; newFeature: FeatureData; triggerBag.slices _ NIL; FOR sliceList: LIST OF FeatureData _ sliceFeatures, sliceList.rest UNTIL sliceList = NIL DO sliceD _ NARROW[sliceList.first.shape]; newSliceD _ filterSliceProc[sliceD, scene]; IF NOT SVAssembly.EmptyParts[sliceD] THEN { newFeature _ FeatureFromSlice[newSliceD.slice, newSliceD.parts]; triggerBag.slices _ CONS[newFeature, triggerBag.slices]; }; ENDLOOP; }; <<>> Init: PROC [] = { emptyTriggerBag _ NIL; emptyAlignBag _ NIL; }; Init[]; END.