<> <> <> <> <> DIRECTORY BitMap3d, CoordSys, FS, Icons, Imager, Menus, Rope, SV2d, SV3d, SVDrawMonitor, SVError, SVInterfaceTypes, SVMenus, SVModelTypes, SVScene, SVSceneTypes, SVUserInput, SVViewer, SVViewerTool, SVViewerUser, TIPUser, ViewerClasses, ViewerOps; SVViewerImpl: CEDAR PROGRAM IMPORTS BitMap3d, CoordSys, FS, Icons, Imager, Menus, Rope, SVError, SVMenus, SVScene, SVUserInput, SVViewerTool, SVViewerUser, TIPUser, ViewerOps EXPORTS SVViewer SHARES ViewerClasses = BEGIN Camera: TYPE = SVModelTypes.Camera; CoordSystem: TYPE = SVModelTypes.CoordSystem; EditToolData: TYPE = SVInterfaceTypes.EditToolData; FileCamera: TYPE = SVSceneTypes.FileCamera; MouseButton: TYPE = Menus.MouseButton; Plane: TYPE = SV3d.Plane; Point2d: TYPE = SV2d.Point2d; Scene: TYPE = SVSceneTypes.Scene; Viewer: TYPE = ViewerClasses.Viewer; ViewerToolData: TYPE = REF ViewerToolDataObj; ViewerToolDataObj: TYPE = SVInterfaceTypes.ViewerToolDataObj; SolidPaint: SAFE PROC [self: Viewer, context: Imager.Context, whatChanged: REF ANY, clear: BOOL] RETURNS [quit: BOOL _ FALSE] = TRUSTED { <> <> viewerToolData: ViewerToolData; IF whatChanged = NIL THEN { --we are being called by Window Manager viewerToolData _ NARROW[self.data]; SVViewerUser.PlaceOrigin[self]; SVViewerUser.ResizeBitMaps[self]; Imager.SetFont[context, viewerToolData.editToolData.font]; SVViewerUser.EraseAndDrawSceneEtc[context, viewerToolData]; } ELSE { proc: PROC [Imager.Context]; viewerToolData _ NARROW[whatChanged]; proc _ viewerToolData.proc; Imager.SetFont[context, viewerToolData.editToolData.font]; proc[context]; RETURN}; }; Init: PROC = { solidWindowClass: ViewerClasses.ViewerClass; solidWindowClass _ NEW[ViewerClasses.ViewerClassRec _ [ paint: SolidPaint, notify: SVUserInput.InputNotify, tipTable: TIPUser.InstantiateNewTIPTable["SolidViews.TIP"] ]]; ViewerOps.RegisterViewerClass[$SolidWindow, solidWindowClass]; }; CreateViewerTool: PUBLIC PROC [parentData: REF ANY, scene: Scene, iconic: BOOL, paint: BOOL, workingDirectory: Rope.ROPE] RETURNS [viewerToolData: ViewerToolData, viewerPicture: Viewer] = { <> <> <> <<#BBox #Scene #Coords #Point #Cross #Color #B&W Coords>> screenCS, worldCS: CoordSystem; success: BOOL; fileCamera: FileCamera; editToolData: EditToolData; iconFileName: Rope.ROPE; windowMenu: Menus.Menu; viewerToolData _ NEW[ViewerToolDataObj]; windowMenu _ Menus.CreateMenu[1]; viewerToolData.editToolData _ NARROW[parentData]; viewerToolData.scene _ scene; editToolData _ NARROW[parentData]; iconFileName _ Rope.Concat[editToolData.originalWorkingDirectory, "SolidViews.icons"]; <> viewerToolData.outer _ SVViewerTool.Create[ info: [ name: Rope.Concat["Solid Scene: ", viewerToolData.scene.name], menu: windowMenu, data: viewerToolData, iconic: TRUE, column: left, scrollable: FALSE, icon: Icons.NewIconFromFile[iconFileName, 0] ], paint: FALSE]; <> screenCS _ CoordSys.CreateRoot["SCREEN"]; IF scene.cameraOrder # NIL THEN [fileCamera, ----] _ SVScene.FindFileCameraFromName[scene.cameraOrder.first, viewerToolData.scene] ELSE { [fileCamera, success] _ SVScene.FindFileCameraFromName["Front", viewerToolData.scene]; IF NOT success THEN ERROR; }; worldCS _ scene.coordSysRoot; viewerToolData.camera _ SVScene.CreateCamera[worldCS, screenCS, shaded]; SVScene.StuffCameraFromFileCamera[viewerToolData.camera, fileCamera, shaded]; viewerToolData.sceneStyleIndex _ 2; -- shaded viewerToolData.mode _ cast; viewerToolData.showCoordSys _ FALSE; viewerToolData.doubleBuffer _ FALSE; viewerToolData.altDC _ BitMap3d.GetAltDisplayContext[]; SVMenus.BuildControlPanel[viewerToolData, windowMenu, workingDirectory]; BuildPictureSection[viewerToolData]; viewerPicture _ viewerToolData.viewerPicture; IF NOT iconic THEN ViewerOps.OpenIcon[icon: viewerToolData.outer, closeOthers: FALSE, bottom: FALSE, paint: TRUE]; }; BuildPictureSection: PRIVATE PROC [viewerToolData: ViewerToolData] = { <> viewerToolData.viewerPicture _ ViewerOps.CreateViewer[ flavor: $SolidWindow, info: [ parent: viewerToolData.outer, wx: 0, wy: viewerToolData.height, ww: viewerToolData.outer.ww, wh: viewerToolData.outer.wh, -- only initial values for ww and wh. They are constrained below data: viewerToolData, -- contains the current scene scrollable: FALSE ] ]; SVViewerTool.ChildXBound[viewerToolData.outer, viewerToolData.viewerPicture]; SVViewerTool.ChildYBound[viewerToolData.outer, viewerToolData.viewerPicture]; viewerToolData.height _ viewerToolData.height + viewerToolData.viewerPicture.wh; }; -- end of BuildDrawSection ReloadTipTable: PUBLIC PROC [viewerToolData: ViewerToolData] = TRUSTED { newTable: TIPUser.TIPTable; editToolData: EditToolData _ NARROW[viewerToolData.editToolData]; solidviewer: ViewerClasses.Viewer; bad: BOOL _ FALSE; tableName, msg: Rope.ROPE; SVError.AppendHerald["Reloading tip table...", begin]; tableName _ Rope.Concat[editToolData.originalWorkingDirectory, "Solidviews.TIP"]; newTable _ TIPUser.InstantiateNewTIPTable[tableName ! FS.Error => { bad _ TRUE; msg _ Rope.Concat["Cannot read TIP table file: ", tableName]; CONTINUE}; TIPUser.InvalidTable => { bad _ TRUE; msg _ Rope.Concat["Error(s) saved on TIP.Errors for: ", tableName]; CONTINUE}]; IF bad THEN {SVError.Append[msg, oneLiner]; RETURN}; SVError.AppendHerald["Done.", end]; IF newTable = NIL THEN ERROR; solidviewer _ viewerToolData.viewerPicture; solidviewer.tipTable _ newTable; }; Init[]; END.