DIRECTORY CoordSys, Feedback, FS, Imager, IO, Labels, Matrix3d, Menus, Rope, SlackProcess, SV2d, SV3d, SVAssembly, SVBasicTypes, SVBoundBox, SVEditUser, SVEditUserB, SVGraphics, SVHalfSpaces, SVInterfaceTypes, SVMasterObject, SVMasterObjectTypes, SVModelTypes, SVPolygon2d, SVRayTypes, SVRefresh, SVScene, SVSceneTypes, SVScratchpadUser, SVSelect, SVSelections, SVTransforms, SVViewersOnScene, SVViewerTools, SweepGeometry, TiogaMenuOps, ViewerClasses, ViewerTools; SVEditUserImplC: CEDAR PROGRAM IMPORTS CoordSys, Feedback, FS, IO, Labels, Matrix3d, Rope, SVScratchpadUser, SlackProcess, SVAssembly, SVBoundBox, SVEditUser, SVPolygon2d, SVRefresh, SVScene, SVSelect, SVSelections, SVTransforms, SVViewersOnScene, SVViewerTools, SweepGeometry, TiogaMenuOps, ViewerTools EXPORTS SVEditUser, SVEditUserB = BEGIN Slice: TYPE = REF SliceObj; SliceObj: TYPE = SVSceneTypes.SliceObj; SliceList: TYPE = SVSceneTypes.SliceList; BoundBox: TYPE = SVBasicTypes.BoundBox; Camera: TYPE = SVModelTypes.Camera; Color: TYPE = Imager.Color; CoordSystem: TYPE = SVModelTypes.CoordSystem; EditToolData: TYPE = SVInterfaceTypes.EditToolData; LinearMesh: TYPE = SweepGeometry.LinearMesh; MasterObject: TYPE = SVSceneTypes.MasterObject; Matrix4by4: TYPE = SV3d.Matrix4by4; MouseButton: TYPE = Menus.MouseButton; Path: TYPE = SV2d.Path; Point3d: TYPE = SV3d.Point3d; Polygon: TYPE = SV2d.Polygon; PointSetOp: TYPE = SVRayTypes.PointSetOp; RevoluteMesh: TYPE = SweepGeometry.RevoluteMesh; Scene: TYPE = SVSceneTypes.Scene; ScratchpadData: TYPE = SVInterfaceTypes.ScratchpadData; ScratchViewerData: TYPE = SVInterfaceTypes.ScratchViewerData; Selection: TYPE = SVInterfaceTypes.Selection; SelectionGenerator: TYPE = SVInterfaceTypes.SelectionGenerator; Shape: TYPE = SVSceneTypes.Shape; SliceDescriptorGenerator: TYPE = SVSceneTypes.SliceDescriptorGenerator; Vector3d: TYPE = SV3d.Vector3d; Viewer: TYPE = ViewerClasses.Viewer; ViewerCell: TYPE = REF ViewerCellObj; ViewerCellObj: TYPE = SVInterfaceTypes.ViewerCellObj; SVData: TYPE = SVInterfaceTypes.SVData; HalfSpaceRec: TYPE = SVHalfSpaces.HalfSpaceRec; SphereRec: TYPE = SVMasterObjectTypes.SphereRec; BlockData: TYPE = SVMasterObjectTypes.BlockData; CylinderRec: TYPE = SVMasterObjectTypes.CylinderRec; ConeRec: TYPE = SVMasterObjectTypes.ConeRec; TorusRec: TYPE = SVMasterObjectTypes.TorusRec; globalOpIndex: NAT _ 1; globalOpCount: NAT = 3; globalOpArray: ARRAY[1..globalOpCount] OF Rope.ROPE _ ["union", "intersection", "difference"]; globalIsColor: BOOL _ FALSE; PlaneButtonAux: PRIVATE PROC [planeName: Rope.ROPE, editToolData: EditToolData] = { currentScene: Scene _ editToolData.sceneSection.currentScene; svData: SVData _ editToolData.currentSVData; planeSel: Selection; planeAssem: Slice; success: BOOL; [planeAssem, ----, success] _ SVScene.FindAssemblyFromName[planeName, currentScene]; IF NOT success THEN RETURN; planeSel _ SVSelections.CreatePlaneSelection[planeAssem, svData]; SVSelections.PushPlane[planeSel]; SVViewersOnScene.PaintSceneAllViewers[$DrawPlane, editToolData, currentScene]; }; SourceButtonAux: PRIVATE PROC [sourceName: Rope.ROPE, editToolData: EditToolData] = { currentScene: Scene _ editToolData.sceneSection.currentScene; svData: SVData _ editToolData.currentSVData; sourceSel: Selection; source: Slice; success: BOOL; IF Rope.Equal[sourceName, "background", TRUE] THEN { source _ NEW[SliceObj _ [ name: "background", coordSys: currentScene.coordSysRoot, shape: NIL, normalSelectedParts: NIL, hotSelectedParts: NIL, activeSelectedParts: NIL, onOverlay: FALSE, mark: FALSE, artwork: NIL, showAs: normal, isTool: FALSE, toolMasterObject: NIL, sittingOn: NIL ]]; success _ TRUE; } ELSE [source, ----, success] _ SVScene.FindAssemblyFromName[sourceName, currentScene]; IF NOT success THEN RETURN; sourceSel _ SVSelections.CreateCoordSysMovee[source, svData]; SVSelections.PushMovee[sourceSel]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, editToolData, currentScene]; }; TargetButtonAux: PRIVATE PROC [targetName: Rope.ROPE, editToolData: EditToolData] = { currentScene: Scene _ editToolData.sceneSection.currentScene; svData: SVData _ editToolData.currentSVData; targetSel: Selection; target: Slice; success: BOOL; IF Rope.Equal[targetName, "WORLD", TRUE] THEN { target _ NEW[SliceObj _ [ name: "WORLD", coordSys: currentScene.coordSysRoot, shape: NIL, normalSelectedParts: NIL, hotSelectedParts: NIL, activeSelectedParts: NIL, onOverlay: FALSE, mark: FALSE, artwork: NIL, showAs: normal, isTool: FALSE, toolMasterObject: NIL, sittingOn: NIL ]]; success _ TRUE; } ELSE [target, ----, success] _ SVScene.FindAssemblyFromName[targetName, currentScene]; IF NOT success THEN RETURN; targetSel _ SVSelections.CreateCoordSysTarget[target, svData]; SVSelections.PushTarget[targetSel]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, editToolData, currentScene]; }; ParentButtonAux: PRIVATE PROC [parentName: Rope.ROPE, editToolData: EditToolData] = { currentScene: Scene _ editToolData.sceneSection.currentScene; success: BOOL; [----, ----, success] _ SVScene.FindAssemblyFromName[parentName, currentScene]; IF NOT success THEN RETURN; ViewerTools.SetContents[editToolData.sceneSection.parent, parentName]; }; SkitterSourceButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { sourceName: Rope.ROPE; editToolData: EditToolData _ svData.editToolData; sourceName _ ViewerTools.GetContents[editToolData.sceneSection.current]; SourceButtonAux[sourceName, editToolData]; }; SkitterTargetButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { targetName: Rope.ROPE; editToolData: EditToolData _ svData.editToolData; targetName _ ViewerTools.GetContents[editToolData.sceneSection.current]; TargetButtonAux[targetName, editToolData]; }; SkitterParentButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; parentName: Rope.ROPE; parentName _ ViewerTools.GetContents[editToolData.sceneSection.current]; ParentButtonAux[parentName, editToolData]; }; Text1PromptButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; ViewerTools.SetSelection[editToolData.sceneSection.text1]; }; Text1SourceButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { sourceName: Rope.ROPE; editToolData: EditToolData _ svData.editToolData; sourceName _ ViewerTools.GetContents[editToolData.sceneSection.text1]; SourceButtonAux[sourceName, editToolData]; }; Text1TargetButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { targetName: Rope.ROPE; editToolData: EditToolData _ svData.editToolData; targetName _ ViewerTools.GetContents[editToolData.sceneSection.text1]; TargetButtonAux[targetName, editToolData]; }; Text1ParentButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; parentName: Rope.ROPE; parentName _ ViewerTools.GetContents[editToolData.sceneSection.text1]; ParentButtonAux[parentName, editToolData]; }; SelectedTextPlaneButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { planeName: Rope.ROPE; editToolData: EditToolData _ svData.editToolData; planeName _ ViewerTools.GetSelectionContents[]; PlaneButtonAux[planeName, editToolData]; }; SelectedTextSourceButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { sourceName: Rope.ROPE; editToolData: EditToolData _ svData.editToolData; sourceName _ ViewerTools.GetSelectionContents[]; SourceButtonAux[sourceName, editToolData]; }; SelectedTextTargetButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { targetName: Rope.ROPE; editToolData: EditToolData _ svData.editToolData; targetName _ ViewerTools.GetSelectionContents[]; TargetButtonAux[targetName, editToolData]; }; SelectedTextParentButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; parentName: Rope.ROPE; parentName _ ViewerTools.GetSelectionContents[]; ParentButtonAux[parentName, editToolData]; }; SelectOp: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; globalOpIndex _ IF globalOpIndex = globalOpCount THEN 1 ELSE globalOpIndex + 1; Labels.Set[editToolData.sceneSection.opLabel, globalOpArray[globalOpIndex]]; SELECT globalOpArray[globalOpIndex] FROM "union" => editToolData.sceneSection.op _ union; "intersection" => editToolData.sceneSection.op _ intersection; "difference" => editToolData.sceneSection.op _ difference; ENDCASE => ERROR; }; IsColor: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; truthRope: Rope.ROPE; globalIsColor _ NOT globalIsColor; truthRope _ IF globalIsColor THEN "TRUE" ELSE "FALSE"; Labels.Set[editToolData.artworkSection.isColor, truthRope]; }; First: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; assembly, superA: Slice; found: BOOL; namePresent: BOOL _ FALSE; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; [assembly, superA, found] _ SVScene.FindAssemblyFromName[assembly.name, scene]; IF NOT found THEN RETURN; SVScene.MoveToFrontOfAssembly[assembly, superA, scene]; SVViewersOnScene.SceneNewVersion[editToolData.currentSVData]; }; -- end of First DrawCS: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; assembly: Slice; cs: CoordSystem; success: BOOL; viewerCell: ViewerCell; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; cs _ assembly.coordSys; [viewerCell, success] _ SVViewersOnScene.FindSceneInAllViewers[scene, editToolData.allViewers]; IF NOT success THEN ERROR; IF viewerCell.viewersOnScene = NIL THEN RETURN; svData _ NARROW[viewerCell.viewersOnScene.data]; IF viewerCell.viewersOnScene.link = NIL THEN RETURN; FOR list: Viewer _ viewerCell.viewersOnScene.link, list.link UNTIL list = viewerCell.viewersOnScene DO svData _ NARROW[list.data]; ENDLOOP; }; Delete: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; arg: ATOM _ NARROW[event.rest.first]; IF arg=$Undo THEN { Feedback.AppendRaw[$Solidviews, "Can't undo Delete. Sorry.", oneLiner]; Feedback.BlinkRaw[$Solidviews]; RETURN; }; DeleteInternal[editToolData]; }; DeleteInternal: PUBLIC PROC [editToolData: EditToolData] = { found: BOOL _ TRUE; svData: SVData _ editToolData.currentSVData; scene: Scene _ svData.scene; bBoxOfSelected: BoundBox; camera: Camera _ svData.camera; SVSelections.ClearMoveeStack[editToolData]; SVSelections.ClearTargetStack[editToolData]; bBoxOfSelected _ SVBoundBox.BoundBoxOfSelected[scene, camera, normal]; IF bBoxOfSelected=NIL THEN RETURN; -- nothing selected svData.refresh.startBoundBox^ _ SVScene.DeleteAllSelected[scene, camera]^; SVViewersOnScene.PaintSceneAllViewers[paintAction: $PaintEntireScene, editToolData: editToolData, scene: scene, remake: triggerBag, backgndOK: FALSE, edited: TRUE, okToClearFeedback: TRUE]; }; SetOp: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; pointSetOp: PointSetOp _ editToolData.sceneSection.op; compAssembly: Slice; namePresent: BOOL _ FALSE; arg: ATOM _ NARROW[event.rest.first]; IF arg=$Undo THEN { Feedback.AppendRaw[$Solidviews, "Can't undo SetOp!", oneLiner]; Feedback.BlinkRaw[$Solidviews]; RETURN}; compAssembly _ SVSelections.PopMoveeCoincident[]; IF compAssembly = NIL THEN RETURN; WITH compAssembly.shape SELECT FROM shape: Shape => { Feedback.PutFRaw[$Solidviews, oneLiner, "Can't add op to primitive assembly %g.", [rope[compAssembly.name]]]; Feedback.BlinkRaw[$Solidviews]; RETURN}; al: SliceList => al.pointSetOp _ pointSetOp; ENDCASE => ERROR; SVViewersOnScene.SceneNewVersion[editToolData.currentSVData]; }; -- end of SetOp Help: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; fullName: Rope.ROPE; wdir: Rope.ROPE; success: BOOL _ TRUE; wdir _ editToolData.originalWorkingDirectory; [fullName,,] _ FS.ExpandName["SVHelpFile.tioga", wdir ! FS.Error => IF error.group = user THEN { success _ FALSE; CONTINUE; } ]; IF NOT success THEN RETURN; [] _ TiogaMenuOps.Open[fullName]; }; SetColorMap: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; }; BWMap: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { }; Revive: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; currentSVData: SVData _ editToolData.currentSVData; SVRefresh.MoveOverlayToBackground[currentSVData]; SlackProcess.Restart[currentSVData.slackHandle]; }; RotX: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; degrees: REAL _ SVViewerTools.GetReal[editToolData.transformSection.degrees, 0]; arg: ATOM _ NARROW[event.rest.first]; IF arg=$Undo THEN degrees _ -degrees; RotAxis[editToolData, degrees, 1]; }; RotY: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; degrees: REAL _ SVViewerTools.GetReal[editToolData.transformSection.degrees, 0]; arg: ATOM _ NARROW[event.rest.first]; IF arg=$Undo THEN degrees _ -degrees; RotAxis[editToolData, degrees, 2]; }; RotZ: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; degrees: REAL _ SVViewerTools.GetReal[editToolData.transformSection.degrees, 0]; arg: ATOM _ NARROW[event.rest.first]; IF arg=$Undo THEN degrees _ -degrees; RotAxis[editToolData, degrees, 3]; }; RotAxis: PUBLIC PROC [editToolData: EditToolData, degrees: REAL, axis: [1..3]] = { scene: Scene _ editToolData.sceneSection.currentScene; targetCS: CoordSystem; targetCSspecified: BOOL _ TRUE; sliceDescGen: SliceDescriptorGenerator; success: BOOL _ TRUE; targetCS _ SVSelections.TopTargetCoinCoordSys[]; IF targetCS = NIL THEN targetCSspecified _ FALSE; sliceDescGen _ SVSelect.SelectedSlices[scene, normal]; FOR coin: Slice _ SVSelect.NextSlice[sliceDescGen], SVSelect.NextSlice[sliceDescGen] UNTIL coin = NIL DO IF NOT targetCSspecified THEN targetCS _ coin.coordSys; SVTransforms.Rotate[coin, scene, axis, degrees, targetCS]; ENDLOOP; SVViewersOnScene.PaintSceneAllViewers[paintAction: $PaintEntireScene, editToolData: editToolData, scene: scene, edited: TRUE]; }; Trans: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; x, y, z: REAL; targetCS: CoordSystem; targetCSspecified: BOOL _ TRUE; sliceDescGen: SliceDescriptorGenerator; success: BOOL _ TRUE; vec: Vector3d; arg: ATOM _ NARROW[event.rest.first]; [x, y, z] _ SVViewerTools.GetThreeReals[editToolData.transformSection.transXYZ]; IF arg=$Undo THEN {x _ -x; y _ -y; z _ -z}; vec _ [x, y, z]; targetCS _ SVSelections.TopTargetCoinCoordSys[]; IF targetCS = NIL THEN targetCSspecified _ FALSE; sliceDescGen _ SVSelect.SelectedSlices[scene, normal]; FOR coin: Slice _ SVSelect.NextSlice[sliceDescGen], SVSelect.NextSlice[sliceDescGen] UNTIL coin = NIL DO IF NOT targetCSspecified THEN targetCS _ coin.coordSys; SVTransforms.Translate[coin, scene, vec, targetCS]; ENDLOOP; SVViewersOnScene.PaintSceneAllViewers[paintAction: $PaintEntireScene, editToolData: editToolData, scene: scene, edited: TRUE]; }; ScalePrimitive: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; errorRope: Rope.ROPE; x, y, z: REAL; sliceDescGen: SliceDescriptorGenerator; bad: Slice; success: BOOL _ TRUE; arg: ATOM _ NARROW[event.rest.first]; BEGIN [x, y, z] _ SVViewerTools.GetThreeReals[editToolData.transformSection.scaleXYZ]; IF x = 0 OR y = 0 OR z = 0 THEN GOTO ScaleByZero; IF arg=$Undo THEN {x _ 1/x; y _ 1/y; z _ 1/z}; sliceDescGen _ SVSelect.SelectedSlices[scene, normal]; FOR coin: Slice _ SVSelect.NextSlice[sliceDescGen], SVSelect.NextSlice[sliceDescGen] UNTIL coin = NIL DO IF NOT ISTYPE[coin.shape, Shape] THEN {bad _ coin; GOTO ScalePrimitive}; SVTransforms.ScalePrimitives[coin, x, y, z]; ENDLOOP; SVViewersOnScene.PaintSceneAllViewers[paintAction: $PaintEntireScene, editToolData: editToolData, scene: scene, edited: TRUE]; EXITS ScaleByZero => { Feedback.AppendRaw[$Solidviews, "Can't scale by 0", oneLiner]; Feedback.BlinkRaw[$Solidviews]; }; ScalePrimitive => { errorRope _ IO.PutFR["Can't ScalePrimitive! a cluster assembly [%g]",[rope[bad.name]]]; Feedback.AppendRaw[$Solidviews, errorRope, oneLiner]; Feedback.BlinkRaw[$Solidviews]; }; END; }; EvenScale: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; targetCS: CoordSystem; scalar: REAL; targetCSspecified: BOOL _ TRUE; sliceDescGen: SliceDescriptorGenerator; success: BOOL _ TRUE; arg: ATOM _ NARROW[event.rest.first]; BEGIN scalar _ SVViewerTools.GetReal[editToolData.transformSection.scalar, 0]; IF scalar = 0 THEN GOTO ScaleByZero; IF arg=$Undo THEN {scalar _ 1/scalar}; targetCS _ SVSelections.TopTargetCoinCoordSys[]; IF targetCS = NIL THEN targetCSspecified _ FALSE; sliceDescGen _ SVSelect.SelectedSlices[scene, normal]; FOR coin: Slice _ SVSelect.NextSlice[sliceDescGen], SVSelect.NextSlice[sliceDescGen] UNTIL coin = NIL DO IF NOT targetCSspecified THEN targetCS _ coin.coordSys; IF CoordSys.Parent[coin.coordSys] # NIL THEN SVTransforms.ScaleEven[coin, scene, scalar, targetCS] ELSE SVTransforms.ScaleEven[coin, scene, scalar, targetCS]; ENDLOOP; SVViewersOnScene.PaintSceneAllViewers[paintAction: $PaintEntireScene, editToolData: editToolData, scene: scene, edited: TRUE]; EXITS ScaleByZero => { Feedback.AppendRaw[$Solidviews, "Can't scale by 0", oneLiner]; Feedback.BlinkRaw[$Solidviews]; }; END; }; Edit: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scratchpad: Viewer _ editToolData.scratchpad; scratchpadData: ScratchpadData _ NARROW[scratchpad.data]; scratchViewerData: ScratchViewerData _ scratchpadData.scratchViewerData; scene: Scene _ editToolData.sceneSection.currentScene; mo: MasterObject; shape: Shape; scalars: Vector3d; path: Path; poly: Polygon; moClassName: Rope.ROPE; assembly: Slice; assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; IF NOT ISTYPE[assembly.shape, Shape] THEN { Feedback.AppendRaw[$Solidviews, "Cannot Edit Composite Slice", oneLiner]; Feedback.BlinkRaw[$Solidviews]; RETURN}; shape _ NARROW[assembly.shape]; mo _ shape.mo; scalars _ CoordSys.GetScalars[shape.coordSys]; moClassName _ mo.class.name; SELECT TRUE FROM Rope.Equal[moClassName, "revoluteSweep"] => { path _ SweepGeometry.GetRevolutePath[NARROW[mo.lineBody, RevoluteMesh]]; SVScratchpadUser.Edit[path, revo, scratchViewerData]; SVViewerTools.SetThreeReals[editToolData.transformSection.scaleXYZ, scalars[1], scalars[2], scalars[3]]; }; Rope.Equal[moClassName, "linearSweep"] => { linMesh: LinearMesh _ NARROW[mo.lineBody]; depth: REAL; poly _ SweepGeometry.GetLinearPoly[linMesh]; path _ SVPolygon2d.PolygonToPath[poly]; SVScratchpadUser.Edit[path, lin, scratchViewerData]; depth _ linMesh.array[1][1][3]*2; SVViewerTools.SetReal[editToolData.linSection.depth, depth]; SVViewerTools.SetThreeReals[editToolData.transformSection.scaleXYZ, scalars[1], scalars[2], scalars[3]]; }; Rope.Equal[moClassName, "sphere"] => { radius: REAL; sphereRec: SphereRec _ NARROW[mo.mainBody]; radius _ sphereRec.radius; IF scalars[1] = scalars[2] AND scalars[2] = scalars[3] THEN {-- stuff the radius and 1's into the scalars SVViewerTools.SetReal[editToolData.sphereSection.radius, scalars[1]*radius]; SVViewerTools.SetThreeReals[editToolData.transformSection.scaleXYZ, 1,1,1]; } ELSE {-- radius = 1; write scalars SVViewerTools.SetReal[editToolData.sphereSection.radius, 1]; SVViewerTools.SetThreeReals[editToolData.transformSection.scaleXYZ, scalars[1]*radius, scalars[2]*radius, scalars[3]*radius]; }; }; Rope.Equal[moClassName, "block"] => { bx, by, bz: REAL; blockRec: BlockData _ NARROW[mo.mainBody]; bx _ blockRec.box.hiX - blockRec.box.loX; by _ blockRec.box.hiY - blockRec.box.loY; bz _ blockRec.box.hiZ - blockRec.box.loZ; SVViewerTools.SetThreeReals[editToolData.blockSection.xyz, bx*scalars[1], by*scalars[2], bz*scalars[3]]; SVViewerTools.SetThreeReals[editToolData.transformSection.scaleXYZ, 1,1,1]; }; Rope.Equal[moClassName, "cylinder"] => { radius, height: REAL; cylinderRec: CylinderRec _ NARROW[mo.mainBody]; radius _ cylinderRec.radius; height _ cylinderRec.height;-- dimensions of the master object IF scalars[1] = scalars[3] THEN { SVViewerTools.SetReal[editToolData.cylinderSection.radius, radius*scalars[1]]; SVViewerTools.SetReal[editToolData.cylinderSection.height, height*scalars[2]]; SVViewerTools.SetThreeReals[editToolData.transformSection.scaleXYZ, 1,1,1]; } ELSE { SVViewerTools.SetReal[editToolData.cylinderSection.radius, 1]; SVViewerTools.SetReal[editToolData.cylinderSection.height, 1]; SVViewerTools.SetThreeReals[editToolData.transformSection.scaleXYZ, scalars[1]*radius, scalars[2]*height, scalars[3]*radius]; }; }; Rope.Equal[moClassName, "cone"] => { radius, height: REAL; coneRec: ConeRec _ NARROW[mo.mainBody]; radius _ coneRec.radius; height _ coneRec.height;-- dimensions of the master object IF scalars[1] = scalars[3] THEN { SVViewerTools.SetReal[editToolData.coneSection.radius, radius*scalars[1]]; SVViewerTools.SetReal[editToolData.coneSection.height, height*scalars[2]]; SVViewerTools.SetThreeReals[editToolData.transformSection.scaleXYZ, 1,1,1]; } ELSE { SVViewerTools.SetReal[editToolData.coneSection.radius, 1]; SVViewerTools.SetReal[editToolData.coneSection.height, 1]; SVViewerTools.SetThreeReals[editToolData.transformSection.scaleXYZ, scalars[1]*radius, scalars[2]*height, scalars[3]*radius]; }; }; Rope.Equal[moClassName, "torus"] => { bigRadius, sectionRadius: REAL; torusRec: TorusRec _ NARROW[mo.mainBody]; bigRadius _ torusRec.bigRadius; sectionRadius _ torusRec.sectionRadius; SVViewerTools.SetReal[editToolData.torusSection.bigRadius, bigRadius]; SVViewerTools.SetReal[editToolData.torusSection.sectionRadius, sectionRadius]; SVViewerTools.SetThreeReals[editToolData.transformSection.scaleXYZ, scalars[1], scalars[2], scalars[3]]; }; ENDCASE => { Feedback.AppendRaw[$Solidviews, Rope.Concat["I don't know how to edit ", moClassName], oneLiner]; Feedback.BlinkRaw[$Solidviews]; }; }; -- end of Edit AddComposite: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; pointSetOp: PointSetOp _ editToolData.sceneSection.op; compName: Rope.ROPE; newAssembly, superAssembly: Slice; success: BOOL; addSucceeds: BOOL _ TRUE; compName _ ViewerTools.GetContents[editToolData.sceneSection.new]; [superAssembly, success] _ SVEditUser.GetParent[editToolData]; IF NOT success THEN RETURN; [newAssembly, addSucceeds] _ SVAssembly.CreateCluster[compName, pointSetOp, scene]; IF NOT addSucceeds THEN RETURN; addSucceeds _ SVAssembly.AddCluster[newAssembly, superAssembly, Matrix3d.Identity[], scene]; IF NOT addSucceeds THEN RETURN; SVViewersOnScene.SceneNewVersion[editToolData.currentSVData]; }; -- end of AddComposite SetAmbient: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; color: Color; success: BOOLEAN; [color, success] _ SVViewerTools.GetColor[editToolData.lightSection.color]; IF NOT success THEN RETURN; IF NOT scene.lightSources.first.type = ambient THEN ERROR; scene.lightSources.first.color _ color; SVViewersOnScene.SceneNewVersion[editToolData.currentSVData]; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, scene]; }; GetAmbient: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; color: Color; IF NOT scene.lightSources.first.type = ambient THEN ERROR; color _ scene.lightSources.first.color; SVViewerTools.SetColor[editToolData.lightSection.color, color]; }; END. ΞFile: SVEditUserImplC.mesa Last edited by Bier on May 22, 1987 1:35:02 pm PDT Copyright c 1984 by Xerox Corporation. All rights reserved. Author: Eric Bier Contents: All of the procedures called by SVEditTool when menus and buttons are pressed (part 3) Basic Shapes GLOBAL VARIABLES Text Input Section Use planeName to coordsys-select. Create a plane-selection of this assembly. Use sourceName to coordsys-select. Create a source-selection of this assembly. Use targetName to coordsys-select. Create a target-selection of this assembly. Stuff parentName into the Parent slot. Use the text in the skitter area as the name of an assembly to coordsys-select. Create a source-selection of this assembly. Stuff the text next to Skitter: into the Parent slot. Stuff the text next to Text1: into the Parent slot. Stuff the text of the current selection into the Parent slot. Prompts which cycle through possibilities Command Buttons Make sure that the assembly named in "Slice: " is the first element in the SliceList of its super assembly (useful when csg op = "difference" since the result of difference is that of the first element minus all of the rest. find the assembly mentioned by the edittool and draw its coordinate system. Draw the first viewer if there is one. SVEvent.DrawOneCSInViewer[svData, cs]; draw the rest (remember they are linked in a ring) SVEvent.DrawOneCSInViewer[svData, cs]; the name in the assembly slot should refer to an already existing Composite Slice. Make its SVRay pointSetOp equal to the op shown next to "Op:". Error if Slice is a Primitive Slice. Find out if the current object is a sweep shape. If so, extract its path and feed to the scratchpad. Otherwise complain in Feedback. A sphere may actually be an oblate spheroid if the scalars are uneven. If they are even, I will will stuff the radius. Otherwise, I will set radius = 1 and stuff the scalars in the scaling part of the transform section. **** This should also stuff the name of the sphere's parent in "With Respect To:". if sx = sz then stuff radius and height. Otherwise using scaling blank to list all scalars similar to cylinder in the case of the torus, we write the current scalars AND take the radius data directly from the torus record (master object) Use the name in the assembly slot to name this new composite. It is a subassembly of the assembly named in "WithRespectTo"; It has no sub-assemblies to begin with. Add * will now add objects to the assembly named in "WithRespectTo". ΚΥ˜Ihead1šœ™Jšœ2™2Jšœ Οmœ1™˜>Lšœ#˜#JšœU˜ULšœ˜L˜—šŸœžœžœžœ!˜ULšœ&™&Lšœ=˜=Lšœ žœ˜L˜Lšœ œ œD˜OLšžœžœ žœžœ˜LšœF˜FLšœ˜L˜—šŸœžœžœ žœžœžœžœ˜ML™|Lšœžœ˜Lšœ1˜1LšœH˜HLšΟbœ˜*L˜L˜—š Ÿœž œ žœžœžœžœ˜MLšœžœ˜Lšœ1˜1LšœH˜HLšŸœ˜*L˜L˜—šŸœžœžœ žœžœžœžœ˜ML™5Lšœ1˜1Lšœžœ˜LšœH˜HLšœ*˜*Lšœ˜L˜—š Ÿœž œ žœžœžœžœ˜KJšœ1˜1Jšœ:˜:Jšœ˜L˜—š Ÿœž œ žœžœžœžœ˜KLšœžœ˜Lšœ1˜1LšœF˜FLš‘œ˜*Lšœ˜—š Ÿœž œ žœžœžœžœ˜KLšœžœ˜Lšœ1˜1LšœF˜FLšŸœ˜*L˜—š Ÿœž œ žœžœžœžœ˜KL™3Lšœ1˜1Lšœžœ˜LšœF˜FLšœ*˜*Lšœ˜L˜—š Ÿœž œ žœžœžœžœ˜QLšœžœ˜Lšœ1˜1Lšœ/˜/Lš‘œ˜(Lšœ˜L˜—š Ÿœž œ žœžœžœžœ˜RLšœžœ˜Lšœ1˜1Lšœ0˜0Lš‘œ˜*Lšœ˜—š Ÿœž œ žœžœžœžœ˜RLšœžœ˜Lšœ1˜1Lšœ0˜0LšŸœ˜*L˜—š Ÿœž œ žœžœžœžœ˜RL™=Lšœ1˜1Lšœžœ˜Lšœ0˜0Lš‘œ˜*Lšœ˜—J™Jšœ)™)J˜šŸœžœžœ žœžœžœžœ˜BJšœ1˜1Jšœ6˜6Jšœžœžœžœ˜OJšœL˜Lšžœž˜(Jšœ0˜0Jšœ>˜>Jšœ:˜:—Jšžœžœ˜Jšœ˜—J˜šŸœžœžœ žœžœžœžœ˜AJšœ1˜1Jšœ6˜6Jšœžœ˜Jšœžœ˜"Jšœ žœžœžœ ˜6Jšœ;˜;Jšœ˜—J˜Jšœ™J˜šŸœžœžœ žœžœžœžœ˜?Jšœΰ™ΰJšœ1˜1Jšœ6˜6Jšœ˜Jšœžœ˜ Jšœ žœžœ˜J˜Jšœ-˜-Jšžœ žœžœžœ˜JšœO˜OJšžœžœžœžœ˜Jšœ7˜7Jšœ=˜=Jšœ ˜—J˜šŸœžœžœ žœžœžœžœ˜@JšœK™KJšœ1˜1Jšœ6˜6Jšœ˜Jšœ˜Jšœ žœ˜Jšœ˜J˜Jšœ-˜-Jšžœžœžœ˜Jšœ˜Jšœ_˜_Jšžœžœ žœžœ˜Jšœ&™&Jšžœžœžœžœ˜/Jšœ žœ!˜0Jšœ&™&Jšœ2™2Jšžœ"žœžœžœ˜4Jšžœ9˜<šžœ"ž˜)Jšœ žœ ˜Jšœ&™&—Jšžœ˜Jšœ˜—J˜šŸœžœžœ žœžœžœžœ˜@Jšœ1˜1Jšœ6˜6J˜%J˜šžœ žœ˜JšœH˜HJšœ˜Jšž˜Jšœ˜—Jšœ˜J˜J˜—šŸœžœžœ!˜Jšœ1˜1Jšœžœ˜Jšœ žœ˜Jšœ˜Jšœ-˜-šœ5˜5šœ*˜*Jšœ˜Jšœ ˜ J˜—Jšœ˜—Jšžœžœ žœžœ˜Jšœ!˜!L˜L˜—šŸ œžœžœ žœžœžœžœ˜EJšœ1˜1Jšœ˜—J˜šŸœžœžœ žœžœžœžœ˜?Jšœ˜—J˜šŸœžœžœ žœžœžœžœ˜@Lšœ1˜1Lšœ3˜3Lšœ1˜1Lšœ0˜0L˜L˜—šŸœžœžœ žœžœžœžœ˜>Jšœ1˜1Jšœ žœC˜PJšœžœžœ˜%Jšžœ žœ˜%Jšœ"˜"J˜—šŸœžœžœ žœžœžœžœ˜>Jšœ1˜1Jšœ žœC˜PJšœžœžœ˜%Jšžœ žœ˜%Jšœ"˜"J˜—šŸœžœžœ žœžœžœžœ˜>Jšœ1˜1Jšœ žœC˜PJšœžœžœ˜%Jšžœ žœ˜%Jšœ"˜"J˜J˜—šŸœžœžœ'žœ˜RJšœ6˜6Jšœ˜Jšœžœžœ˜Jšœ'˜'Jšœ žœžœ˜J˜Jšœ0˜0Jšžœ žœžœžœ˜1Jšœ6˜6šžœRžœžœž˜hJšžœžœžœ˜7Jšœ:˜:Jšžœ˜—Lšœxžœ˜~Jšœ˜—J˜šŸœžœžœ žœžœžœžœ˜?Jšœ1˜1Jšœ6˜6Jšœ žœ˜Jšœ˜Jšœžœžœ˜Jšœ'˜'Jšœ žœžœ˜J˜J˜%J˜JšœP˜PJšžœ žœ˜+Jšœ˜J˜Jšœ0˜0Jšžœ žœžœžœ˜1Jšœ6˜6šžœRžœžœž˜hJšžœžœžœ˜7Jšœ ‘ œ˜3Jšžœ˜—Lšœ~˜~Jšœ˜—J˜šŸœžœžœ žœžœžœžœ˜HJšœ1˜1Jšœ6˜6Jšœžœ˜Jšœ žœ˜Jšœ'˜'Jšœ ˜ Jšœ žœžœ˜J˜%J˜šž˜JšœP˜PJš žœžœžœžœžœ ˜1Jšžœ žœ˜.J˜Jšœ6˜6šžœRžœžœž˜hJš žœžœžœžœžœ˜HJšœ ‘œ˜,Jšžœ˜—Lšœ~˜~šž˜˜Jšœ>˜>Jšœ˜J˜—˜Jšœ žœI˜WJšœ5˜5Jšœ˜J˜——Jšžœ˜—Jšœ˜—J˜šŸ œžœžœ žœžœžœžœ˜CJšœ1˜1Jšœ6˜6Jšœ˜Jšœžœ˜ Jšœžœžœ˜Jšœ'˜'Jšœ žœžœ˜J˜%J˜šž˜JšœH˜HJšžœ žœžœ ˜$Jšžœ žœ˜&J˜Jšœ0˜0Jšžœ žœžœžœ˜1Jšœ6˜6šžœRžœžœž˜hLšžœžœžœ˜7Lšžœ"žœžœ‘ œ˜bLšžœ‘ œ ˜;Jšžœ˜—Lšœ~˜~šž˜˜Jšœ>˜>Jšœ˜J˜——Jšžœ˜—Jšœ˜—J˜šŸœžœžœ žœžœžœžœ˜>Jšœ†™†Jšœ1˜1Jšœ-˜-Jšœ!žœ˜9JšœH˜HJšœ6˜6Jšœ˜J˜ J˜Jšœ ˜ Jšœ˜Jšœžœ˜Jšœ˜J˜Jšœ-˜-Jšžœ žœžœžœ˜šžœžœžœžœ˜+JšœI˜IJšœ˜Jšžœ˜—Jšœžœ˜Jšœ˜Jšœ.˜.Jšœ˜šžœžœž˜šœ-˜-Jšœ%žœ˜HJšœ5˜5Jšœh˜hJšœ˜—šœ+˜+Jšœžœ˜*Jšœžœ˜ Jšœ,˜,Jšœ'˜'Jšœ4˜4Jšœ!˜!Jšœ<˜šžœžœ˜!JšœN˜NJšœN˜NJšœK˜KJšœ˜—šžœ˜Jšœ>˜>Jšœ>˜>Jšœ}˜}Jšœ˜—Jšœ˜—šœ$˜$Jšœ™Jšœžœ˜Jšœžœ˜'Jšœ˜Jšœ "˜:šžœžœ˜!JšœJ˜JJšœJ˜JJšœK˜KJšœ˜—šžœ˜Jšœ:˜:Jšœ:˜:Jšœ}˜}Jšœ˜—Jšœ˜—šœ%˜%Jšœ~™~Jšœžœ˜Jšœžœ˜)Jšœ˜Jšœ'˜'JšœF˜FJšœN˜NJšœh˜hJšœ˜—šžœ˜ Jšœa˜aJšœ˜J˜——Jšœ ˜—J˜šŸ œžœžœ žœžœžœžœ˜FJšœλ™λJšœ1˜1Jšœ6˜6Jšœ6˜6Jšœž˜Jšœ"˜"Jšœ žœ˜Jšœ žœžœ˜Jšœ=‘œ˜BJšœ&‘ œ˜>Jšžœžœ žœžœ˜Lšœ(Ÿ œ˜SJšžœžœ žœžœ˜Jšœ\˜\Jšžœžœ žœžœ˜Jšœ=˜=Jšœ ˜J˜—šŸ œžœžœ žœžœžœžœ˜DJšœ1˜1Jšœ6˜6Jšœ ˜ Jšœ žœ˜JšœK˜KJšžœžœ žœžœ˜Jšžœžœ)žœžœ˜:Jšœ'˜'Jšœ=˜=LšœN˜NJ˜J˜—š Ÿ œž œ žœžœžœžœ˜DJšœ1˜1Jšœ6˜6Jšœ ˜ Jšžœžœ)žœžœ˜:Jšœ'˜'Jšœ?˜?J˜J˜—J˜Jšžœ˜J˜J˜—…—`*ƒΝ