<> <> <> DIRECTORY Atom, CD, CDSequencer, TerminalIO, CDOrient, CDPanel, CDCallSpecific, CDInline, CDOps, CDProperties, CDExtras, CDViewer USING [DesignOf], Rope, ViewerClasses USING [Viewer]; CDExtraCommands: CEDAR PROGRAM IMPORTS Atom, CDInline, CDOps, CDOrient, CDPanel, CDProperties, CDSequencer, TerminalIO, CDCallSpecific, CDExtras, CDViewer, Rope = BEGIN verbose: BOOL _ TRUE; WriteInLambda: PROC [n: CD.Number] = {TerminalIO.WriteRope[CDExtras.ToLambda[n]]}; CoordinatesCommand: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Coordinates"]; TerminalIO.WriteRope[" down: ("]; WriteInLambda[comm.sPos.x]; TerminalIO.WriteRope[","]; WriteInLambda[comm.sPos.y]; TerminalIO.WriteRope[") up: ("]; WriteInLambda[comm.pos.x]; TerminalIO.WriteRope[","]; WriteInLambda[comm.pos.y]; TerminalIO.WriteRope[") dist: ("]; WriteInLambda[comm.pos.x-comm.sPos.x]; TerminalIO.WriteRope[","]; WriteInLambda[comm.pos.y-comm.sPos.y]; TerminalIO.WriteRope[")\n"]; END; WriteInfo: PROC[aptr: CD.ApplicationPtr] = <<-- copied from CDOps>> BEGIN x: REF ~ CDProperties.GetPropFromApplication[aptr, $SignalName]; TerminalIO.WriteRope[" ("]; TerminalIO.WriteRope[CDOps.Info[aptr.ob]]; IF x#NIL THEN WITH x SELECT FROM r: Rope.ROPE => TerminalIO.WriteRope[Rope.Concat[" ", r]]; a: ATOM => TerminalIO.WriteRope[Rope.Concat[" ", Atom.GetPName[a]]]; ENDCASE => NULL; TerminalIO.WriteRope[")"]; END; PersonalizedApplicationRect: PROC [aptr: CD.ApplicationPtr] RETURNS [CD.DesignRect] = --should be in CDApplications INLINE BEGIN RETURN [ CDOrient.MapRect[ itemInCell: aptr.ob.p.insideRect[aptr.ob], cellSize: aptr.ob.size, cellInstOrient: aptr.orientation, cellInstPos: aptr.location ] ] END; StatisticCommand: PROC [comm: CDSequencer.Command] = BEGIN countTot: INT _ 0; countSel: INT _ 0; countInvis: INT _ 0; isDesign: BOOL _ FALSE; rect: CD.DesignRect; aptr: CD.ApplicationPtr; TerminalIO.WriteRope["Statistic"]; IF ISTYPE[comm.ref, ViewerClasses.Viewer] THEN [isDesign, , rect] _ CDViewer.DesignOf[NARROW[comm.ref]]; IF ~isDesign THEN rect _ CDInline.universe; FOR l: CD.ApplicationList _ CDOps.AppList[comm.design], l.rest WHILE l#NIL DO countTot _ countTot+1; IF l.first.selected THEN { IF ~CDInline.Intersect[rect, PersonalizedApplicationRect[l.first]] THEN countInvis _ countInvis+1; countSel _ countSel+1; aptr _ l.first } ENDLOOP; TerminalIO.WriteInt[countTot]; TerminalIO.WriteRope[" objects;"]; TerminalIO.WriteInt[countSel]; TerminalIO.WriteRope[" selected"]; IF countSel=1 THEN { WriteInfo[aptr]; IF verbose THEN { TerminalIO.WriteRope[" at: ("]; TerminalIO.WriteInt[aptr.location.x]; TerminalIO.WriteRope[","]; TerminalIO.WriteInt[aptr.location.y]; TerminalIO.WriteRope[") size: ("]; TerminalIO.WriteInt[aptr.ob.size.x]; TerminalIO.WriteRope[","]; TerminalIO.WriteInt[aptr.ob.size.y]; TerminalIO.WriteRope[") orientation-code:"]; TerminalIO.WriteInt[aptr.orientation]; } }; IF countInvis#0 THEN { TerminalIO.WriteRope["\n **** "]; TerminalIO.WriteInt[countInvis]; TerminalIO.WriteRope[" invisible selected objects"]; }; TerminalIO.WriteLn[]; END; SelectIfLevel: CDCallSpecific.CallProc = BEGIN IF aptr.ob.level#NARROW[x, REF CD.Level]^ THEN {done_FALSE; RETURN}; IF aptr.selected THEN RETURN; aptr.selected _ TRUE; repaintMe _ TRUE END; AddSelectLevel: PROC [comm: CDSequencer.Command] = BEGIN n: INT; reflev: REF CD.Level _ NEW[CD.Level_CDPanel.FetchDefaultLevel[comm.design]]; TerminalIO.WriteRope["Select all of current layer: ("]; n _ CDCallSpecific.CallForAll[design: comm.design, whatElse: SelectIfLevel, x: reflev]; TerminalIO.WriteInt[n]; TerminalIO.WriteRope[") objects\n"]; END; DesignMenu: PROC [comm: CDSequencer.Command] = BEGIN ENABLE TerminalIO.UserAbort => GOTO userAbort; Forward: PROC [a: ATOM] = { CDSequencer.ExecuteCommand[comm: comm, as: a, queue: dontQueue]; }; SELECT TerminalIO.RequestSelection[ label: "Design options", choice: LIST["IO", "viewer", "directory", "rename", "un-delete", "select all", "statistic", "flush del's"] ] FROM 1 => Forward[$IOMenu]; 2 => Forward[$ViewerMenu]; 3 => Forward[$DirectoryMenu]; 4 => Forward[$RenameDesign]; 5 => Forward[$Undel]; 6 => Forward[$SelectAll]; 7 => Forward[$Statistic]; 8 => Forward[$FlushUndelList]; ENDCASE => TerminalIO.WriteRope["skipped\n"]; EXITS userAbort => {TerminalIO.WriteRope["discarded\n"]} END; DirectoryMenu: PROC [comm: CDSequencer.Command] = BEGIN ENABLE TerminalIO.UserAbort => GOTO userAbort; Forward: PROC [a: ATOM] = { CDSequencer.ExecuteCommand[comm: comm, as: a, queue: dontQueue]; }; SELECT TerminalIO.RequestSelection[ label: "Directory options", choice: LIST["list direcory", "clean up directory", "remove ob", "rename selected ob", "create cell", "list imports", "list importee", " IO"] ] FROM 1 => Forward[$DisplayCellNames]; 2 => Forward[$DeleteUnUsedObjects]; 3 => Forward[$RemoveCell]; 4 => Forward[$RenameS]; 5 => Forward[$CreateCellS]; 6 => Forward[$DisplayImports]; 7 => Forward[$DisplayImportedEntries]; 8 => Forward[$IOMenu] ENDCASE => TerminalIO.WriteRope["skipped\n"]; EXITS userAbort => {TerminalIO.WriteRope["discarded\n"]} END; IOMenu: PROC [comm: CDSequencer.Command] = BEGIN ENABLE TerminalIO.UserAbort => GOTO userAbort; Forward: PROC [a: ATOM] = { CDSequencer.ExecuteCommand[comm: comm, as: a, queue: dontQueue]; }; SELECT TerminalIO.RequestSelection[ label: "Input / Output", choice: LIST["output", "import", "include", "reload conditions", "chipmonk-output", " list imports", " directory"] ] FROM 1 => Forward[$OutputDesign]; 2 => Forward[$ImportADesign]; 3 => Forward[$IncludeADesign]; 4 => Forward[$CheckConditions]; 5 => Forward[$ChipmonkOutput]; 6 => Forward[$DisplayImports]; 7 => Forward[$DirectoryMenu]; ENDCASE => TerminalIO.WriteRope["skipped\n"]; EXITS userAbort => {TerminalIO.WriteRope["discarded\n"]} END; CDSequencer.ImplementCommand[$AddSelectLevel, AddSelectLevel]; CDSequencer.ImplementCommand[$DesignMenu, DesignMenu]; CDSequencer.ImplementCommand[$IOMenu, IOMenu]; CDSequencer.ImplementCommand[$DirectoryMenu, DirectoryMenu]; CDSequencer.ImplementCommand[$Coordinates, CoordinatesCommand]; CDSequencer.ImplementCommand[$Statistic, StatisticCommand]; END.