DIRECTORY ViewerClasses, Rope, Menus, IO, Convert, ViewerIO, ViewerTools, ViewerOps, TypeScript, Imager, ImagerColor, ImagerPath, AlgebraClasses, Points, BigRats, RatIntervals, Variables, DistribPolys, Polynomials, AlgebraicNumbers, ExtensionFields, Formulas, QETypes, QEIO, Cad2D, Cads, Graphs, GraphOps; QEIOTestMain: CEDAR PROGRAM IMPORTS IO, Menus, ViewerIO, ViewerTools, ViewerOps, Convert, TypeScript, QEIO, Cad2D, Imager, ImagerColor, Cads, GraphOps SHARES Imager = BEGIN OPEN AC: AlgebraClasses, PTS: Points, BR: BigRats, RI: RatIntervals, VARS: Variables, DP: DistribPolys, POL: Polynomials, AN: AlgebraicNumbers, EF: ExtensionFields, QFF: Formulas, QET: QETypes, QEIO; SEGMENTWIDTH: REAL = 2.; -- width of segment portion in edge drawing Cad2DViewer: TYPE = ViewerClasses.Viewer; Cad2DViewerData: TYPE = REF Cad2DViewerDataRec; Cad2DViewerDataRec: TYPE = RECORD [ x, y: REAL _ 0.0, -- origin for plot scale: REAL _ 100.0, -- current scale for Imager cad2D: QET.Cad _ NIL ]; cad2DViewer: Cad2DViewer; ts: TypeScript.TS; -- the primary typescript in, out: IO.STREAM; -- global variables for log writing dimension: NAT; cad: QET.Cad _ NIL; SetDimension: Menus.MenuProc = { dimension _ Convert.CardFromRope[ViewerTools.GetSelectionContents[] ]; out.PutF["Dimension = %g\n\n", IO.card[dimension] ]; }; SetCadFromFile: Menus.MenuProc = { cad2DViewerData: Cad2DViewerData _ NARROW[cad2DViewer.data]; cad _ CadFileFromRope[ViewerTools.GetSelectionContents[] ]; cad2DViewerData.cad2D _ GetInducedCad[cad, 2]; dimension _ cad.dimension; WriteCadFile[cad, out]; }; Components: Menus.MenuProc = { edgePredicate: GraphOps.EdgePredicate ~ { cell1: QET.Cell _ NARROW[v.rep]; cell2: QET.Cell _ NARROW[w.rep]; RETURN[cell1.basisSignature.structure.class.equal[cell1.basisSignature, cell2.basisSignature] ]; }; inducedCad: QET.Cad _ QEIO.GetInducedCad[cad, dimension]; numComponents: CARDINAL _ GraphOps.DetermineComponents[cad.abstractGraph, Undirected, edgePredicate]; clusters: QET.SignedRegionSeq _ Cads.ExtractClusters[inducedCad, numComponents]; QEIO.WriteSignedRegionSeq[clusters, out]; }; SetCad: Menus.MenuProc = { cad2DViewerData: Cad2DViewerData _ NARROW[cad2DViewer.data]; cad _ CadFromRope[ViewerTools.GetSelectionContents[] ]; cad2DViewerData.cad2D _ QEIO.GetInducedCad[cad, 2]; dimension _ cad.dimension; WriteCad[cad, out]; }; SetCoveringSets: Menus.MenuProc = { CoveringSetsFromRope[ViewerTools.GetSelectionContents[], cad]; WriteCadCoveringSets[cad, out]; }; SetAdjacencies: Menus.MenuProc = { AdjacenciesFromRope[ViewerTools.GetSelectionContents[], cad]; WriteCadAdjacencies[cad, out]; }; DisplayCad2D: Menus.MenuProc = { ViewerOps.PaintViewer[viewer: cad2DViewer, hint: client, whatChanged: NIL, clearClient: TRUE]; }; Zoom: Menus.MenuProc = { selfData: Cad2DViewerData _ NARROW[cad2DViewer.data]; IF mouseButton=red THEN { selfData.scale _ selfData.scale*2; selfData.x _ selfData.x - (1.0 / selfData.scale) * 300.0; selfData.y _ selfData.y - (1.0 / selfData.scale) * 350.0 } ELSE { selfData.x _ selfData.x + (1.0 / selfData.scale) * 300.0; selfData.y _ selfData.y + (1.0 / selfData.scale) * 350.0; selfData.scale _ selfData.scale/2 }; ViewerOps.PaintViewer[viewer: cad2DViewer, hint: client, whatChanged: NIL, clearClient: TRUE]; }; Horizontal: Menus.MenuProc = { selfData: Cad2DViewerData _ NARROW[cad2DViewer.data]; IF mouseButton=red THEN selfData.x _ selfData.x - (1.0 / selfData.scale) * 100.0 ELSE selfData.x _ selfData.x + (1.0 / selfData.scale) * 100.0; ViewerOps.PaintViewer[viewer: cad2DViewer, hint: client, whatChanged: NIL, clearClient: TRUE]; }; Vertical: Menus.MenuProc = { selfData: Cad2DViewerData _ NARROW[cad2DViewer.data]; IF mouseButton=red THEN selfData.y _ selfData.y + (1.0 / selfData.scale) * 100.0 ELSE selfData.y _ selfData.y - (1.0 / selfData.scale) * 100.0; ViewerOps.PaintViewer[viewer: cad2DViewer, hint: client, whatChanged: NIL, clearClient: TRUE]; }; InitCad2DViewer: ViewerClasses.InitProc -- [self: ViewerClasses.Viewer] -- = { self.data _ NEW[Cad2DViewerDataRec _ [ x: 8.0, y: 7.0, scale: 50.0 ]]; self.name _ "Cad2DViewer"; }; PaintCad2DViewer: ViewerClasses.PaintProc = { DoIt: PROC = { dotWidth: REAL _ 2.0 / selfData.scale ; segmentWidth: REAL _ 10.0 / selfData.scale ; context.ScaleT[selfData.scale]; context.TranslateT[ [selfData.x, selfData.y] ]; Cad2D.DisplayCad[selfData.cad2D, context, dotWidth, segmentWidth]; }; selfData: Cad2DViewerData _ NARROW[self.data]; context.SetColor[ImagerColor.ColorFromAtom[$Black]]; SELECT whatChanged FROM NIL => context.DoSaveAll[DoIt]; ENDCASE => ERROR; }; RegisterCad2DViewerClass: PROC ~ { menu: Menus.Menu _ Menus.CreateMenu[1]; cad2DViewerClass: ViewerClasses.ViewerClass; Menus.AppendMenuEntry[menu:menu, entry:Menus.CreateEntry [name:"Zoom ", proc: Zoom], line:0]; Menus.AppendMenuEntry[menu:menu, entry:Menus.CreateEntry [name:"Horizontal ", proc: Horizontal], line:0]; Menus.AppendMenuEntry[menu:menu, entry:Menus.CreateEntry [name:"Vertical ", proc: Vertical], line:0]; cad2DViewerClass _ NEW[ViewerClasses.ViewerClassRec _ [ flavor: $Cad2DViewer, init: InitCad2DViewer, paint: PaintCad2DViewer, menu: menu ]]; ViewerOps.RegisterViewerClass[flavor: $Cad2DViewer, class: cad2DViewerClass]; }; ts _ TypeScript.Create[info: [name: "QE IO Test" ] ]; Menus.ChangeNumberOfLines[menu: ts.menu, newLines: 2]; Menus.AppendMenuEntry[menu: ts.menu, entry:Menus.CreateEntry [name:"DisplayCad2D", proc: DisplayCad2D], line: 0]; Menus.AppendMenuEntry[menu: ts.menu, entry:Menus.CreateEntry [name:"Cad", proc: SetCad], line: 0]; Menus.AppendMenuEntry[menu: ts.menu, entry:Menus.CreateEntry [name:"CoveringSets", proc: SetCoveringSets], line: 0]; Menus.AppendMenuEntry[menu: ts.menu, entry:Menus.CreateEntry [name:"Adjacencies", proc: SetAdjacencies], line: 0]; Menus.AppendMenuEntry[menu: ts.menu, entry:Menus.CreateEntry [name:"CadFile", proc: SetCadFromFile], line: 1]; Menus.AppendMenuEntry[menu: ts.menu, entry:Menus.CreateEntry [name:"Dimension", proc: SetDimension], line: 0]; Menus.AppendMenuEntry[menu: ts.menu, entry:Menus.CreateEntry [name:"Components", proc: Components], line: 1]; [in: in, out: out] _ ViewerIO.CreateViewerStreams[name: "QE IO Test",viewer: ts]; RegisterCad2DViewerClass[]; cad2DViewer _ ViewerOps.CreateViewer[flavor: $Cad2DViewer, info: [iconic:TRUE, column: color] ]; END. ŽQEIOTestMain.mesa Last Edited by: Arnon, June 20, 1985 4:46:23 pm PDT Commander, Process, timesRomanBI: Imager.Font ~ ImagerFont.Scale[ImagerFont.Find["xerox/pressfonts/timesroman-brr"], 10.]; --- why does scale of 10. work? cellIndex: QET.CellIndex; SetCellIndex: Menus.MenuProc = { cellIndex _ CellIndexFromRope[ViewerTools.GetSelectionContents[], dimension]; WriteCellIndex[cellIndex, out]; }; User specifies polynomials with respect to which to cluster by (*,*,@,*,*,@) tuples (@ is new FormulaOperators.Op). [self: Viewer, context: Imager.Context, whatChanged: REF, clear: BOOL] See ImagerInterpress to expand to write Interpress master, /indigo/peach for how to use Versatec context.ScaleT[0.0254/72]; -- conversion from meters to inches not needed???? Paint: ViewerClasses.PaintProc = { [self: Viewer, context: Imager.Context, whatChanged: REF, clear: BOOL] See ImagerInterpress to expand to write Interpress master, /indigo/peach for how to use Versatec PlotFolium: PROC = { traj: Imager.Trajectory; context.ScaleT[selfData.scale]; context.TranslateT[ [selfData.x, selfData.y] ]; traj _ ImagerPath.MoveTo[ [1.587, 1.260] ]; traj _ ImagerPath.LineTo[traj, [1.562, 1.090] ]; traj _ ImagerPath.LineTo[traj, [-0.875, 0.249] ]; traj _ ImagerPath.LineTo[traj, [-0.906, 0.267] ]; traj _ ImagerPath.LineTo[traj, [-0.937, 0.284] ]; traj _ ImagerPath.LineTo[traj, [-0.969, 0.303] ]; Imager.MaskStrokeTrajectory[context, traj ]; traj _ ImagerPath.MoveTo[ [1.587, 1.260] ]; traj _ ImagerPath.LineTo[traj, [1.562, 1.402] ]; traj _ ImagerPath.LineTo[traj, [2.469, -3.434] ]; Imager.MaskStrokeTrajectory[context, traj ]; }; selfData: Cad2DViewerData _ NARROW[self.data]; context.ScaleT[0.0254/72]; -- conversion from meters to inches not needed???? context.SetStrokeWidth[SEGMENTWIDTH/ selfData.scale]; context.SetColor[ImagerColor.ColorFromAtom[$Black]]; SELECT whatChanged FROM NIL => context.DoSaveAll[PlotFolium]; ENDCASE => ERROR; }; notify: Notify, tipTable: TIPUser.InstantiateNewTIPTable["Plot.tip"], Menus.AppendMenuEntry[menu: ts.menu, entry:Menus.CreateEntry [name:"CellIndex", proc: SetCellIndex], line: 0]; Κ@˜šœ™J™3J™—šΟk ˜ Jšœ ™ Jšœ™Jšœ˜Jšœ˜Jšœ˜Icodešœ˜K˜KšœΟc˜ K˜ Kšœ ˜ Kšœ ˜ Jšœ˜Jšœ ˜ Jšœ ˜ J˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜J˜Jšœ˜J˜J˜ J˜—InamešΠbx œœ˜šœœs˜~Jšœ ˜—Jšœœœœ œ œœ œœœœœ œ œ˜ΝJ˜Jš œœž+˜DKšœgž™†J˜Jšœ œ˜)Jšœœœ˜/šœœœ˜#Jšœœž˜$Jšœœ ž˜1Jšœœ˜Jšœ˜—šœ˜J˜—Kšœœž˜,Jšœ œœž#˜7Jšœ œ˜Jšœ œ ™Jšœœœ˜J˜šΟn œ™ IdefaultšœM™MJšœ™J™J™—š  œ˜ MšœF˜FJšœœ˜4J˜J˜—š œ˜"Jšœ#œ˜=Mšœ;˜;Mšœ.˜.Mšœ˜Jšœ˜J˜J˜—š  œ˜Jšžt™tšœ)˜)Jšœœœ˜ Jšœœœ˜ JšœZ˜`J˜—Jšœ œœ˜9Jšœœ  œ/˜eJšœ œ œ˜PJšœ%˜)J˜J˜—š œ˜Jšœ#œ˜=Mšœ7˜7Mšœ3˜3Mšœ˜Jšœ˜J˜J˜—š œ˜#Mšœ>˜>Mšœ˜J˜J˜—š œ˜"Mšœ=˜=Mšœ˜J˜J˜—š  œ˜ JšœFœœ˜^J˜—J˜š œ˜Jšœœ˜6šœœ˜Jšœ"˜"Jšœ9˜9Jšœ8˜8J˜—šœ˜Jšœ9˜9Jšœ9˜9Jšœ!˜!J˜—JšœFœœ˜^J˜J˜—š  œ˜Jšœœ˜6šœœ:˜UJšœ9˜9—JšœFœœ˜^J˜J˜—š œ˜Jšœœ˜6šœœ:˜UJšœ9˜9—JšœFœœ˜^J˜J˜—š œΠck#œ˜Ošœ œ˜&JšœΟfœ˜Jšœ’˜Jšœ ˜ Jšœ˜—J˜J˜—š œ˜-Jšœ5œ œ™FJ™`š œœ˜Jšœ œ˜'Jšœœ˜,Jšœ˜Jšœ/˜/JšœB˜BJ˜—Jšœœ ˜.Jšœž2™NJšœ4˜4šœ ˜Jšœ˜Jšœœ˜—J˜J™—š œ™"Jšœ5œ œ™FJ™`š  œœ™Jš’œ™Jšœ™Jšœ  œ™/J™Jš’Θ™ΘJšœ%’œ™,J™Jš’£™£Jšœ%’œ™,J™J™—Jšœœ ™.JšœN™NJšœ œ™5Jšœ4™4šœ ™Jšœ"™%Jšœœ™—J™J™—š œœ˜"Jšœ'˜'Jšœ,˜,Jšœ]˜]Jšœi˜iJšœe˜ešœœ!˜7J˜Jšœ˜J™Jšœ5™5Jšœ˜J˜ J˜—JšœM˜MJ˜J™—Kšœ5˜5Jšœ6˜6Jšœq˜qJšœb˜bJšœt˜tJšœr˜rJšœn™nJšœn˜nJšœn˜nJšœm˜mKšœQ˜QK˜Jšœ˜šœIœ˜`J˜—Jšœ˜J˜˜J™—J˜˜J™——…—Ί(ˆ