CDRepetitionCommands:
CEDAR
PROGRAM
IMPORTS CDCallSpecific, CDRepetitions, TerminalIO, CDSequencer, CDApplications, CDCells, CDOps =
MakeRepetition:
PROC [comm: CDSequencer.Command] =
BEGIN
sel: CD.ApplicationList;
ob: CD.ObPtr;
offset, location: CD.DesignPosition;
count: INT;
first: CD.ApplicationPtr;
multiple: BOOL;
TerminalIO.WriteRope["make a repetition "];
[first, multiple] ← CDOps.SelectedApplication[comm.design];
IF first=NIL THEN {TerminalIO.WriteRope["no selected object\n"]; RETURN};
count ← TerminalIO.RequestInt["number: "];
IF count<1
OR count>=
LAST[
NAT]
THEN
{TerminalIO.WriteRope["bad number\n"]; RETURN};
IF count>=257
THEN
{TerminalIO.WriteRope["don't exagerate\n"]; RETURN};
IF multiple
THEN {
[done: multiple, cellOb: ob] ← CDCells.CreateCellSelected[comm.design, "-dummy"];
IF NOT multiple THEN {TerminalIO.WriteRope["not done\n"]; RETURN};
};
[selected: sel, others: comm.design.actual.first.specific.contents] ←
CDApplications.SplitSelected[comm.design.actual.first.specific.contents];
IF sel.first=NIL OR sel.rest#NIL THEN ERROR; -- therefore sel#NIL !
offset ← [comm.pos.x-comm.sPos.x, comm.pos.y-comm.sPos.y];
ob ← CDRepetitions.CreateRepetition[comm.design, sel.first.ob, count, offset, sel.first.orientation];
location ← sel.first.location;
IF offset.x<0 THEN location.x ← location.x+(count-1)*offset.x;
IF offset.y<0 THEN location.y ← location.y+(count-1)*offset.y;
CDOps.AddAnObject[comm.design, ob, location, CDOrient.original];
END;
TransformToCellS:
PROC [comm: CDSequencer.Command] =
BEGIN
n: NAT;
TerminalIO.WriteRope["transform to cell\n"];
n ← CDCallSpecific.CallForSelected[comm.design, $TransformToCell];
TerminalIO.WriteInt[n]; TerminalIO.WriteRope[" objects transformed\n"];
END;