Revision 132
org.gvsig.dxf/trunk/org.gvsig.dxf/org.gvsig.dxf.provider/src/main/java/org/gvsig/fmap/dal/store/dxf/DXFStoreProvider.java | ||
---|---|---|
82 | 82 |
import org.gvsig.tools.dispose.DisposableIterator; |
83 | 83 |
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException; |
84 | 84 |
import org.gvsig.tools.dynobject.exception.DynMethodException; |
85 |
import org.gvsig.tools.exception.BaseException; |
|
85 | 86 |
import org.gvsig.tools.exception.NotYetImplemented; |
86 | 87 |
import org.gvsig.tools.logger.FilteredLogger; |
87 | 88 |
import org.gvsig.tools.persistence.PersistentState; |
... | ... | |
135 | 136 |
public DXFStoreProvider(DXFStoreParameters parameters, |
136 | 137 |
DataStoreProviderServices storeServices) throws InitializeException { |
137 | 138 |
super( |
138 |
parameters,
|
|
139 |
parameters, |
|
139 | 140 |
storeServices, |
140 | 141 |
FileHelper.newMetadataContainer(METADATA_DEFINITION_NAME) |
141 | 142 |
); |
... | ... | |
378 | 379 |
this.taskStatus.remove(); |
379 | 380 |
} |
380 | 381 |
} |
381 |
|
|
382 |
|
|
382 | 383 |
public static void initializeFeatureType(EditableFeatureType featureType, IProjection projection, int geometrySubtype){ |
383 | 384 |
featureType.setHasOID(true); |
384 | 385 |
|
... | ... | |
390 | 391 |
EditableFeatureAttributeDescriptor attr = featureType.add( |
391 | 392 |
NAME_FIELD_GEOMETRY, DataTypes.GEOMETRY); |
392 | 393 |
attr.setSRS(projection); |
393 |
attr.setGeometryType(Geometry.TYPES.GEOMETRY);
|
|
394 |
attr.setGeometryType(Geometry.TYPES.GEOMETRY); |
|
394 | 395 |
//If is a 3D file, set the geometry subtype |
395 | 396 |
attr.setGeometrySubType(geometrySubtype); |
396 |
|
|
397 |
|
|
397 | 398 |
// ID_FIELD_GEOMETRY = 1; //attr.getIndex(); |
398 | 399 |
|
399 | 400 |
featureType.setDefaultGeometryAttributeName(NAME_FIELD_GEOMETRY); |
400 | 401 |
|
401 | 402 |
// FIXME: Cual es el size y el valor por defecto para Entity ? |
402 |
// ID_FIELD_ENTITY = 2;
|
|
403 |
// ID_FIELD_ENTITY = 2; |
|
403 | 404 |
featureType.add(NAME_FIELD_ENTITY, |
404 | 405 |
DataTypes.STRING, 100) |
405 | 406 |
.setDefaultValue("") |
... | ... | |
502 | 503 |
geometrySubtype = Geometry.SUBTYPES.GEOM3D; |
503 | 504 |
}else{ |
504 | 505 |
geometrySubtype = Geometry.SUBTYPES.GEOM2D; |
505 |
}
|
|
506 |
} |
|
506 | 507 |
EditableFeatureType featureType = store.createFeatureType(getName()); |
507 | 508 |
initializeFeatureType(featureType, this.projection, geometrySubtype); |
508 | 509 |
|
... | ... | |
663 | 664 |
} |
664 | 665 |
} |
665 | 666 |
} |
666 |
|
|
667 |
|
|
667 | 668 |
public void load() throws DataException { |
668 | 669 |
|
669 | 670 |
this.envelope = null; |
... | ... | |
717 | 718 |
} |
718 | 719 |
|
719 | 720 |
FilteredLogger logger = new FilteredLogger(DXFStoreProvider.logger,"DXFLoafing",20); |
720 |
|
|
721 |
|
|
721 | 722 |
FeatureType ft = store.getStoreServices().getDefaultFeatureType(); |
722 | 723 |
taskStatus.message("_loading"); |
723 | 724 |
// Nos recorremos las geometrias tres veces para cargarlas en orden: |
724 | 725 |
// - poligonos |
725 | 726 |
// - lineas |
726 | 727 |
// - puntos |
727 |
// Y garantizar que siempre se pinten los puntos sobre lineas y
|
|
728 |
// Y garantizar que siempre se pinten los puntos sobre lineas y |
|
728 | 729 |
// poligonos y las lineas sobre los polignos. |
729 | 730 |
int n = 0; |
730 | 731 |
taskStatus.setRangeOfValues(0,features.size()*3); |
... | ... | |
828 | 829 |
GeometryType type = geom.getGeometryType(); |
829 | 830 |
boolean geometrySupported = true; |
830 | 831 |
|
831 |
if ((TYPES.POINT == type.getType()) && (SUBTYPES.GEOM3D == type.getSubType())) {
|
|
832 |
if ((type.isTypeOf(TYPES.POINT)) && (SUBTYPES.GEOM3D == type.getSubType())) {
|
|
832 | 833 |
dxf3DFile = true; |
833 | 834 |
k = createPoint3D(handle, k, feature); |
834 | 835 |
|
835 |
} else if ((TYPES.POINT == type.getType()) && (SUBTYPES.GEOM2D == type.getSubType())) {
|
|
836 |
} else if ((type.isTypeOf(TYPES.POINT)) && (SUBTYPES.GEOM2D == type.getSubType())) {
|
|
836 | 837 |
k = createPoint2D(handle, k, feature); |
837 | 838 |
|
838 |
} else if ((TYPES.CURVE == type.getType()) && (SUBTYPES.GEOM3D == type.getSubType())) { |
|
839 |
} else if ((type.isTypeOf(TYPES.ARC)) && (SUBTYPES.GEOM2D == type.getSubType())) { |
|
840 |
k = createArc2D(handle, k, feature); |
|
841 |
|
|
842 |
} else if ((type.isTypeOf(TYPES.CURVE) || type.isTypeOf(TYPES.MULTICURVE)) && (SUBTYPES.GEOM3D == type.getSubType())) { |
|
839 | 843 |
dxf3DFile = true; |
840 | 844 |
k = createPolyline3D(handle, k, feature); |
841 | 845 |
|
842 |
} else if ((TYPES.ARC == type.getType()) && (SUBTYPES.GEOM2D == type.getSubType())) { |
|
843 |
k = createArc2D(handle, k, feature); |
|
844 |
|
|
845 |
} else if ((TYPES.CURVE == type.getType()) && (SUBTYPES.GEOM2D == type.getSubType())) { |
|
846 |
} else if ((type.isTypeOf(TYPES.CURVE) || type.isTypeOf(TYPES.MULTICURVE)) && (SUBTYPES.GEOM2D == type.getSubType())) { |
|
846 | 847 |
k = createLwPolyline2D(handle, k, feature, false); |
847 | 848 |
|
848 |
} else if ((TYPES.SURFACE == type.getType()) && (SUBTYPES.GEOM3D == type.getSubType())) { |
|
849 |
dxf3DFile = true; |
|
850 |
k = createPolyline3D(handle, k, feature); |
|
851 |
|
|
852 |
} else if ((TYPES.CIRCLE == type.getType()) && (SUBTYPES.GEOM2D == type.getSubType())) { |
|
849 |
} else if ((type.isTypeOf(TYPES.CIRCLE)) && (SUBTYPES.GEOM2D == type.getSubType())) { |
|
853 | 850 |
k = createCircle2D(handle, k, feature); |
854 | 851 |
|
855 |
} else if ((TYPES.ELLIPSE == type.getType()) && (SUBTYPES.GEOM2D == type.getSubType())) {
|
|
852 |
} else if ((type.isTypeOf(TYPES.ELLIPSE)) && (SUBTYPES.GEOM2D == type.getSubType())) {
|
|
856 | 853 |
k = createEllipse2D(handle, k, feature); |
857 | 854 |
|
858 |
} else if ((TYPES.SURFACE == type.getType()) && (SUBTYPES.GEOM2D == type.getSubType())) { |
|
855 |
} else if ((type.isTypeOf(TYPES.SURFACE) || (type.isTypeOf(TYPES.MULTISURFACE))) && (SUBTYPES.GEOM3D == type.getSubType())) { |
|
856 |
dxf3DFile = true; |
|
857 |
k = createPolyline3D(handle, k, feature); |
|
858 |
|
|
859 |
} else if ((type.isTypeOf(TYPES.SURFACE) || (type.isTypeOf(TYPES.MULTISURFACE))) && (SUBTYPES.GEOM2D == type.getSubType())) { |
|
859 | 860 |
k = createLwPolyline2D(handle, k, feature, true); |
860 | 861 |
|
861 | 862 |
} else { |
... | ... | |
1352 | 1353 |
DxfGroup xvertex = new DxfGroup(); |
1353 | 1354 |
xvertex.setCode(10); |
1354 | 1355 |
Circle circle = (Circle) (feature |
1355 |
.getDefaultGeometry()).getInternalShape();
|
|
1356 |
.getDefaultGeometry()); |
|
1356 | 1357 |
xvertex.setData(new Double(circle.getCenter().getX())); |
1357 | 1358 |
DxfGroup yvertex = new DxfGroup(); |
1358 | 1359 |
yvertex.setCode(20); |
... | ... | |
1378 | 1379 |
|
1379 | 1380 |
private int createArc2D(int handle, int k, FeatureProvider feature) |
1380 | 1381 |
throws Exception { |
1381 |
Arc arc = (Arc) (feature.getDefaultGeometry()) |
|
1382 |
.getInternalShape(); |
|
1382 |
Arc arc = (Arc) (feature.getDefaultGeometry());
|
|
1383 |
|
|
1383 | 1384 |
org.gvsig.fmap.geom.primitive.Point[] pts = new org.gvsig.fmap.geom.primitive.Point[3]; |
1384 | 1385 |
pts[0] = arc.getInitPoint(); |
1385 |
pts[1] = arc.getCenterPoint();
|
|
1386 |
pts[1] = arc.getMiddlePoint();
|
|
1386 | 1387 |
pts[2] = arc.getEndPoint(); |
1387 | 1388 |
org.gvsig.fmap.geom.primitive.Point center = arc.getCenterPoint(); |
1388 | 1389 |
GeometryOperationContext ctx = new GeometryOperationContext(); |
... | ... | |
1398 | 1399 |
double endAngle = ((Double)geomManager.invokeOperation(PointGetAngle.CODE, center, ctx)).doubleValue(); |
1399 | 1400 |
endAngle = Math.toDegrees(endAngle); |
1400 | 1401 |
|
1402 |
double aux; |
|
1403 |
if(initAngle<=endAngle){ |
|
1404 |
if(initAngle<=midAngle && midAngle<=endAngle){ |
|
1405 |
//do nothing |
|
1406 |
} else { |
|
1407 |
aux = initAngle; |
|
1408 |
initAngle = endAngle; |
|
1409 |
endAngle = aux; |
|
1410 |
} |
|
1411 |
} else { |
|
1412 |
if(initAngle>=midAngle && midAngle>=endAngle){ |
|
1413 |
aux = initAngle; |
|
1414 |
initAngle = endAngle; |
|
1415 |
endAngle = aux; |
|
1416 |
} else { |
|
1417 |
//do nothing |
|
1418 |
} |
|
1419 |
} |
|
1420 |
|
|
1401 | 1421 |
DxfGroup ax = new DxfGroup(); |
1402 | 1422 |
DxfGroup ay = new DxfGroup(); |
1403 | 1423 |
DxfGroup ac = new DxfGroup(); |
... | ... | |
1427 | 1447 |
private int createEllipse2D(int handle, int k, FeatureProvider feature) |
1428 | 1448 |
throws Exception { |
1429 | 1449 |
Ellipse ellipse = (Ellipse) (feature |
1430 |
.getDefaultGeometry()).getInternalShape();
|
|
1450 |
.getDefaultGeometry()); |
|
1431 | 1451 |
|
1432 | 1452 |
org.gvsig.fmap.geom.primitive.Point center = (org.gvsig.fmap.geom.primitive.Point)geomManager.create(TYPES.POINT, SUBTYPES.GEOM2D); |
1433 | 1453 |
center.setCoordinateAt(0, (ellipse.getAxis1Start().getX() + ellipse.getAxis1End().getX()) / 2); |
... | ... | |
1623 | 1643 |
return resource; |
1624 | 1644 |
} |
1625 | 1645 |
|
1646 |
/* (non-Javadoc) |
|
1647 |
* @see org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider#doDispose() |
|
1648 |
*/ |
|
1649 |
@Override |
|
1650 |
protected void doDispose() throws BaseException { |
|
1651 |
super.doDispose(); |
|
1652 |
resource.removeConsumer(this); |
|
1653 |
} |
|
1654 |
|
|
1626 | 1655 |
} |
Also available in: Unified diff