CDRepetitionCommands.mesa (part of ChipNDale)
Copyright © 1983, 1984 by Xerox Corporation. All rights reserved.
by Christian Jacobi, July 11, 1983 3:42 pm
last edited Christian Jacobi, December 4, 1984 2:39:18 pm PST
DIRECTORY
CD,
CDApplications,
CDCallSpecific,
CDCells,
CDCommandOps,
CDDirectory,
CDMenus,
CDOps,
CDOrient,
CDRepetitions,
CDSequencer,
Rope,
TerminalIO;
CDRepetitionCommands: CEDAR PROGRAM
IMPORTS CDApplications, CDCallSpecific, CDCells, CDCommandOps, CDDirectory, CDMenus, CDOps, CDOrient, CDRepetitions, CDSequencer, Rope, TerminalIO =
BEGIN
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];
CDCommandOps.RedrawApplication[comm.design, app];
app.ob ← CDRepetitions.CreateRepetition[comm.design, rp.ob, rp.count, offset, CDOrient.ComposeOrient[rp.orientation, app.orientation]];
app.orientation ← CDOrient.original;
CDCommandOps.RedrawApplication[comm.design, 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;
AllRepetitionsToCells: PROC [comm: CDSequencer.Command] =
BEGIN
n: NAT ← 0;
repList: LIST OF CD.ObPtr ← NIL;
--we make a list first, otherwise: directory changes while the enumeration
FindRepetitions: CDDirectory.EachEntryAction =
-- PROC [name: Rope.ROPE, ob: CD.ObPtr] RETURNS [quit: BOOL�LSE]
BEGIN
WITH ob.specificRef SELECT FROM
rp: CDRepetitions.RepPtr => repList ← CONS[ob, repList];
ENDCASE => NULL
END;
TerminalIO.WriteRope["transform all repetitions to cells\n"];
[] ← CDDirectory.Enumerate[design: comm.design, action: FindRepetitions];
FOR list: LIST OF CD.ObPtr ← repList, list.rest WHILE list#NIL DO
name: Rope.ROPE ← CDDirectory.Name[list.first];
rCell: CD.ObPtr ← CDDirectory.Expand[list.first, comm.design, comm.design];
IF rCell=NIL THEN
TerminalIO.WriteRope[Rope.Cat["** ", name, " not transformed\n"]]
ELSE {
[] ← CDDirectory.Remove[design: comm.design, name: name, expectObject: list.first];
[] ← CDDirectory.Rename[design: comm.design, object: rCell, newName: name];
n ← n+1;
CDDirectory.ReplaceObject[design: comm.design, old: list.first, new: rCell];
TerminalIO.WriteRope[Rope.Cat[" cell ", CDDirectory.Name[rCell], " generated\n"]]
};
ENDLOOP;
TerminalIO.WriteInt[n]; TerminalIO.WriteRope[" repetitions transformed\n"];
END;
CDSequencer.ImplementCommand[$DrawRepetition, MakeRepetition];
CDSequencer.ImplementCommand[$ChangeRepetition, ChangeRepetition];
CDSequencer.ImplementCommand[$TransformToCellS, TransformToCellS];
CDSequencer.ImplementCommand[$AllRepetitionsToCells, AllRepetitionsToCells,, dontQueue]; --XXXXX
CDMenus.CreateEntry[$SpecialMenu, "ALL rep->cell", $AllRepetitionsToCells];
END.