Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / extExpressionField / src / org / gvsig / expressionfield / project / documents / table / operators / Perimeter.java @ 39133

History | View | Annotate | Download (3.76 KB)

1
package org.gvsig.expressionfield.project.documents.table.operators;
2

    
3
import java.awt.geom.Point2D;
4
import java.util.ArrayList;
5

    
6
import org.apache.bsf.BSFException;
7
import org.apache.bsf.BSFManager;
8
import org.gvsig.andami.PluginServices;
9
import org.gvsig.andami.messages.NotificationManager;
10
import org.gvsig.expressionfield.ExpressionFieldExtension;
11
import org.gvsig.expressionfield.project.documents.table.GraphicOperator;
12
import org.gvsig.expressionfield.project.documents.table.IOperator;
13
import org.gvsig.fmap.dal.exception.DataException;
14
import org.gvsig.fmap.dal.feature.Feature;
15
import org.gvsig.fmap.dal.feature.FeatureStore;
16
import org.gvsig.fmap.mapcontext.MapContext;
17
import org.gvsig.fmap.mapcontext.ViewPort;
18

    
19
/**
20
 * @author Vicente Caballero Navarro
21
 */
22
public class Perimeter extends GraphicOperator{
23

    
24
        public String addText(String s) {
25
                return s.concat(toString()+"()");
26
        }
27
        public double process(Feature feature) {
28
//                ReadableVectorial adapter = getLayer().getSource();
29
                   org.gvsig.fmap.geom.Geometry geom=null;
30
                        geom = feature.getDefaultGeometry();//adapter.getShape(index.get());
31
                ArrayList parts=getXY(geom);
32
                   double perimeter=0;
33
                   for (int j=0;j<parts.size();j++){
34
                   Double[][] xsys=(Double[][])parts.get(j);//getXY(geom);
35
            double dist = 0;
36
        double distAll = 0;
37

    
38
        ViewPort vp = getLayer().getMapContext().getViewPort();
39
        for (int i = 0; i < (xsys[0].length - 1); i++) {
40
            dist = 0;
41

    
42
            Point2D p = new Point2D.Double(xsys[0][i].doubleValue(), xsys[1][i].doubleValue());//vp.toMapPoint(new Point(event.getXs()[i].intValue(), event.getYs()[i].intValue()));
43
            Point2D p2 = new Point2D.Double(xsys[0][i + 1].doubleValue(), xsys[1][i + 1].doubleValue());//vp.toMapPoint(new Point(event.getXs()[i + 1].intValue(), event.getYs()[i + 1].intValue()));
44
            dist = vp.distanceWorld(p,p2);
45
            //System.out.println("distancia parcial = "+dist);
46
            distAll += dist;
47
        }
48
        int distanceUnits=vp.getDistanceUnits();
49
                perimeter+= distAll/MapContext.getDistanceTrans2Meter()[distanceUnits];
50
                   }
51
                   return perimeter;
52
        }
53
        public void eval(BSFManager interpreter) throws BSFException {
54
                interpreter.declareBean("jperimeter",this,Perimeter.class);
55
//                interpreter.eval(ExpressionFieldExtension.BEANSHELL,null,-1,-1,"double perimeter(){return jperimeter.process(indexRow);};");
56
                interpreter.exec(ExpressionFieldExtension.JYTHON,null,-1,-1,"def perimeter():\n" +
57
                                "  return jperimeter.process(featureContainer.getFeature())");
58
        }
59
        public String toString() {
60
                return "perimeter";
61
        }
62
        public boolean isEnable() {
63
                if (getLayer()==null)
64
                        return false;
65
                int geomType=org.gvsig.fmap.geom.Geometry.TYPES.POINT;
66
                try {
67
                        FeatureStore store = getLayer().getFeatureStore();
68
                        geomType = store.getDefaultFeatureType().getAttributeDescriptor(store.getDefaultFeatureType().getDefaultGeometryAttributeIndex()).getGeometryType();
69
                } catch (DataException e) {
70
                        NotificationManager.addError(e);
71
                }
72
                return (getType()==IOperator.NUMBER &&
73
                    (geomType==org.gvsig.fmap.geom.Geometry.TYPES.SURFACE
74
            || geomType==org.gvsig.fmap.geom.Geometry.TYPES.MULTISURFACE
75
            || geomType==org.gvsig.fmap.geom.Geometry.TYPES.CURVE
76
            || geomType==org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE
77
                    ));
78
        }
79
        public String getTooltip(){
80
                return PluginServices.getText(this,"operator")+":  "+addText("")+"\n"+getDescription();
81
        }
82
        public String getDescription() {
83
        return PluginServices.getText(this, "returns") + ": " +
84
        PluginServices.getText(this, "numeric_value") + "\n" +
85
        PluginServices.getText(this, "description") + ": " +
86
        "Returns the perimeter of polygon or line geometry  of this row.";
87
    }
88
}