/******************************************************************************* * Copyright 2010 Simon Mieth * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package org.kabeja.entities; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.kabeja.common.Type; import org.kabeja.math.Bounds; import org.kabeja.math.MathUtils; import org.kabeja.math.ParametricPlane; import org.kabeja.math.Point3D; import org.kabeja.math.TransformContext; import org.kabeja.math.Vector; import org.kabeja.util.Constants; /** * @author <a href="mailto:simon.mieth@gmx.de>Simon Mieth</a> * */ public class Viewport extends Entity { private String viewportID = ""; private String plotStyleName = ""; private Point3D lowerLeftCorner = new Point3D(); private Point3D upperRightCorner = new Point3D(); private Point3D centerPoint = new Point3D(); private Point3D snapBasePoint = new Point3D(); private Point3D snapSpacingPoint = new Point3D(); private Point3D gridSpacingPoint = new Point3D(); private Vector viewDirectionVector = new Vector(); private Point3D viewCenterPoint = new Point3D(); private Point3D viewTargetPoint = new Point3D(); private Vector ucsOrigin = new Vector(); private Vector ucsXAxis = new Vector(); private Vector ucsYAxis = new Vector(); private int ucsType = 0; private int viewportStatus = 0; private double ucsElevation = 0.0; private boolean useUCS = false; private double height; private double width; private double ratio; private double lensLength; private double viewHeight; private double frontClippingPlane; private double backClippingPlane; private double twistAngle; private double snapAngle; private double circleZoom; private double fastZoom; private boolean snap; private boolean grid; private boolean active = false; private int renderMode; private Set<String> frozenLayerSet = new HashSet<String>(); /** * @return Returns the backClippingPlane. */ public double getBackClippingPlane() { return backClippingPlane; } /** * @param backClippingPlane * The backClippingPlane to set. */ public void setBackClippingPlane(double backClippingPlane) { this.backClippingPlane = backClippingPlane; } /** * @return Returns the centerPoint. */ public Point3D getCenterPoint() { return centerPoint; } /** * @param centerPoint * The centerPoint to set. */ public void setCenterPoint(Point3D centerPoint) { this.centerPoint = centerPoint; } /** * @return Returns the circleZoom. */ public double getCircleZoom() { return circleZoom; } /** * @param circleZoom * The circleZoom to set. */ public void setCircleZoom(double circleZoom) { this.circleZoom = circleZoom; } /** * @return Returns the fastZoom. */ public double getFastZoom() { return fastZoom; } /** * @param fastZoom * The fastZoom to set. */ public void setFastZoom(double fastZoom) { this.fastZoom = fastZoom; } /** * @return Returns the frontClippingPlane. */ public double getFrontClippingPlane() { return frontClippingPlane; } /** * @param frontClippingPlane * The frontClippingPlane to set. */ public void setFrontClippingPlane(double frontClippingPlane) { this.frontClippingPlane = frontClippingPlane; } /** * @return Returns the grid. */ public boolean isGrid() { return grid; } /** * @param grid * The grid to set. */ public void setGrid(boolean grid) { this.grid = grid; } /** * @return Returns the gridSpacingPoint. */ public Point3D getGridSpacingPoint() { return gridSpacingPoint; } /** * @param gridSpacingPoint * The gridSpacingPoint to set. */ public void setGridSpacingPoint(Point3D gridSpacingPoint) { this.gridSpacingPoint = gridSpacingPoint; } /** * @return Returns the height. */ public double getHeight() { return height; } /** * @param height * The height to set. */ public void setHeight(double height) { this.height = height; } /** * @return Returns the lensLength. */ public double getLensLength() { return lensLength; } /** * @param lensLength * The lensLength to set. */ public void setLensLength(double lensLength) { this.lensLength = lensLength; } /** * @return Returns the lowerLeftCorner. */ public Point3D getLowerLeftCorner() { return lowerLeftCorner; } /** * @param lowerLeftCorner * The lowerLeftCorner to set. */ public void setLowerLeftCorner(Point3D lowerLeftCorner) { this.lowerLeftCorner = lowerLeftCorner; } /** * @return Returns the name. */ public String getViewportID() { return viewportID; } /** * @param name * The name to set. */ public void setViewportID(String name) { this.viewportID = name; } /** * @return Returns the ratio. */ public double getAspectRatio() { return ratio; } /** * @param ratio * The ratio to set. */ public void setAspectRatio(double ratio) { this.ratio = ratio; } /** * @param rotationAngle * The rotationAngle to set. */ public void setTwistAngle(double rotationAngle) { this.twistAngle = rotationAngle; } /** * @return Returns the snap. */ public boolean isSnap() { return snap; } /** * @param snap * The snap to set. */ public void setSnap(boolean snap) { this.snap = snap; } /** * @return Returns the snapBasePoint. */ public Point3D getSnapBasePoint() { return snapBasePoint; } /** * @param snapBasePoint * The snapBasePoint to set. */ public void setSnapBasePoint(Point3D snapBasePoint) { this.snapBasePoint = snapBasePoint; } /** * @return Returns the upperRightCorner. */ public Point3D getUpperRightCorner() { return upperRightCorner; } /** * @param upperRightCorner * The upperRightCorner to set. */ public void setUpperRightCorner(Point3D upperRightCorner) { this.upperRightCorner = upperRightCorner; } /** * @return Returns the viewDirectionPoint. */ public Vector getViewDirectionVector() { return viewDirectionVector; } /** * @param viewDirectionPoint * The viewDirectionPoint to set. */ public void setViewDirectionVector(Vector viewDirectionPoint) { this.viewDirectionVector = viewDirectionPoint; } /** * @return Returns the viewTargetPoint. */ public Point3D getViewCenterPoint() { return viewCenterPoint; } /** * @param viewTargetPoint * The viewTargetPoint to set. */ public void setViewCenterPoint(Point3D viewTargetPoint) { this.viewCenterPoint = viewTargetPoint; } /** * @return Returns the active. */ public boolean isActive() { return active; } /** * @param active * The active to set. */ public void setActive(boolean active) { this.active = active; } public Bounds getBounds() { Bounds bounds = new Bounds(); if (this.viewportStatus > 0) { bounds.addToBounds(this.centerPoint.getX() - (this.width / 2), this.centerPoint.getY() - (this.height / 2), 0.0); bounds.addToBounds(this.centerPoint.getX() + (this.width / 2), this.centerPoint.getY() + (this.height / 2), 0.0); } return bounds; } public double getLength() { // TODO Auto-generated method stub return 0; } public Type<Viewport> getType() { return Type.TYPE_VIEWPORT; } public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } public void setRenderMode(int renderMode) { this.renderMode = renderMode; } public double getViewHeight() { return viewHeight; } public void setViewHeight(double viewHeight) { this.viewHeight = viewHeight; } public Vector getUcsOrigin() { return ucsOrigin; } public void setUcsOrigin(Vector ucsOrigin) { this.ucsOrigin = ucsOrigin; } public Vector getUcsXAxis() { return ucsXAxis; } public void setUcsXAxis(Vector ucsXAxis) { this.ucsXAxis = ucsXAxis; } public Vector getUcsYAxis() { return ucsYAxis; } public void setUcsYAxis(Vector ucsYAxis) { this.ucsYAxis = ucsYAxis; } public int getUcsType() { return ucsType; } public void setUcsType(int ucsType) { this.ucsType = ucsType; } public double getUcsElevation() { return ucsElevation; } public void setUcsElevation(double ucsElevation) { this.ucsElevation = ucsElevation; } public boolean isUseUCS() { return useUCS; } public void setUseUCS(boolean useUCS) { this.useUCS = useUCS; } public double getRatio() { return ratio; } public void setRatio(double ratio) { this.ratio = ratio; } public int getRenderMode() { return renderMode; } public double getSnapAngle() { return snapAngle; } public void setSnapAngle(double snapAngle) { this.snapAngle = snapAngle; } public Point3D getViewTargetPoint() { return viewTargetPoint; } public void setViewTargetPoint(Point3D viewTargetPoint) { this.viewTargetPoint = viewTargetPoint; } public Point3D getSnapSpacingPoint() { return snapSpacingPoint; } public void setSnapSpacingPoint(Point3D snapSpacingPoint) { this.snapSpacingPoint = snapSpacingPoint; } public String getPlotStyleName() { return plotStyleName; } public void setPlotStyleName(String plotStyleName) { this.plotStyleName = plotStyleName; } public int getViewportStatus() { return viewportStatus; } public void setViewportStatus(int viewportStatus) { this.viewportStatus = viewportStatus; } public double getTwistAngle() { return twistAngle; } public void addFrozenLayer(String layerName) { this.frozenLayerSet.add(layerName); } public boolean isFrozenLayer(String layerName) { return this.frozenLayerSet.contains(layerName); } /** * @deprecated * @return */ public Iterator<String> getFrozenLayerIterator() { return this.frozenLayerSet.iterator(); } public Set<String> getFrozenLayers(){ return this.frozenLayerSet; } public double getZoomXPFactor() { if (this.viewHeight != 0.0) { return this.height / this.viewHeight; } else { return this.calculateZoomXPFactor(); } } public double calculateZoomXPFactor() { double c = (this.getViewDirectionVector().getLength() * 42) / this.lensLength; double f = this.width / this.height; double b = Math.sqrt((Math.pow(c, 2) / (Math.pow(f, 2) + 1))); return this.height / b; } public Bounds getModelspaceViewBounds() { double f = this.width / this.height; // the half of width and height double modelH = (this.height / this.getZoomXPFactor()) / 2; double modelW = (f * modelH); double wf = modelW / modelH; Vector directionX = null; if ((this.viewDirectionVector.getX() == 0.0) && (this.viewDirectionVector.getY() == 0.0) && (this.viewDirectionVector.getZ() == 1.0)) { directionX = new Vector(1, 0, 0); } else { directionX = MathUtils.crossProduct(Constants.DEFAULT_Z_AXIS_VECTOR, this.viewDirectionVector); } ParametricPlane plane = new ParametricPlane(this.viewTargetPoint, directionX, MathUtils.crossProduct(this.viewDirectionVector, directionX), this.viewDirectionVector); Bounds bounds = new Bounds(); Point3D p = plane.getPoint(this.viewCenterPoint.getX() - modelW, this.viewCenterPoint.getY() - modelH); bounds.addToBounds(p); p = plane.getPoint(this.viewCenterPoint.getX() + modelW, this.viewCenterPoint.getY() + modelH); bounds.addToBounds(p); return bounds; } /** * Not implemented yet */ public void transform(TransformContext context) { } }