CDRepetitionCommands.mesa (part of Chipndale)
by Christian Jacobi July 11, 1983 3:42 pm
last edited Christian Jacobi November 2, 1983 4:06 pm
DIRECTORY
CD,
CDRepetitions,
TerminalIO,
CDSequencer,
CDApplications,
CDCells,
CDCallSpecific,
CDCommandOps,
CDOps,
CDOrient;
CDRepetitionCommands: CEDAR PROGRAM
IMPORTS CDCallSpecific, CDCommandOps, CDRepetitions, TerminalIO, CDSequencer, CDApplications, CDCells, CDOps, CDOrient =
BEGIN
HasSingleSelected: PROC [list: CD.ApplicationList] RETURNS [BOOLEAN] =
BEGIN
firstFound: BOOLEANFALSE;
FOR w: CD.ApplicationList ← list, w.rest WHILE w#NIL DO
IF w.first.selected THEN
IF firstFound THEN RETURN [FALSE]
ELSE firstFound ← TRUE;
ENDLOOP;
RETURN [firstFound]
END;
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;
ChangeRepetition: PROC [comm: CDSequencer.Command] =
BEGIN
app: CD.ApplicationPtr = CDCommandOps.TheApplication[comm, "change a repetition "];
IF app#NIL THEN
IF ~ISTYPE[app.ob.specificRef, CDRepetitions.RepPtr] THEN
TerminalIO.WriteRope["selected ob not a repetition"]
ELSE {
offset: CD.DesignPosition = [comm.pos.x-comm.sPos.x, comm.pos.y-comm.sPos.y];
rp: CDRepetitions.RepPtr = NARROW[app.ob.specificRef];
CDOps.DelayedRedraw[comm.design, CDApplications.ARectO[app]];
app.ob ← CDRepetitions.CreateRepetition[comm.design, rp.ob, rp.count, offset, CDOrient.ComposeOrient[rp.orientation, app.orientation]];
app.orientation ← CDOrient.original;
CDOps.DelayedRedraw[comm.design, CDApplications.ARectO[app], FALSE];
TerminalIO.WriteRope[" done\n"]
};
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;
CDSequencer.ImplementCommand[$DrawRepetition, MakeRepetition];
CDSequencer.ImplementCommand[$ChangeRepetition, ChangeRepetition];
CDSequencer.ImplementCommand[$TransformToCellS, TransformToCellS];
END.