-- File: SVEditUserImplB.mesa -- Last edited by Bier on March 22, 1983 2:24 pm -- Author: Eric Bier in October 1982 -- Contents: All of the procedures called by SVEditTool when menus and buttons are pressed DIRECTORY BasicObject3d, DisplayList3d, GraphicsColor, IO, Matrix3d, Menus, MessageWindow, Rope, Scratchpad2d, SVDisplayListFiling, SVEditUser, 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; -- Basic Shapes 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; AddSphere: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { -- 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. 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; -- 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 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]; -- 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 [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]; -- 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 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]; -- 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 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]; -- create a new torus master object 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; -- create a new linear master object 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[] }; -- leave assembly.scalars as they were; }; 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; -- create a new linear master object 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[] }; -- leave assembly.scalars alone }; 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.