1:
45:
46: package ;
47:
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53: import ;
54: import ;
55: import ;
56: import ;
57: import ;
58: import ;
59: import ;
60:
61: import ;
62: import ;
63: import ;
64: import ;
65: import ;
66: import ;
67: import ;
68: import ;
69:
70:
73: public class WaferMapPlot extends Plot implements RendererChangeListener,
74: Cloneable,
75: Serializable {
76:
77:
78: private static final long serialVersionUID = 4668320403707308155L;
79:
80:
81: public static final Stroke DEFAULT_GRIDLINE_STROKE = new BasicStroke(0.5f,
82: BasicStroke.CAP_BUTT,
83: BasicStroke.JOIN_BEVEL,
84: 0.0f,
85: new float[] {2.0f, 2.0f},
86: 0.0f);
87:
88:
89: public static final Paint DEFAULT_GRIDLINE_PAINT = Color.lightGray;
90:
91:
92: public static final boolean DEFAULT_CROSSHAIR_VISIBLE = false;
93:
94:
95: public static final Stroke DEFAULT_CROSSHAIR_STROKE
96: = DEFAULT_GRIDLINE_STROKE;
97:
98:
99: public static final Paint DEFAULT_CROSSHAIR_PAINT = Color.blue;
100:
101:
102: protected static ResourceBundle localizationResources =
103: ResourceBundle.getBundle("org.jfree.chart.plot.LocalizationBundle");
104:
105:
109: private PlotOrientation orientation;
110:
111:
112: private WaferMapDataset dataset;
113:
114:
118: private WaferMapRenderer renderer;
119:
120:
123: public WaferMapPlot() {
124: this(null);
125: }
126:
127:
132: public WaferMapPlot(WaferMapDataset dataset) {
133: this(dataset, null);
134: }
135:
136:
142: public WaferMapPlot(WaferMapDataset dataset, WaferMapRenderer renderer) {
143:
144: super();
145:
146: this.orientation = PlotOrientation.VERTICAL;
147:
148: this.dataset = dataset;
149: if (dataset != null) {
150: dataset.addChangeListener(this);
151: }
152:
153: this.renderer = renderer;
154: if (renderer != null) {
155: renderer.setPlot(this);
156: renderer.addChangeListener(this);
157: }
158:
159: }
160:
161:
166: public String getPlotType() {
167: return ("WMAP_Plot");
168: }
169:
170:
175: public WaferMapDataset getDataset() {
176: return this.dataset;
177: }
178:
179:
185: public void setDataset(WaferMapDataset dataset) {
186:
187:
188: if (this.dataset != null) {
189: this.dataset.removeChangeListener(this);
190: }
191:
192:
193: this.dataset = dataset;
194: if (dataset != null) {
195: setDatasetGroup(dataset.getGroup());
196: dataset.addChangeListener(this);
197: }
198:
199:
200: datasetChanged(new DatasetChangeEvent(this, dataset));
201: }
202:
203:
210: public void setRenderer(WaferMapRenderer renderer) {
211:
212: if (this.renderer != null) {
213: this.renderer.removeChangeListener(this);
214: }
215:
216: this.renderer = renderer;
217: if (renderer != null) {
218: renderer.setPlot(this);
219: }
220:
221: notifyListeners(new PlotChangeEvent(this));
222:
223: }
224:
225:
234: public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor,
235: PlotState state,
236: PlotRenderingInfo info) {
237:
238:
239: boolean b1 = (area.getWidth() <= MINIMUM_WIDTH_TO_DRAW);
240: boolean b2 = (area.getHeight() <= MINIMUM_HEIGHT_TO_DRAW);
241: if (b1 || b2) {
242: return;
243: }
244:
245:
246: if (info != null) {
247: info.setPlotArea(area);
248: }
249:
250:
251: RectangleInsets insets = getInsets();
252: insets.trim(area);
253:
254: drawChipGrid(g2, area);
255: drawWaferEdge(g2, area);
256:
257: }
258:
259:
265: protected void drawChipGrid(Graphics2D g2, Rectangle2D plotArea) {
266:
267: Shape savedClip = g2.getClip();
268: g2.setClip(getWaferEdge(plotArea));
269: Rectangle2D chip = new Rectangle2D.Double();
270: int xchips = 35;
271: int ychips = 20;
272: double space = 1d;
273: if (this.dataset != null) {
274: xchips = this.dataset.getMaxChipX() + 2;
275: ychips = this.dataset.getMaxChipY() + 2;
276: space = this.dataset.getChipSpace();
277: }
278: double startX = plotArea.getX();
279: double startY = plotArea.getY();
280: double chipWidth = 1d;
281: double chipHeight = 1d;
282: if (plotArea.getWidth() != plotArea.getHeight()) {
283: double major = 0d;
284: double minor = 0d;
285: if (plotArea.getWidth() > plotArea.getHeight()) {
286: major = plotArea.getWidth();
287: minor = plotArea.getHeight();
288: }
289: else {
290: major = plotArea.getHeight();
291: minor = plotArea.getWidth();
292: }
293:
294: if (plotArea.getWidth() == minor) {
295: startY += (major - minor) / 2;
296: chipWidth = (plotArea.getWidth() - (space * xchips - 1))
297: / xchips;
298: chipHeight = (plotArea.getWidth() - (space * ychips - 1))
299: / ychips;
300: }
301: else {
302: startX += (major - minor) / 2;
303: chipWidth = (plotArea.getHeight() - (space * xchips - 1))
304: / xchips;
305: chipHeight = (plotArea.getHeight() - (space * ychips - 1))
306: / ychips;
307: }
308: }
309:
310: for (int x = 1; x <= xchips; x++) {
311: double upperLeftX = (startX - chipWidth) + (chipWidth * x)
312: + (space * (x - 1));
313: for (int y = 1; y <= ychips; y++) {
314: double upperLeftY = (startY - chipHeight) + (chipHeight * y)
315: + (space * (y - 1));
316: chip.setFrame(upperLeftX, upperLeftY, chipWidth, chipHeight);
317: g2.setColor(Color.white);
318: if (this.dataset.getChipValue(x - 1, ychips - y - 1) != null) {
319: g2.setPaint(
320: this.renderer.getChipColor(
321: this.dataset.getChipValue(x - 1, ychips - y - 1)
322: )
323: );
324: }
325: g2.fill(chip);
326: g2.setColor(Color.lightGray);
327: g2.draw(chip);
328: }
329: }
330: g2.setClip(savedClip);
331: }
332:
333:
340: protected Ellipse2D getWaferEdge(Rectangle2D plotArea) {
341: Ellipse2D edge = new Ellipse2D.Double();
342: double diameter = plotArea.getWidth();
343: double upperLeftX = plotArea.getX();
344: double upperLeftY = plotArea.getY();
345:
346: if (plotArea.getWidth() != plotArea.getHeight()) {
347: double major = 0d;
348: double minor = 0d;
349: if (plotArea.getWidth() > plotArea.getHeight()) {
350: major = plotArea.getWidth();
351: minor = plotArea.getHeight();
352: }
353: else {
354: major = plotArea.getHeight();
355: minor = plotArea.getWidth();
356: }
357:
358: diameter = minor;
359:
360: if (plotArea.getWidth() == minor) {
361: upperLeftY = plotArea.getY() + (major - minor) / 2;
362: }
363: else {
364: upperLeftX = plotArea.getX() + (major - minor) / 2;
365: }
366: }
367: edge.setFrame(upperLeftX, upperLeftY, diameter, diameter);
368: return edge;
369: }
370:
371:
377: protected void drawWaferEdge(Graphics2D g2, Rectangle2D plotArea) {
378:
379: Ellipse2D waferEdge = getWaferEdge(plotArea);
380: g2.setColor(Color.black);
381: g2.draw(waferEdge);
382:
383:
384:
385: Arc2D notch = null;
386: Rectangle2D waferFrame = waferEdge.getFrame();
387: double notchDiameter = waferFrame.getWidth() * 0.04;
388: if (this.orientation == PlotOrientation.HORIZONTAL) {
389: Rectangle2D notchFrame =
390: new Rectangle2D.Double(
391: waferFrame.getX() + waferFrame.getWidth()
392: - (notchDiameter / 2), waferFrame.getY()
393: + (waferFrame.getHeight() / 2) - (notchDiameter / 2),
394: notchDiameter, notchDiameter
395: );
396: notch = new Arc2D.Double(notchFrame, 90d, 180d, Arc2D.OPEN);
397: }
398: else {
399: Rectangle2D notchFrame =
400: new Rectangle2D.Double(
401: waferFrame.getX() + (waferFrame.getWidth() / 2)
402: - (notchDiameter / 2), waferFrame.getY()
403: + waferFrame.getHeight() - (notchDiameter / 2),
404: notchDiameter, notchDiameter
405: );
406: notch = new Arc2D.Double(notchFrame, 0d, 180d, Arc2D.OPEN);
407: }
408: g2.setColor(Color.white);
409: g2.fill(notch);
410: g2.setColor(Color.black);
411: g2.draw(notch);
412:
413: }
414:
415:
420: public LegendItemCollection getLegendItems() {
421: return this.renderer.getLegendCollection();
422: }
423:
424:
429: public void rendererChanged(RendererChangeEvent event) {
430: notifyListeners(new PlotChangeEvent(this));
431: }
432:
433: }