DIRECTORY CD, CDInstances, CDCommandOps, CDMenus, CDOps, CDOrient, CDPolygons, CDSequencer, Real, Rope, TerminalIO; CDPolygonsCommands: CEDAR PROGRAM IMPORTS CDInstances, CDCommandOps, CDMenus, CDOps, CDOrient, CDPolygons, CDSequencer, Real, TerminalIO = BEGIN PList: TYPE = LIST OF CD.Position; DrawPolygonComm: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; offset: CD.Position; p1: CD.Position _ comm.sPos; --from p2: CD.Position _ comm.pos; --to points: LIST OF CD.Position; TerminalIO.WriteRope["Draw a polygon\n"]; IF ABS[p1.x-p2.x]<4 THEN p2.x _ p1.x+10; IF ABS[p1.y-p2.y]<4 THEN p2.y _ p1.y+10; points _ LIST[p1, p2, [p2.x, p1.y]]; [ob, offset] _ CDPolygons.CreatePolygon[points, comm.l]; IF ob=NIL THEN TerminalIO.WriteRope[" not done\n"] ELSE CDOps.AddAnObject[comm.design, ob, offset] END; DistanceSq: PROC[p1, p2: CD.Position] RETURNS [REAL] = BEGIN dx: REAL = Real.Float[p1.x]-Real.Float[p2.x]; dy: REAL = Real.Float[p1.y]-Real.Float[p2.y]; RETURN [dx*dx+dy*dy] END; Distance: PROC [p1, p2: CD.Position] RETURNS [REAL] = BEGIN RETURN [Real.SqRt[DistanceSq[p1, p2]]] END; DistancePairP: PROC[p1, p2, p: CD.Position] RETURNS [REAL] = BEGIN RETURN [ABS[Distance[p1, p]+Distance[p2, p]-Distance[p2, p1]]] END; StretchPoints: PROC [points: PList, from, to: CD.Position] RETURNS [new: PList_NIL] = BEGIN pos: INT _ 0; cnt: INT _ 0; dmin: REAL _ LAST[INT]; FOR p: PList _ points, p.rest WHILE p#NIL DO d: REAL = DistanceSq[p.first, from]; cnt _ cnt+1; IF d3 THEN points _ points.rest ELSE TerminalIO.WriteRope["degenerated polygon not created\n"]; FOR p: PList _ points, p.rest WHILE p#NIL DO new _ CONS[p.first, new]; ENDLOOP; END; OrientedPoints: PROC [ap: CD.Instance] RETURNS [copy: PList_NIL] = BEGIN pp: CDPolygons.PolygonPtr = NARROW[ap.ob.specificRef]; FOR p: PList _ pp.points, p.rest WHILE p#NIL DO orientedP: CD.Position = CDOrient.MapPoint[ pointInCell: p.first, cellSize: ap.ob.size, cellInstOrient: ap.orientation, cellInstPos: ap.location].pointInWorld; copy _ CONS[orientedP, copy]; ENDLOOP; END; StretchPolygonComm: PROC [comm: CDSequencer.Command] = BEGIN ap: CD.Instance; p: PROC [points: PList, from, to: CD.Position] RETURNS [PList]; r: Rope.ROPE; SELECT comm.a FROM $MovePolygonPoint => {p _ StretchPoints; r _ "stretch polygon"}; $AddPolygonPoint => {p _ IncludePoint; r _ "add point to polygon"}; $RemovePolygonPoint => {p _ RemovePoint; r _ "remove point from polygon"}; ENDCASE => { TerminalIO.WriteRope["unknown command\n"]; RETURN }; ap _ CDCommandOps.TheInstance[comm, r]; IF ap#NIL THEN { WITH ap.ob.specificRef SELECT FROM t: CDPolygons.PolygonPtr => { offset: CD.Position; ob: CD.Object; oldPoints: PList _ OrientedPoints[ap]; newPoints: PList _ p[oldPoints, comm.sPos, comm.pos]; [ob: ob, offset: offset] _ CDPolygons.CreatePolygon[newPoints, ap.ob.layer]; IF ob=NIL THEN { TerminalIO.WriteRope[" not done\n"]; RETURN }; CDOps.DelayedRedraw[comm.design, CDInstances.InstRectO[ap]]; ap.ob _ ob; ap.orientation _ CD.original; ap.location _ offset; CDOps.DelayedRedraw[comm.design, CDInstances.InstRectO[ap], FALSE]; } ENDCASE => TerminalIO.WriteRope["selected ob is not polygon; not done\n"]; }; END; CDSequencer.ImplementCommand[$DrawPolygon, DrawPolygonComm]; CDSequencer.ImplementCommand[$MovePolygonPoint, StretchPolygonComm]; CDSequencer.ImplementCommand[$AddPolygonPoint, StretchPolygonComm]; CDSequencer.ImplementCommand[$RemovePolygonPoint, StretchPolygonComm]; [] _ CDMenus.CreateMenu["Polygons", $PolygonMenu]; CDMenus.CreateEntry[$PolygonMenu, "draw polygon", $DrawPolygon]; CDMenus.CreateEntry[$PolygonMenu, "add point", $AddPolygonPoint]; CDMenus.CreateEntry[$PolygonMenu, "move point", $MovePolygonPoint]; CDMenus.CreateEntry[$PolygonMenu, "remove point", $RemovePolygonPoint]; CDMenus.ImplementMenuCommand[$PolygonMenu, $PolygonMenu]; END. `CDPolygonsCommands.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. by Christian Jacobi, March 30, 1985 12:19:40 pm PST last edited by Christian Jacobi, June 11, 1985 10:21:00 am PDT --returns th square of the distance --returns some bad hack representing distance --to is ignored --ap must be application of a polygon object ʹ˜šœ™Jšœ Ïmœ1™™>—J™šÏk ˜ Jšžœ˜Jšœ ˜ Jšœ ˜ Jšœ˜Jšœ˜J˜ J˜ Jšœ ˜ Jšœ˜Jšœ˜Jšœ ˜ J˜—šÏbœžœžœ˜"Jšžœa˜h—Jšž˜J˜Jš œžœžœžœžœ ˜"J˜šÏnœžœ˜3Jšž˜Jšœžœ˜Jšœžœ ˜JšœžœÏc˜#Jšœžœ¡˜ Jšœžœžœžœ ˜Jšœ*˜*Jšžœžœžœ˜(Jšžœžœžœ˜(Jšœ žœ˜$Jšœ8˜8Jšžœžœžœ%˜3Jšžœ+˜/Jšžœ˜—J˜š   œžœ žœ žœžœ˜6Jšœ#™#Jšž˜Jšœžœ%˜-Jšœžœ%˜-Jšžœ˜Jšžœ˜—J˜š  œžœ žœ žœžœ˜6Jšž˜Jšžœ ˜&Jšžœ˜—J˜š   œžœ žœ žœžœ˜Jšžœ˜—J˜š   œžœžœ žœ žœ˜UJšž˜Jšœžœ˜ Jšœžœ˜ Jšœžœžœžœ˜šžœžœžœžœ˜-Jšœžœ˜$Jšœ ˜ Jšžœžœ˜!Jšžœ˜—šžœžœžœ ž˜Jšœžœ˜Jšœ˜Jšžœ˜—Jšœžœ ˜Jšœ˜šžœžœžœžœ˜-Jšœžœ˜Jšžœ˜—Jšžœ˜—J˜š   œžœžœ žœ žœ˜TJšž˜Jšœžœ˜Jšœžœ˜ Jšœžœžœžœ˜Jšœžœ ˜Jšœžœ˜š žœžœžœžœžœžœ˜