Assembly: TYPE = DisplayList3d.Assembly;
BoundBox: TYPE = SVBoundBox.BoundBox;
Camera: TYPE = CSGGraphics.Camera;
Color: TYPE = GraphicsColor.Color;
CoordSysGenerator: TYPE = DisplayList3d.CoordSysGenerator;
CoordSystem: TYPE = CoordSys.CoordSystem;
CSGTree: TYPE = DisplayList3d.CSGTree;
DeviceObject: PUBLIC TYPE = CGDevice.Rep;
DrawStyle: TYPE = CSGGraphics.DrawStyle;
FileCamera: TYPE = DisplayList3d.FileCamera;
EditToolData: TYPE = SVEditUser.EditToolData;
MasterObject: TYPE = DisplayList3d.MasterObject;
Matrix4by4: TYPE = Matrix3d.Matrix4by4;
MouseButton: TYPE = Menus.MouseButton;
Point2d: TYPE = SV2d.Point2d;
Primitive: TYPE = CSG.Primitive;
Scene: TYPE = DisplayList3d.Scene;
Vector: TYPE = SVVector3d.Vector;
Viewer: TYPE = ViewerClasses.Viewer;
ViewerToolData: TYPE = REF ViewerToolDataObj;
ViewerToolDataObj: TYPE = SVViewerTool.ViewerToolDataObj;
ViewerTextData: TYPE = SVViewerTool.ViewerTextData;
ViewerPictureData: TYPE = REF ViewerPictureDataObj;
ViewerPictureDataObj: TYPE = SVViewerUser.ViewerPictureDataObj;
InteractionMode: TYPE = SVViewerUser.InteractionMode;-- {select, cast};
DCProc: TYPE = SVViewerUser.DCProc;
ReadTwoReals:
PUBLIC
PROC [textViewer: Viewer]
RETURNS [x, y:
REAL] =
TRUSTED {
wholeRope: Rope.ROPE ← ViewerTools.GetContents[textViewer];
wholeStream: IO.STREAM ← IO.RIS[wholeRope];
TFI3d.ReadBlank[wholeStream];
x ← TFI3d.ReadReal[wholeStream];
TFI3d.ReadBlankAndRope[wholeStream, ","];
y ← TFI3d.ReadReal[wholeStream];
};
DrawSceneEtc:
PUBLIC
PROC [dc: Graphics.Context, viewerToolData: ViewerToolData] =
TRUSTED {
May also draw coordinate systems, drawing planes, etc depending on the current selected modes.
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
camera: Camera ← viewerPictureData.camera;
IF viewerPictureData.doubleBuffer
THEN {
BitMap3d.Erase[viewerPictureData.altDC];
DisplayList3d.DrawScene[viewerPictureData.altDC.dc, scene, camera];
IF viewerPictureData.showCoordSys
THEN DrawAllCS[viewerPictureData.altDC.dc, viewerToolData];
SVEditUser.DrawAnySelections[dc, viewerToolData];
BitMap3d.DrawAltDisplayContext[dc, viewerPictureData.altDC];
}
ELSE {
editToolData: EditToolData ← NARROW[viewerToolData.editToolData];
assem: Assembly;
success: BOOL;
DisplayList3d.DrawScene[dc, scene, camera];
Graphics.SetColor[dc, GraphicsColor.black];
IF viewerPictureData.showCoordSys THEN DrawAllCS[dc, viewerToolData];
IF viewerPictureData.showCoordSys
THEN
IF editToolData.sceneSection.currentScene = scene
THEN {
[assem, success] ← SVEditUser.GetAssembly[editToolData.sceneSection.assemblyName, scene];
IF success THEN DrawOneCS[dc, viewerToolData, assem.coordSys];
};
SVEditUser.DrawAnySelections[dc, viewerToolData];
};
}; -- end of DrawSceneEtc
EraseAndDrawSceneEtc:
PUBLIC
PROC [dc: Graphics.Context, viewerToolData: ViewerToolData] =
TRUSTED {
May also draw coordinate systems, drawing planes, etc depending on the current selected modes.
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
camera: Camera ← viewerPictureData.camera;
IF viewerPictureData.doubleBuffer
THEN {
BitMap3d.Erase[viewerPictureData.altDC];
DisplayList3d.DrawScene[viewerPictureData.altDC.dc, scene, camera];
IF viewerPictureData.showCoordSys THEN DrawAllCS[viewerPictureData.altDC.dc, viewerToolData];
SVEditUser.DrawAnySelections[dc, viewerToolData];
BitMap3d.DrawAltDisplayContext[dc, viewerPictureData.altDC];
}
ELSE {
Graphics.SetColor[dc, GraphicsColor.white];
Graphics.DrawBox[dc, Graphics.GetBounds[dc]];
DisplayList3d.DrawScene[dc, scene, camera];
Graphics.SetColor[dc, GraphicsColor.black];
IF viewerPictureData.showCoordSys THEN DrawAllCS[dc, viewerToolData];
SVEditUser.DrawAnySelections[dc, viewerToolData];
};
};
DrawAllCS:
PUBLIC
PROC [dc: Graphics.Context, viewerToolData: ViewerToolData] =
TRUSTED {
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
camera: Camera ← viewerPictureData.camera;
g: CoordSysGenerator ← DisplayList3d.GetCoordSysGenerator[scene];
mat: Matrix4by4;
FOR cs: CoordSystem ← DisplayList3d.NextCoordSys[g], DisplayList3d.NextCoordSys[g]
UNTIL cs = NIL DO
mat ← CoordSys.FindInTermsOfCamera[cs, camera.coordSys];
Make sure you have up to date coordSys positions.
Draw3d.DrawCoordSys[dc, mat, camera];
ENDLOOP;
};
DrawOneCS:
PUBLIC
PROC [dc: Graphics.Context, viewerToolData: ViewerToolData, cs: CoordSystem] =
TRUSTED {
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
camera: Camera ← viewerPictureData.camera;
assume that cs has valid cs.wrtCamera and cs.wrtWorld fields.
Draw3d.DrawCoordSys[dc, cs.wrtCamera, camera];
};
UpdateHeader:
PUBLIC
PROC [pictureFile: Rope.
ROPE, viewerToolData: ViewerToolData] =
TRUSTED {
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
headerRope: Rope.ROPE;
aisName: Rope.ROPE;
viewName: Rope.ROPE ← viewerPictureData.camera.viewName;
IF pictureFile = NIL THEN pictureFile ← viewerPictureData.scene.name;
headerRope ← Rope.Cat[viewName, " View of Solid Scene: ", pictureFile];
aisName ← Rope.Concat[SVFiles.FilenameMinusExtension[pictureFile], ".ais"];
viewerToolData.outer.name ← headerRope;
ViewerTools.SetContents[viewerToolData.textSection.ais, aisName, TRUE];
ViewerOps.PaintViewer[viewerToolData.outer, caption, FALSE, NIL];
};
NotifyOfSplit:
PUBLIC
PROC [viewer: Viewer] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[viewer.data];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
UpdateHeader[viewerPictureData.scene.name, viewerToolData];
};
UnSplit:
PUBLIC
PROC [viewerToolData: ViewerToolData] =
TRUSTED {
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
UpdateHeader[viewerPictureData.scene.name, viewerToolData];
};
DrawOneCSInViewer:
PUBLIC
PROC [viewerToolData: ViewerToolData, cs: CoordSystem] =
TRUSTED {
DoDrawOneCSInViewer:
PROC [dc: Graphics.Context] =
TRUSTED {
DrawOneCS[dc, viewerToolData, cs];
};
Painter[DoDrawOneCSInViewer, viewerToolData];
};
Painter:
PUBLIC
PROC [proc: DCProc, viewerToolData: ViewerToolData ←
NIL] =
TRUSTED {
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
camera: Camera ← viewerPictureData.camera;
viewerPictureData.proc ← proc;
ViewerOps.PaintViewer[viewer: viewerToolData.viewerPicture,
hint: client,
whatChanged: viewerToolData,
clearClient: FALSE];
}; -- end of Painter
DrawScene:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
Menus.MenuProc
viewer is a SolidWindow. clientData is viewerToolData
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ←
NARROW[viewerToolData.viewerPicture.data];
DoDrawScene: PROC [dc: Graphics.Context] = TRUSTED {
DrawSceneEtc[dc, viewerToolData];
};
Painter[DoDrawScene, viewerToolData];
};
DrawSceneInternal:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
-- like DrawScene but erases the screen before drawing.
Menus.MenuProc
viewer is a SolidWindow. clientData is viewerToolData.
viewerToolData: ViewerToolData ←
NARROW[clientData];
DoDrawScene: PROC [dc: Graphics.Context] = TRUSTED {
EraseAndDrawSceneEtc[dc, viewerToolData];
};
Painter[DoDrawScene, viewerToolData];
};
PlaceOrigin:
PUBLIC
PROC [viewer: Viewer] =
TRUSTED {
viewer is the viewerPicture
Find the center of the solid window in solid window coordinates.
originX, originY: REAL;
transMat: Matrix4by4;
viewerPictureData: ViewerPictureData ← NARROW[viewer.data];
screenCS: CoordSystem;
camera: Camera ← viewerPictureData.camera;
screenCS ← camera.screenCS;
originX ← viewer.cw;-- convert window width to real
originY ← viewer.ch;-- convert window height to real
originX ← originX/2.0;-- find the midpoint in window coords
originY ← originY/2.0;
transMat ← Matrix3d.MakeTranslateMat[-originX,-originY,0];
CoordSys.TPlaceAwrtB[screenCS,camera.coordSys,transMat];
}; -- end of PlaceOrigin
ResizeBitMap:
PUBLIC
PROC [viewer: Viewer] =
TRUSTED {
viewer is the viewerPicture
resize its bitMap
viewerPictureData: ViewerPictureData ← NARROW[viewer.data];
BitMap3d.ResizeBitMap[viewer, viewerPictureData.altDC];
};
Empty:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
Creates a new empty scene for the viewer to view.
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
oldScene: Scene ← viewerPictureData.scene;
newScene: Scene;
fileCamera: FileCamera;
cameraName: Rope.ROPE;
newScene ← viewerPictureData.scene ← DisplayList3d.CreateScene["NoName.pic"];
UpdateHeader[newScene.name, viewerToolData];
SVViewerUser.Selected[parent, clientData, mouseButton, shift, control];
IF newScene.cameraOrder = NIL THEN fileCamera ← newScene.cameras.first
ELSE {
success: BOOL;
cameraName ← newScene.cameraOrder.first;
[fileCamera, success] ← DisplayList3d.FindFileCameraFromName[cameraName, newScene];
IF
NOT success
THEN {
fileCamera ← newScene.cameras.first;
MessageWindow.Append[Rope.Cat["Camera ", cameraName, " not found"], TRUE];
MessageWindow.Blink[];
};
};
viewerPictureData.camera ← DisplayList3d.CameraFromFileCamera[fileCamera, viewerPictureData.camera.coordSys.withRespectTo, viewerPictureData.camera.screenCS, viewerPictureData.camera.style];
Erase[parent, clientData, mouseButton, shift, control];
SVEditUser.NotifyOfEmpty[viewerToolData: viewerToolData, from: oldScene, to: viewerPictureData.scene];
SceneOldVersion[viewerToolData];
This must be done after NotifyOfEmpty since SVEditUser expects to register to the newly created NoName scene before it resets the [New Version] headers.
ViewerTools.SetContents[viewerToolData.textSection.ais, "default.ais"];
};
ConfirmEmpty:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
stream: IO.STREAM;
rope: Rope.ROPE;
dirty: BOOL;
stream ← IO.CreateOutputStreamToRope[];
dirty ← viewerToolData.outer.newVersion;
IF dirty THEN stream.PutF["Confirm discard of edits"]
ELSE stream.PutF["Confirm emptying of viewer"];
rope ← IO.GetOutputStreamRope[stream];
MessageWindow.Append[rope, TRUE];
};
ClearScene:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
DisplayList3d.ClearScene[viewerPictureData.scene];
};
Erase:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
DoErase:
PROC [dc: Graphics.Context] =
TRUSTED {
mark: Graphics.Mark ← Graphics.Save[dc];
Graphics.SetColor[dc, Graphics.white];
Graphics.DrawBox[dc,Graphics.GetBounds[dc]];
Graphics.SetColor[dc, Graphics.white];
Graphics.Restore[dc,mark];
};
Painter[DoErase, viewerToolData];
};
DrawCoordSystems:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
DoDrawCoordSys:
PROC [dc: Graphics.Context] =
TRUSTED {
DrawAllCS[dc, viewerToolData];
};
Painter[DoDrawCoordSys, viewerToolData];
};
DrawBoundBoxes:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewer is Container
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
camera: Camera ← viewerPictureData.camera;
tree: CSG.CSGTree;
DoDrawBoundBoxes:
PROC [dc: Graphics.Context] =
TRUSTED {
Draw3d.DrawBoundBoxes[dc, tree, camera];
};
tree ← DisplayList3d.SceneToTree[scene, camera]; -- does a TellAboutCameraAndWorld
[] ← Preprocess3d.Preprocess[tree, camera];
Painter[DoDrawBoundBoxes, viewerToolData];
}; -- end of DrawBoundBoxes
SceneNewVersion:
PUBLIC
PROC [viewerToolData: ViewerToolData] =
TRUSTED {
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
SVEditUser.SceneNewVersion[viewerToolData, scene];
};
NewVersion:
PUBLIC
PROC [viewer: Viewer] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[viewer.data];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
scene.dirty ← TRUE;
viewerToolData.outer.newVersion ← TRUE;
UpdateHeader[scene.name, viewerToolData];
};
SceneOldVersion:
PUBLIC
PROC [viewerToolData: ViewerToolData] =
TRUSTED {
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
SVEditUser.SceneOldVersion[viewerToolData, scene];
};
OldVersion:
PUBLIC
PROC [viewer: Viewer] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[viewer.data];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
scene.dirty ← FALSE;
viewerToolData.outer.newVersion ← FALSE;
UpdateHeader[scene.name, viewerToolData];
};
Reset:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
success: BOOL;
scene: Scene ← viewerPictureData.scene;
[scene, success] ← SVEditUser.LoadScene[viewerToolData, scene.name];
Reload this scene from its backing file.
IF success
THEN {
viewerPictureData.scene ← scene;
SceneOldVersion[viewerToolData];
UpdateHeader[scene.name, viewerToolData];
DrawSceneInternal[parent, clientData, mouseButton, shift, control];
SVViewerUser.Selected[parent, clientData, mouseButton, shift, control];
};
}; -- end of Reset
ConfirmReset:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
stream: IO.STREAM;
rope: Rope.ROPE;
dirty: BOOL;
stream ← IO.CreateOutputStreamToRope[];
dirty ← viewerToolData.outer.newVersion;
IF dirty THEN stream.PutF["Confirm discard of edits"]
ELSE stream.PutF["Confirm reset of %g", [rope[scene.name]]];
rope ← IO.GetOutputStreamRope[stream];
MessageWindow.Append[rope, TRUE];
}; -- end of ConfirmReset
Save:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
success: BOOL;
scene: Scene ← viewerPictureData.scene;
success ← SVEditUser.SaveScene[viewerToolData, scene.name];
IF success
THEN {
SVViewerUser.Selected[parent, clientData, mouseButton, shift, control];
SceneOldVersion[viewerToolData];
UpdateHeader[scene.name, viewerToolData];
};
}; -- end of Save
ConfirmSave:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
exists: BOOL;
stream: IO.STREAM;
rope: Rope.ROPE;
stream ← IO.CreateOutputStreamToRope[];
exists ← SVFiles.FileExists[scene.name];
IF exists THEN stream.PutF["Confirm Save to %g [Old File]", [rope[scene.name]]]
ELSE {
stream.PutF["%g doesn't exist. Use Store", [rope[scene.name]]];
MessageWindow.Blink[]
};
rope ← IO.GetOutputStreamRope[stream];
MessageWindow.Append[rope, TRUE];
};
Get:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
success: BOOL;
picName: Rope.ROPE ← ViewerTools.GetContents[viewerToolData.textSection.fileName];
picName: Rope.ROPE ← ViewerTools.GetSelectionContents[];
aisName: Rope.ROPE;
scene: Scene;
IF Rope.Length[picName] = 0
THEN {
MessageWindow.Append["Please select a file name.", TRUE];
MessageWindow.Blink[];
RETURN;
};
[scene, success] ← SVEditUser.LoadScene[viewerToolData, picName];
IF success
THEN {
fileCamera: FileCamera;
cameraName: Rope.ROPE;
IF scene.cameraOrder = NIL THEN fileCamera ← scene.cameras.first
ELSE {
cameraName ← scene.cameraOrder.first;
[fileCamera, success] ← DisplayList3d.FindFileCameraFromName[cameraName, scene];
IF
NOT success
THEN {
fileCamera ← scene.cameras.first;
MessageWindow.Append[Rope.Cat["Camera ", cameraName, " not found"], TRUE];
MessageWindow.Blink[];
};
};
viewerPictureData.scene ← scene;
viewerPictureData.camera ← DisplayList3d.CameraFromFileCamera[fileCamera, viewerPictureData.camera.coordSys.withRespectTo, viewerPictureData.camera.screenCS, viewerPictureData.camera.style];
SceneOldVersion[viewerToolData];
UpdateHeader[picName, viewerToolData];
aisName ← Rope.Concat[SVFiles.FilenameMinusExtension[picName], ".ais"];
ViewerTools.SetContents[viewerToolData.textSection.ais, aisName];
DrawSceneInternal[parent, clientData, mouseButton, shift, control];
SVViewerUser.Selected[parent, clientData, mouseButton, shift, control];
};
}; -- end of Get
ConfirmGet:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
picName: Rope.ROPE ← ViewerTools.GetContents[viewerToolData.textSection.fileName];
picName: Rope.ROPE ← ViewerTools.GetSelectionContents[];
stream: IO.STREAM;
rope: Rope.ROPE;
dirty: BOOL;
stream ← IO.CreateOutputStreamToRope[];
dirty ← viewerToolData.outer.newVersion;
IF dirty THEN stream.PutF["Confirm discard of edits"]
ELSE stream.PutF["Confirm load of %g", [rope[picName]]];
rope ← IO.GetOutputStreamRope[stream];
MessageWindow.Append[rope, TRUE];
}; -- end of ConfirmGet
Store:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
success: BOOL;
aisName: Rope.ROPE;
picName: Rope.ROPE ← ViewerTools.GetSelectionContents[];
scene: Scene ← viewerPictureData.scene;
success ← SVEditUser.StoreScene[viewerToolData, scene, picName];
IF success
THEN {
UpdateHeader[picName, viewerToolData];
SVViewerUser.Selected[parent, clientData, mouseButton, shift, control];
SceneOldVersion[viewerToolData];
UpdateHeader[scene.name, viewerToolData];
aisName ← Rope.Concat[SVFiles.FilenameMinusExtension[picName], ".ais"];
ViewerTools.SetContents[viewerToolData.textSection.ais, aisName];};
}; -- end of Store
ConfirmStore:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
picName: Rope.ROPE ← ViewerTools.GetSelectionContents[];
exists: BOOL;
stream: IO.STREAM;
rope: Rope.ROPE;
stream ← IO.CreateOutputStreamToRope[];
exists ← SVFiles.FileExists[picName];
IF exists THEN stream.PutF["Confirm Store of %g [Old File]", [rope[picName]]]
ELSE stream.PutF["Confirm Store to %g [New File]", [rope[picName]]];
rope ← IO.GetOutputStreamRope[stream];
MessageWindow.Append[rope, TRUE];
};
Split:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
Create a new viewer onto this scene. Update the ring of links joining all viewers onto this scene,
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
SVEditUser.Split[viewerToolData, scene];
};
RayCast:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
editToolData: EditToolData ← NARROW[viewerToolData.editToolData];
scene: Scene ← viewerPictureData.scene;
camera: Camera ← viewerPictureData.camera;
tree: CSGTree;
startTime: System.GreenwichMeanTime;
endTime: System.GreenwichMeanTime;
totalTime: LONG CARDINAL;
timeStream: IO.STREAM ← IO.CreateOutputStreamToRope[];
outStream: IO.STREAM ← SVEditUser.GetOutHandle[];
timeRope: Rope.ROPE;
aisFileRope: Rope.ROPE ← ViewerTools.GetContents[viewerToolData.textSection.ais];
success: BOOL;
For now, I delete any old file if it exists.
startTime ← Time.Current[];
tree ← DisplayList3d.SceneToTree[scene, camera];
success ← CastRays.DrawTree[NIL, tree, scene.lightSources, camera, aisFileRope, mouseButton = blue, SVViewerUser.RayCastProgress, viewerToolData, outStream];
IF
NOT success
THEN {
outStream.PutF["...Raycast aborted."];
RETURN;
};
endTime ← Time.Current[];
totalTime ← endTime - startTime;
outStream.PutF[" Raycast took (%r)\n",[cardinal[totalTime]]];
timeStream.PutF[" Raycast took (%r)",[cardinal[totalTime]]];
timeRope ← IO.GetOutputStreamRope[timeStream];
MessageWindow.Append[timeRope, TRUE];
SVViewerUser.DrawBlackAndWhite[parent, clientData, mouseButton, shift, control];
}; -- end of RayCast
ConfirmRayCast:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
exists: BOOL;
aisFileRope: Rope.ROPE ← ViewerTools.GetContents[viewerToolData.textSection.ais];
redRope: Rope.ROPE ← Rope.Concat[SVFiles.FilenameMinusExtension[aisFileRope], "-red.ais"];
greenRope: Rope.ROPE ← Rope.Concat[SVFiles.FilenameMinusExtension[aisFileRope], "-green.ais"];
blueRope: Rope.ROPE ← Rope.Concat[SVFiles.FilenameMinusExtension[aisFileRope], "-blue.ais"];
stream: IO.STREAM;
rope: Rope.ROPE;
stream ← IO.CreateOutputStreamToRope[];
IF mouseButton = blue
THEN {
-- black and white only
exists ← SVFiles.FileExists[aisFileRope];
stream.PutF["Confirm raycast to %g.", [rope[aisFileRope]]];
IF exists THEN stream.PutF[" [Old File]"]
ELSE stream.PutF[" [New File]"];
}
ELSE {
exists ← SVFiles.FileExists[aisFileRope] OR SVFiles.FileExists[redRope] OR SVFiles.FileExists[greenRope] OR SVFiles.FileExists[blueRope];
stream.PutF["Confirm raycast to %g [-red, -green, -blue, plain].ais",
[rope[SVFiles.FilenameMinusExtension[aisFileRope]]]];
IF exists THEN stream.PutF[" [Old Files]"]
ELSE stream.PutF[" [New Files]"];
};
rope ← IO.GetOutputStreamRope[stream];
MessageWindow.Append[rope, TRUE];
};
Stop:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
camera: Camera ← viewerPictureData.camera;
camera.abort ← TRUE;
};
ARay:
PUBLIC
PROC [parent:
REF
ANY, clientData:
REF
ANY, mouseButton: MouseButton, shift, control:
BOOL] =
TRUSTED {
viewerToolData: ViewerToolData ← NARROW[clientData];
viewerPictureData: ViewerPictureData ← NARROW[viewerToolData.viewerPicture.data];
scene: Scene ← viewerPictureData.scene;
camera: Camera ← viewerPictureData.camera;
Get x and y from appropriate slots. Interpret this as camera coordinates and draw a cross.
x, y: REAL;
xInt, yInt: INTEGER;
outHandle: IO.STREAM;
tree: CSGTree ← DisplayList3d.SceneToTree[scene, camera];
color: Color;
[x, y] ← ReadTwoReals[viewerToolData.textSection.xyz];
xInt ← Real.FixI[x]; yInt ← Real.FixI[y];
outHandle ← SVEditUser.GetOutHandle[];
color ← CastRays.SingleRay[xInt, yInt,
tree, scene.lightSources, viewerPictureData.camera, TRUE, outHandle];
outHandle.PutF["[%g,%g]: ",[real[x]], [real[y]]];
TFO3d.FileoutColor[outHandle, color];
}; -- end of ARay