/******************************************************************************* * This is part of SketchChair, an open-source tool for designing your own furniture. * www.sketchchair.cc * * Copyright (C) 2012, Diatom Studio ltd. Contact: hello@diatom.cc * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package ShapePacking; import java.util.ArrayList; import java.util.List; import nu.xom.Attribute; import nu.xom.Element; import ToolPathWriter.DXFWriter; import ToolPathWriter.HPGLWriter; import processing.core.PGraphics; /** * Container class for spShapes. * @author gregsaul * */ public class spShapes { float plotterWidth = 180; List l = new ArrayList(); float targetWidth = 180; float targetHeight = 250; float pageBoarder = 20; private float yGap = 5; private float xGap = 5; public void add(spShape shape) { this.l.add(shape); } public spShapes copy() { spShapes shapesCopy = new spShapes(); for (int i = 0; i < l.size(); i++) { spShape shape = (spShape) l.get(i); shapesCopy.add(shape); } return shapesCopy; } public void empty() { this.l = new ArrayList(); } float getWidth() { float width = 0; for (int i = 0; i < l.size(); i++) { spShape shape = (spShape) l.get(i); width += shape.getWidth(); } return width; } public float getHeight() { float height = 0; for (int i = 0; i < l.size(); i++) { spShape shape = (spShape) l.get(i); height += shape.getHeight(); } return height; } public void renderList(PGraphics g) { renderList(g, true); } public void renderList(PGraphics g, boolean scale) { g.pushMatrix(); if (scale) { g.translate(200, 30); g.rect(0, 0, targetWidth, targetHeight); g.translate(pageBoarder, pageBoarder); } else g.translate(30, 30); float lineWidth = getWidth(); float currentLineWidth = 0; float tallestFound = 0; g.textSize(11); g.noFill(); //float pageScale = targetWidth / lineWidth; if (scale) { //g.scale((targetWidth / lineWidth)); } float currentY = 0; for (int i = 0; i < l.size(); i++) { spShape shape = (spShape) l.get(i); //System.out.println(shape.getWidth()); g.pushMatrix(); if ((currentLineWidth + shape.getWidth()) > targetWidth - (pageBoarder * 2)) { currentY += tallestFound + yGap; currentLineWidth = 0; tallestFound = 0; } g.translate(currentLineWidth, currentY); shape.render(g); //g.ellipse(0,0, 4, 4); currentLineWidth += shape.getWidth() + xGap; if (shape.getHeight() > tallestFound) tallestFound = shape.getHeight(); //System.out.println(currentLineWidth + " : " + lineWidth); g.popMatrix(); } g.popMatrix(); } public void renderPage(PGraphics g) { for (int i = 0; i < l.size(); i++) { spShape shape = (spShape) l.get(i); g.pushMatrix(); //g.translate(shape.offsetX, shape.offsetY); shape.render(g); g.popMatrix(); } } public void renderPickBufferPage(PGraphics pickBuffer) { for (int i = 0; i < l.size(); i++) { spShape shape = (spShape) l.get(i); pickBuffer.pushMatrix(); //g.translate(shape.offsetX, shape.offsetY); shape.renderPickBuffer(pickBuffer); pickBuffer.popMatrix(); } } public void renderPageDXF(DXFWriter dxf, float offsetX, float offsetY) { for (int i = 0; i < l.size(); i++) { spShape shape = (spShape) l.get(i); //shape.renderDXF(dxf, offsetX + shape.offsetX, offsetY // + shape.offsetY); shape.renderDXF(dxf,0,0); } } public void renderToPlotter(HPGLWriter hpglWriter) { // TODO Auto-generated method stub for (int i = 0; i < l.size(); i++) { spShape shape = (spShape) l.get(i); hpglWriter.pushMatrix(); hpglWriter.translate(shape.offsetX, shape.offsetY); shape.renderToPlotter(hpglWriter); hpglWriter.popMatrix(); } /* float lineWidth = plotterWidth; float currentLineWidth = 0; float tallestFound = 0; float currentY = 0; for(int i = 0; i < l.size(); i++){ spShape shape = (spShape) l.get(i); hpglWriter.resetMatrix(); hpglWriter.translate(pageBoarder,pageBoarder); if((currentLineWidth+shape.getWidth()) > targetWidth-(pageBoarder*2)){ currentY += tallestFound + yGap; currentLineWidth = 0; tallestFound = 0; } hpglWriter.translate(currentLineWidth, currentY); shape.renderToPlotter(hpglWriter); //g.ellipse(0,0, 4, 4); currentLineWidth += shape.getWidth()+xGap; if(shape.getHeight() > tallestFound) tallestFound = shape.getHeight(); } */ } public void scale(float scale) { for (int i = 0; i < l.size(); i++) { spShape shape = (spShape) l.get(i); shape.scale(scale); shape.build(); } } public boolean hasCollisions() { for (int i = 0; i < l.size(); i++) { spShape shape = (spShape) l.get(i); for (int i2 = 0; i2 < l.size(); i2++) { spShape shapeOther = (spShape) l.get(i2); if((!shape.equals(shapeOther)) && shape.collides(shapeOther)) return true; } } return false; } public boolean hasCollisions(spShape shape) { for (int i = 0; i < l.size(); i++) { spShape shapeOther = (spShape) l.get(i); if((!shape.equals(shapeOther)) && shape.collides(shapeOther)) return true; } return false; } public boolean hasCollisionsBounds(spShape shape, float border) { for (int i = 0; i < l.size(); i++) { spShape shapeOther = (spShape) l.get(i); if((!shape.equals(shapeOther)) && shape.collidesBounds(shapeOther,border)) return true; } return false; } public Element toXML() { Element element = new Element("g","http://www.w3.org/2000/svg"); element.addAttribute(new Attribute("id","shapes")); for (int i = 0; i < l.size(); i++) { spShape shape = (spShape) l.get(i); element.appendChild(shape.toXML()); } return element; } }