DIRECTORY BasicObject3d, DisplayList3d, GraphicsColor, IO, Matrix3d, Menus, MessageWindow, Rope, Scratchpad2d, SVDisplayListFiling, SVEditUser, SVHalfSpaces, SVPolygon2d, SVViewerTools, SVViewerUser, SweepGeometry, ViewerClasses, ViewerTools; SVEditUserImplB: CEDAR PROGRAM IMPORTS BasicObject3d, DisplayList3d, IO, Matrix3d, MessageWindow, Rope, SweepGeometry, Scratchpad2d, SVDisplayListFiling, SVEditUser, SVPolygon2d, SVViewerTools, SVViewerUser, ViewerTools EXPORTS SVEditUser = BEGIN Assembly: TYPE = DisplayList3d.Assembly; AssemblyList: TYPE = DisplayList3d.AssemblyList; AssemblyGenerator: TYPE = DisplayList3d.AssemblyGenerator; Color: TYPE = GraphicsColor.Color; EditToolData: TYPE = SVEditUser.EditToolData; LightSource: TYPE = DisplayList3d.LightSource; LinearMesh: TYPE = SweepGeometry.LinearMesh; MasterObject: TYPE = DisplayList3d.MasterObject; Matrix4by4: TYPE = Matrix3d.Matrix4by4; MouseButton: TYPE = Menus.MouseButton; NameAlreadyPresent: SIGNAL = DisplayList3d.NameAlreadyPresent; Point3d: TYPE = Matrix3d.Point3d; Polygon: TYPE = SVPolygon2d.Polygon; RevoluteMesh: TYPE = SweepGeometry.RevoluteMesh; Path: TYPE = SVPolygon2d.Path; Scene: TYPE = DisplayList3d.Scene; Viewer: TYPE = ViewerClasses.Viewer; ViewerCell: TYPE = REF ViewerCellObj; ViewerCellObj: TYPE = SVEditUser.ViewerCellObj; ViewerToolData: TYPE = SVViewerUser.ViewerToolData; ViewerPictureData: TYPE = SVViewerUser.ViewerPictureData; HalfSpaceRec: TYPE = REF HalfSpaceRecObj; HalfSpaceRecObj: TYPE = SVHalfSpaces.HalfSpaceRecObj; SphereRec: TYPE = REF SphereRecObj; SphereRecObj: TYPE = BasicObject3d.SphereRecObj; BlockRec: TYPE = REF BlockRecObj; BlockRecObj: TYPE = BasicObject3d.BlockRecObj; CylinderRec: TYPE = REF CylinderRecObj; CylinderRecObj: TYPE = BasicObject3d.CylinderRecObj; ConeRec: TYPE = REF ConeRecObj; ConeRecObj: TYPE = BasicObject3d.ConeRecObj; TorusRec: TYPE = REF TorusRecObj; TorusRecObj: TYPE = BasicObject3d.TorusRecObj; AddHalfSpace: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; errorStream: IO.STREAM; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; halfSpaceName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.assemblyName]; newAssembly, superAssembly, assembly: Assembly; success: BOOL; halfSpaceMO: MasterObject; moFound: BOOL; halfSpaceRec: HalfSpaceRec; [halfSpaceMO, moFound] _ DisplayList3d.FindObjectFromName["halfSpace", scene]; IF NOT moFound THEN ERROR; halfSpaceRec _ NARROW[halfSpaceMO.mainBody]; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetSuper[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----] _ DisplayList3d.CreatePrimitiveAssembly[halfSpaceName, "halfSpace", [1, 1, 1], scene]; DisplayList3d.AddSubassemblyToAssembly[newAssembly, superAssembly, scene, Matrix3d.Identity[] ! DisplayList3d.NameAlreadyPresent => { MessageWindow.Append["This halfSpace name is already registered. Try another.",TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}; DisplayList3d.AttemptToAddSubassemblyToPrimitive => { MessageWindow.Append["Attempt To Add Subassembly To Primitive", TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}]; IF NOT addSucceeds THEN RETURN; } ELSE {-- mouseButton = blue mo, oldMo: MasterObject; [assembly, success] _ SVEditUser.GetAssembly[editToolData.sceneSection.assemblyName, scene]; IF NOT success THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["halfSpace", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.object, MasterObject] THEN { errorStream _ IO.CreateOutputStreamToRope[]; errorStream.PutF["Can't replace cluster assembly [%g] with a halfSpace.",[rope[assembly.name]]]; errorRope _ IO.GetOutputStreamRope[errorStream]; MessageWindow.Append[errorRope, TRUE]; MessageWindow.Blink[]; RETURN}; oldMo _ NARROW[assembly.object]; assembly.object _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { MessageWindow.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"]]; MessageWindow.Blink[] }; assembly.scalars _ [1, 1, 1]; }; SVViewerUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.DrawSceneInternal[parent, clientData, mouseButton, shift, control]; }; -- end of AddHalfSpace AddSphere: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; errorStream: IO.STREAM; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; sphereName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.assemblyName]; radius: REAL _ SVViewerTools.GetReal[editToolData.sphereSection.radius, 200]; newAssembly, superAssembly, assembly: Assembly; success: BOOL; sphereMO: MasterObject; moFound: BOOL; sphereRec: SphereRec; moRadius: REAL; [sphereMO, moFound] _ DisplayList3d.FindObjectFromName["sphere", scene]; IF NOT moFound THEN ERROR; sphereRec _ NARROW[sphereMO.mainBody]; moRadius _ sphereRec.radius; radius _ radius/moRadius; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetSuper[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----] _ DisplayList3d.CreatePrimitiveAssembly[sphereName, "sphere", [radius, radius, radius], scene]; DisplayList3d.AddSubassemblyToAssembly[newAssembly, superAssembly, scene, Matrix3d.Identity[] ! DisplayList3d.NameAlreadyPresent => { MessageWindow.Append["This sphere name is already registered. Try another.",TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}; DisplayList3d.AttemptToAddSubassemblyToPrimitive => { MessageWindow.Append["Attempt To Add Subassembly To Primitive", TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}]; IF NOT addSucceeds THEN RETURN; } ELSE {-- mouseButton = blue mo, oldMo: MasterObject; [assembly, success] _ SVEditUser.GetAssembly[editToolData.sceneSection.assemblyName, scene]; IF NOT success THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["sphere", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.object, MasterObject] THEN { errorStream _ IO.CreateOutputStreamToRope[]; errorStream.PutF["Can't add sphere to a cluster assembly [%g]",[rope[assembly.name]]]; errorRope _ IO.GetOutputStreamRope[errorStream]; MessageWindow.Append[errorRope, TRUE]; MessageWindow.Blink[]; RETURN}; oldMo _ NARROW[assembly.object]; assembly.object _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { MessageWindow.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"]]; MessageWindow.Blink[] }; assembly.scalars _ [radius, radius, radius]; }; SVViewerUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.DrawSceneInternal[parent, clientData, mouseButton, shift, control]; }; -- end of AddSphere AddBlock: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; errorStream: IO.STREAM; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; x, y, z: REAL; blockName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.assemblyName]; newAssembly, superAssembly, assembly: Assembly; success: BOOL; blockMO: MasterObject; moFound: BOOL; blockRec: BlockRec; [blockMO, moFound] _ DisplayList3d.FindObjectFromName["block", scene]; IF NOT moFound THEN ERROR; blockRec _ NARROW[blockMO.mainBody]; [x, y, z] _ SVViewerTools.GetThreeReals[editToolData.blockSection.xyz]; x _ x/blockRec.x; y _ y/blockRec.y; z _ z/blockRec.z; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetSuper[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----] _ DisplayList3d.CreatePrimitiveAssembly[blockName, "block", [x, y, z], scene]; DisplayList3d.AddSubassemblyToAssembly[newAssembly, superAssembly, scene, Matrix3d.Identity[] ! NameAlreadyPresent => { MessageWindow.Append["This block name is already registered. Try another.",TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}; DisplayList3d.AttemptToAddSubassemblyToPrimitive => { MessageWindow.Append["Attempt To Add Subassembly To Primitive", TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}]; IF NOT addSucceeds THEN RETURN; } ELSE { -- mouseButton = blue mo, oldMo: MasterObject; [assembly, success] _ SVEditUser.GetAssembly[editToolData.sceneSection.assemblyName, scene]; IF NOT success THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["block", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.object, MasterObject] THEN { errorStream _ IO.CreateOutputStreamToRope[]; errorStream.PutF["Can't add block to a cluster assembly [%g]",[rope[assembly.name]]]; errorRope _ IO.GetOutputStreamRope[errorStream]; MessageWindow.Append[errorRope, TRUE]; MessageWindow.Blink[]; RETURN}; oldMo _ NARROW[assembly.object]; assembly.object _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { MessageWindow.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"]]; MessageWindow.Blink[] }; assembly.scalars _ [x, y, z]; }; SVViewerUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.DrawSceneInternal[parent, clientData, mouseButton, shift, control]; }; -- end of AddBlock AddCyl: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; errorStream: IO.STREAM; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; cylName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.assemblyName]; radius: REAL _ SVViewerTools.GetReal[editToolData.cylinderSection.radius, 200]; height: REAL _ SVViewerTools.GetReal[editToolData.cylinderSection.height, 300]; newAssembly, superAssembly, assembly: Assembly; success: BOOL; cylMO: MasterObject; moFound: BOOL; cylinderRec: CylinderRec; [cylMO, moFound] _ DisplayList3d.FindObjectFromName["cylinder", scene]; IF NOT moFound THEN ERROR; cylinderRec _ NARROW[cylMO.mainBody]; radius _ radius/cylinderRec.radius; height _ height/cylinderRec.height; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetSuper[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----] _ DisplayList3d.CreatePrimitiveAssembly[cylName, "cylinder", [radius, height, radius], scene]; DisplayList3d.AddSubassemblyToAssembly[newAssembly, superAssembly, scene, Matrix3d.Identity[] ! NameAlreadyPresent => { MessageWindow.Append["This cyl name is already registered. Try another.",TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}; DisplayList3d.AttemptToAddSubassemblyToPrimitive => { MessageWindow.Append["Attempt To Add Subassembly To Primitive", TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}]; IF NOT addSucceeds THEN RETURN; } ELSE { -- mouseButton = blue mo, oldMo: MasterObject; [assembly, success] _ SVEditUser.GetAssembly[editToolData.sceneSection.assemblyName, scene]; IF NOT success THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["cylinder", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.object, MasterObject] THEN { errorStream _ IO.CreateOutputStreamToRope[]; errorStream.PutF["Can't add cylinder to a cluster assembly [%g]",[rope[assembly.name]]]; errorRope _ IO.GetOutputStreamRope[errorStream]; MessageWindow.Append[errorRope, TRUE]; MessageWindow.Blink[]; RETURN}; oldMo _ NARROW[assembly.object]; assembly.object _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { MessageWindow.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"]]; MessageWindow.Blink[] }; assembly.scalars _ [radius, height, radius]; }; SVViewerUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.DrawSceneInternal[parent, clientData, mouseButton, shift, control]; }; -- end of AddCyl AddCone: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; errorStream: IO.STREAM; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; coneName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.assemblyName]; radius: REAL _ SVViewerTools.GetReal[editToolData.coneSection.radius, 200]; height: REAL _ SVViewerTools.GetReal[editToolData.coneSection.height, 300]; newAssembly, superAssembly, assembly: Assembly; success: BOOL; coneMO: MasterObject; moFound: BOOL; coneRec: ConeRec; [coneMO, moFound] _ DisplayList3d.FindObjectFromName["cone", scene]; IF NOT moFound THEN ERROR; coneRec _ NARROW[coneMO.mainBody]; radius _ radius/coneRec.radius; height _ height/coneRec.height; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetSuper[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----] _ DisplayList3d.CreatePrimitiveAssembly[coneName, "cone", [radius, height, radius], scene]; DisplayList3d.AddSubassemblyToAssembly[newAssembly, superAssembly, scene, Matrix3d.Identity[] ! NameAlreadyPresent => { MessageWindow.Append["This cone name is already registered. Try another.",TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}; DisplayList3d.AttemptToAddSubassemblyToPrimitive => { MessageWindow.Append["Attempt To Add Subassembly To Primitive", TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}]; IF NOT addSucceeds THEN RETURN; } ELSE { -- mouseButton = blue mo, oldMo: MasterObject; [assembly, success] _ SVEditUser.GetAssembly[editToolData.sceneSection.assemblyName, scene]; IF NOT success THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["cone", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.object, MasterObject] THEN { errorStream _ IO.CreateOutputStreamToRope[]; errorStream.PutF["Can't add cone to a cluster assembly [%g]",[rope[assembly.name]]]; errorRope _ IO.GetOutputStreamRope[errorStream]; MessageWindow.Append[errorRope, TRUE]; MessageWindow.Blink[]; RETURN}; oldMo _ NARROW[assembly.object]; assembly.object _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { MessageWindow.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"]]; MessageWindow.Blink[] }; assembly.scalars _ [radius, height, radius]; }; SVViewerUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.DrawSceneInternal[parent, clientData, mouseButton, shift, control]; }; -- end of AddCone AddTorus: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; errorStream: IO.STREAM; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; torusName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.assemblyName]; mo, oldMo: MasterObject; newAssembly, superAssembly, assembly: Assembly; success: BOOL; bigRadius, sectionRadius: REAL; moFound: BOOL; bigRadius _ SVViewerTools.GetReal[editToolData.torusSection.bigRadius, 100]; sectionRadius _ SVViewerTools.GetReal[editToolData.torusSection.sectionRadius, 100]; mo _ BasicObject3d.TorusMakeMasterObject[torusName, bigRadius, sectionRadius]; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetSuper[editToolData]; IF NOT success THEN RETURN; DisplayList3d.AddMasterObjectToScene[mo, scene]; [newAssembly, moFound] _ DisplayList3d.CreatePrimitiveAssembly[torusName, torusName, [1,1,1], scene]; IF NOT moFound THEN ERROR; DisplayList3d.AddSubassemblyToAssembly[newAssembly, superAssembly, scene, Matrix3d.Identity[] ! NameAlreadyPresent => { MessageWindow.Append["This assembly name is already registered. Try another.",TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}; DisplayList3d.AttemptToAddSubassemblyToPrimitive => { MessageWindow.Append["Attempt To Add Subassembly To Primitive", TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}]; IF NOT addSucceeds THEN RETURN; } ELSE { -- mouseButton = blue [assembly, success] _ SVEditUser.GetAssembly[editToolData.sceneSection.assemblyName, scene]; IF NOT success THEN RETURN; IF NOT ISTYPE[assembly.object, MasterObject] THEN { errorStream _ IO.CreateOutputStreamToRope[]; errorStream.PutF["Can't add torus to a cluster assembly [%g]",[rope[assembly.name]]]; errorRope _ IO.GetOutputStreamRope[errorStream]; MessageWindow.Append[errorRope, TRUE]; MessageWindow.Blink[]; RETURN}; oldMo _ NARROW[assembly.object]; assembly.object _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { MessageWindow.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"]]; MessageWindow.Blink[] }; assembly.scalars _ [1,1,1]; }; SVViewerUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.DrawSceneInternal[parent, clientData, mouseButton, shift, control]; }; -- end of AddTorus AddRevo: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scratchpad: Viewer _ editToolData.scratchpad; linesOfLongitude: NAT _ 10; scene: Scene _ editToolData.sceneSection.currentScene; errorStream: IO.STREAM; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; revName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.assemblyName]; mo, oldMo: MasterObject; revMesh: RevoluteMesh; path: Path; newAssembly, superAssembly, assembly: Assembly; success: BOOL; path _ Scratchpad2d.GetPath[scratchpad]; IF path.len = 0 THEN { MessageWindow.Append["There is no 2d shape in the scratchpad", TRUE]; MessageWindow.Blink[]; RETURN}; revMesh _ SweepGeometry.RevoluteSweep[path, linesOfLongitude]; mo _ BasicObject3d.RevoSweepMakeMasterObject[revName, revMesh]; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetSuper[editToolData]; IF NOT success THEN RETURN; DisplayList3d.AddMasterObjectToScene[mo, scene]; [newAssembly, ----] _ DisplayList3d.CreatePrimitiveAssembly[revName, revName, [1,1,1], scene]; DisplayList3d.AddSubassemblyToAssembly[newAssembly, superAssembly, scene, Matrix3d.Identity[] ! NameAlreadyPresent => { MessageWindow.Append["This revo name is already registered. Try another.",TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}; DisplayList3d.AttemptToAddSubassemblyToPrimitive => { MessageWindow.Append["Attempt To Add Subassembly To Primitive", TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}]; IF NOT addSucceeds THEN RETURN; } ELSE { -- mouseButton = blue [assembly, success] _ SVEditUser.GetAssembly[editToolData.sceneSection.assemblyName, scene]; IF NOT success THEN RETURN; IF NOT ISTYPE[assembly.object, MasterObject] THEN { errorStream _ IO.CreateOutputStreamToRope[]; errorStream.PutF["Can't add revolute sweep to a cluster assembly [%g]",[rope[assembly.name]]]; errorRope _ IO.GetOutputStreamRope[errorStream]; MessageWindow.Append[errorRope, TRUE]; MessageWindow.Blink[]; RETURN}; mo.name _ DisplayList3d.UniqueNameFrom[mo.name, scene]; DisplayList3d.AddMasterObjectToScene[mo, scene]; oldMo _ NARROW[assembly.object]; assembly.object _ mo; success _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT success THEN { MessageWindow.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"]]; MessageWindow.Blink[] }; }; SVViewerUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.DrawSceneInternal[parent, clientData, mouseButton, shift, control]; }; -- end of AddRevolute AddLinear: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scratchpad: Viewer _ editToolData.scratchpad; scene: Scene _ editToolData.sceneSection.currentScene; errorStream: IO.STREAM; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; frontDepth, backDepth: REAL; lengthRope: Rope.ROPE; mo, oldMo: MasterObject; linMesh: LinearMesh; path: Path; poly: Polygon; newAssembly, superAssembly, assembly: Assembly; success: BOOL; linName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.assemblyName]; lengthRope _ ViewerTools.GetContents[editToolData.linSection.depth]; frontDepth _ SVViewerTools.GetReal[editToolData.linSection.depth, 100]/2.0; backDepth _ -frontDepth; path _ Scratchpad2d.GetPath[scratchpad]; poly _ SVPolygon2d.PathToPolygon[path]; linMesh _ SweepGeometry.LinearSweep[poly, frontDepth, backDepth]; mo _ BasicObject3d.LinSweepMakeMasterObject[linName, linMesh]; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetSuper[editToolData]; IF NOT success THEN RETURN; DisplayList3d.AddMasterObjectToScene[mo, scene]; [newAssembly, ----] _ DisplayList3d.CreatePrimitiveAssembly[linName, linName, [1,1,1], scene]; DisplayList3d.AddSubassemblyToAssembly[newAssembly, superAssembly, scene, Matrix3d.Identity[] ! NameAlreadyPresent => {MessageWindow.Append["This linear sweep name is already registered. Try another.",TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}; DisplayList3d.AttemptToAddSubassemblyToPrimitive => { MessageWindow.Append["Attempt To Add Subassembly To Primitive", TRUE]; MessageWindow.Blink[]; addSucceeds _ FALSE; CONTINUE}]; IF NOT addSucceeds THEN RETURN; } ELSE { -- mouseButton = blue [assembly, success] _ SVEditUser.GetAssembly[editToolData.sceneSection.assemblyName, scene]; IF NOT success THEN RETURN; IF NOT ISTYPE[assembly.object, MasterObject] THEN { errorStream _ IO.CreateOutputStreamToRope[]; errorStream.PutF["Can't add linear sweep to a cluster assembly [%g]",[rope[assembly.name]]]; errorRope _ IO.GetOutputStreamRope[errorStream]; MessageWindow.Append[errorRope, TRUE]; MessageWindow.Blink[]; RETURN}; mo.name _ DisplayList3d.UniqueNameFrom[mo.name, scene]; DisplayList3d.AddMasterObjectToScene[mo, scene]; oldMo _ NARROW[assembly.object]; assembly.object _ mo; success _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT success THEN { MessageWindow.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"]]; MessageWindow.Blink[] }; }; SVViewerUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.DrawSceneInternal[parent, clientData, mouseButton, shift, control]; }; -- end of AddLinear Copy: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; wrt, assembly, assemblyCopy: Assembly; prefix: Rope.ROPE _ ViewerTools.GetContents[editToolData.copySection.prefix]; found, success: BOOL; [assembly, found] _ SVEditUser.GetAssembly[editToolData.copySection.assemblyName, scene]; IF NOT found THEN RETURN; [wrt, found] _ SVEditUser.GetAssembly[editToolData.sceneSection.wrt, scene]; IF NOT found THEN RETURN; success _ TRUE; assemblyCopy _ DisplayList3d.CopyAssemblyAndSons[assembly, scene, prefix !DisplayList3d.NameAlreadyPresent => {success _ FALSE; CONTINUE}]; IF NOT success THEN { MessageWindow.Append["Some name in assembly is already present"]; MessageWindow.Blink[]; RETURN; }; assemblyCopy.coordSys.mat _ assembly.coordSys.mat; SVDisplayListFiling.AddSubassemblyToAssemblyWithCS[assemblyCopy, wrt, scene, assemblyCopy.coordSys]; SVViewerUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.DrawSceneInternal[parent, clientData, mouseButton, shift, control]; }; -- end of Copy Rename: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; assembly: Assembly; found: BOOL; newName: Rope.ROPE _ ViewerTools.GetContents[editToolData.renameSection.newName]; [assembly, found] _ SVEditUser.GetAssembly[editToolData.sceneSection.assemblyName, scene]; IF NOT found THEN RETURN; DisplayList3d.RenameAssembly[assembly, newName, scene]; ViewerTools.SetContents[editToolData.sceneSection.assemblyName, assembly.name]; SVViewerUser.SceneNewVersion[editToolData.currentViewerToolData]; }; Move: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; assembly, wrt: Assembly; found, wrtIsPrimitive: BOOL; [assembly, found] _ SVEditUser.GetAssembly[editToolData.sceneSection.assemblyName, scene]; IF NOT found THEN RETURN; [wrt, found] _ SVEditUser.GetAssembly[editToolData.sceneSection.wrt, scene]; IF NOT found THEN RETURN; wrtIsPrimitive _ FALSE; DisplayList3d.MoveSubassembly[assembly, wrt, scene !DisplayList3d.AttemptToAddSubassemblyToPrimitive => {wrtIsPrimitive _ TRUE; CONTINUE}]; IF wrtIsPrimitive THEN { MessageWindow.Append["Can't move assembly to a primitive", TRUE]; MessageWindow.Blink[]; }; SVViewerUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.DrawSceneInternal[parent, clientData, mouseButton, shift, control]; }; END. ‚File: SVEditUserImplB.mesa Author: Eric Bier in October 1982 Last edited by Bier on August 15, 1983 11:46 am Contents: All of the procedures called by SVEditTool when menus and buttons are pressed Basic Shapes If mouseButton = red or yellow, then make sure this assembly name is unique and add a new sphere by this name. if mouseButton = blue, then find the old assembly by this name. Make sure it is a primitive assembly. Let it refer to halfSpace as its master object and use the new scalar values. We need to know the size of the master object in order to know what scalars to use to achieve a sphere of the size requested by the user. If mouseButton = red or yellow, then make sure this assembly name is unique and add a new sphere by this name. if mouseButton = blue, then find the old assembly by this name. Make sure it is a primitive assembly. Let it refer to sphere as its master object and use the new scalar values. We need to know the size of the master object in order to know what scalars to use to achieve a sphere of the size requested by the user. We need to know the size of the master object in order to know what scalars to use to achieve a block of the size requested by the user. We need to know the size of the master object in order to know what scalars to use to achieve a cylinder of the size requested by the user. We need to know the size of the master object in order to know what scalars to use to achieve a cylinder of the size requested by the user. Create a new torus master object. Create a new revolute master object. Leave assembly.scalars as they were; Create a new linear master object Leave assembly.scalars alone Κ<– "cedar" style˜Iheadšœ™Iprocšœ!™!Lšœ/™/LšœW™WL˜šΟk ˜ Lšœ˜Lšœ˜Lšœ˜Lšœ˜Lšœ ˜ Lšœ˜Lšœ˜Lšœ˜Lšœ ˜ Lšœ˜Lšœ ˜ L˜ Lšœ ˜ Lšœ˜Lšœ ˜ Lšœ˜Lšœ˜Lšœ ˜ —L˜šœœ˜Lšœœ”˜ΌLšœ ˜—L˜Lš˜˜Lšœ œ˜(Lšœœ˜0Lšœœ#˜:Lšœœ˜"Lšœœ˜-Lšœ œ˜.Lšœ œ˜,Lšœœ˜0Lšœ œ˜'Lšœ œ˜&Lšœœ$˜>Lšœ œ˜!Lšœ œ˜$Lšœœ˜0Lšœœ˜Lšœœ˜"Lšœœ˜$Lšœ œœ˜%Lšœœ˜/Lšœœ˜3Lšœœ"˜9L˜Lšœ ™ L˜Lšœœœ˜)Lšœœ!˜6Lšœ œœ˜#Lšœœ˜0L˜Lšœ œœ ˜!Lšœ œ˜.L˜Lšœ œœ˜'Lšœœ ˜4L˜Lšœ œœ ˜Lšœ œ˜,L˜Lšœ œœ ˜!Lšœ œ˜.—˜šΟn œœœ œœœœ,œœ˜|Lšœ₯™₯Lšœœ ˜0Lšœ6˜6Lšœ œœ˜Lšœœ˜Lšœ œœ˜LšœœC˜[Lšœ/˜/Lšœ œ˜L˜Lšœ˜Lšœ œ˜Lšœ˜L˜LšœN˜NLšœœ œœ˜Lšœœ˜,L˜Lšœ‰™‰L˜šœœœ˜3Lšœ=˜=Lšœœ œœ˜LšœΟcœ˜LšœT˜Tšœ]˜]šœ'˜'LšœPœ˜VLšœ˜Lšœœœ˜——šœ5˜5Lšœ@œ˜FLšœ˜Lšœœœ˜ —Lšœœ œœ˜Lšœ˜—šœŸ˜Lšœ˜Lšœ\˜\Lšœœ œœ˜LšœE˜ELšœœ œœ˜šœœœ œ˜3Lšœœ˜,Lšœ`˜`Lšœ œ"˜0Lšœ œ˜&Lšœ˜Lšœ˜—Lšœœ˜ Lšœ˜LšœA˜Ašœœ œ˜Lšœn˜nLšœ˜—Lšœ˜Lšœ˜—LšœA˜ALšœN˜NLšœŸ˜—˜L˜—šž œœœ œœœœ,œœ˜yLšœ’™’Lšœœ ˜0Lšœ6˜6Lšœ œœ˜Lšœœ˜Lšœ œœ˜LšœœC˜XLšœœA˜MLšœ/˜/Lšœ œ˜L˜Lšœ˜Lšœ œ˜Lšœ˜Lšœ œ˜L˜LšœH˜HLšœœ œœ˜Lšœ œ˜&Lšœ˜Lšœ˜L˜Lšœ‰™‰L˜šœœœ˜3Lšœ=˜=Lšœœ œœ˜LšœŸœ˜Lšœ]˜]šœ]˜]šœ'˜'LšœMœ˜SLšœ˜Lšœœœ˜——šœ5˜5Lšœ@œ˜FLšœ˜Lšœœœ˜ —Lšœœ œœ˜Lšœ˜—šœŸ˜Lšœ˜Lšœ\˜\Lšœœ œœ˜LšœB˜BLšœœ œœ˜šœœœ œ˜3Lšœœ˜,LšœV˜VLšœ œ"˜0Lšœ œ˜&Lšœ˜Lšœ˜—Lšœœ˜ Lšœ˜LšœA˜Ašœœ œ˜Lšœn˜nLšœ˜—Lšœ,˜,Lšœ˜—LšœA˜ALšœN˜NLšœŸ˜—L˜šžœœœ œœœœ,œœ˜xLšœœ ˜0Lšœ6˜6Lšœ œœ˜Lšœœ˜Lšœ œœ˜Lšœ œ˜LšœœC˜WLšœ/˜/Lšœ œ˜L˜Lšœ˜Lšœ œ˜Lšœ˜LšœF˜FLšœœ œœ˜Lšœ œ˜$Lšœˆ™ˆL˜LšœG˜GLšœ7˜7L˜šœœœ˜3Lšœ=˜=Lšœœ œœ˜LšœŸœP˜bšœ]˜]šœ˜LšœLœ)œœ˜Š——šœ5˜5Lšœ@œ˜FLšœ˜Lšœœœ˜ —Lšœœ œœ˜Lšœ˜—šœŸ˜Lšœ˜Lšœ˜LšœF˜FLšœœ œœ˜LšœA˜ALšœœ œœ˜šœœœ œ˜3Lšœœ˜,LšœU˜ULšœ œ"˜0Lšœ œ˜&Lšœ˜Lšœ˜—Lšœœ˜ Lšœ˜LšœA˜Ašœœ œ˜Lšœn˜nLšœ˜—Lšœ˜Lšœ˜—LšœA˜ALšœN˜NLšœŸ˜—L˜šžœœœ œœœœ,œœ˜vLšœœ ˜0Lšœ6˜6Lšœ œœ˜Lšœœ˜Lšœ œœ˜LšœœC˜ULšœœC˜OLšœœC˜OLšœ/˜/Lšœ œ˜L˜Lšœ˜Lšœ œ˜Lšœ˜LšœG˜GLšœœ œœ˜Lšœœ˜%Lšœ‹™‹L˜LšœH˜HL˜šœœœ˜3Lšœ=˜=Lšœœ œœ˜LšœŸœ˜Lšœ\˜\šœ]˜]šœ˜LšœJœ˜PLšœ%œœ˜6——šœ5˜5Lšœ@œ˜FLšœ˜Lšœœœ˜ —Lšœœ œœ˜Lšœ˜—šœŸ˜Lšœ˜Lšœ˜LšœF˜FLšœœ œœ˜LšœD˜DLšœœ œœ˜šœœœ œ˜3Lšœœ˜,LšœX˜XLšœ œ"˜0Lšœ œ˜&Lšœ˜Lšœ˜—Lšœœ˜ Lšœ˜LšœA˜Ašœœ œ˜Lšœn˜nLšœ˜—Lšœ,˜,Lšœ˜—L˜LšœA˜ALšœN˜NLšœŸ˜—L˜šžœœœ œœœœ,œœ˜wLšœœ ˜0Lšœ6˜6Lšœ œœ˜Lšœœ˜Lšœ œœ˜LšœœC˜VLšœœ?˜KLšœœ?˜KLšœ/˜/Lšœ œ˜L˜Lšœ˜Lšœ œ˜Lšœ˜LšœD˜DLšœœ œœ˜Lšœ œ˜"Lšœ‹™‹L˜Lšœ@˜@L˜šœœœ˜3Lšœ=˜=Lšœœ œœ˜LšœŸœ˜LšœY˜Yšœ]˜]šœ˜LšœKœ˜QLšœ%œœ˜6——Lšœ5˜5Lšœ@œ˜FLšœ˜Lšœœœ˜ Lšœœ œœ˜Lšœ˜—šœŸ˜Lšœ˜Lšœ˜LšœF˜FLšœœ œœ˜Lšœ@˜@Lšœœ œœ˜šœœœ œ˜3Lšœœ˜,LšœT˜TLšœ œ"˜0Lšœ œ˜&Lšœ˜Lšœ˜—Lšœœ˜ Lšœ˜LšœA˜Ašœœ œ˜Lšœn˜nLšœ˜—Lšœ,˜,Lšœ˜—L˜LšœA˜ALšœN˜NLšœŸ˜—L˜Lšžœœœ œœœœ˜Všœœœ˜!Lšœœ ˜0Lšœ6˜6Lšœ œœ˜Lšœœ˜Lšœ œœ˜LšœœC˜WLšœ˜Lšœ/˜/Lšœ œ˜Lšœœ˜Lšœ œ˜L˜LšœL˜LLšœT˜TLšœ!™!LšœN˜NL˜šœœœ˜3Lšœ=˜=Lšœœ œœ˜Lšœ0˜0Lšœ˜LšœL˜LLšœœ œœ˜šœ]˜]šœ˜LšœOœ˜ULšœ%œœ˜6——Lšœ5˜5Lšœ@œ˜FLšœ˜Lšœœœ˜ Lšœœ œœ˜Lšœ˜—šœŸ˜Lšœ˜LšœF˜FLšœœ œœ˜šœœœ œ˜3Lšœœ˜,LšœU˜ULšœ œ"˜0Lšœ œ˜&Lšœ˜Lšœ˜—Lšœœ˜ Lšœ˜LšœA˜Ašœœ œ˜Lšœn˜nLšœ˜—Lšœ˜Lšœ˜—L˜LšœA˜ALšœN˜NLšœŸ˜—L˜šžœœœ œœœœ,œœ˜wLšœœ ˜0Lšœ-˜-Lšœœ˜Lšœ6˜6Lšœ œœ˜Lšœœ˜Lšœ œœ˜LšœœC˜ULšœ˜Lšœ˜Lšœ ˜ Lšœ/˜/Lšœ œ˜L˜Lšœ$™$Lšœ(˜(šœœ˜Lšœ?œ˜ELšœ˜Lšœ˜—Lšœ>˜>Lšœ?˜?L˜šœœœ˜3Lšœ=˜=Lšœœ œœ˜Lšœ0˜0LšœŸœ˜LšœH˜Hšœ]˜]šœ˜LšœKœ˜QLšœ%œœ˜6——Lšœ5˜5Lšœ@œ˜FLšœ˜Lšœœœ˜ Lšœœ œœ˜Lšœ˜—šœŸ˜Lšœ˜LšœF˜FLšœœ œœ˜šœœœ œ˜3Lšœœ˜,Lšœ^˜^Lšœ œ"˜0Lšœ œ˜&Lšœ˜Lšœ˜—Lšœ7˜7Lšœ0˜0Lšœœ˜ Lšœ˜LšœA˜Ašœœ œ˜Lšœn˜nLšœ˜—Lšœ$™$Lšœ˜—L˜LšœA˜ALšœN˜NLšœŸ˜—L˜L˜šž œœœ œœœœ,œœ˜yLšœœ ˜0Lšœ-˜-Lšœ6˜6Lšœ œœ˜Lšœœ˜Lšœ œœ˜Lšœœ˜Lšœœ˜Lšœ˜Lšœ˜Lšœ ˜ Lšœ˜Lšœ/˜/Lšœ œ˜LšœœC˜UL˜LšœD˜DLšœK˜KLšœ˜L˜Lšœ!™!Lšœ(˜(Lšœ'˜'LšœA˜ALšœ>˜>L˜šœœœ˜3Lšœ=˜=Lšœœ œœ˜Lšœ0˜0LšœŸœ˜LšœH˜Hšœ]˜]Lšœlœ˜rLšœ%œœ˜6—šœ5˜5Lšœ@œ˜FLšœ˜Lšœœœ˜ —Lšœœ œœ˜Lšœ˜—šœŸ˜Lšœ˜LšœF˜FLšœœ œœ˜šœœœ œ˜3Lšœœ˜,Lšœ\˜\Lšœ œ"˜0Lšœ œ˜&Lšœ˜Lšœ˜—Lšœ7˜7Lšœ0˜0Lšœœ˜ Lšœ˜LšœA˜Ašœœ œ˜Lšœn˜nLšœ˜—Lšœ™Lšœ˜—L˜LšœA˜ALšœN˜NLšœŸ˜—L˜L˜šžœœœ œœœœ,œœ˜tLšœœ ˜0Lšœ6˜6Lšœ&˜&Lšœ œ<˜MLšœœ˜Lšœ˜LšœE˜ELšœœœœ˜LšœL˜LLšœœœœ˜Lšœ œ˜šœH˜HLšœ0œœ˜B—šœœ œ˜LšœA˜ALšœ˜Lšœ˜Lšœ˜—Lšœ2˜2Lšœ@˜@Lšœ%˜%LšœA˜ALšœN˜NLšœŸ˜—L˜Lšžœœœ œœœœ˜Tšœœœ˜!Lšœœ ˜0Lšœ6˜6Lšœ˜Lšœœ˜ Lšœœ?˜QLšœ˜LšœF˜FLšœœœœ˜Lšœ7˜7LšœO˜OLšœA˜ALšœ˜—L˜Lšžœœœ œœœœ˜Ršœœœ˜!Lšœœ ˜0Lšœ6˜6Lšœ˜Lšœœ˜LšœZ˜ZLšœœœœ˜LšœL˜LLšœœœœ˜Lšœœ˜šœ2˜2šœ4˜4Lšœœœ˜#——šœœ˜Lšœ;œ˜ALšœ˜Lšœ˜—LšœA˜ALšœN˜NLšœ˜——L˜L˜Lšœ˜L˜L˜—…—d „ή