<> <> <> <> <> DIRECTORY CoordSys, Feedback, FS, Imager, IO, Labels, Matrix3d, Menus, Rope, SlackProcess, SV2d, SV3d, SVAssembly, SVBasicTypes, SVBoundBox, SVCaret, SVEditUser, SVEditUserB, SVGraphics, SVHalfSpaces, SVInterfaceTypes, SVMasterObject, SVMasterObjectTypes, SVModelTypes, SVPolygon2d, SVRefresh, SVScene, SVSceneTypes, SVScratchpadUser, SVSelect, SVSelections, SVTransforms, SVViewersOnScene, SVViewerTools, SweepGeometry, TiogaMenuOps, ViewerClasses, ViewerTools; SVEditUserImplC: CEDAR PROGRAM IMPORTS CoordSys, Feedback, FS, IO, Labels, Matrix3d, Rope, SlackProcess, SVAssembly, SVBoundBox, SVCaret, SVEditUser, SVPolygon2d, SVRefresh, SVScene, SVScratchpadUser, 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 = SVSceneTypes.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]^; SVCaret.NoAttractor[editToolData.skitter]; 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; <> anchorWorld, rotation: Matrix4by4; targetCSspecified: BOOL _ TRUE; sliceDescGen: SliceDescriptorGenerator; success: BOOL _ TRUE; <> <> IF NOT SVCaret.Exists[scene.anchor] THEN targetCSspecified _ FALSE ELSE { anchorWorld _ SVCaret.GetPosition[scene.anchor]; }; rotation _ Matrix3d.MakeRotateMat[axis, degrees]; sliceDescGen _ SVSelect.SelectedSlices[scene, normal]; FOR coin: Slice _ SVSelect.NextSlice[sliceDescGen], SVSelect.NextSlice[sliceDescGen] UNTIL coin = NIL DO IF NOT targetCSspecified THEN anchorWorld _ CoordSys.WRTWorld[coin.coordSys]; SVAssembly.IncTransfMatrix[coin, anchorWorld, rotation]; 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; <> anchorWorld, translation: Matrix4by4; 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]; <> <> IF NOT SVCaret.Exists[scene.anchor] THEN targetCSspecified _ FALSE ELSE { anchorWorld _ SVCaret.GetPosition[scene.anchor]; }; translation _ Matrix3d.MakeTranslateMat[vec[1], vec[2], vec[3]]; sliceDescGen _ SVSelect.SelectedSlices[scene, normal]; FOR coin: Slice _ SVSelect.NextSlice[sliceDescGen], SVSelect.NextSlice[sliceDescGen] UNTIL coin = NIL DO IF NOT targetCSspecified THEN anchorWorld _ CoordSys.WRTWorld[coin.coordSys]; SVAssembly.IncTransfMatrix[coin, anchorWorld, translation]; ENDLOOP; SVViewersOnScene.PaintSceneAllViewers[paintAction: $PaintEntireScene, editToolData: editToolData, scene: scene, edited: TRUE]; }; EvenScale: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; <> anchorWorld, scaleMat: Matrix4by4; 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}; <> <> IF NOT SVCaret.Exists[scene.anchor] THEN targetCSspecified _ FALSE ELSE { anchorWorld _ SVCaret.GetPosition[scene.anchor]; }; scaleMat _ Matrix3d.MakeScaleMat[scalar, scalar, scalar]; sliceDescGen _ SVSelect.SelectedSlices[scene, normal]; FOR coin: Slice _ SVSelect.NextSlice[sliceDescGen], SVSelect.NextSlice[sliceDescGen] UNTIL coin = NIL DO IF NOT targetCSspecified THEN anchorWorld _ CoordSys.WRTWorld[coin.coordSys]; SVAssembly.IncTransfMatrix[coin, anchorWorld, scaleMat]; 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; }; 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; }; 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.