<> <> <> <> 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 { << Loops through split viewers updating headers.>> 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.