/**
*
*/
package cz.cuni.mff.peckam.java.origamist.model;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import cz.cuni.mff.peckam.java.origamist.math.Line2d;
import cz.cuni.mff.peckam.java.origamist.math.Segment3d;
import cz.cuni.mff.peckam.java.origamist.model.jaxb.Operations;
import cz.cuni.mff.peckam.java.origamist.modelstate.Layer;
import cz.cuni.mff.peckam.java.origamist.modelstate.LayerFilter;
import cz.cuni.mff.peckam.java.origamist.modelstate.ModelPoint;
import cz.cuni.mff.peckam.java.origamist.modelstate.ModelState;
import cz.cuni.mff.peckam.java.origamist.modelstate.arguments.ExistingLinesArgument;
import cz.cuni.mff.peckam.java.origamist.modelstate.arguments.LayersArgument;
import cz.cuni.mff.peckam.java.origamist.modelstate.arguments.LineArgument;
import cz.cuni.mff.peckam.java.origamist.modelstate.arguments.OperationArgument;
import cz.cuni.mff.peckam.java.origamist.modelstate.arguments.PointArgument;
/**
* Pull some existing folds.
*
* @author Martin Pecka
*/
public class PullOperation extends cz.cuni.mff.peckam.java.origamist.model.jaxb.PullOperation implements
HasSymmetricOperation
{
/** P1 is the center of rotation segment, P2 is the furthest rotated point in the last getModelState() call. */
protected Segment3d markerPosition = null;
@Override
protected void init()
{
super.init();
type = Operations.PULL; // it doesn't help to specify the value as fixed in XSD
}
@Override
public ModelState getModelState(ModelState previousState)
{
Map<Layer, Layer> layers = null;
if (getLine().size() > 0)
previousState.setFurthestRotationSegment(getLine().get(0).toSegment2d());
for (Line2D line : this.line) {
layers = previousState.pullFold(line.getStart().toPoint2d(), line.getEnd().toPoint2d(),
refPoint.toPoint2d(), layers != null ? new LayerFilter(layers.keySet()) : new LayerFilter(layer));
}
ModelPoint furthest = previousState.getFurthestRotatedPointAroundSegment();
if (furthest != null)
markerPosition = new Segment3d(furthest, previousState.getFurthestRotationSegment().getNearestPoint(
furthest));
previousState.clearFurthestRotationSegment();
return previousState;
}
@Override
protected List<OperationArgument> initArguments()
{
List<OperationArgument> result = new ArrayList<OperationArgument>(3);
LineArgument line;
result.add(line = new ExistingLinesArgument(true, "operation.argument.select.existing.lines"));
result.add(new LayersArgument(line, true, "operation.argument.select.layers"));
result.add(new PointArgument(true, "operation.argument.select.reference.point"));
return result;
}
@Override
public void fillFromArguments() throws IllegalStateException
{
super.fillFromArguments();
this.line = ((ExistingLinesArgument) arguments.get(0)).getLines();
this.layer = ((LayersArgument) arguments.get(1)).getLayers();
this.refPoint = ((PointArgument) arguments.get(2)).getPoint2D();
}
@Override
public Segment3d getMarkerPosition()
{
return markerPosition;
}
@Override
public String getL7dUserTip(OperationArgument argument)
{
String bundleKey = null;
if (argument == getArguments().get(0)) {
bundleKey = "pull.lines.user.tip";
} else if (argument == getArguments().get(1)) {
bundleKey = "pull.layers.user.tip";
} else if (argument == getArguments().get(2)) {
bundleKey = "pull.refPoint.user.tip";
}
if (bundleKey != null)
return messages.getString(bundleKey);
else
return null;
}
@Override
public String toString()
{
return "PullOperation [line=" + line + ", layer=" + layer + ", refPoint=" + refPoint + "]";
}
@Override
public Operation getSymmetricOperation(Line2d symmetryAxis)
{
PullOperation result = new PullOperation();
result.type = this.type;
result.line = new LinkedList<Line2D>();
for (Line2D line : this.line) {
result.line.add(new Line2D(symmetryAxis.mirror(line.toLine2d())));
}
result.layer = new LinkedList<Integer>(this.layer);
if (this.refPoint != null)
result.refPoint = new Point2D(symmetryAxis.mirror(this.refPoint.toPoint2d()));
return result;
}
}