DIRECTORY BasicObject3d, CoordSys, DisplayList3d, GraphicsColor, IO, Matrix3d, Menus, Rope, Scratchpad2d, SV2d, SV3d, SVEditUser, SVError, SVHalfSpaces, SVInterfaceTypes, SVModelTypes, SVSceneTypes, SVSelections, SVPolygon2d, SVViewerTools, SVViewerUser, SweepGeometry, ViewerClasses, ViewerTools; SVEditUserImplB: CEDAR PROGRAM IMPORTS BasicObject3d, CoordSys, DisplayList3d, IO, Matrix3d, Rope, SweepGeometry, Scratchpad2d, SVEditUser, SVError, SVPolygon2d, SVSelections, SVViewerTools, SVViewerUser, ViewerTools EXPORTS SVEditUser = BEGIN Assembly: TYPE = SVSceneTypes.Assembly; AssemblyList: TYPE = SVSceneTypes.AssemblyList; AssemblyGenerator: TYPE = DisplayList3d.AssemblyGenerator; Color: TYPE = GraphicsColor.Color; EditToolData: TYPE = SVInterfaceTypes.EditToolData; LightSource: TYPE = SVModelTypes.LightSource; LinearMesh: TYPE = SweepGeometry.LinearMesh; MasterObject: TYPE = SVSceneTypes.MasterObject; Matrix4by4: TYPE = SV3d.Matrix4by4; MouseButton: TYPE = Menus.MouseButton; NameAlreadyPresent: SIGNAL = DisplayList3d.NameAlreadyPresent; Point3d: TYPE = SV3d.Point3d; Polygon: TYPE = SV2d.Polygon; RevoluteMesh: TYPE = SweepGeometry.RevoluteMesh; Path: TYPE = SV2d.Path; Scene: TYPE = SVSceneTypes.Scene; SelectionGenerator: TYPE = SVInterfaceTypes.SelectionGenerator; Shape: TYPE = SVSceneTypes.Shape; Viewer: TYPE = ViewerClasses.Viewer; ViewerCell: TYPE = SVInterfaceTypes.ViewerCell; ViewerToolData: TYPE = SVInterfaceTypes.ViewerToolData; HalfSpaceRec: TYPE = SVHalfSpaces.HalfSpaceRec; SphereRec: TYPE = BasicObject3d.SphereRec; BlockRec: TYPE = BasicObject3d.BlockRec; CylinderRec: TYPE = BasicObject3d.CylinderRec; ConeRec: TYPE = BasicObject3d.ConeRec; TorusRec: TYPE = BasicObject3d.TorusRec; AddHalfSpace: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; halfSpaceName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.new]; 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.GetParent[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----, addSucceeds] _ DisplayList3d.CreateAndAddPrimitiveAssembly[halfSpaceName, "halfSpace", [1, 1, 1], scene, superAssembly, Matrix3d.Identity[]]; IF NOT addSucceeds THEN RETURN; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssembly, editToolData, scene, newAssembly]; } ELSE {-- mouseButton = blue mo, oldMo: MasterObject; shape: Shape; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["halfSpace", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.shape, Shape] THEN { errorRope _ IO.PutFR["Can't replace cluster assembly [%g] with a halfSpace.",[rope[assembly.name]]]; SVError.Append[errorRope, TRUE, TRUE]; SVError.Blink[]; RETURN}; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; shape _ NARROW[assembly.shape]; oldMo _ shape.mo; shape.mo _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { SVError.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"], TRUE, TRUE]; SVError.Blink[] }; CoordSys.ResetScalars[shape.coordSys, [1, 1, 1]]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; }; }; -- end of AddHalfSpace AddSteiner: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; steinerName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.new]; newAssembly, superAssembly, assembly: Assembly; success: BOOL; steinerMO: MasterObject; moFound: BOOL; [steinerMO, moFound] _ DisplayList3d.FindObjectFromName["steiner", scene]; IF NOT moFound THEN ERROR; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetParent[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----, addSucceeds] _ DisplayList3d.CreateAndAddPrimitiveAssembly[steinerName, "steiner", [30, 30, 30], scene, superAssembly, Matrix3d.Identity[]]; IF NOT addSucceeds THEN RETURN; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssembly, editToolData, scene, newAssembly]; } ELSE {-- mouseButton = blue mo, oldMo: MasterObject; shape: Shape; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["steiner", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.shape, Shape] THEN { errorRope _ IO.PutFR["Can't replace cluster assembly [%g] with a steiner.",[rope[assembly.name]]]; SVError.Append[errorRope, TRUE, TRUE]; SVError.Blink[]; RETURN}; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; shape _ NARROW[assembly.shape]; oldMo _ shape.mo; shape.mo _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { SVError.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"], TRUE, TRUE]; SVError.Blink[] }; CoordSys.ResetScalars[shape.coordSys, [30, 30, 30]]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; }; }; -- end of AddSteiner AddExtra1: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; sphereName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.new]; newAssembly, superAssembly, assembly: Assembly; success: BOOL; sphereMO: MasterObject; moFound: BOOL; [sphereMO, moFound] _ DisplayList3d.FindObjectFromName["arnonSphere", scene]; IF NOT moFound THEN ERROR; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetParent[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----, addSucceeds] _ DisplayList3d.CreateAndAddPrimitiveAssembly[sphereName, "arnonSphere", [30, 30, 30], scene, superAssembly, Matrix3d.Identity[]]; IF NOT addSucceeds THEN RETURN; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssembly, editToolData, scene, newAssembly]; } ELSE {-- mouseButton = blue mo, oldMo: MasterObject; shape: Shape; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["arnonSphere", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.shape, Shape] THEN { errorRope _ IO.PutFR["Can't replace cluster assembly [%g] with a sphere.",[rope[assembly.name]]]; SVError.Append[errorRope, TRUE, TRUE]; SVError.Blink[]; RETURN}; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; shape _ NARROW[assembly.shape]; oldMo _ shape.mo; shape.mo _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { SVError.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"], TRUE, TRUE]; SVError.Blink[] }; CoordSys.ResetScalars[shape.coordSys, [30, 30, 30]]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; }; }; -- end of AddExtra1 AddExtra2: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; catastropheName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.new]; newAssembly, superAssembly, assembly: Assembly; success: BOOL; catastropheMO: MasterObject; moFound: BOOL; [catastropheMO, moFound] _ DisplayList3d.FindObjectFromName["catastrophe", scene]; IF NOT moFound THEN ERROR; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetParent[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----, addSucceeds] _ DisplayList3d.CreateAndAddPrimitiveAssembly[catastropheName, "catastrophe", [10, 10, 10], scene, superAssembly, Matrix3d.Identity[]]; IF NOT addSucceeds THEN RETURN; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssembly, editToolData, scene, newAssembly]; } ELSE {-- mouseButton = blue mo, oldMo: MasterObject; shape: Shape; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["catastrophe", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.shape, Shape] THEN { errorRope _ IO.PutFR["Can't replace cluster assembly [%g] with a sphere.",[rope[assembly.name]]]; SVError.Append[errorRope, TRUE, TRUE]; SVError.Blink[]; RETURN}; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; shape _ NARROW[assembly.shape]; oldMo _ shape.mo; shape.mo _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { SVError.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"], TRUE, TRUE]; SVError.Blink[] }; CoordSys.ResetScalars[shape.coordSys, [10, 10, 10]]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; }; }; -- end of AddExtra2 AddExtra3: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = {}; AddExtra4: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = {}; AddSphere: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; sphereName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.new]; 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.GetParent[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----, addSucceeds] _ DisplayList3d.CreateAndAddPrimitiveAssembly[sphereName, "sphere", [radius, radius, radius], scene, superAssembly, Matrix3d.Identity[]]; IF NOT addSucceeds THEN RETURN; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssembly, editToolData, scene, newAssembly]; } ELSE {-- mouseButton = blue mo, oldMo: MasterObject; shape: Shape; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["sphere", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.shape, Shape] THEN { errorRope _ IO.PutFR["Can't substitue a sphere for a cluster assembly [%g]",[rope[assembly.name]]]; SVError.Append[errorRope, TRUE, TRUE]; SVError.Blink[]; RETURN}; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; shape _ NARROW[assembly.shape]; oldMo _ shape.mo; shape.mo _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { SVError.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"], TRUE, TRUE]; SVError.Blink[] }; CoordSys.ResetScalars[shape.coordSys, [radius, radius, radius]]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; }; }; -- 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; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; x, y, z: REAL; blockName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.new]; 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.GetParent[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----, addSucceeds] _ DisplayList3d.CreateAndAddPrimitiveAssembly[blockName, "block", [x, y, z], scene, superAssembly, Matrix3d.Identity[]]; IF NOT addSucceeds THEN RETURN; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssembly, editToolData, scene, newAssembly]; } ELSE { -- mouseButton = blue mo, oldMo: MasterObject; shape: Shape; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["block", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.shape, Shape] THEN { errorRope _ IO.PutFR["Can't substitue a block for a cluster assembly [%g]",[rope[assembly.name]]]; SVError.Append[errorRope, TRUE, TRUE]; SVError.Blink[]; RETURN}; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; shape _ NARROW[assembly.shape]; oldMo _ shape.mo; shape.mo _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { SVError.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"], TRUE, TRUE]; SVError.Blink[] }; CoordSys.ResetScalars[shape.coordSys, [x, y, z]]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; }; }; -- 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; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; cylName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.new]; 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.GetParent[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----, addSucceeds] _ DisplayList3d.CreateAndAddPrimitiveAssembly[cylName, "cylinder", [radius, height, radius], scene, superAssembly, Matrix3d.Identity[]]; IF NOT addSucceeds THEN RETURN; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssembly, editToolData, scene, newAssembly]; } ELSE { -- mouseButton = blue mo, oldMo: MasterObject; shape: Shape; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["cylinder", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.shape, Shape] THEN { errorRope _ IO.PutFR["Can't substitute a cylinder for a cluster assembly [%g]",[rope[assembly.name]]]; SVError.Append[errorRope, TRUE, TRUE]; SVError.Blink[]; RETURN}; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; shape _ NARROW[assembly.shape]; oldMo _ shape.mo; shape.mo _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { SVError.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"], TRUE, TRUE]; SVError.Blink[] }; CoordSys.ResetScalars[shape.coordSys, [radius, height, radius]]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; }; }; -- 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; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; coneName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.new]; 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.GetParent[editToolData]; IF NOT success THEN RETURN; [newAssembly, ----, addSucceeds] _ DisplayList3d.CreateAndAddPrimitiveAssembly[coneName, "cone", [radius, height, radius], scene, superAssembly, Matrix3d.Identity[]]; IF NOT addSucceeds THEN RETURN; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssembly, editToolData, scene, newAssembly]; } ELSE { -- mouseButton = blue mo, oldMo: MasterObject; shape: Shape; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; [mo, moFound] _ DisplayList3d.FindObjectFromName["cone", scene]; IF NOT moFound THEN ERROR; IF NOT ISTYPE[assembly.shape, Shape] THEN { errorRope _ IO.PutFR["Can't substitue a cone for a cluster assembly [%g]",[rope[assembly.name]]]; SVError.Append[errorRope, TRUE]; SVError.Blink[]; RETURN}; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; shape _ NARROW[assembly.shape]; oldMo _ shape.mo; shape.mo _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { SVError.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"], TRUE, TRUE]; SVError.Blink[] }; CoordSys.ResetScalars[shape.coordSys, [radius, height, radius]]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; }; }; -- 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; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; torusName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.new]; 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.GetParent[editToolData]; IF NOT success THEN RETURN; DisplayList3d.AddMasterObjectToScene[mo, scene ! NameAlreadyPresent => { SVError.Append[Rope.Cat["Torus name ", mo.name, " is already registered. Try another."], TRUE, TRUE]; SVError.Blink[]; addSucceeds _ FALSE; CONTINUE} ]; [newAssembly, moFound, addSucceeds] _ DisplayList3d.CreateAndAddPrimitiveAssembly[torusName, torusName, [1,1,1], scene, superAssembly, Matrix3d.Identity[]]; IF NOT moFound THEN ERROR; IF NOT addSucceeds THEN RETURN; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssembly, editToolData, scene, newAssembly]; } ELSE { -- mouseButton = blue shape: Shape; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; IF NOT ISTYPE[assembly.shape, Shape] THEN { errorRope _ IO.PutFR["Can't substitute a torus for a cluster assembly (%g)",[rope[assembly.name]]]; SVError.Append[errorRope, TRUE, TRUE]; SVError.Blink[]; RETURN}; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; mo.name _ DisplayList3d.UniqueObjectNameFrom[mo.name, scene]; DisplayList3d.AddMasterObjectToScene[mo, scene]; shape _ NARROW[assembly.shape]; oldMo _ shape.mo; shape.mo _ mo; moFound _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT moFound THEN { SVError.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"], TRUE, TRUE]; SVError.Blink[] }; CoordSys.ResetScalars[shape.coordSys, [1, 1, 1]]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; }; }; -- 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; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; revName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.new]; mo, oldMo: MasterObject; revMesh: RevoluteMesh; path: Path; newAssembly, superAssembly, assembly: Assembly; success: BOOL; path _ Scratchpad2d.GetPath[scratchpad]; IF path.len = 0 THEN { SVError.Append["There is no 2d shape in the scratchpad", TRUE]; SVError.Blink[]; RETURN}; revMesh _ SweepGeometry.RevoluteSweep[path, linesOfLongitude]; mo _ BasicObject3d.RevoSweepMakeMasterObject[revName, revMesh]; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetParent[editToolData]; IF NOT success THEN RETURN; DisplayList3d.AddMasterObjectToScene[mo, scene ! NameAlreadyPresent => { SVError.Append[Rope.Cat["Revolute sweep name ", mo.name, " is already registered. Try another."], TRUE, TRUE]; SVError.Blink[]; addSucceeds _ FALSE; CONTINUE} ]; IF NOT addSucceeds THEN RETURN; [newAssembly, ----, addSucceeds] _ DisplayList3d.CreateAndAddPrimitiveAssembly[revName, revName, [1,1,1], scene, superAssembly, Matrix3d.Identity[]]; IF NOT addSucceeds THEN RETURN; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssembly, editToolData, scene, newAssembly]; } ELSE { -- mouseButton = blue OldMoWasRevo: BOOL; shape: Shape; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; IF NOT ISTYPE[assembly.shape, Shape] THEN { errorRope _ IO.PutFR["Can't substitue a revolute sweep for a cluster assembly [%g]",[rope[assembly.name]]]; SVError.Append[errorRope, TRUE, TRUE]; SVError.Blink[]; RETURN}; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; mo.name _ DisplayList3d.UniqueObjectNameFrom[mo.name, scene]; DisplayList3d.AddMasterObjectToScene[mo, scene]; shape _ NARROW[assembly.shape]; oldMo _ shape.mo; OldMoWasRevo _ Rope.Equal[oldMo.class.name, "revoluteSweep", TRUE]; shape.mo _ mo; success _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT success THEN { SVError.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"], TRUE, TRUE]; SVError.Blink[] }; IF NOT OldMoWasRevo THEN CoordSys.ResetScalars[shape.coordSys, [1, 1, 1]]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; }; }; -- 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; errorRope: Rope.ROPE; addSucceeds: BOOL _ TRUE; sweepOK: 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.new]; 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 ! SweepGeometry.TooFewPointsForShadedSweep => { SVError.Append["Too few points for a linear sweep.",TRUE,TRUE]; SVError.Blink[]; sweepOK _ FALSE; CONTINUE; }; ]; IF NOT sweepOK THEN RETURN; mo _ BasicObject3d.LinSweepMakeMasterObject[linName, linMesh]; IF mouseButton = red OR mouseButton = yellow THEN { [superAssembly, success] _ SVEditUser.GetParent[editToolData]; IF NOT success THEN RETURN; DisplayList3d.AddMasterObjectToScene[mo, scene ! NameAlreadyPresent => { SVError.Append[Rope.Cat["Linear sweep name ", mo.name, " is already registered. Try another."], TRUE, TRUE]; SVError.Blink[]; addSucceeds _ FALSE; CONTINUE} ]; IF NOT addSucceeds THEN RETURN; [newAssembly, ----, addSucceeds] _ DisplayList3d.CreateAndAddPrimitiveAssembly[linName, linName, [1,1,1], scene, superAssembly, Matrix3d.Identity[]]; IF NOT addSucceeds THEN RETURN; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssembly, editToolData, scene, newAssembly]; } ELSE { -- mouseButton = blue. Replace shape. oldMOWasLinear: BOOL; shape: Shape; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; IF NOT ISTYPE[assembly.shape, Shape] THEN { errorRope _ IO.PutFR["Can't substitute a linear sweep for a cluster assembly [%g]",[rope[assembly.name]]]; SVError.Append[errorRope, TRUE, TRUE]; SVError.Blink[]; RETURN}; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; mo.name _ DisplayList3d.UniqueObjectNameFrom[mo.name, scene]; DisplayList3d.AddMasterObjectToScene[mo, scene]; shape _ NARROW[assembly.shape]; oldMo _ shape.mo; oldMOWasLinear _ Rope.Equal[oldMo.class.name, "linearSweep", TRUE]; shape.mo _ mo; success _ DisplayList3d.DeleteMasterObjectIfUnused[oldMo, scene]; IF NOT success THEN { SVError.Append[Rope.Cat["Old master object ", oldMo.name, "mysteriously disappeared. Save your work"], TRUE, TRUE]; SVError.Blink[] }; IF NOT oldMOWasLinear THEN CoordSys.ResetScalars[shape.coordSys, [1, 1, 1]]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintAssemblyAllViewers[SVViewerUser.DrawAssemblyXOR, editToolData, scene, assembly]; }; }; -- 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; parentToBe, assembly, assemblyCopy: Assembly; found, success: BOOL; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; [parentToBe, found] _ SVEditUser.GetParent[editToolData]; IF NOT found THEN RETURN; success _ TRUE; assemblyCopy _ DisplayList3d.CopyAssemblyAndSonsUniqueNames[assembly, scene, scene, parentToBe !DisplayList3d.NameAlreadyPresent => {success _ FALSE; CONTINUE}]; IF NOT success THEN { SVError.Append["Some name in assembly is already present", TRUE, TRUE]; SVError.Blink[]; RETURN; }; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; }; -- 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; oldName: Rope.ROPE; newName: Rope.ROPE _ ViewerTools.GetContents[editToolData.sceneSection.new]; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; oldName _ assembly.name; DisplayList3d.RenameAssembly[assembly, newName, scene]; SVError.Append[Rope.Cat["Assembly ", oldName, " renamed to ", newName, "."], TRUE, TRUE]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; }; NewParent: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; parentToBe: Assembly; found, parentIsPrimitive: BOOL; g: SelectionGenerator; selectionsExist: BOOL; [g, selectionsExist] _ SVSelections.GetSelectionGenerator[movee]; SVSelections.ComplainIfNot[selectionsExist]; IF NOT selectionsExist THEN RETURN; [parentToBe, found] _ SVEditUser.GetParent[editToolData]; IF NOT found THEN RETURN; FOR assembly: Assembly _ SVSelections.NextSelectionCoincident[g], SVSelections.NextSelectionCoincident[g] UNTIL assembly = NIL DO DisplayList3d.MoveSubassembly[assembly, parentToBe, scene !DisplayList3d.AttemptToAddSubassemblyToPrimitive => {parentIsPrimitive _ TRUE; CONTINUE}]; IF parentIsPrimitive THEN GOTO PrimitiveParent; REPEAT PrimitiveParent => { SVError.Append["A primitive can't be a parent.", TRUE, TRUE]; SVError.Blink[]; }; ENDLOOP; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; }; END. ΦFile: SVEditUserImplB.mesa Created in October 1982 Copyright c 1984 by Xerox Corporation. All rights reserved. Last edited by Bier on January 11, 1985 1:56:06 pm PST 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. 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. halfSpaceRec _ NARROW[halfSpaceMO.mainBody]; The Arnon Sphere. 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. halfSpaceRec _ NARROW[halfSpaceMO.mainBody]; The Arnon Sphere. 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. halfSpaceRec _ NARROW[halfSpaceMO.mainBody]; 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. mo.name should be unique, so NameAlreadyPresent would be a surprise. If we are replacing an old revolute sweep with a new one, then leave the scalars as they are. Otherwise, set them all to unity. Create a new linear master object mo.name should be unique, so SIGNAL NameAlreadyPresent would be a surprise. Leave assembly.scalars alone if the old master object was also a linear sweep. Otherwise, set them all to unity. Since the copy is on top of the original, there is no need to redraw. Κ Z– "cedar" style˜Iheadšœ™Iprocšœ™Jšœ Οmœ1™Lšœ žœ˜Lšœ žœ˜Lšœžœ˜0Lšœžœ ˜Lšœžœ˜!Lšœ?˜?Lšœžœ˜!Lšœžœ˜$Lšœ žœ˜/Lšœžœ#˜7L˜Lšœ ™ L˜Lšœžœ˜/Lšœ žœ˜*Lšœ žœ˜(Lšœ žœ˜.Lšœ žœ˜&Lšœ žœ˜(L˜—šΟn œžœžœ žœžœžœžœ,žœžœ˜|Lšœ₯™₯Lšœžœ ˜0Lšœ6˜6Lšœžœ˜Lšœ žœžœ˜Lšœžœ5Οbœ˜RLšœ/˜/Lšœ žœ˜L˜Lšœ˜Lšœ žœ˜Lšœ˜L˜LšœN˜NLšžœžœ žœžœ˜Lšœžœ˜,L˜šžœžœžœ˜3Lšœ>˜>Lšžœžœ žœžœ˜LšœΟcœ˜"Lšœ œS˜~Lšžœžœ žœžœ˜Lšœ?˜?Lšœ`˜`Lšœ˜—šžœ‘˜Lšœ˜L˜ Lšœ-˜-Lšžœžœžœ˜LšœE˜ELšžœžœ žœžœ˜šžœžœžœžœ˜+Lšœ žœV˜dLšœžœžœ˜&Lšœ˜Lšžœ˜—Lšœ0 œ!˜`Lšœžœ˜Lšœ˜Lšœ˜LšœA˜Ašžœžœ žœ˜Lšœhžœžœ˜tLšœ˜—Lšœ1˜1Lšœ?˜?Lšœ0 œ!˜`Lšœ˜—Lšœ‘˜L˜—šŸ œžœžœ žœžœžœžœ,žœžœ˜zLšœ₯™₯Lšœžœ ˜0Lšœ6˜6Lšœžœ˜Lšœ žœžœ˜Lšœžœ5 œ˜PLšœ/˜/Lšœ žœ˜L˜Lšœ˜Lšœ žœ˜L˜LšœJ˜JLšžœžœ žœžœ˜Lšœžœ™,L˜šžœžœžœ˜3Lšœ>˜>Lšžœžœ žœžœ˜Lšœ‘œ˜"Lšœ œR˜}Lšžœžœ žœžœ˜Lšœ?˜?Lšœ`˜`Lšœ˜—šžœ‘˜Lšœ˜L˜ Lšœ-˜-Lšžœžœžœ˜LšœC˜CLšžœžœ žœžœ˜šžœžœžœžœ˜+Lšœ žœT˜bLšœžœžœ˜&Lšœ˜Lšžœ˜—Lšœ0 œ!˜`Lšœžœ˜Lšœ˜Lšœ˜LšœA˜Ašžœžœ žœ˜Lšœhžœžœ˜tLšœ˜—Lšœ4˜4Lšœ?˜?Lšœ0 œ!˜`Lšœ˜—Lšœ‘˜L˜—šŸ œžœžœ žœžœžœžœ,žœžœ˜yL™Lšœ₯™₯Lšœžœ ˜0Lšœ6˜6Lšœžœ˜Lšœ žœžœ˜Lšœžœ5 œ˜OLšœ/˜/Lšœ žœ˜L˜Lšœ˜Lšœ žœ˜L˜LšœM˜MLšžœžœ žœžœ˜Lšœžœ™,L˜šžœžœžœ˜3Lšœ>˜>Lšžœžœ žœžœ˜Lšœ‘œ˜"Lšœ œU˜€Lšžœžœ žœžœ˜Lšœ?˜?Lšœ`˜`Lšœ˜—šžœ‘˜Lšœ˜L˜ Lšœ-˜-Lšžœžœžœ˜LšœG˜GLšžœžœ žœžœ˜šžœžœžœžœ˜+Lšœ žœS˜aLšœžœžœ˜&Lšœ˜Lšžœ˜—Lšœ0 œ!˜`Lšœžœ˜Lšœ˜Lšœ˜LšœA˜Ašžœžœ žœ˜Lšœhžœžœ˜tLšœ˜—Lšœ4˜4Lšœ?˜?Lšœ0 œ!˜`Lšœ˜—Lšœ‘˜L˜—šŸ œž œ žœžœžœžœ,žœ ˜yL™Lšœ₯™₯Lšœžœ ˜0Lšœ6˜6Lšœžœ˜Lšœ žœžœ˜Lšœžœ5 œ˜TLšœ/˜/Lšœ žœ˜L˜Lšœ˜Lšœ žœ˜L˜LšœR˜RLšžœžœ žœžœ˜Lšœžœ™,L˜šžœžœžœ˜3Lšœ>˜>Lšžœžœ žœžœ˜Lšœ‘œ˜"Lšœ œZ˜…Lšžœžœ žœžœ˜Lšœ?˜?Lšœ`˜`Lšœ˜—šžœ‘˜Lšœ˜L˜ Lšœ-˜-Lšžœžœžœ˜LšœG˜GLšžœžœ žœžœ˜šžœžœžœžœ˜+Lšœ žœS˜aLšœžœžœ˜&Lšœ˜Lšžœ˜—Lšœ0 œ!˜`Lšœžœ˜Lšœ˜Lšœ˜LšœA˜Ašžœžœ žœ˜Lšœhžœžœ˜tLšœ˜—Lšœ4˜4Lšœ?˜?Lšœ0 œ!˜`Lšœ˜—Lšœ˜L˜—LšŸ œž œ žœžœžœžœ,žœ˜sLšŸ œž œ žœžœžœžœ,žœ˜sšŸ œžœžœ žœžœžœžœ,žœžœ˜yLšœ’™’Lšœžœ ˜0Lšœ6˜6Lšœžœ˜Lšœ žœžœ˜Lšœžœ5 œ˜OLšœžœA˜MLšœ/˜/Lšœ žœ˜L˜Lšœ˜Lšœ žœ˜Lšœ˜Lšœ žœ˜L˜LšœH˜HLšžœžœ žœžœ˜Lšœ žœ˜&Lšœ˜Lšœ˜L˜Lšœ‰™‰L˜šžœžœžœ˜3Lšœ>˜>Lšžœžœ žœžœ˜Lšœ‘œ˜"Lšœ œ\˜‡Lšžœžœ žœžœ˜Lšœ?˜?Lšœ`˜`Lšœ˜—šžœ‘˜Lšœ˜L˜ Jšœ-˜-Lšžœžœžœ˜LšœB˜BLšžœžœ žœžœ˜šžœžœžœžœ˜+Lšœ žœU˜cLšœžœžœ˜&Lšœ˜Lšžœ˜—Lšœ0 œ!˜`Lšœžœ˜Lšœ˜Lšœ˜LšœA˜Ašžœžœ žœ˜Lšœhžœžœ˜tLšœ˜—Lšœ@˜@Lšœ?˜?Lšœ0 œ!˜`Lšœ˜—Lšœ‘˜L˜—šŸœžœžœ žœžœžœžœ,žœžœ˜xLšœžœ ˜0Lšœ6˜6Lšœžœ˜Lšœ žœžœ˜Lšœ žœ˜Lšœžœ5 œ˜NLšœ/˜/Lšœ žœ˜L˜Lšœ˜Lšœ žœ˜Lšœ˜LšœF˜FLšžœžœ žœžœ˜Lšœ žœ˜$Lšœˆ™ˆL˜LšœG˜GLšœ7˜7L˜šžœžœžœ˜3Lšœ>˜>Lšžœžœ žœžœ˜Lšœ‘œ œK˜™Lšžœžœ žœžœ˜Lšœ?˜?Lšœ`˜`Lšœ˜—šžœ‘˜Lšœ˜L˜ Jšœ-˜-Lšžœžœžœ˜LšœA˜ALšžœžœ žœžœ˜šžœžœžœžœ˜+Lšœ žœT˜bLšœžœžœ˜&Lšœ˜Lšžœ˜—Lšœ0 œ!˜`Lšœžœ˜Lšœ˜Lšœ˜LšœA˜Ašžœžœ žœ˜Lšœhžœžœ˜tLšœ˜—Lšœ1˜1Lšœ?˜?Lšœ0 œ!˜`Lšœ˜—Lšœ‘˜L˜—šŸœžœžœ žœžœžœžœ,žœžœ˜vLšœžœ ˜0Lšœ6˜6Lšœžœ˜Lšœ žœžœ˜Lšœžœ5 œ˜LLšœžœC˜OLšœžœC˜OLšœ/˜/Lšœ žœ˜L˜Lšœ˜Lšœ žœ˜Lšœ˜LšœG˜GLšžœžœ žœžœ˜Lšœžœ˜%Lšœ‹™‹L˜LšœH˜HL˜šžœžœžœ˜3Lšœ&  œ˜>Lšžœžœ žœžœ˜Lšœ‘œ˜"Lšœ œ[˜†Lšžœžœ žœžœ˜Lšœ?˜?Lšœ`˜`Lšœ˜—šžœ‘˜Lšœ˜L˜ Jšœ-˜-Lšžœžœžœ˜LšœD˜DLšžœžœ žœžœ˜šžœžœžœžœ˜+Lšœ žœX˜fLšœžœžœ˜&Lšœ˜Lšžœ˜—Lšœ0 œ!˜`Lšœžœ˜Lšœ˜Lšœ˜LšœA˜Ašžœžœ žœ˜Lšœhžœžœ˜tLšœ˜—Lšœ@˜@Lšœ?˜?Lšœ0 œ!˜`Lšœ˜—Lšœ‘˜L˜—šŸœžœžœ žœžœžœžœ,žœžœ˜wLšœžœ ˜0Lšœ6˜6Lšœžœ˜Lšœ žœžœ˜Lšœžœ5 œ˜MLšœžœ?˜KLšœžœ?˜KLšœ/˜/Lšœ žœ˜L˜Lšœ˜Lšœ žœ˜Lšœ˜LšœD˜DLšžœžœ žœžœ˜Lšœ žœ˜"Lšœ‹™‹L˜Lšœ@˜@L˜šžœžœžœ˜3Lšœ&  œ˜>Lšžœžœ žœžœ˜Lšœ‘œ˜"Lšœ œX˜ƒLšžœžœ žœžœ˜Lšœ?˜?Lšœ`˜`Lšœ˜—šžœ‘˜Lšœ˜L˜ Jšœ-˜-Lšžœžœžœ˜Lšœ@˜@Lšžœžœ žœžœ˜šžœžœžœžœ˜+Lšœ žœS˜aLšœžœ˜ Lšœ˜Lšžœ˜—Lšœ0 œ!˜`Lšœžœ˜Lšœ˜Lšœ˜LšœA˜Ašžœžœ žœ˜Lšœhžœžœ˜tLšœ˜—Lšœ@˜@Lšœ?˜?Lšœ0 œ!˜`Lšœ˜—Lšœ‘˜L˜—LšŸœžœžœ žœžœžœžœ˜Všœžœžœ˜!Lšœžœ ˜0Lšœ6˜6Lšœžœ˜Lšœ žœžœ˜Lšœžœ5 œ˜NLšœ˜Lšœ/˜/Lšœ žœ˜Lšœžœ˜Lšœ žœ˜L˜LšœL˜LLšœT˜TLšœ!™!Lšœ œ&˜NL˜šžœžœžœ˜3Lšœ>˜>Lšžœžœ žœžœ˜šœ œ ˜.šœ˜LšœZžœžœ˜fLšœžœžœ˜/Lšœ˜——Lšœ%˜%Lšœ œK˜vLšžœžœ žœžœ˜Lšžœžœ žœžœ˜Lšœ?˜?Lšœ`˜`Lšœ˜—šžœ‘˜L˜ Jšœ-˜-Lšžœžœžœ˜šžœžœžœžœ˜+Lšœ žœU˜cLšœžœžœ˜&Lšœ˜Lšžœ˜—Lšœ0 œ!˜`Lšœ=˜=Lšœ œ ˜0Lšœžœ˜Lšœ˜Lšœ˜Lšœ œ˜Ašžœžœ žœ˜Lšœhžœžœ˜tLšœ˜—Lšœ1˜1Lšœ?˜?Lšœ0 œ!˜`Lšœ˜—Lšœ‘˜L˜—šŸœžœžœ žœžœžœžœ,žœžœ˜wLšœžœ ˜0Lšœ-˜-Lšœžœ˜Lšœ6˜6Lšœžœ˜Lšœ žœžœ˜Lšœžœ5 œ˜LLšœ˜Lšœ˜Lšœ ˜ Lšœ/˜/Lšœ žœ˜L˜Lšœ$™$Lšœ(˜(šžœžœ˜Lšœ9žœ˜?Lšœ˜Lšžœ˜—Lšœ>˜>Lšœ œ˜?L˜šžœžœžœ˜3Lšœ>˜>Lšžœžœ žœžœ˜šœ œ ˜.šœ˜Lšœcžœžœ˜oLšœžœžœ˜/Lšœ˜——Lšžœžœ žœžœ˜Lšœ‘œ˜"Lšœ œG˜rLšžœžœ žœžœ˜Lšœ?˜?Lšœ`˜`Lšœ˜—šžœ‘˜L˜L˜ Jšœ-˜-Lšžœžœžœ˜šžœžœžœžœ˜+Lšœ žœ]˜kLšœžœžœ˜&Lšœ˜Lšžœ˜—Lšœ0 œ!˜`Lšœ=˜=šœ œ ˜0L™D—Lšœžœ˜Lšœ˜Lšœ=žœ˜CLšœ˜Lšœ œ˜Ašžœžœ žœ˜Lšœhžœžœ˜tLšœ˜—L™€Lšžœžœžœ2˜JLšœ?˜?Lšœ0 œ!˜`Lšœ˜—Lšœ‘˜L˜—šŸ œžœžœ žœžœžœžœ,žœžœ˜yLšœžœ ˜0Lšœ-˜-Lšœ6˜6Lšœžœ˜Lšœ žœžœ˜Lšœ žœžœ˜Lšœžœ˜Lšœžœ˜Lšœ˜Lšœ˜Lšœ ˜ Lšœ˜Lšœ/˜/Lšœ žœ˜Lšœžœ5 œ˜LL˜LšœD˜DLšœK˜KLšœ˜L˜Lšœ!™!Lšœ(˜(Lšœ'˜'šœ?˜?šœ/˜/Lšœ4žœžœ˜?L˜Lšœ žœ˜Lšžœ˜ L˜—Lšœ˜—Lšžœžœ žœžœ˜Lšœ>˜>L˜šžœžœžœ˜3Lšœ>˜>Lšžœžœ žœžœ˜šœ œ ˜.šœ˜Lšœažœžœ˜mLšœžœžœ˜/Lšœ˜——Lšžœžœ žœžœ˜šœ‘œ˜"Lšœ œG˜r—Lšžœžœ žœžœ˜Lšœ?˜?Lšœ`˜`Lšœ˜—šžœ‘&˜-Lšœžœ˜L˜ Lšœ-˜-Lšžœžœžœ˜šžœžœžœžœ˜+Lšœ žœ\˜jLšœžœžœ˜&Lšœ˜Lšžœ˜—Lšœ0 œ!˜`Lšœ=˜=šœ œ ˜0LšœK™K—Lšœžœ˜Lšœ˜Lšœ=žœ˜CLšœ˜LšœA˜Ašžœžœ žœ˜Lšœhžœžœ˜tLšœ˜—Lšœq™qLšžœžœžœ2˜LLšœ?˜?Lšœ0 œ!˜`Lšœ˜—Lšœ‘˜—L˜šŸœžœžœ žœžœžœžœ,žœžœ˜tLšœžœ ˜0Lšœ6˜6Lšœ-˜-Lšœžœ˜J˜Jšœ-˜-Lšžœžœžœ˜Lšœ9˜9Lšžœžœžœžœ˜Lšœ žœ˜šœŸœ#˜^Lšœ0žœžœ˜B—šžœžœ žœ˜Lšœ;žœžœ˜GLšœ˜Lšžœ˜Lšœ˜—šœ?˜?L™E—Lšœ‘˜L˜—šŸœžœžœ žœžœžœžœ,žœžœ˜vLšœžœ ˜0Lšœ6˜6Lšœ˜Lšœžœ˜Lšœžœ5 œ˜LL˜Jšœ-˜-Lšžœ žœžœžœ˜Lšœ˜Lšœ7˜7LšœMžœžœ˜YLšœ?˜?Lšœ˜L˜—LšŸ œžœžœ žœžœžœžœ˜Wšœžœžœ˜!Lšœžœ ˜0Lšœ6˜6Lšœ˜Lšœžœ˜Jšœ˜Jšœžœ˜L˜JšœA˜AJšœ,˜,Jšžœžœžœžœ˜#Lšœ9˜9Lšžœžœžœžœ˜šžœgžœ žœž˜šœ9˜9šœ4˜4Lšœžœžœ˜&——Lšžœžœžœ˜/—šž˜˜Lšœ1žœžœ˜=Lšœ˜Lšœ˜——Jšžœ˜Lšœ?˜?Lšœ˜—L˜L˜Lšžœ˜L˜L˜—…—yΘ₯ψ