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šœ6™6LšœW™WL˜�šÏk	˜	Lšœ˜L˜	Lšœ˜Lšœ˜Lšžœ˜Lšœ	˜	Lšœ˜Lšœ˜Lšœ
˜
L˜J˜Lšœ˜L˜L˜
L˜J˜
J˜
J˜
Lšœ˜Lšœ˜L˜
Lšœ˜Lšœ˜Lšœ˜—L˜�šœžœž˜Lšžœ)žœ‡˜¹Lšžœ
˜—L˜�Lšž˜˜�Lšœ
žœ˜'Lšœžœ˜/Lšœžœ#˜:Lšœžœ˜"Lšœžœ!˜3Lšœ
žœ˜-Lšœžœ˜,Lšœžœ˜/Lšœžœ˜#Lšœ
žœ˜&Lšœžœ$˜>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È��¥ø��