DIRECTORY CD, CDBasics, CDCommandOps, CDExtras, CDMenus, CDOps, CDProperties, CDSequencer, Graphics, GraphicsToPress, IO, Real, Rope, TerminalIO; CDSimplePressImpl: CEDAR PROGRAM IMPORTS CD, CDBasics, CDCommandOps, CDExtras, CDMenus, CDOps, CDProperties, CDSequencer, Graphics, GraphicsToPress, IO, Real, TerminalIO = BEGIN fileNameBase: Rope.ROPE _ "///temp/temp"; abortPlot: REF BOOL = NEW[BOOL_FALSE]; debugContext: Graphics.Context_NIL; pageW: REAL _ 72*8.5-2; --points 0.216; meter pageH: REAL _ 72*11.0; --points 0.277; meter contextFilter: REF CD.ContextFilter = NEW[CD.ContextFilter_ALL[[ doit: TRUE, paintMode: Graphics.PaintMode[transparent], color: Graphics.black ]]]; normalsetUp: BOOL _ FALSE; ResetContextFilter: PROC [ignoreProperties: BOOL _ TRUE] = BEGIN normalsetUp _ ignoreProperties; FOR layer: CD.Layer IN CD.Layer DO contextFilter[layer].doit _ ignoreProperties; CDProperties.PutPropOnLayer[layer, $CDxSimplePress, NIL]; ENDLOOP; contextFilter[CD.backGround].doit _ FALSE; END; SetUpContextFilter: PROC [] = BEGIN normalsetUp _ FALSE; FOR layer: CD.Layer IN CD.Layer DO contextFilter[layer].doit _ (CDProperties.GetPropFromLayer[layer, $CDxSimplePress]=$doit) ENDLOOP; contextFilter[CD.backGround].doit _ FALSE; END; HardCopyCommand: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["HardCopy\n"]; IF CDCommandOps.CallWithResource[ProtectedHardCopy, comm, $CDSimplePressImpl, abortPlot].skipped THEN RETURN; IF ~abortPlot^ THEN TerminalIO.WriteRope[" (needs a press printer!, spruce does not work)\ndone\n"]; END; ToBox: PROC [r: CD.Rect] RETURNS [Graphics.Box] = INLINE { RETURN [[xmin: r.x1, xmax: r.x2, ymin: r.y1, ymax: r.y2]] }; ProtectedHardCopy: PROC [comm: CDSequencer.Command] = BEGIN nW: INT _ 1; --number of vertical stripes nH: INT _ 1; --number of horizontal stripes borderW, borderH: REAL; --border of page, in device coordinates insidePageW, insidePageH: REAL; --what fits in a page in device coordinates (points) designPageW, designPageH: CD.DesignNumber; --what fits in a page in designnumbers context: Graphics.Context; dr: CD.DrawRef; clip: CD.DesignRect; scale: REAL; IF ~normalsetUp THEN { TerminalIO.WriteRope["** SPECIAL COLORS\n"]; SetUpContextFilter[] }; SELECT TerminalIO.RequestSelection["Plot", LIST["complete design", "rectangle"]] FROM 2 => { clip _ CDBasics.ToRect[comm.pos, comm.sPos]; TerminalIO.WriteRope["plot rectangle\n"]; }; ENDCASE => { clip _ CDExtras.BoundingBox[comm.design]; TerminalIO.WriteRope["plot all\n"]; }; abortPlot^ _ FALSE; nW _ TerminalIO.RequestInt["How many rows? >"]; IF nW<1 OR nW>20 THEN { TerminalIO.WriteRope[" to bad\n"]; RETURN }; IF TerminalIO.UserSaysYes["border ?"] THEN borderH _ borderW _ 72*0.2 ELSE borderH _ borderW _ 0; insidePageW _ pageW-borderW; insidePageH _ pageH-borderH; designPageW _ (clip.x2-clip.x1)/nW+1; designPageH _ Real.Fix[insidePageH*((designPageW-1.0)/insidePageW)]; scale _ insidePageW/designPageW; nH _ (clip.y2-clip.y1+designPageH-1)/designPageH; TerminalIO.WriteRope[IO.PutFR[" printing %01g rows and %01g columns\n", IO.int[nW], IO.int[nH]]]; FOR nX: INT IN [0..nW) DO FOR nY: INT IN [0..nH) DO r: CD.DesignRect; fileName: Rope.ROPE _ IO.PutFR["%01g%01g%01g%01g.press", IO.rope[fileNameBase], IO.int[nX], IO.char['X], IO.int[nY] ]; IF abortPlot^ THEN RETURN; r.x1 _ clip.x1+nX*designPageW; r.x2 _ r.x1+designPageW; r.y1 _ clip.y1+nY*designPageH; r.y2 _ r.y1+designPageH; IF debugContext#NIL THEN context _ debugContext ELSE context _ GraphicsToPress.NewContext[fileName]; context.Translate[borderW, borderH]; context.Scale[scale, scale]; context.Translate[-r.x1, -r.y1]; context.ClipBox[ToBox[r]]; dr _ CD.CreateDrawRef[comm.design, context]; dr.minimalSize _ 0; dr.stopFlag _ abortPlot; dr.contextFilter _ contextFilter; dr.interestClip _ r; CDOps.DrawDesign[comm.design, dr]; IF context#debugContext THEN GraphicsToPress.Close[context]; TerminalIO.WriteRope[IO.PutFR[" ""%01g"" created\n", IO.rope[fileName]]]; ENDLOOP; ENDLOOP; END; Init: PROC = { ResetContextFilter[ignoreProperties: TRUE]; CDSequencer.ImplementCommand[a: $HardCopy, p: HardCopyCommand, queue: doQueue]; CDMenus.CreateEntry[menu: $HardCopyMenu, entry: "b&w press format", key: $HardCopy]; TerminalIO.WriteRope["HardCopy loaded (press)\n"]; }; Init[]; END. RCDSimplePressImpl.mesa Copyright c 1984, 1985 by Xerox Corporation. All rights reserved. Last Edited by: Jacobi, November 1, 1984 8:50:32 am PST Last Edited by: Jacobi, February 4, 1985 3:16:27 pm PST For comparison: old one-page code BEGIN insidePageW: REAL = pageW-borderW; insidePageH: REAL = pageH-borderH; scale _ MIN[insidePageW/(clip.x2-clip.x1), insidePageH/(clip.y2-clip.y1)] context.Translate[borderW, borderH]; context.Scale[scale, scale]; context.Translate[-clip.x1, -clip.y1]; context.ClipBox[ToBox[clip]]; END; --not re-entrant: using a global abort flag (abortPlot) ʘšœ™J™Jšœ Ïmœ7™BJ™7J™7—J˜šÏk ˜ Jšžœ˜Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ J˜—šÏbœžœž˜ Jšžœžœhžœžœ˜Š—Jšž˜J˜Jšœžœ˜)J˜Jš œ žœžœžœžœžœ˜&Jšœžœ˜#J˜Jšœžœ Ïc˜1Jšœžœ  ˜0J˜š œžœžœžœžœžœ˜@Jšœžœ˜ Jšœ+˜+Jšœ˜Jšœ˜—Jšœ žœžœ˜J˜šÏnœžœžœžœ˜:Jšž˜Jšœ˜š žœžœžœžœž˜"Jšœ-˜-Jšœ4žœ˜:Jšžœ˜—Jšœžœžœ˜*Jšžœ˜—J˜š¡œžœ˜Jšž˜Jšœžœ˜š žœžœžœžœž˜"JšœZ˜ZJšžœ˜—Jšœžœžœ˜*Jšžœ˜—J˜š¡œžœ˜3Jšž˜Jšœ$˜$Jšžœ_žœžœ˜mJšžœ žœS˜fJšžœ˜—J˜š ¡œžœžœžœžœ˜:Jšžœ3˜9Jšœ˜—Jšœ!™!šž™Jšœ žœ™#Jšœ žœ™#Jšœžœ>™IJšœ$™$Jšœ™Jšœ&™&Jšœ™Jšžœ™—J˜š¡œžœ˜5Jšœ7™7Jšž˜Jšœžœ ˜)Jšœžœ ˜+Jšœžœ '˜?Jšœžœ 4˜TJšœžœ &˜RJšœ˜Jšœžœ ˜Jšœžœ ˜Jšœžœ˜ šžœžœ˜Jšœ.˜.Jšœ˜Jšœ˜—šžœ%žœ"ž˜U˜Jšœ,˜,Jšœ)˜)J˜—šžœ˜ Jšœ)˜)Jšœ#˜#J˜——Jšœ žœ˜Jšœ/˜/šžœžœžœ˜Jšœ"˜"Jšž˜J˜—Jšžœ$žœ˜EJšžœ˜Jšœ˜Jšœ žœ˜Jšœ%˜%JšœD˜DJšœ ˜ Jšœ1˜1Jšœžœ2žœ žœ ˜bšžœžœžœ ž˜šžœžœžœ ž˜Jšœžœ ˜šœžœžœ!˜9Jšžœžœ žœ žœ˜:Jšœ˜—Jšžœ žœžœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšžœžœžœ˜/Jšžœ0˜4Jšœ$˜$Jšœ˜Jšœ ˜ Jšœ˜Jšœžœ%˜,Jšœ˜Jšœ˜Jšœ!˜!Jšœ˜Jšœ"˜"Jšžœžœ ˜