Package cc.sketchchair.core

Source Code of cc.sketchchair.core.MeasureTool

/*******************************************************************************
* 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 cc.sketchchair.core;

import processing.core.PConstants;
import processing.core.PGraphics;
import toxi.geom.Vec2D;

/**
* Measure tool used to measure anything in SketchChair.
* @author gregsaul
*
*/
public class MeasureTool implements Clickable {

  public static void measure(float maxX, float minX, float maxY, float minY,
      PGraphics g) {

    float measureLineLen = 30;
    float measureLineModelOffset = 3;
    float measureLineProportion = .9f;

    float arrowWidth = 20;
    float arrowHeight = 50;

    float lenX = (Math.abs(maxX - minX) * SETTINGS.scale);
    float lenY = (Math.abs(maxY - minY) * SETTINGS.scale);

    lenX = Math.round(lenX);
    lenY = Math.round(lenY);

    g.pushMatrix();
    g.strokeWeight(1f);
    g.stroke(0);
    g.fill(0);
    g.line(minX - measureLineModelOffset, maxY, minX - measureLineLen
        + measureLineModelOffset, maxY);
    g.line(minX - measureLineModelOffset, minY, minX - measureLineLen
        + measureLineModelOffset, minY);

    Vec2D arrowSideBottom = new Vec2D(minX + measureLineModelOffset
        - (measureLineLen * measureLineProportion), maxY);
    Vec2D arrowSideTop = new Vec2D(minX + measureLineModelOffset
        - (measureLineLen * measureLineProportion), minY);

    g.line(arrowSideTop.x, arrowSideTop.y, arrowSideBottom.x,
        arrowSideBottom.y);
    g.triangle(arrowSideTop.x, arrowSideTop.y, arrowSideTop.x + arrowWidth
        / 2, arrowSideTop.y + arrowHeight, arrowSideTop.x - arrowWidth
        / 2, arrowSideTop.y + arrowHeight);
    g.triangle(arrowSideBottom.x, arrowSideBottom.y, arrowSideBottom.x
        + arrowWidth / 2, arrowSideBottom.y - arrowHeight,
        arrowSideBottom.x - arrowWidth / 2, arrowSideBottom.y
            - arrowHeight);

    Vec2D texPosY = arrowSideBottom.copy().sub(
        arrowSideBottom.sub(arrowSideTop).scale(.5f));
    texPosY.x -= 30;
    g.textAlignY = PConstants.CENTER;
    g.textSize((float) (12f / GLOBAL.getZOOM()));
    g.text(Float.toString(lenY) + " :mm", texPosY.x, texPosY.y);

    g.line(minX, minY - measureLineModelOffset, minX, minY - measureLineLen
        + measureLineModelOffset);
    g.line(maxX, minY - measureLineModelOffset, maxX, minY - measureLineLen
        + measureLineModelOffset);

    Vec2D arrowTopLeft = new Vec2D(minX, minY + measureLineModelOffset
        - (measureLineLen * measureLineProportion));
    Vec2D arrowTopRight = new Vec2D(maxX, minY + measureLineModelOffset
        - (measureLineLen * measureLineProportion));

    g.line(arrowTopLeft.x, arrowTopLeft.y, arrowTopRight.x, arrowTopRight.y);
    g.triangle(arrowTopLeft.x, arrowTopLeft.y,
        arrowTopLeft.x + arrowHeight, arrowTopLeft.y + arrowWidth / 2,
        arrowTopLeft.x + arrowHeight, arrowTopLeft.y - arrowWidth / 2);
    g.triangle(arrowTopRight.x, arrowTopRight.y, arrowTopRight.x
        - arrowHeight, arrowTopRight.y + arrowWidth / 2,
        arrowTopRight.x - arrowHeight, arrowTopRight.y - arrowWidth / 2);

    Vec2D textPosX = arrowTopLeft.copy().sub(
        arrowTopLeft.sub(arrowTopRight).scale(.5f));
    textPosX.y -= 10;
    g.textAlign = PConstants.CENTER;

    g.text(Float.toString(lenX) + " :mm", textPosX.x, textPosX.y);

    g.popMatrix();

  }

  Vec2D startPoint = null;

  Vec2D currentPoint = null;

  //@Override
  public void mouseClicked() {
    // TODO Auto-generated method stub

  }

  //@Override
  public void mouseDragged() {
    // TODO Auto-generated method stub

  }

  //@Override
  public void mousePressed() {
    // TODO Auto-generated method stub

  }

  public void mousePressed(float mouseX, float mouseY) {

    if (GLOBAL.uiTools.getCurrentTool() == UITools.MEASURE_TOOL) {
      if (startPoint == null)
        startPoint = new Vec2D(mouseX, mouseY);

      this.currentPoint = new Vec2D(mouseX, mouseY);
    }
  }

  //@Override
  public void mouseReleased() {
    // TODO Auto-generated method stub

  }

  public void mouseReleased(int mouseX, int mouseY) {
    // TODO Auto-generated method stub
    startPoint = null;
  }

  public void render(PGraphics g) {

    if (startPoint != null) {

      MeasureTool.measure(Math.max(startPoint.x, currentPoint.x),
          Math.min(startPoint.x, currentPoint.x),
          Math.max(startPoint.y, currentPoint.y),
          Math.min(startPoint.y, currentPoint.y), g);
      g.stroke(0);
      g.noFill();
      g.rect(startPoint.x, startPoint.y, currentPoint.x - startPoint.x,
          currentPoint.y - startPoint.y);
    }
  }

}
TOP

Related Classes of cc.sketchchair.core.MeasureTool

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.