-- 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. Κ 7– "Mesa" style˜IprocšθΟcΟœΟk œ2žœΜžœžœžœžœ–žœžœ žœ)žœ2žœ+žœ&žœ)žœ*žœ+žœ+žœ%žœ*žœ.žœžœ&žœ%žœžœ žœ%žœžœžœ-žœ3žœ$œ žœžœžœ+žœžœžœ-žœžœ!žœ,žœžœžœ(žœžœžœΟn œžœžœ žœžœžœžœ,žœžœ¦œžœTžœžœžœžœžœžœMžœ}žœ'žœ$žœOžœžœ žœžœžœRœžœžœžœEžœžœ žœžœœΏžœ.žœžœ~žœ.žœžœžœžœ žœžœžœœ|žœžœ žœžœIžœžœ žœžœžœžœžœ žœžœ†žœFžœ žœ žœqžœžœ žœΧœŸœžœžœ žœžœžœžœ,žœžœ!žœTžœžœžœžœžœ žœžœžœ&žœ`žœžœ žœžœžœ‹œˆžœžœžœEžœžœ žœžœœ˜žœ)žœžœ~žœ.žœžœžœžœ žœžœžœœžœžœ žœžœHžœžœ žœžœžœžœžœ žœžœ…žœFžœ žœ žœqžœžœ žœΘœŸœžœžœ žœžœžœžœ,žœžœ!žœTžœžœžœžœžœžœMžœMžœžœ$žœgžœžœ žœžœžœŽœNžœžœžœEžœžœ žœžœœ©žœ)žœžœ~žœ.žœžœžœžœ žœžœžœœžœžœ žœžœKžœžœ žœžœžœžœžœ žœžœˆžœFžœ žœ žœqžœžœ žœΪœŸœžœžœ žœžœžœžœ,žœžœ!žœTžœžœžœžœžœžœMžœIžœ{žœ%žœ\žœžœ žœžœ žœŽœFžœžœžœEžœžœ žœžœœ§žœ)žœžœ~žœ.žœžœžœžœ žœžœžœœ€žœžœ žœžœGžœžœ žœžœžœžœžœ žœžœ„žœFžœ žœ žœqžœžœ žœΩœŸœžœžœ žœžœžœžœ.žœžœ!žœTžœžœžœžœžœžœ™žœžœ žœͺ$œSžœžœžœEžœžœ žœžœ’žœžœ žœžœΝžœ)žœžœ~žœ.žœžœžœžœ žœžœžœœdžœžœ žœžœžœžœžœ žœžœ…žœFžœ žœ žœqžœžœ žœΗœŸœžœžœ žœžœžœžœ,žœžœ!žœPžœMžœžœžœžœžœžœΎžœ%œ-žœžœEžœ žœ‰žœžœžœEžœžœ žœžœEœ—žœ)žœžœ~žœ.žœžœžœžœ žœžœžœœdžœžœ žœžœžœžœžœ žœžœŽžœFžœ žœzžœqžœžœ žœŽ(œŸœŸ œžœžœ žœžœžœžœ,žœžœ!žœƒžœžœžœžœžœžœžœŠžœžœφ%œέžœžœžœEžœžœ žœžœEœžžœ)žœžœ~žœ.žœžœžœžœ žœžœžœœdžœžœ žœžœžœžœžœ žœžœŒžœFžœ žœzžœqžœžœ žœŽ œœŸœžœžœ žœžœžœžœ,žœžœ!žœ|žœNžœažœžœžœžœQžœžœžœžœ žœ~žœžœžœžœ žœbžœΛœŸœžœžœ žœžœžœžœ.žœžœ"žœfžœžœ’žœžœžœžœΫŸœžœžœ žœžœžœžœ.žœžœ!žœxžœbžœžœžœžœSžœžœžœžœžœ‚žœžœžœžœ@žœΎžœ˜ΖΔ—…—bHk