DIRECTORY CD, CDApplications, CDCommandOps, CDMenus, CDOps, CDOrient, CDPolygons, CDSequencer, Real, Rope, TerminalIO; CDPolygonsCommands: CEDAR PROGRAM IMPORTS CDApplications, CDCommandOps, CDMenus, CDOps, CDOrient, CDPolygons, CDSequencer, Real, TerminalIO = BEGIN PList: TYPE = LIST OF CD.DesignPosition; DrawPolygonComm: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.ObPtr; offset: CD.DesignPosition; p1: CD.DesignPosition _ comm.sPos; --from p2: CD.DesignPosition _ comm.pos; --to points: LIST OF CD.DesignPosition; 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.DesignPosition] 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.ApplicationPtr] 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.DesignPosition = 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.ApplicationPtr; p: PROC [points: PList, from, to: CD.DesignPosition] 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.TheApplication[comm, r]; IF ap#NIL THEN { WITH ap.ob.specificRef SELECT FROM t: CDPolygons.PolygonPtr => { offset: CD.DesignPosition; ob: CD.ObPtr; 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, CDApplications.ARectO[ap]]; ap.ob _ ob; ap.orientation _ CD.original; ap.location _ offset; CDOps.DelayedRedraw[comm.design, CDApplications.ARectO[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, April 11, 1985 9:16:26 am PST --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šžœd˜k—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˜š   œžœžœžœ žœ˜[Jšž˜Jšœžœ˜ Jšœžœ˜ Jšœžœžœžœ˜šžœžœžœžœ˜-Jšœžœ˜$Jšœ ˜ Jšžœžœ˜!Jšžœ˜—šžœžœžœ ž˜Jšœžœ˜Jšœ˜Jšžœ˜—Jšœžœ ˜Jšœ˜šžœžœžœžœ˜-Jšœžœ˜Jšžœ˜—Jšžœ˜—J˜š   œžœžœžœ žœ˜ZJšž˜Jšœžœ˜Jšœžœ˜ Jšœžœžœžœ˜Jšœžœ˜Jšœžœ˜š žœžœžœžœžœžœ˜