DIRECTORY CD, CDBasics, CDDirectory, CDIO, CDOps, CDPDPlot, CDSequencer, CDViewer, CMos, CommandTool, Commander, Convert, ImagerPD, IO, Nectarine, PDFileWriter, PeachPrint, Rope, SymTab, ThisMachine, ViewerOps; CDPlotImpl: CEDAR PROGRAM IMPORTS CD, CDBasics, CDDirectory, CDIO, CDOps, CDPDPlot, CDSequencer, CDViewer, CommandTool, Commander, Convert, IO, Nectarine, PeachPrint, Rope, SymTab, ThisMachine, ViewerOps = BEGIN Printer: TYPE = REF PrinterRec; PrinterRec: TYPE = RECORD[ name: Rope.ROPE _ NIL, color: BOOL _ FALSE, iFace: {peach, tsetter} _ peach, ipType: PrinterType _ nil, deviceKey: ATOM _ NIL, device: REF CDPDPlot.DeviceDesc _ NIL ]; PageMode: TYPE = CDPDPlot.PageMode; PrinterType: TYPE = ImagerPD.PrinterType; thisMachine: Printer = NEW[ PrinterRec _ [name: ThisMachine.Name[], iFace: peach ] ]; doc: Rope.ROPE = " CDPlot Server Design Nx_1 Ny_1 -l load - just load for interactive use -b black and white => nectarine -e expand - do peach expand -k kill comment layer - big win for layouts -n no send -f fixFonts - good for layouts"; CDPlotProc: Commander.CommandProc = { ENABLE { ABORTED => GOTO Abort; PeachPrint.PupAborted => GOTO Abort }; design: CD.Design; printer: Printer; dName: Rope.ROPE; pName: Rope.ROPE; nn, nofNums: INT _ 0; xn, yn: INT _ 1; clip: CD.Rect _ [0, 0, 0, 0]; argv: CommandTool.ArgumentVector _ CommandTool.Parse[cmd]; load, exp, fixFonts, killCmnt, noSend: BOOL _ FALSE; color: BOOL _ TRUE; FOR ii: INT DECREASING IN [1..argv.argc) DO rope: Rope.ROPE _ CommandTool.ArgN[cmd, ii]; SELECT rope.Fetch[0] FROM '- => SELECT rope.Fetch[1] FROM 'l, 'L => load _ TRUE; -- just load for interactive use 'b, 'B => color _ FALSE; 'e, 'E => exp _ TRUE; 'k, 'K => killCmnt _ TRUE; 'n, 'N => noSend _ TRUE; 'f, 'F => fixFonts _ TRUE; ENDCASE; IN ['0..'9] => { temp: INT _ MAX[0, Convert.IntFromRope[rope]]; SELECT nofNums FROM 0 => {xn _ MIN[20, MAX[1, Convert.IntFromRope[rope]]]}; 1 => {yn _ xn; xn _ MIN[20, MAX[1, Convert.IntFromRope[rope]]]}; 2 => {nn _ MIN[xn*yn-1, MAX[0, Convert.IntFromRope[rope]]]}; ENDCASE => ERROR; nofNums _ nofNums +1}; ENDCASE => {pName _ dName; dName _ rope} ENDLOOP; IF NOT IsPrinterName[pName] AND IsPrinterName[dName] THEN {temp: Rope.ROPE _ dName; dName _ pName; pName _ temp}; printer _ GetPrinter[pName: pName, color: color]; IF printer=NIL THEN {cmd.out.PutF["Printer: %g not registered\n", IO.rope[pName]]; RETURN}; color _ printer.color; IF exp THEN [] _ CommandTool.DoCommand["PeachExpand", cmd]; [design, clip] _ GetDesignClip[dName, cmd]; IF design=NIL THEN {cmd.out.PutF["Design: %g not found\n", IO.rope[dName]]; RETURN}; CDSequencer.ExecuteCommand[$UnqueuedLoadAllImps, design, dontQueue]; IF design#NIL AND nofNums=3 THEN {clip _ GetNthOfXYSections[nn, xn, yn, clip]; xn_yn_1}; IF load OR design=NIL THEN {cmd.out.PutRope["CDPlot loaded\n"]; RETURN}; IF color THEN { [] _ CommandTool.DoCommand["STPServer start", cmd]; [] _ CommandTool.DoCommand["Install CDPDPlot", cmd]; printer.device.contextFilter[CD.commentLayer] _ ~killCmnt; FOR yindex: INT IN [0..yn) DO ENABLE Error => {cmd.out.PutRope[msg]; ERROR ABORTED}; yClip: CD.Rect _ GetNthOfXYSections[yindex, 1, yn, clip]; fileName: Rope.ROPE _ PeachPrint.FileName[long, primary, 1, NIL]; task: REF CDPDPlot.TaskDesc; IF xn > 1 THEN fileName _ fileName.Substr[0, fileName.Length[]-1]; task _ NEW[CDPDPlot.TaskDesc _ [ design: design, dd: printer.device, fileName: fileName, clip: yClip, substituteFonts: ~fixFonts, scale: -1, abort: NIL, strips: xn ]]; CDPDPlot.Plot[task]; IF ~noSend THEN FOR xx: INT IN [1..xn] DO IF exp THEN { PrintPD[thisMachine, primary, xx, cmd]; PrintPD[printer, secondary, xx, cmd]} ELSE PrintPD[printer, primary, xx, cmd] ENDLOOP ENDLOOP} ELSE { [] _ CommandTool.DoCommand["Install Nectarine", cmd]; FOR yindex: INT IN [0..yn) DO FOR xindex: INT IN [0..xn) DO index: INT _ yindex*xn + xindex; useClip: BOOL _ xn>1 OR yn>1; xyClip: CD.Rect _ GetNthOfXYSections[index, xn, yn, clip]; firstNm: Rope.ROPE _ Nectarine.DoInterpress[ design: design, chipNDaleWindow: xyClip, clip: useClip, onlySel: FALSE, singleLayer: FALSE, layer: CD.undefLayer, lambda: 0.0, firstPage: TRUE, lastPage: TRUE, abortFlag: NIL].masterName; secondNm: Rope.ROPE _ PeachPrint.FileName[long, secondary, index+1, ".pd"]; line: Rope.ROPE _ Rope.Cat["InterpressToPD ", secondNm, " _ ", firstNm]; [] _ CommandTool.DoCommand [Rope.Cat[line, " ", printerNames[printer.ipType] ], cmd]; IF ~noSend THEN PrintPD[printer, secondary, 1, cmd]; ENDLOOP ENDLOOP}; EXITS Abort => {cmd.out.PutF["aborted\n"]; RETURN[$Failure]; } }; ParseName: PROC[name: Rope.ROPE] RETURNS[root, ext: Rope.ROPE] = { index: INT _ Rope.Find[name, "."]; SELECT index FROM -1 => RETURN[name, NIL]; 0 => RETURN[NIL, NIL]; name.Length[]-1 => RETURN[Rope.Substr[name, 0, index], NIL] ENDCASE => RETURN[Rope.Substr[name, 0, index], Rope.Substr[name, index+1]]}; GetDesignClip: PROC [name: Rope.ROPE, cmd: Commander.Handle] RETURNS [design: CD.Design, clip: CD.Rect] = { inst: CD.Instance; root, ext: Rope.ROPE; [root, ext] _ ParseName[name]; design _ GetDesign[root, cmd]; IF design=NIL THEN RETURN[NIL, [0,0,0,0]]; clip _ CDOps.BoundingBox[design]; IF Rope.Length[ext]=0 OR Rope.Equal[ext, "dale", FALSE] THEN RETURN[design, clip]; inst _ GetTopDesignObjInst[design, ext]; IF inst=NIL THEN RETURN[NIL, [0,0,0,0]]; clip _ CDBasics.MapRect[CD.InterestRect[inst.ob], inst.trans]; RETURN[design, clip]}; GetTopDesignObjInst: PROC [design: CD.Design, name: Rope.ROPE] RETURNS[inst: CD.Instance]={ object: CD.Object _ CDDirectory.Fetch[design, name].object; IF object=NIL THEN RETURN[NIL]; FOR l: CD.InstanceList _ CDOps.InstList[design], l.rest WHILE l#NIL DO IF l.first.ob=object THEN RETURN[l.first]; ENDLOOP; RETURN[NIL]}; GetDesign: PROC [name: Rope.ROPE, cmd: Commander.Handle] RETURNS [design: CD.Design] = { design _ FindDesignViewer[name]; IF design#NIL THEN RETURN[design]; IF Rope.Length[name]=0 THEN RETURN[NIL]; design _ CDIO.ReadDesign[name]; IF design#NIL THEN RETURN[design]; design _ CDIO.ReadDesign[name] }; FindDesignViewer: PROC[name: Rope.ROPE] RETURNS[design: CD.Design_NIL] = { Checker: ViewerOps.EnumProc ~ {design _ CDViewer.DesignOf[v]; RETURN[design=NIL]}; IF name.Length[]#0 THEN RETURN[CDViewer.FindDesign[name]]; ViewerOps.EnumerateViewers[Checker] }; IsPrinterName: PROC [pName: Rope.ROPE] RETURNS[BOOL] = {RETURN[ SymTab.Fetch[printerTable, PrinterKey[pName, TRUE]].found OR SymTab.Fetch[printerTable, PrinterKey[pName, FALSE]].found ]}; PrinterKey: PROC [pName: Rope.ROPE, color: BOOL] RETURNS[Rope.ROPE] = {RETURN[Rope.Cat[(IF color THEN "+" ELSE "-"), pName]]}; GetPrinter: PROC [pName: Rope.ROPE, color: BOOL] RETURNS [printer: Printer] = { found: BOOL; val: REF; IF pName#NIL THEN { [found, val] _ SymTab.Fetch[printerTable, PrinterKey[pName, color]]; IF ~found THEN color _ ~color; [found, val] _ SymTab.Fetch[printerTable, PrinterKey[pName, color]]; IF ~found THEN RETURN[NIL]; printer _ NARROW[val]} ELSE printer _ IF color THEN defaultColorPrinter ELSE defaultBWPrinter; IF color AND printer.device=NIL THEN printer.device _ CDPDPlot.MakeDevice[printer.deviceKey]}; GetNthOfXYSections: PROC [n, x, y: INT, clip: CD.Rect] RETURNS[CD.Rect] = { pos: CD.Position; size: CD.Position _ CDBasics.SizeOfRect [clip]; size.y _ (size.y + (y-1))/y; size.x _ (size.x + (x-1))/x; pos _ [clip.x1 + size.x * (n MOD x), clip.y1 + size.y * (n / x)]; RETURN[CDBasics.RectAt[pos, size]]}; PrintPD: PROC [printer: Printer, order: PeachPrint.FileNameOrder, index: INT, cmd: Commander.Handle] = { file: Rope.ROPE _ PeachPrint.FileName[long, order, index, ".pd"]; IF printer.iFace=tsetter THEN []_CommandTool.DoCommand[Rope.Cat["Tsetter ", printer.name, " ", file], cmd] ELSE []_CommandTool.DoCommand[Rope.Cat["PeachPrint ", printer.name, " ", file], cmd]}; printerNames: ARRAY PrinterType OF Rope.ROPE _ [ nil: NIL, raven300: "Raven300", raven384: "Raven384", o3: NIL, plateMaker: "PlateMaker", o5: NIL, puffin: "Puffin", colorVersatec: "ColorVersatec", versatec: "Versatec", color400: "Color400", c150: "C150", d4020: "d4020", bw400: "bw400", o13: NIL, o14: NIL, o15: NIL ]; Error: ERROR [msg: Rope.ROPE] = CODE; Init: PROC = { Store: PROC[printerRec: PrinterRec] = { printer: Printer _ NEW[PrinterRec _ printerRec]; [] _ SymTab.Store[printerTable, PrinterKey[printer.name, printer.color], printer]}; colorKey: Rope.ROPE = PrinterKey["Sleepy", col]; bwKey: Rope.ROPE = PrinterKey["Sleepy", bw]; col: BOOL = TRUE; bw: BOOL = FALSE; Store[["Sleepy", col, peach, colorVersatec, $Versatec ]]; Store[["Sleepy", bw, peach, versatec ]]; Store[["MtFuji", col, peach, color400, $Color400 ]]; Store[["MtFuji", bw, peach, bw400 ]]; Store[["Stinger", bw, tsetter, raven384 ]]; defaultColorPrinter _ NARROW[SymTab.Fetch[printerTable, colorKey ].val]; defaultBWPrinter _ NARROW[SymTab.Fetch[printerTable, bwKey ].val]}; printerTable: SymTab.Ref _ SymTab.Create[case: FALSE]; defaultColorPrinter: Printer; defaultBWPrinter: Printer; Init[]; Commander.Register[key:"CDPlot", proc: CDPlotProc, doc: doc]; END. hCDPlotImpl.mesa Don Curry May 2, 1988 1:50:14 pm PDT Want to do the commnad line version (above) in order to not load the IP stuff unless needed. See: [Cedar]InterpressTools>PrintFileConvertImpl.InterpressToPDAction InterpressToPD: PROC [iName: ROPE, oName: ROPE, printerType: ImagerPD.PrinterType, cmd: Commander.Handle] ~ { printerTypePPD: ARRAY ImagerPD.PrinterType OF REAL _ [ nil: 5, raven300: 6, raven384: 6, o3: 5, plateMaker: 9, o5: 5, puffin: 6, colorVersatec: 5, versatec: 5, color400: 7, c150: 4, o11: 5, o12: 5, o13: 5, o14: 5, o15: 5 ]; realPPD: REAL ~ printerTypePPD[printerType]; interpress: Interpress.OpenMaster ~ Interpress.Open[iName, Log, cmd]; pd: ImagerPD.PD ~ ImagerPD.CreateFromPrinterType[oName, printerType, NIL, NIL, realPPD]; FOR i: INT IN [0..interpress.pages) DO action: PROC [context: Imager.Context] ~ {Interpress.DoPage[master: interpress, context: context, page: i+1]}; cmd.out.PutF[" [%g", IO.int[i+1]]; ImagerPD.DoPage[pd: pd, action: action, pixelUnits: FALSE]; cmd.out.PutChar[']]; ENDLOOP; cmd.out.PutChar[' ]; ImagerPD.Close[pd] }; Ê 6˜šœ™J™$—J˜šÏk ˜ Jšœœ[œL˜È—J˜šœ œ˜JšœœKœ?˜³—Jš˜J™JšÏbœœœ ˜ šž œœœ˜Jšœ œœ˜Jšœ œ œ˜Jšœ%˜%Jšœ˜Jšœ˜Jšœ œ˜)—Jšœ œ˜$Jšœœ˜*J˜Jšœœ;˜UJšœ œë˜ùJ˜šœ%˜%šœ˜Jšœœ˜Jšœœ ˜&—Jšœ œ˜Jšœ˜Jšœœ˜Jšœœ˜Jšœ œ˜Jšœ œ˜Jšœ œ˜ Jšœ=˜=Jšœ'œœ˜4Jšœœœ˜š œœ œœ˜+Jšœ œ˜,šœ˜šœœ˜JšœœÏc ˜8Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœ˜—šœ˜Jšœœœ˜.šœ ˜Jšœ œœ!˜:Jšœœœ!˜AJšœ œ œ!˜>Jšœœ˜Jšœ˜——Jšœ"œ˜1——šœœœ˜9Jšœ œ'˜7—Jšœ1˜1šœ œ˜Jšœ?œ˜G—Jšœ˜Jšœœ0˜;Jšœ+˜+Jš œœœ)œœ˜TJšœD˜DJšœœœ œ8˜XJš œœœœ&œ˜Hšœ˜šœ˜Jšœ3˜3Jšœ4˜4Jšœœ˜:šœ œœ ˜Jšœ!œœ˜6Jšœœ0˜9Jšœœ.˜AJšœœ˜Jšœœ4˜Bšœœ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ œ˜Jšœ˜—Jšœ˜š œ œœœœ ˜)šœ˜šœ˜Jšœ(˜(Jšœ'˜'—š˜Jšœ"˜"—Jš˜——Jšœ˜——šœ˜Jšœ6˜6šœ œœ ˜šœ œœ ˜Jšœœ˜"Jšœ œ œ˜Jšœ œ0˜;šœœ˜-Jšœ˜Jšœ˜Jšœ˜Jšœ œ˜Jšœœ˜Jšœ œ ˜Jšœ˜Jšœœ˜Jšœ œ˜Jšœ œ ˜—Jšœœ8˜KJšœ œ:˜Kšœ˜Jšœ;˜;—Jšœ œ%˜4Jšœœ˜————Jšœ&œ˜A—J˜š Ïn œœ œœœ˜BJšœœ˜"šœ˜Jšœ œœ˜Jšœ œœœ˜Jšœœœ˜;Jšœœ;˜OJ˜——š  œœ œ˜Jšœ˜—J˜š  œœ œœœœ ˜[Jšœœ1˜;Jš œœœœœ˜š œœ/œœ˜FJšœœœ œ˜3—Jšœœ˜ —J˜š  œœ œ˜8Jšœ œ ˜Jšœ ˜ Jšœœœœ ˜"Jšœœœœ˜(Jšœ œ˜Jšœœœœ ˜"Jšœ œ˜!—J˜š  œœ œœ œœ˜JJšœ>œœ˜RJšœœœ˜:Jšœ&˜&—J˜š   œœœœœ˜6šœœ˜Jšœ-œ˜9Jš˜Jšœ-œ ˜>——J˜š   œœœ œœœ˜EJš œœ œœœ˜8—J˜š  œœœ œ˜0Jšœ˜Jšœœ˜ Jšœœ˜ šœ˜ šœ˜JšœD˜DJšœœ˜JšœD˜DJšœœœœ˜Jšœ œ˜—Jšœ œœœ˜G—šœœ˜Jšœ:˜>——J˜š  œœ œœœœ ˜KJšœœ ˜Jšœœ(˜0Jšœ˜Jšœ˜Jšœœ!˜AJšœ˜$—J˜š œœ<œ˜MJšœ˜Jšœ œ2˜Ašœ˜JšœN˜RJšœR˜V——J˜Jšœ\™\Jšœ@ œ™Tš œ™Jšœœ œ?™Xšœœœœ™6Jšœ0™0Jšœ6™6Jšœ1™1Jšœ*™*—Jšœ œ™-JšœE™Ešœœ™Jšœ3œœ ™F—šœœœ™&šœœ™)JšœE™E—Jšœœ ™"Jšœ4œ™;J™Jšœ™—J™Jšœ™J™—šœœ œœ˜0Jšœœ˜ Jšœ˜Jšœ˜Jšœœ˜ Jšœ˜Jšœœ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœœ˜ Jšœœ˜ Jšœœ˜—J˜Jšœœ œœ˜%J˜š œœ˜š œœ˜'Jšœœ˜0JšœS˜S—Jšœœ˜0Jšœ œ˜,Jšœœœ˜Jšœœœ˜Jšœ:˜:Jšœ.˜.Jšœ7˜7Jšœ,˜,Jšœ1˜1Jšœœ,˜HJšœœ+˜D—J˜Jšœ2œ˜:Jšœ˜Jšœ˜J˜Jšœ˜J˜Jšœ=˜=J™Jšœ˜—…—$4¼