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. @SVAlignImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Last edited by Bier on March 11, 1987 4:59:39 pm PST Contents: Maintains the three snap-dragging gravity bags: triggerBag, sceneBag, and alignBag for Solidviews. Creating a TriggerBag Use this as an (immutable) empty TriggerBag. Filling the SceneBag Filling all of the Bags at Once We are about to drag things around. Here is what that means for each of the bags: triggerBag: AddHeuristics may add some things. RemoveMoving is going to remove some things. sceneBag: RemoveMoving is going to remove some things. alignBag: Those things that RemoveMoving now removes will no longer trigger midpoints, nor alignment lines. repaintForeground is TRUE if alignBag is altered. Incrementally Update SceneBag ComputeAllBoundingBoxes[newBag]; In support of building sceneBag. The Filter Routines shown in the figure as boxes and ovals If we are about to drag all of the selected objects, then we must remove selected objects from the triggerBag. We must also remove segments which are adjacent to a moving joint (called "dangling" segments), and segments whose control points are selected. When this procedure is called, all sequences in triggerBag are passed to filterSeqProc. filterSeqProc should return those parts which should be included in the new bag. Ê£˜J˜Icodešœ™Kšœ Ïmœ1™K˜K˜—K˜š Ÿœžœžœžœžœ˜WK™RK™]K™7Kšœl™lKšœ1™1Kšœ/˜/K˜KšÏb™Kšœ&˜&Kšœ;˜;Kšœ#˜#K˜K˜—šŸœžœ&žœ˜cKšœ"˜"Kšœ˜Kšœ ™ K˜K˜—š Ÿœžœžœžœžœ˜WKšœ˜Kšœ@˜@K˜K˜—š Ÿœžœžœ žœžœ˜RKšœ˜K˜K˜—K™ šŸœžœ+˜AKšœ žœžœ=˜NKšœ˜š žœžœžœžœžœž˜AKšœ'˜'Kšœ ˜ Kšžœ˜—K˜K˜—š Ÿœžœžœ$žœžœ˜hKš œžœžœžœžœžœ˜lKšœL˜LKšœ žœ˜Kšœ˜Kšœ˜K˜K˜—šŸ œžœ7˜GK˜šžœž˜˜ Kšœžœ!˜9K˜—˜ Kšœ ˜ K˜—Kšžœžœ˜—K˜K˜—K™:šŸ œžœ+˜=Kšœÿ™ÿKšœ;˜;K˜K˜—šŸœžœ)žœ"˜iKšœU˜UKšœ9˜9Kš žœ žœžœžœ Ïc˜DKšœ_˜_Kšœ+˜+Kšœ6˜6Kšœ˜K˜—šŸœžœM˜gKšœ©™©Kšœ#˜#Kšœžœžœ!˜7Kšœ˜Kšœžœ˜š žœ žœžœ-žœ žœž˜[Kšœ žœ˜'Kšœ+˜+šžœžœžœ˜+Kšœ@˜@Kšœžœ ˜8K˜—Kšžœ˜—K˜K˜K™—šŸœžœ˜Kšœžœ˜Kšœžœ˜Kšœ˜K˜—K˜Kšžœ˜K˜J˜—…—²•