DIRECTORY CoordSys, CSG, CSGGraphics, DisplayList3d, Graphics, IO, Labels, Matrix3d, Menus, MessageWindow, Rope, SVEditUser, SVFiles, SV2d, SVViewer, SVViewerInput, SVViewerUser, TFI3d, ViewerClasses, ViewerIO, ViewerOps, ViewerTools; SVEditUserImplA: CEDAR PROGRAM IMPORTS CoordSys, DisplayList3d, IO, Labels, Matrix3d, MessageWindow, Rope, SVFiles, SVViewer, SVViewerInput, SVViewerUser, TFI3d, ViewerIO, ViewerOps, ViewerTools EXPORTS SVEditUser = BEGIN Assembly: TYPE = DisplayList3d.Assembly; AssemblyList: TYPE = DisplayList3d.AssemblyList; Camera: TYPE = CSGGraphics.Camera; CoordSystem: TYPE = CoordSys.CoordSystem; DCProc: TYPE = SVViewerUser.DCProc; EditToolData: TYPE = REF EditToolDataObj; EditToolDataObj: TYPE = SVEditUser.EditToolDataObj; MasterObject: TYPE = DisplayList3d.MasterObject; Matrix4by4: TYPE = Matrix3d.Matrix4by4; MouseButton: TYPE = Menus.MouseButton; Point2d: TYPE = SV2d.Point2d; Point3d: TYPE = Matrix3d.Point3d; PointSetOp: TYPE = CSG.PointSetOp; Primitive: TYPE = CSG.Primitive; Scene: TYPE = DisplayList3d.Scene; Selection: TYPE = REF SelectionObj; SelectionObj: TYPE = SVEditUser.SelectionObj; Viewer: TYPE = ViewerClasses.Viewer; ViewerCell: TYPE = REF ViewerCellObj; ViewerCellObj: TYPE = SVEditUser.ViewerCellObj; ViewerProc: TYPE = SVEditUser.ViewerProc; ViewerToolData: TYPE = SVViewerUser.ViewerToolData; ViewerPictureData: TYPE = SVViewerUser.ViewerPictureData; globalInHandle, globalOutHandle: IO.STREAM; primarySelection: Selection; secondarySelection: Selection; finalPrimary: Selection; finalSecondary: Selection; DrawAnySelections: PUBLIC PROC [dc: Graphics.Context, viewerToolData: ViewerToolData] = TRUSTED { IF primarySelection.viewerToolData = viewerToolData THEN { CoordSys.TellAboutParent[primarySelection.coordSys]; SVViewerUser.DrawOneCS[dc, viewerToolData, primarySelection.coordSys]; }; IF secondarySelection.viewerToolData = viewerToolData THEN { CoordSys.TellAboutParent[secondarySelection.coordSys]; SVViewerUser.DrawOneCS[dc, viewerToolData, secondarySelection.coordSys]; }; }; SetPrimarySelection: PUBLIC PROC [cameraPoint: Point2d, assembly: Assembly, primitive: Primitive, worldMat: Matrix4by4, viewerToolData: ViewerToolData] RETURNS [selection: Selection] = TRUSTED { primarySelection.cameraPoint _ cameraPoint; primarySelection.primitive _ primitive; primarySelection.assembly _ assembly; IF assembly # NIL THEN { primarySelection.coordSys.withRespectTo _ assembly.coordSys.withRespectTo; primarySelection.coordSys.mat _ Matrix3d.WorldToLocal[primarySelection.coordSys.withRespectTo.wrtWorld, worldMat]; primarySelection.coordSys.wrtWorld _ worldMat; -- not necessary but as long as its already calculated... }; primarySelection.viewerToolData _ viewerToolData; selection _ primarySelection; SVViewerUser.Selected[NIL, viewerToolData, red, FALSE, FALSE]; -- fake a button push SetAssembly[assembly, NARROW[viewerToolData.editToolData]]; }; SetSecondarySelection: PUBLIC PROC [cameraPoint: Point2d, assembly: Assembly, primitive: Primitive, worldMat: Matrix4by4, viewerToolData: ViewerToolData] RETURNS [selection: Selection] = TRUSTED { secondarySelection.cameraPoint _ cameraPoint; secondarySelection.assembly _ assembly; secondarySelection.primitive _ primitive; IF assembly # NIL THEN { secondarySelection.coordSys.withRespectTo _ assembly.coordSys.withRespectTo; secondarySelection.coordSys.mat _ Matrix3d.WorldToLocal[secondarySelection.coordSys.withRespectTo.wrtWorld, worldMat]; secondarySelection.coordSys.wrtWorld _ worldMat; -- not necessary but as long as its already calculated... }; secondarySelection.viewerToolData _ viewerToolData; selection _ secondarySelection; }; SetFinalPrimary: PUBLIC PROC [cameraPoint: Point2d, assembly: Assembly, primitive: Primitive, worldMat: Matrix4by4, viewerToolData: ViewerToolData] RETURNS [selection: Selection] = TRUSTED { localMat: Matrix4by4; withRespectTo: CoordSystem; finalPrimary _ NEW[SelectionObj]; finalPrimary.cameraPoint _ cameraPoint; finalPrimary.assembly _ assembly; finalPrimary.primitive _ primitive; IF assembly # NIL THEN { withRespectTo _ assembly.coordSys.withRespectTo; localMat _ Matrix3d.WorldToLocal[withRespectTo.wrtWorld, worldMat]; finalPrimary.coordSys _ CoordSys.CreateCoordSys["finalPrimary", localMat, withRespectTo]; }; finalPrimary.viewerToolData _ viewerToolData; selection _ finalPrimary; }; SetFinalSecondary: PUBLIC PROC [cameraPoint: Point2d, assembly: Assembly, primitive: Primitive, worldMat: Matrix4by4, viewerToolData: ViewerToolData] RETURNS [selection: Selection] = TRUSTED { localMat: Matrix4by4; withRespectTo: CoordSystem; finalSecondary _ NEW[SelectionObj]; finalSecondary.cameraPoint _ cameraPoint; finalSecondary.assembly _ assembly; finalSecondary.primitive _ primitive; IF assembly # NIL THEN { withRespectTo _ assembly.coordSys.withRespectTo; localMat _ Matrix3d.WorldToLocal[withRespectTo.wrtWorld, worldMat]; finalSecondary.coordSys _ CoordSys.CreateCoordSys["finalSecondary", localMat, withRespectTo]; }; finalSecondary.viewerToolData _ viewerToolData; selection _ finalSecondary; }; GetPrimarySelection: PUBLIC PROC RETURNS [selection: Selection] = TRUSTED { selection _ primarySelection; }; GetSecondarySelection: PUBLIC PROC RETURNS [selection: Selection] = TRUSTED { selection _ secondarySelection; }; GetFinalPrimary: PUBLIC PROC RETURNS [selection: Selection] = TRUSTED { selection _ finalPrimary; }; GetFinalSecondary: PUBLIC PROC RETURNS [selection: Selection] = TRUSTED { selection _ finalSecondary; }; ExtendSecondary: PUBLIC PROC = TRUSTED { viewerPictureData: ViewerPictureData; editToolData: EditToolData; scene: Scene; assembly, parent: Assembly; IF secondarySelection.assembly = NIL THEN RETURN; viewerPictureData _ NARROW[secondarySelection.viewerToolData.viewerPicture.data]; editToolData _ NARROW[secondarySelection.viewerToolData.editToolData]; scene _ viewerPictureData.scene; [assembly, parent] _ DisplayList3d.FindAssemblyFromName[secondarySelection.assembly.name, scene]; IF parent#NIL THEN secondarySelection.assembly _ parent; ViewerTools.SetContents[ editToolData.sceneSection.assemblyName, secondarySelection.assembly.name, TRUE]; NotifyOfExtendedSelection[secondarySelection.viewerToolData, finalSecondary, secondarySelection]; -- **** Dangerous to assume that finalSecondary is correct [] _ SetFinalSecondary[secondarySelection.cameraPoint, secondarySelection.assembly, secondarySelection.primitive, secondarySelection.coordSys.wrtWorld, secondarySelection.viewerToolData]; }; NotifyOfExtendedSelection: PUBLIC PROC [viewerToolData: ViewerToolData, oldSelection: Selection, newSelection: Selection] = TRUSTED { SVViewerInput.ComplementBoundBox[oldSelection.primitive.boundBox, viewerToolData]; SVViewerInput.ComplementBoundBox[newSelection.primitive.boundBox, viewerToolData]; }; Painter: PUBLIC PROC [proc: ViewerProc, editToolData: EditToolData, scene: Scene] = TRUSTED { viewerToolData: ViewerToolData; success: BOOL; viewerCell: ViewerCell; drawProc: PROC [dc: Graphics.Context] = TRUSTED { proc[dc, viewerToolData]; }; [viewerCell, success] _ FindSceneInAllViewers[scene, editToolData.allViewers]; IF NOT success THEN ERROR; IF viewerCell.viewersOnScene = NIL THEN RETURN; viewerToolData _ NARROW[viewerCell.viewersOnScene.data]; SVViewerUser.Painter[drawProc, viewerToolData]; IF viewerCell.viewersOnScene.link = NIL THEN RETURN; FOR list: Viewer _ viewerCell.viewersOnScene.link, list.link UNTIL list = viewerCell.viewersOnScene DO viewerToolData _ NARROW[list.data]; SVViewerUser.Painter[drawProc, viewerToolData]; ENDLOOP; }; GetOutHandle: PUBLIC PROC RETURNS [outHandle: IO.STREAM] = TRUSTED { IF globalOutHandle = NIL THEN [globalInHandle, globalOutHandle] _ MakeNewViewerAndHandle[]; outHandle _ globalOutHandle; }; NewOutput: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { [globalInHandle, globalOutHandle] _ MakeNewViewerAndHandle[]; }; MakeNewViewerAndHandle: PRIVATE PROC [] RETURNS [in, out: IO.STREAM] = TRUSTED { newViewer: Viewer _ ViewerOps.CreateViewer[ flavor: $TypeScript, info: [ name: "SolidViews Output", menu: NIL, data: NIL, iconic: TRUE, column: right, scrollable: TRUE, icon: unInit ], paint: FALSE]; ViewerOps.SetOpenHeight[newViewer, 120]; ViewerOps.OpenIcon[icon: newViewer, closeOthers: FALSE, bottom: TRUE, paint: TRUE]; [in, out] _ ViewerIO.CreateViewerStreams["solidviews output", newViewer, NIL, TRUE]; }; NewViewer: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; viewerCell: ViewerCell; currentViewerToolData: ViewerToolData; scene: Scene _ DisplayList3d.CreateScene["NoName.pic"]; [currentViewerToolData, ----] _ SVViewer.CreateViewerTool[editToolData, scene, FALSE, TRUE]; [viewerCell, editToolData.allViewers] _ AddSceneToAllViewers[scene, editToolData.allViewers]; AddViewerToViewerCell[currentViewerToolData.outer, viewerCell]; SVViewerUser.Selected[NIL, currentViewerToolData, red, FALSE, FALSE]; SVViewerUser.UpdateHeader[scene.name, currentViewerToolData]; }; FindSceneInAllViewers: PUBLIC PROC [scene: Scene, allViewers: LIST OF ViewerCell] RETURNS [viewerCell: ViewerCell, success: BOOL] = TRUSTED { success _ FALSE; FOR list: LIST OF ViewerCell _ allViewers, list.rest UNTIL list = NIL OR success DO IF list.first.scene = scene THEN { viewerCell _ list.first; success _ TRUE; RETURN; }; ENDLOOP; }; AddSceneToAllViewers: PUBLIC PROC [scene: Scene, allViewers: LIST OF ViewerCell] RETURNS [viewerCell: ViewerCell, newAllViewers: LIST OF ViewerCell] = TRUSTED { viewerCell _ NEW[ViewerCellObj _ [scene, NIL]]; newAllViewers _ CONS[viewerCell, allViewers]; }; FindViewerInAllViewers: PUBLIC PROC [viewer: Viewer, allViewers: LIST OF ViewerCell] RETURNS [viewerCell: ViewerCell, before, listCell, after: Viewer, success: BOOL] = TRUSTED { firstViewer: Viewer; success _ FALSE; FOR allList: LIST OF ViewerCell _ allViewers, allList.rest UNTIL allList = NIL OR success DO before _ NIL; firstViewer _ allList.first.viewersOnScene; IF firstViewer = NIL THEN LOOP; IF firstViewer = viewer THEN { listCell _ firstViewer; after _ firstViewer.link; viewerCell _ allList.first; success _ TRUE; RETURN}; before _ firstViewer; IF firstViewer.link = NIL THEN LOOP; FOR viewerList: Viewer _ firstViewer.link, viewerList.link UNTIL viewerList = firstViewer OR success DO IF viewerList = viewer THEN { listCell _ viewerList; after _ viewerList.link; viewerCell _ allList.first; success _ TRUE; RETURN}; before _ viewerList; ENDLOOP; ENDLOOP; }; FindViewerInViewerCell: PUBLIC PROC [viewer: Viewer, viewerCell: ViewerCell] RETURNS [before, listCell, after: Viewer, success: BOOL] = TRUSTED { firstViewer: Viewer; success _ FALSE; firstViewer _ viewerCell.viewersOnScene; IF firstViewer = NIL THEN {success _ FALSE; RETURN}; IF firstViewer = viewer THEN { before _ NIL;-- this tells delete proc that it needs a new firstViewer listCell _ firstViewer; after _ firstViewer.link; success _ TRUE; RETURN}; before _ firstViewer; FOR viewerList: Viewer _ viewerCell.viewersOnScene, viewerList.link UNTIL viewerList = firstViewer OR success DO IF viewerList = viewer THEN { listCell _ viewerList; after _ viewerList.link; success _ TRUE; RETURN}; before _ viewerList; ENDLOOP; success _ FALSE; }; DeleteViewerFromAllViewers: PUBLIC PROC [viewerCell: ViewerCell, before, listCell, after: Viewer] = TRUSTED { viewerToolData: ViewerToolData; IF before = NIL OR viewerCell.viewersOnScene = listCell THEN { IF after = NIL THEN {viewerCell.viewersOnScene _ NIL; RETURN}; FOR v: Viewer _ after, v.link UNTIL v.link = listCell DO REPEAT FINISHED => IF v = after THEN { after.link _ NIL; viewerToolData _ NARROW[after.data]; SVViewerUser.UpdateHeader[NIL, viewerToolData]} ELSE v.link _ after; ENDLOOP; viewerCell.viewersOnScene _ after; } ELSE { IF before = after THEN { after.link _ NIL; viewerToolData _ NARROW[after.data]; SVViewerUser.UpdateHeader[NIL, viewerToolData]} ELSE before.link _ after; }; }; AddViewerToViewerCell: PUBLIC PROC [viewer: Viewer, viewerCell: ViewerCell] = TRUSTED { IF viewerCell.viewersOnScene = NIL THEN { viewer.link _ NIL; viewerCell.viewersOnScene _ viewer; RETURN}; viewer.link _ viewerCell.viewersOnScene; IF viewerCell.viewersOnScene.link = NIL THEN viewerCell.viewersOnScene.link _ viewer ELSE FOR v: Viewer _ viewerCell.viewersOnScene.link, v.link UNTIL v.link=viewerCell.viewersOnScene DO REPEAT FINISHED => v.link _ viewer; ENDLOOP; viewerCell.viewersOnScene _ viewer; }; LoadScene: PUBLIC PROC [viewerToolData: ViewerToolData, picName: Rope.ROPE] RETURNS [scene: Scene, success: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[viewerToolData.editToolData]; oldViewerCell, newViewerCell: ViewerCell; before, listCell, after: Viewer; [scene, success] _ SVFiles.OpenScene[picName]; IF NOT success THEN RETURN; [newViewerCell, editToolData.allViewers] _ AddSceneToAllViewers[scene, editToolData.allViewers]; [oldViewerCell, before, listCell, after, success] _ FindViewerInAllViewers[viewerToolData.outer, editToolData.allViewers]; IF success THEN { DeleteViewerFromAllViewers[oldViewerCell, before, listCell, after]; AddViewerToViewerCell[viewerToolData.outer, newViewerCell]; editToolData.sceneSection.currentScene _ scene; Labels.Set[editToolData.sceneSection.sceneName, scene.name]; } ELSE ERROR; }; SaveScene: PUBLIC PROC [viewerToolData: ViewerToolData, picName: Rope.ROPE] RETURNS [success: BOOL] = TRUSTED { viewerPictureData: ViewerPictureData _ NARROW[viewerToolData.viewerPicture.data]; scene: Scene _ viewerPictureData.scene; success _ SVFiles.SaveScene[scene, picName]; }; StoreScene: PUBLIC PROC [viewerToolData: ViewerToolData, scene: Scene, picName: Rope.ROPE] RETURNS [success: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[viewerToolData.editToolData]; oldViewerCell, newViewerCell: ViewerCell; before, listCell, after: Viewer; sceneAlreadyExists, viewerThere: BOOL _ FALSE; success _ SVFiles.StoreScene[scene, picName]; SVViewerUser.SceneOldVersion[viewerToolData]; IF NOT success THEN RETURN; [oldViewerCell, before, listCell, after, viewerThere] _ FindViewerInAllViewers[viewerToolData.outer, editToolData.allViewers]; IF viewerThere THEN {-- if viewer was there delete it. IF oldViewerCell.scene = scene THEN RETURN; -- user is storing old file. DeleteViewerFromAllViewers[oldViewerCell, before, listCell, after]; }; [newViewerCell, sceneAlreadyExists] _ FindSceneInAllViewers[scene, editToolData.allViewers]; IF NOT sceneAlreadyExists THEN [newViewerCell, editToolData.allViewers] _ AddSceneToAllViewers[scene, editToolData.allViewers]; AddViewerToViewerCell[viewerToolData.outer, newViewerCell]; }; NotifyOfEmpty: PUBLIC PROC [viewerToolData: ViewerToolData, from: Scene, to: Scene] = TRUSTED { editToolData: EditToolData _ NARROW[viewerToolData.editToolData]; before, listCell, after: Viewer; success: BOOL; viewerCell, newViewerCell: ViewerCell; [viewerCell, success] _ FindSceneInAllViewers[from, editToolData.allViewers]; IF NOT success THEN ERROR; [before, listCell, after, success] _ FindViewerInViewerCell [viewerToolData.outer, viewerCell]; IF NOT success THEN ERROR; DeleteViewerFromAllViewers[viewerCell, before, listCell, after]; [newViewerCell, editToolData.allViewers] _ AddSceneToAllViewers[to, editToolData.allViewers]; AddViewerToViewerCell[viewerToolData.outer, newViewerCell]; }; NotifyDestroy: PUBLIC PROC [viewer: Viewer] = TRUSTED { viewerCell: ViewerCell; before, listCell, after: Viewer; success: BOOL; viewerToolData: ViewerToolData _ NARROW[viewer.data]; editToolData: EditToolData _ NARROW[viewerToolData.editToolData]; [viewerCell, before, listCell, after, success] _ FindViewerInAllViewers[viewer, editToolData.allViewers]; IF NOT success THEN ERROR; IF viewerCell.viewersOnScene = viewer THEN viewerCell.viewersOnScene _ viewer.link; }; SceneNewVersion: PUBLIC PROC [viewerToolData: ViewerToolData, scene: Scene] = TRUSTED { viewerCell: ViewerCell; firstViewer: Viewer; success: BOOL; editToolData: EditToolData _ NARROW[viewerToolData.editToolData]; [viewerCell, success] _ FindSceneInAllViewers [scene, editToolData.allViewers]; IF NOT success THEN ERROR; firstViewer _ viewerCell.viewersOnScene; SVViewerUser.NewVersion[firstViewer]; FOR viewerList: Viewer _ firstViewer.link, viewerList.link UNTIL viewerList = NIL OR viewerList = firstViewer DO SVViewerUser.NewVersion[viewerList]; ENDLOOP; }; UpdateAllHeaders: PUBLIC PROC [viewerToolData: ViewerToolData, scene: Scene] = TRUSTED { viewerCell: ViewerCell; firstViewer: Viewer; success: BOOL; editToolData: EditToolData _ NARROW[viewerToolData.editToolData]; [viewerCell, success] _ FindSceneInAllViewers [scene, editToolData.allViewers]; IF NOT success THEN ERROR; firstViewer _ viewerCell.viewersOnScene; SVViewerUser.UpdateHeader[scene.name, NARROW[firstViewer.data]]; FOR viewerList: Viewer _ firstViewer.link, viewerList.link UNTIL viewerList = NIL OR viewerList = firstViewer DO SVViewerUser.UpdateHeader[scene.name, NARROW[viewerList.data]]; ENDLOOP; }; SceneOldVersion: PUBLIC PROC [viewerToolData: ViewerToolData, scene: Scene] = TRUSTED { viewerCell: ViewerCell; firstViewer: Viewer; success: BOOL; editToolData: EditToolData _ NARROW[viewerToolData.editToolData]; [viewerCell, success] _ FindSceneInAllViewers [scene, editToolData.allViewers]; IF NOT success THEN ERROR; firstViewer _ viewerCell.viewersOnScene; SVViewerUser.OldVersion[firstViewer]; FOR viewerList: Viewer _ firstViewer.link, viewerList.link UNTIL viewerList = NIL OR viewerList = firstViewer DO SVViewerUser.OldVersion[viewerList]; ENDLOOP; }; NewSelectedViewer: PUBLIC PROC [viewerToolData: ViewerToolData] = TRUSTED { editToolData: EditToolData _ NARROW[viewerToolData.editToolData]; viewerPictureData: ViewerPictureData _ NARROW[viewerToolData.viewerPicture.data]; IF viewerToolData # editToolData.currentViewerToolData THEN { SVViewerUser.Deselected[editToolData.currentViewerToolData]; editToolData.currentViewerToolData _ viewerToolData; editToolData.sceneSection.currentScene _ viewerPictureData.scene; editToolData.currentViewerToolData.textSection.isSelected _ TRUE; Labels.SetDisplayStyle[editToolData.currentViewerToolData.textSection.selected, $WhiteOnBlack, TRUE]; Labels.Set[editToolData.sceneSection.sceneName, viewerPictureData.scene.name]; }; }; ReSelectViewer: PUBLIC PROC [viewerToolData: ViewerToolData] = { editToolData: EditToolData _ NARROW[viewerToolData.editToolData]; viewerPictureData: ViewerPictureData _ NARROW[viewerToolData.viewerPicture.data]; IF editToolData.currentViewerToolData # viewerToolData THEN { SVViewerUser.Deselected[editToolData.currentViewerToolData]; editToolData.currentViewerToolData _ viewerToolData; editToolData.currentViewerToolData.textSection.isSelected _ TRUE; Labels.SetDisplayStyle[editToolData.currentViewerToolData.textSection.selected, $WhiteOnBlack, TRUE]; }; editToolData.sceneSection.currentScene _ viewerPictureData.scene; Labels.Set[editToolData.sceneSection.sceneName, viewerPictureData.scene.name]; }; SetAssembly: PUBLIC PROC [assembly: Assembly, editToolData: EditToolData] = { assemblyRope: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.assemblyName]; IF NOT Rope.Equal[assemblyRope, assembly.name, TRUE] THEN ViewerTools.SetContents[editToolData.sceneSection.assemblyName, assembly.name]; }; Split: PUBLIC PROC [viewerToolData: ViewerToolData, scene: Scene] = TRUSTED { viewerCell: ViewerCell; oldViewer, newViewer: Viewer; success: BOOL; currentViewerToolData: ViewerToolData; editToolData: EditToolData _ NARROW[viewerToolData.editToolData]; [currentViewerToolData,----] _ SVViewer.CreateViewerTool[editToolData, scene, FALSE, FALSE]; newViewer _ currentViewerToolData.outer; oldViewer _ viewerToolData.outer; [viewerCell, success] _ FindSceneInAllViewers[scene, editToolData.allViewers]; AddViewerToViewerCell[newViewer, viewerCell]; newViewer.newVersion _ oldViewer.newVersion; newViewer.newFile _ oldViewer.newFile; newViewer.file _ oldViewer.file; SVViewerUser.UpdateHeader[scene.name, currentViewerToolData]; ViewerOps.ComputeColumn[column: newViewer.column, paint: TRUE]; -- now do the painting }; DrawSceneInternal: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; Painter[SVViewerUser.EraseAndDrawSceneEtc, editToolData, scene]; }; GetCoordSys: PUBLIC PROC [viewer: Viewer, scene: Scene] RETURNS [cs: CoordSystem, success: BOOL] = TRUSTED { csRope: Rope.ROPE; csRope _ ViewerTools.GetContents[viewer]; success _ TRUE; cs _ CoordSys.FindCoordSysFromName[csRope, scene.coordSystems ! CoordSys.CoordSysNotFound => {success _ FALSE; CONTINUE}]; IF NOT success THEN { MessageWindow.Append["Assembly ", TRUE]; MessageWindow.Append[csRope]; MessageWindow.Append[" not found"]; MessageWindow.Blink[]; }; };-- end of GetCoordSys GetAssembly: PUBLIC PROC [viewer: Viewer, scene: Scene] RETURNS [as: Assembly, success: BOOL] = TRUSTED { asRope: Rope.ROPE; asRope _ ViewerTools.GetContents[viewer]; success _ TRUE; [as, ----] _ DisplayList3d.FindAssemblyFromName[asRope, scene !DisplayList3d.AssemblyNotFound => {MessageWindow.Append["Assembly ", TRUE]; MessageWindow.Append[asRope]; MessageWindow.Append[" not found"]; MessageWindow.Blink[]; success _ FALSE; CONTINUE}] }; -- end of GetAssembly FindAssemblyFromName: PUBLIC PROC [name: Rope.ROPE, scene: Scene] RETURNS [assembly: Assembly, superAssembly: Assembly, found: BOOL] = TRUSTED { found _ TRUE; [assembly, superAssembly] _ DisplayList3d.FindAssemblyFromName[name, scene !DisplayList3d.AssemblyNotFound => {found _ FALSE; CONTINUE}]; IF NOT found THEN { MessageWindow.Append["Assembly ", TRUE]; MessageWindow.Append[name]; MessageWindow.Append[" not found"]; MessageWindow.Blink[]; }; }; GetSuper: PUBLIC PROC [editToolData: EditToolData] RETURNS [super: Assembly, success: BOOL] = TRUSTED { superName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.wrt]; scene: Scene _ editToolData.sceneSection.currentScene; success _ TRUE; super _ NIL; [super, ----] _ DisplayList3d.FindAssemblyFromName[superName, scene !DisplayList3d.AssemblyNotFound => {success _ FALSE; CONTINUE}]; IF NOT success THEN { MessageWindow.Append["Assembly "]; MessageWindow.Append[superName]; MessageWindow.Append[" not found"]; MessageWindow.Blink[];}; }; -- end of GetSuper GetPoint3d: PUBLIC PROC [textViewer: Viewer] RETURNS [pt: Point3d] = TRUSTED { wholeRope: Rope.ROPE _ ViewerTools.GetContents[textViewer]; wholeStream: IO.STREAM _ IO.RIS[wholeRope]; TFI3d.ReadBlank[wholeStream]; pt[1] _ TFI3d.ReadReal[wholeStream]; TFI3d.ReadBlankAndRope[wholeStream, ","]; TFI3d.ReadBlank[wholeStream]; pt[2] _ TFI3d.ReadReal[wholeStream]; TFI3d.ReadBlankAndRope[wholeStream, ","]; TFI3d.ReadBlank[wholeStream]; pt[3] _ TFI3d.ReadReal[wholeStream]; }; ScenePrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.sceneSection.sceneName]; -- force the selection }; AssemblyNamePrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.sceneSection.assemblyName]; -- force the selection }; WithRespectToPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.sceneSection.wrt]; -- force the selection }; RGBPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.artworkSection.rgb]; -- force the selection }; SphereRadiusPrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.sphereSection.radius]; -- force the selection }; BlockXYZPrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.blockSection.xyz]; -- force the selection }; CylinderRadiusPrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cylinderSection.radius]; }; CylinderHeightPrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cylinderSection.height]; }; ConeRadiusPrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.coneSection.radius]; }; ConeHeightPrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.coneSection.height]; }; BigRadiusPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.torusSection.bigRadius]; }; SectionRadiusPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.torusSection.sectionRadius]; }; LinDepthPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.linSection.depth]; }; StuffPrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.utilitySection.stuffNum]; }; DegreesPrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.transformSection.degrees]; }; TranslateXYZPrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.transformSection.transXYZ]; }; ScaleXYZPrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.transformSection.scaleXYZ]; }; EvenScaleXYZPrompt: PUBLIC PROC[parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.transformSection.scalar]; }; CameraNamePrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cameraSection.name]; }; FocusPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cameraSection.focusPoint]; }; ScanResolutionPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cameraSection.resolution]; }; CameraOriginPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cameraSection.origin]; }; SlantPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cameraSection.slant]; }; FocalLengthPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cameraSection.focalLength]; }; FramePrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cameraSection.frame]; }; ClippingPlanePrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cameraSection.clippingPlanes]; }; VisibleAssemblyPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cameraSection.visibleAssemblies]; }; CameraOrderPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.cameraOrderSection.order]; }; PrefixPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.copySection.prefix]; }; CopyFromPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.copySection.assemblyName]; }; NewNamePrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.renameSection.newName]; }; ResolutionPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.artworkSection.resolution]; }; TubeHeightPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.artworkSection.tubeHeight]; }; TubeRadiusPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.artworkSection.tubeRadius]; }; BoxXYZPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.artworkSection.boxXYZ]; }; ArtworkNamePrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.artworkSection.picName]; }; ArtworkDegreesPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.artworkTransformSection.degrees]; }; LightNamePrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.lightSection.name]; }; LightPositionPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.lightSection.position]; }; LightColorPrompt: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; ViewerTools.SetSelection[editToolData.lightSection.color]; }; Init: PRIVATE PROC = TRUSTED { primaryCS, secondaryCS -- , finalPrimaryCS, finalSecondaryCS -- : CoordSystem; primaryCS _ CoordSys.CreateCoordSys["primarySelection", Matrix3d.Identity[], NIL]; secondaryCS _ CoordSys.CreateCoordSys["secondarySelection", Matrix3d.Identity[], NIL]; primarySelection _ NEW[SelectionObj _ [[0,0], NIL, NIL, primaryCS, NIL]]; secondarySelection _ NEW[SelectionObj _ [[0,0], NIL, NIL, secondaryCS, NIL]]; finalPrimary _ NIL; finalSecondary _ NIL; }; Init[]; END. |File: SVEditUserImplA.mesa Last edited by Bier on August 18, 1983 3:39 pm Author: Eric Bier in October 1982 Contents: All of the procedures called by SVEditTool when menus and buttons are pressed GLOBAL VARIABLES If the primary or secondary selection is in viewerToolData.outer then draw the coordinate system of this selection. Tell the selection about the current positions of CAMERA and WORLD before drawing it (We will assume, for now, that the assembly it refers to is already updated). At this point, we may wish to update "Assembly:" in the edittool to be the selected assembly. We should also make sure that the selected scene is the scene we are now pointing at. find parent of secondarySelection.assembly if any. Set secondarySelection.assembly to this value. Indicate the selection by changing the name in the "Assembly" slot of the edittool. draw the first viewer if there is one. draw the rest (remember they are linked in a ring) clientData is editToolData fake a button press on the Selected button viewers are linked in a ring so we go around until we are back at the first viewer. is it the first viewer? viewers are linked in a ring so we go around until we are back at the first viewer. is it the first viewer? ViewerCell is in the key spot. after becomes new key spot. Search the ring for the last cell (which currently refers to viewer cell) and have it refer to after. a viewer is loading a new scene. All newly loaded scenes are considered unique (since the file might have been editted by hand since last loading) Add a viewer cell. a viewer is saving a scene. Save if possible. No other action required. This viewer should be on our list from when this scene was opened or stored. a viewer is storing a scene. If this viewer previously had a scene, we will have to remove it from that scene list and add it to a new one. Otherwise we just have to add it. if this viewerCell doesn't exist, add it. add scene to proper viewer cell. This viewer is about to be destroyed. The window manager will take care of removing it from our linked list. However, make sure that this viewer is not the viewer refered to by the viewerCell corresponding to its scene. (We would lose all our viewers is this is the case). If so, move our pointer to someone else. Loops through split viewers updating headers. Loops through split viewers updating headers. Loops through split viewers updating headers. Create a new viewer and split all viewers onto this scene viewer is a TextViewer. finalPrimaryCS _ CoordSys.CreateCoordSys["finalPrimary", Matrix3d.Identity[], NIL]; finalSecondaryCS _ CoordSys.CreateCoordSys["finalSecondary", Matrix3d.Identity[], NIL]; Κ#φ– "cedar" style˜Ihead1šœ™Jšœ.™.Jšœ!™!JšœW™WJ˜šΟk ˜ Jšœ ˜ Jšœ˜Jšœ ˜ Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜J˜ Jšœ ˜ Jšœ ˜ —J˜šœœ˜Jšœœ€˜£Jšœ˜—Jš˜˜Jšœ œ˜(Jšœœ˜0Jšœœ˜"Jšœ œ˜)Jšœœ˜#Jšœœœ˜)Jšœœ˜3Jšœœ˜0Jšœ œ˜'Jšœ œ˜&Jšœ œ˜Jšœ œ˜!Jšœ œœ ˜"Jšœ œœ ˜ Jšœœ˜"Jšœ œœ˜#Jšœœ˜-Jšœœ˜$Jšœ œœ˜%Jšœœ˜/Jšœ œ˜)Jšœœ˜3Jšœœ"˜9—J˜Jšœ™˜Jšœ!œœ˜+Jšœ;˜;Jšœ3˜3—˜šΟnœœœ:œ˜aJšœ—™—Jšœ1˜3šœ˜Jšœ4˜4JšœF˜FJšœ˜—Jšœ3˜5šœ˜Jšœ6˜6JšœH˜HJšœ˜—Jšœ˜—J˜š žœœœxœœ˜ΒJšœ+˜+Jšœ'˜'Jšœ%˜%šœ œœ˜JšœJ˜JJšœr˜rJšœ/Οc9˜hJšœ˜—Jšœ1˜1Jšœ˜J™΄JšœœœœŸ˜TJšœœ˜;Jšœ˜—J˜š žœœœxœœ˜ΔJšœ-˜-Jšœ'˜'Jšœ)˜)šœ œœ˜JšœL˜LJšœ!˜!JšœT˜TJšœ1Ÿ9˜jJšœ˜—Jšœ3˜3Jšœ˜Jšœ˜—J˜š žœœœxœœ˜ΎJšœ˜Jšœ˜Jšœœ˜!Jšœ'˜'Jšœ!˜!Jšœ#˜#šœ œœ˜Jšœ0˜0JšœC˜CJšœY˜YJšœ˜—Jšœ-˜-Jšœ˜Jšœ˜—J˜š žœœœxœœ˜ΐJšœ˜Jšœ˜Jšœœ˜#Jšœ)˜)Jšœ#˜#Jšœ%˜%šœ œœ˜Jšœ0˜0JšœC˜CJšœ]˜]Jšœ˜—Jšœ/˜/Jšœ˜Jšœ˜—J˜š žœœœœœ˜KJšœ˜Jšœ˜—J˜š žœœœœœ˜MJšœ˜Jšœ˜—J˜š žœœœœœ˜GJšœ˜Jšœ˜—J˜š žœœœœœ˜IJšœ˜Jšœ˜—J˜šžœœœœ˜(Jšœ·™·Jšœ%˜%Jšœ˜Jšœ ˜ Jšœ˜Jšœœœœ˜1Jšœœ7˜QJšœœ1˜FJšœ ˜ Jšœa˜aJšœœœ&˜8šœ˜Jšœ'˜'Jšœ"œ˜(—JšœbŸ:˜œJšœ»˜»Jšœ˜—J˜šžœœœVœ˜…JšœR˜RJšœR˜RJšœ˜J˜—Jšžœœœ@œ˜]šœ˜Jšœ œ˜Jšœ˜Jšœ œœ˜1Jšœ˜Jšœ˜JšœN˜NJšœœ œœ˜Jšœ&™&Jšœœœœ˜/Jšœœ!˜8Jšœ/˜/Jšœ2™2Jšœ"œœœ˜4Jšœ9˜<šœ"˜)Jšœœ ˜#Jšœ/˜/—Jšœ˜Jšœ˜—J˜šž œœœœ œœœ˜DJšœ˜Jšœ>˜BJšœ˜Jšœ˜—J˜šž œœœ œœœœ,œœ˜yJšœ=˜=Jšœ˜—šžœœœœ œœœ˜P˜+J˜Jš œ)œœ œœœ˜†—Jšœ(˜(Jšœ1œ œ œ˜SJšœIœœ˜TJšœ˜—J˜šž œœœ œœœœ,œœ˜yJšœ™Jšœœ ˜0Jšœ˜Jšœ&˜&Jšœ7˜7JšœŸœ3œœ˜\Jšœ]˜]Jšœ?˜?Jšœœœœ˜EJšœ*™*Jšœ=˜=Jšœ˜—J˜J˜šžœœœœœ œ#œœ˜Jšœ œ˜š œœœ$œœœ ˜Sšœœ˜"Jšœ˜Jšœ œ˜Jšœ˜Jšœ˜——Jšœ˜Jšœ˜—J˜šžœœœœœ œ)œœœ˜ Jšœ œœ˜/Jšœœ˜-Jšœ˜—J˜šžœœœœœ œDœœ˜±JšœS™SJšœ˜Jšœ œ˜š œ œœ'œ œœ ˜\Jšœ œ˜ Jšœ+˜+Jšœœœœ˜Jšœ™šœœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ œ˜Jšœ˜—Jšœ˜Jšœœœœ˜$Jšœ7˜:šœœ ˜,šœœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ œ˜Jšœ˜—Jšœ˜—Jšœ˜—Jšœ˜Jšœ˜—J˜š žœœœ*œ,œœ˜‘JšœS™SJšœ˜Jšœ œ˜Jšœ(˜(Jš œœœ œœ˜4Jšœ™šœœ˜Jšœ œŸ9˜FJšœ˜Jšœ˜Jšœ œ˜Jšœ˜—Jšœ˜Jšœ@˜Cšœœ ˜,šœœ˜Jšœ˜Jšœ˜Jšœ œ˜Jšœ˜—Jšœ˜—Jšœ˜Jšœ œ˜Jšœ˜—J˜šžœœœ=œ˜mJšœ˜šœ œœ&œ˜>Jšœ‘™‘Jš œ œœœœ˜>Jšœ˜šœ˜šœœ˜šœ œ˜Jšœ œ˜Jšœœ ˜$Jšœœ˜/—Jšœ˜——Jšœ˜Jšœ"˜"Jšœ˜—šœ˜šœœ˜Jšœ œ˜Jšœœ ˜$Jšœœ˜/—Jšœ˜Jšœ˜—Jšœ˜—J˜šžœœœ,œ˜Wšœœœ˜)Jšœœ˜Jšœ#˜#Jšœ˜—Jšœ(˜(šœ"œ˜,Jšœ'˜'—Jšœœ3˜;šœ"˜)Jšœœ˜#—Jšœ˜Jšœ#˜#Jšœ˜J˜—šž œœœ0œœœœ˜}Jšœ¦™¦Jšœœ˜AJšœ)˜)Jšœ ˜ Jšœ.˜.Jšœœ œœ˜šœ*˜*Jšœ5˜5—Jšœz˜zšœ œ˜JšœC˜CJšœ;˜;Jšœ/˜/Jšœ<˜œœ œœ˜~Jšœ―™―Jšœœ˜AJšœ)˜)Jšœ ˜ Jšœ!œœ˜.Jšœ-˜-Jšœ-˜-Jšœœ œœ˜šœ7˜7JšœF˜F—šœ œŸ!˜6JšœœœŸ˜IJšœC˜CJšœ˜—Jšœ)™)Jšœ\˜\šœœœ+˜IJšœ5˜5—Jšœ ™ Jšœ;˜;Jšœ˜J˜—šž œœœ<œ˜_Jšœœ˜AJšœ ˜ Jšœ œ˜Jšœ&˜&JšœM˜MJšœœ œœ˜Jšœ_˜_Jšœœ œœ˜Jšœ@˜@Jšœ]˜]Jšœ;˜;Jšœ˜—J˜šž œœœœ˜7Jšœ½™½Jšœ˜Jšœ ˜ Jšœ œ˜Jšœ!œ˜5Jšœœ˜AJšœi˜iJšœœ œœ˜Jšœ$œ)˜SJšœ˜—J˜šžœœœ2œ˜WJšœ-™-Jšœ˜Jšœ˜Jšœ œ˜Jšœœ˜AJšœO˜OJšœœ œœ˜Jšœ(˜(Jšœ%˜%Jšœ7˜:šœœœ˜5Jšœ$˜$—Jšœ˜Jšœ˜—šžœœœ2œ˜XJšœ-™-Jšœ˜Jšœ˜Jšœ œ˜Jšœœ˜AJšœO˜OJšœœ œœ˜Jšœ(˜(Jšœ&œ˜@Jšœ7˜:šœœœ˜5Jšœ&œ˜?—Jšœ˜Jšœ˜—J˜šžœœœ2œ˜WJšœ.™.Jšœ˜Jšœ˜Jšœ œ˜Jšœœ˜AJšœO˜OJšœœ œœ˜Jšœ(˜(Jšœ%˜%Jšœ7˜:šœœœ˜5Jšœ$˜$—Jšœ˜Jšœ˜—J˜šžœœœ$œ˜KJšœœ˜AJšœ'œ$˜QJšœ4˜6šœ˜Jšœ<˜—šœœœ˜Jšœ"œ˜(Jšœ˜Jšœ#˜#Jšœ˜J˜—˜J˜——š žœœœœœœ˜gJšœœ:˜NJšœ6˜6Jšœ œ˜Jšœœ˜ JšœŸœ7˜CJšœ.œœ˜@šœœ œ˜Jšœ"˜"Jšœ ˜ Jšœ#˜#Jšœ˜—JšœŸ˜—J˜š ž œœœœœ˜NJšœœ'˜;Jš œ œœœœ ˜+Jšœ˜Jšœ$˜$Jšœ)˜)Jšœ˜Jšœ$˜$Jšœ)˜)Jšœ˜Jšœ$˜$Jšœ˜—J˜šž œœœ œœœœ,œœ˜zJšœœ ˜0Jšœ?Ÿ˜UJšœ˜—J˜šžœœœ œœœœ,œœ˜‚Jšœœ ˜0JšœBŸ˜XJšœ˜—J˜šžœœœ œœœœ,œœ˜ƒJšœœ ˜0Jšœ9Ÿ˜OJšœ˜—J˜šž œœœ œœœœ,œœ˜yJšœœ ˜0Jšœ;Ÿ˜QJšœ˜—J˜šžœœœ œœœœ,œœ˜Jšœœ ˜0Jšœ=Ÿ˜SJšœ˜—J˜šžœœœ œœœœ,œœ˜}Jšœœ ˜0Jšœ9Ÿ˜OJšœ˜—J˜šžœœœ œœœœ,œœ˜ƒJšœœ ˜0Jšœ>˜>Jšœ˜—J˜šžœœœ œœœœ,œœ˜ƒJšœœ ˜0Jšœ>˜>Jšœ˜—J˜šžœœœ œœœœ,œœ˜Jšœœ ˜0Jšœ:˜:Jšœ˜J˜—šžœœœ œœœœ,œœ˜Jšœœ ˜0Jšœ:˜:Jšœ˜—Jšžœœœ œœœœ˜]šœœœ˜!Jšœœ ˜0Jšœ>˜>Jšœ˜—Jšžœœœ œœœœ˜ašœœœ˜!Jšœœ ˜0JšœB˜BJšœ˜—šžœœœ œœœœ,œœ˜~Jšœœ ˜0Jšœ8˜8Jšœ˜—šž œœœ œœœœ,œœ˜zJšœœ ˜0Jšœ?˜?Jšœ˜—J˜šž œœœ œœœœ,œœ˜|Jšœœ ˜0Jšœ@˜@Jšœ˜—J˜šžœœœ œœœœ,œœ˜Jšœœ ˜0JšœA˜AJšœ˜—J˜šžœœœ œœœœ,œœ˜}Jšœœ ˜0JšœA˜AJšœ˜—J˜šžœœœ œœœœ,œœ˜Jšœœ ˜0Jšœ?˜?Jšœ˜—Jšœ˜šžœœœ œœœœ,œœ˜€Jšœœ ˜0Jšœ:˜:Jšœž˜—šž œœœ œœœœ,œœ˜{Jšœœ ˜0Jšœ@˜@Jšœ˜—J˜Jšžœœœ œœœœ˜bšœœœ˜!Jšœœ ˜0Jšœ@˜@Jšœ˜—J˜šžœœœ œœœœ,œœ˜‚Jšœœ ˜0Jšœ<˜˜>Jšœ˜—J˜Jšžœœœ œœœœ˜bšœœœ˜!Jšœœ ˜0JšœG˜GJšœ˜J˜—Jšžœœœ œœœœ˜]šœœœ˜!Jšœœ ˜0Jšœ9˜9Jšœ˜—J˜Jšžœœœ œœœœ˜ašœœœ˜!Jšœœ ˜0Jšœ=˜=Jšœ˜—J˜Jšžœœœ œœœœ˜^šœœœ˜!Jšœœ ˜0Jšœ:˜:Jšœ˜—J˜šžœœœœ˜JšœŸ(œ˜NJšœMœ˜RJšœQœ˜VJšœS™SJšœW™WJš œœœœ œ˜IJš œœœœœ˜MJšœœ˜Jšœœ˜Jšœ˜—J˜Jšœ˜J˜J˜Jšœ˜——…—‚&°˜