<> <> <> <> DIRECTORY CD, CDBasics, CDCellsInteractions, CDDirectory, CDOps, CDRepetitions, CDSequencer, Rope, TerminalIO; CDRepetitionCommands: CEDAR PROGRAM IMPORTS CDCellsInteractions, CDOps, CDBasics, CDRepetitions, CDSequencer, TerminalIO = BEGIN MakeRepetition: PROC [comm: CDSequencer.Command] = { ob: CD.Object; offset: CD.Position; count: INT; inst: CD.Instance; multiple: BOOL; TerminalIO.PutRope["make a repetition "]; [inst, multiple] _ CDOps.SelectedInstance[comm.design]; IF inst=NIL THEN {TerminalIO.PutRope["no selected object\n"]; RETURN}; count _ TerminalIO.RequestInt["number: "]; IF count<1 OR count>=LAST[NAT] THEN { TerminalIO.PutRope["bad number\n"]; RETURN }; IF count>=257 THEN { TerminalIO.PutRope["don't exagerate\n"]; RETURN }; IF multiple THEN { [done: multiple, cellInst: inst] _ CDCellsInteractions.CreateCellSelected[comm.design, FALSE]; IF NOT multiple OR inst=NIL THEN {TerminalIO.PutRope["not done\n"]; RETURN}; }; offset _ [comm.pos.x-comm.sPos.x, comm.pos.y-comm.sPos.y]; ob _ CDRepetitions.CreateRepetition[comm.design, inst.ob, count, offset, inst.trans.orient]; inst.ob _ ob; inst.trans.orient _ original; CDOps.RedrawInstance[comm.design, inst]; }; ChangeRepetition: PROC [comm: CDSequencer.Command] = { inst: CD.Instance = CDOps.TheInstance[comm.design, "change a repetition\n"]; IF inst#NIL THEN IF ~ISTYPE[inst.ob.specific, CDRepetitions.RepSpecific] THEN TerminalIO.PutRope[" selected ob not a repetition"] ELSE { offset: CD.Position = [comm.pos.x-comm.sPos.x, comm.pos.y-comm.sPos.y]; rp: CDRepetitions.RepSpecific = NARROW[inst.ob.specific]; CDOps.RedrawInstance[comm.design, inst]; inst.ob _ CDRepetitions.CreateRepetition[comm.design, rp.ob, rp.count, offset, CDBasics.ComposeOrient[rp.orientation, inst.trans.orient]]; inst.trans.orient _ original; CDOps.RedrawInstance[comm.design, inst, FALSE]; TerminalIO.PutRope[" done\n"] }; }; IncCount: PROC [comm: CDSequencer.Command] = { inst: CD.Instance = CDOps.TheInstance[comm.design, "inc count of a repetition\n"]; IF inst#NIL THEN IF ~ISTYPE[inst.ob.specific, CDRepetitions.RepSpecific] THEN TerminalIO.PutRope[" selected ob not a repetition"] ELSE { rptr: CDRepetitions.RepSpecific _ NARROW[inst.ob.specific]; newOb: CD.Object = CDRepetitions.CreateRepetition[comm.design, rptr.ob, rptr.count+1, rptr.offset, rptr.orientation]; IF newOb#NIL THEN inst.ob _ newOb; CDOps.RedrawInstance[comm.design, inst, FALSE]; }; }; DecCount: PROC [comm: CDSequencer.Command] = { inst: CD.Instance = CDOps.TheInstance[comm.design, "inc count of a repetition\n"]; IF inst#NIL THEN IF ~ISTYPE[inst.ob.specific, CDRepetitions.RepSpecific] THEN TerminalIO.PutRope[" selected ob not a repetition"] ELSE { newOb: CD.Object _ NIL; rptr: CDRepetitions.RepSpecific _ NARROW[inst.ob.specific]; IF rptr.count>1 THEN newOb _ CDRepetitions.CreateRepetition[comm.design, rptr.ob, rptr.count-1, rptr.offset, rptr.orientation]; CDOps.RedrawInstance[comm.design, inst]; IF newOb#NIL THEN inst.ob _ newOb }; }; <> <> <> <<--we make a list first, otherwise: directory changes while the enumeration>> <<>> <> <> <<};>> <<>> <> <<[] _ CDDirectory.Enumerate[design: comm.design, action: FindRepetitions];>> <> <> <> <> <> <> <<[] _ CDDirectory.Remove[design: comm.design, name: name, expectObject: list.first];>> <<[] _ CDDirectory.Rename[design: comm.design, object: rCell, newName: name];>> <> <> <> <<};>> <> <> <<};>> <<>> <<>> CDSequencer.ImplementCommand[$DrawRepetition, MakeRepetition]; CDSequencer.ImplementCommand[$ChangeRepetition, ChangeRepetition]; CDSequencer.ImplementCommand[$IncRepetition, IncCount]; CDSequencer.ImplementCommand[$DecRepetition, DecCount]; END.