Revision 39280 branches/v2_0_0_prep/extensions/extEditing/src/org/gvsig/editing/gui/cad/tools/PolylineCADTool.java
PolylineCADTool.java | ||
---|---|---|
25 | 25 |
import java.awt.event.MouseEvent; |
26 | 26 |
import java.awt.geom.Point2D; |
27 | 27 |
import java.util.ArrayList; |
28 |
import java.util.List; |
|
28 | 29 |
|
29 | 30 |
import javax.swing.JOptionPane; |
30 | 31 |
|
32 |
import org.slf4j.Logger; |
|
33 |
import org.slf4j.LoggerFactory; |
|
34 |
|
|
31 | 35 |
import org.gvsig.andami.PluginServices; |
32 |
import org.gvsig.andami.messages.NotificationManager; |
|
33 | 36 |
import org.gvsig.app.ApplicationLocator; |
34 | 37 |
import org.gvsig.editing.gui.cad.exception.CommandException; |
35 | 38 |
import org.gvsig.editing.gui.cad.tools.smc.PolylineCADToolContext; |
36 | 39 |
import org.gvsig.editing.gui.cad.tools.smc.PolylineCADToolContext.PolylineCADToolState; |
37 | 40 |
import org.gvsig.fmap.dal.exception.ReadException; |
38 | 41 |
import org.gvsig.fmap.geom.Geometry; |
39 |
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
|
|
42 |
import org.gvsig.fmap.geom.exception.CreateGeometryException;
|
|
40 | 43 |
import org.gvsig.fmap.geom.handler.Handler; |
41 | 44 |
import org.gvsig.fmap.geom.primitive.Curve; |
42 | 45 |
import org.gvsig.fmap.geom.primitive.GeneralPathX; |
46 |
import org.gvsig.fmap.geom.primitive.Point; |
|
47 |
import org.gvsig.fmap.geom.primitive.Surface; |
|
43 | 48 |
import org.gvsig.fmap.geom.util.UtilFunctions; |
44 | 49 |
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect; |
45 | 50 |
import org.gvsig.fmap.mapcontrol.MapControlDrawer; |
... | ... | |
52 | 57 |
*/ |
53 | 58 |
public class PolylineCADTool extends AbstractCurveSurfaceCADTool { |
54 | 59 |
|
60 |
private static final Logger LOG = LoggerFactory.getLogger(PolylineCADTool.class); |
|
61 |
|
|
55 | 62 |
protected PolylineCADToolContext _fsm; |
56 | 63 |
protected Point2D firstPoint; |
57 | 64 |
protected Point2D antPoint; |
58 | 65 |
protected Point2D antantPoint; |
59 | 66 |
protected Point2D antCenter; |
60 | 67 |
protected Point2D antInter; |
61 |
protected ArrayList list = new ArrayList();
|
|
68 |
protected List<Curve> list = new ArrayList<Curve>();
|
|
62 | 69 |
protected boolean close = false; |
63 |
protected GeneralPathX gpx = null; |
|
64 | 70 |
|
65 | 71 |
/** |
66 | 72 |
* M?todo de incio, para poner el c?digo de todo lo que se requiera de una |
... | ... | |
71 | 77 |
} |
72 | 78 |
|
73 | 79 |
public Geometry getGeometry() { |
74 |
Geometry[] geoms = (Geometry[]) list.toArray(new Geometry[0]); |
|
75 |
MultiPrimitive fgc = createMultiPrimitive(geoms); |
|
76 |
// No queremos guardar FGeometryCollections: |
|
77 |
GeneralPathX gp = new GeneralPathX(); |
|
78 |
gp.append(fgc.getPathIterator(null, geomManager.getFlatness()), true); |
|
79 |
Geometry newGeom = createCurve(gp); |
|
80 |
Geometry newGeom = null; |
|
81 |
newGeom = concatenateCurves(list, false); |
|
80 | 82 |
return newGeom; |
81 | 83 |
} |
82 | 84 |
|
85 |
|
|
86 |
|
|
83 | 87 |
public int getLinesCount() { |
84 | 88 |
return list.size(); |
85 | 89 |
} |
... | ... | |
93 | 97 |
} |
94 | 98 |
|
95 | 99 |
public void endGeometry() { |
100 |
|
|
101 |
/* |
|
96 | 102 |
if (gpx == null) { |
97 | 103 |
gpx = new GeneralPathX(); |
98 | 104 |
Geometry[] geoms = (Geometry[]) list.toArray(new Geometry[0]); |
... | ... | |
101 | 107 |
gpx.append(fgc.getPathIterator(null, geomManager.getFlatness()), |
102 | 108 |
true); |
103 | 109 |
} |
110 |
|
|
104 | 111 |
try { |
105 | 112 |
if (((FLyrVect) getVLE().getLayer()).getShapeType() == Geometry.TYPES.SURFACE |
106 | 113 |
&& !close) { |
... | ... | |
109 | 116 |
} catch (ReadException e) { |
110 | 117 |
NotificationManager.addError(e.getMessage(), e); |
111 | 118 |
} |
119 |
*/ |
|
120 |
|
|
112 | 121 |
|
113 | 122 |
Geometry newGeom = null; |
114 | 123 |
int type = getCadToolAdapter().getActiveLayerType(); |
124 |
|
|
115 | 125 |
if ((type == Geometry.TYPES.SURFACE) |
116 | 126 |
|| (type == Geometry.TYPES.MULTISURFACE)) { |
117 |
newGeom = createSurface(gpx); |
|
127 |
|
|
128 |
newGeom = concatenateCurves(list, true); |
|
129 |
closeSurfaceIfNecessary((Surface) newGeom); |
|
130 |
// newGeom = createSurface(gpx); |
|
118 | 131 |
} else { |
119 |
newGeom = createCurve(gpx); |
|
132 |
newGeom = concatenateCurves(list, false); |
|
133 |
// newGeom = createCurve(gpx); |
|
120 | 134 |
} |
121 | 135 |
insertAndSelectGeometry(newGeom); |
122 | 136 |
_fsm = new PolylineCADToolContext(this); |
123 | 137 |
list.clear(); |
124 | 138 |
clearTemporalCache(); |
125 | 139 |
close = false; |
126 |
gpx = null; |
|
127 | 140 |
antantPoint = antCenter = antInter = antPoint = firstPoint = null; |
128 | 141 |
} |
129 | 142 |
|
143 |
/** |
|
144 |
* @param newGeom |
|
145 |
*/ |
|
146 |
private void closeSurfaceIfNecessary(Surface geo) { |
|
147 |
|
|
148 |
if (!close && geo != null && geo.getNumVertices() > 1) { |
|
149 |
Point firstp = geo.getVertex(0); |
|
150 |
firstp = (Point) firstp.cloneGeometry(); |
|
151 |
geo.addVertex(firstp); |
|
152 |
} |
|
153 |
// TODO Auto-generated method stub |
|
154 |
|
|
155 |
} |
|
156 |
|
|
130 | 157 |
public void closeGeometry() { |
131 |
if (gpx == null) { |
|
132 |
gpx = new GeneralPathX();
|
|
133 |
Geometry[] geoms = (Geometry[]) list.toArray(new Geometry[0]);
|
|
134 |
for (int i=0; i<geoms.length; i++) {
|
|
135 |
gpx.append(
|
|
136 |
geoms[i].getPathIterator(null, geomManager.getFlatness()),
|
|
137 |
true);
|
|
138 |
}
|
|
158 |
|
|
159 |
int ng = list.size();
|
|
160 |
if (ng > 0) {
|
|
161 |
Curve firstcurve = list.get(0);
|
|
162 |
Curve lastcurve = list.get(ng - 1);
|
|
163 |
Point firstp = firstcurve.getVertex(0);
|
|
164 |
firstp = (Point) firstp.cloneGeometry();
|
|
165 |
lastcurve.addVertex(firstp);
|
|
139 | 166 |
} |
140 | 167 |
close = true; |
141 |
gpx.closePath(); |
|
142 | 168 |
} |
143 | 169 |
|
144 | 170 |
public void transition(double x, double y, InputEvent event) { |
... | ... | |
185 | 211 |
new GeneralPathX(GeneralPathX.WIND_EVEN_ODD, 2); |
186 | 212 |
elShape.moveTo(antPoint.getX(), antPoint.getY()); |
187 | 213 |
elShape.lineTo(point.getX(), point.getY()); |
188 |
Geometry geom = createCurve(elShape);
|
|
214 |
Curve geom = createCurve(elShape);
|
|
189 | 215 |
if (geom != null) { |
190 | 216 |
list.add(geom); |
191 | 217 |
addTemporalCache(geom); |
... | ... | |
265 | 291 |
UtilFunctions.getPoint(interp, mediop, radio); |
266 | 292 |
antCenter = centerp; |
267 | 293 |
|
268 |
Geometry ig = createArc(lastp, centerp, point);
|
|
294 |
Curve ig = createArc(lastp, centerp, point);
|
|
269 | 295 |
|
270 | 296 |
if (ig != null) { |
271 | 297 |
list.add(ig); |
... | ... | |
325 | 351 |
Point2D centerp = |
326 | 352 |
UtilFunctions.getPoint(interp, mediop, radio); |
327 | 353 |
antCenter = centerp; |
328 |
Geometry geom = createArc(lastp, centerp, point);
|
|
354 |
Curve geom = createArc(lastp, centerp, point);
|
|
329 | 355 |
|
330 | 356 |
if (geom != null) { |
331 | 357 |
list.add(geom); |
... | ... | |
534 | 560 |
public void endTransition(double x, double y, MouseEvent event) { |
535 | 561 |
_fsm.endPoint(x, y, event); |
536 | 562 |
} |
563 |
|
|
564 |
/** |
|
565 |
* @param geoms |
|
566 |
* @return |
|
567 |
* @throws CreateGeometryException |
|
568 |
*/ |
|
569 |
private Geometry concatenateCurves(List<Curve> cus, boolean surf) { |
|
570 |
|
|
571 |
Curve _curv = null; |
|
572 |
Surface _surf = null; |
|
573 |
|
|
574 |
try { |
|
575 |
if (surf) { |
|
576 |
_surf = (Surface) geomManager.create( |
|
577 |
Geometry.TYPES.SURFACE, Geometry.SUBTYPES.GEOM2D); |
|
578 |
} else { |
|
579 |
_curv = (Curve) geomManager.create( |
|
580 |
Geometry.TYPES.CURVE, Geometry.SUBTYPES.GEOM2D); |
|
581 |
} |
|
582 |
} catch (CreateGeometryException e) { |
|
583 |
LOG.info("Unable to create geometry: " + e.getMessage()); |
|
584 |
ApplicationLocator.getManager().message( |
|
585 |
Messages.getText("_Unable_to_create_geometry"), |
|
586 |
JOptionPane.ERROR_MESSAGE); |
|
587 |
return null; |
|
588 |
} |
|
589 |
|
|
590 |
|
|
591 |
if (cus == null || cus.size() == 0) { |
|
592 |
if (surf) { |
|
593 |
return _surf; |
|
594 |
} else { |
|
595 |
return _curv; |
|
596 |
} |
|
597 |
} |
|
598 |
|
|
599 |
Curve item_cu = cus.get(0); |
|
600 |
int len = item_cu.getNumVertices(); |
|
601 |
Point po = null; |
|
602 |
/* |
|
603 |
* All from first curve |
|
604 |
*/ |
|
605 |
for (int i=0; i<len; i++) { |
|
606 |
po = item_cu.getVertex(i); |
|
607 |
if (surf) { |
|
608 |
_surf.addVertex(po); |
|
609 |
} else { |
|
610 |
_curv.addVertex(po); |
|
611 |
} |
|
612 |
|
|
613 |
} |
|
614 |
|
|
615 |
for (int n=1; n<cus.size(); n++) { |
|
616 |
|
|
617 |
item_cu = cus.get(n); |
|
618 |
len = item_cu.getNumVertices(); |
|
619 |
for (int i=0; i<len; i++) { |
|
620 |
po = item_cu.getVertex(i); |
|
621 |
/* |
|
622 |
* Add only if not same coords |
|
623 |
*/ |
|
624 |
if (surf) { |
|
625 |
if (differentCoordinates(po, |
|
626 |
_surf.getVertex( |
|
627 |
_surf.getNumVertices()-1))) { |
|
628 |
_surf.addVertex(po); |
|
629 |
} |
|
630 |
} else { |
|
631 |
if (differentCoordinates(po, |
|
632 |
_curv.getVertex( |
|
633 |
_curv.getNumVertices()-1))) { |
|
634 |
_curv.addVertex(po); |
|
635 |
} |
|
636 |
} |
|
637 |
} |
|
638 |
} |
|
639 |
|
|
640 |
if (surf) { |
|
641 |
return _surf; |
|
642 |
} else { |
|
643 |
return _curv; |
|
644 |
} |
|
645 |
|
|
646 |
} |
|
537 | 647 |
|
648 |
/** |
|
649 |
* @param po |
|
650 |
* @param vertex |
|
651 |
* @return |
|
652 |
*/ |
|
653 |
private boolean differentCoordinates(Point p1, Point p2) { |
|
654 |
return !p1.equals(p2); |
|
655 |
} |
|
656 |
|
|
538 | 657 |
} |
Also available in: Unified diff