Revision 130 org.gvsig.dgn/trunk/org.gvsig.dgn/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/DGNStoreProvider.java
DGNStoreProvider.java | ||
---|---|---|
315 | 315 |
TimeCounter tc = new TimeCounter(); |
316 | 316 |
tc.start(); |
317 | 317 |
|
318 |
FeatureStoreProviderServices store = getStoreServices(); |
|
318 |
FeatureStoreProviderServices storeProviderServices = getStoreServices();
|
|
319 | 319 |
if (dgndata == null && !(getDGNParameters().useReload())) { |
320 | 320 |
if (resource.getData() != null) { |
321 | 321 |
dgndata = |
... | ... | |
333 | 333 |
data = dgndata.data; |
334 | 334 |
counterNewsOIDs = 0; |
335 | 335 |
Reader reader = new Reader().initialice(getMemoryProvider(), (File) resource.get(), projection, legendBuilder); |
336 |
reader.begin(store); |
|
336 |
reader.begin(storeProviderServices);
|
|
337 | 337 |
dgndata.defaultFType = reader.getDefaultType().getNotEditableCopy(); |
338 | 338 |
List types = new ArrayList(); |
339 | 339 |
Iterator it = reader.getTypes().iterator(); |
... | ... | |
349 | 349 |
dgndata.fTypes = types; |
350 | 350 |
|
351 | 351 |
resource.notifyOpen(); |
352 |
store.setFeatureTypes(dgndata.fTypes, dgndata.defaultFType); |
|
352 |
storeProviderServices.setFeatureTypes(dgndata.fTypes, dgndata.defaultFType);
|
|
353 | 353 |
reader.load(); |
354 | 354 |
dgndata.envelope = reader.getEnvelope(); |
355 | 355 |
dgndata.legendBuilder = legendBuilder; |
... | ... | |
365 | 365 |
// El feature type no lo compartimos entre las instancias del |
366 | 366 |
// mismo resource ya que puede cambiar en funcion del filtro. |
367 | 367 |
// Por lo menos el geometry-type. |
368 |
List<FeatureType> featureTypes = getFeatureTypes(store); |
|
368 |
List<FeatureType> featureTypes = getFeatureTypes(storeProviderServices);
|
|
369 | 369 |
|
370 | 370 |
tc.restart("Created featuretype (featureTypes=" + featureTypes + ")"); |
371 | 371 |
|
... | ... | |
380 | 380 |
tc.restart("PostProcessFeatures"); |
381 | 381 |
|
382 | 382 |
legendBuilder = dgndata.legendBuilder; |
383 |
store.setFeatureTypes(featureTypes, featureTypes.get(0)); |
|
383 |
storeProviderServices.setFeatureTypes(featureTypes, featureTypes.get(0));
|
|
384 | 384 |
setDynValue("CRS", projection); |
385 | 385 |
counterNewsOIDs = data.size(); |
386 | 386 |
tc.restart("load finished."); |
... | ... | |
420 | 420 |
} |
421 | 421 |
|
422 | 422 |
public List getFeatureTypes(FeatureStoreProviderServices store) { |
423 |
//FIXME: Habr?a que distinguir cuando se va a crear un DGN 3D o 2D, de momento siempre 3D |
|
424 |
return getFeatureTypes(store, Geometry.SUBTYPES.GEOM3D); |
|
425 |
} |
|
426 |
|
|
427 |
private List getFeatureTypes(FeatureStoreProviderServices store, int subtype) { |
|
423 | 428 |
EditableFeatureType featureType = store.createFeatureType(getName()); |
424 | 429 |
|
425 | 430 |
featureType.setHasOID(true); |
... | ... | |
539 | 544 |
} |
540 | 545 |
try { |
541 | 546 |
attr.setGeometryType(GeometryLocator.getGeometryManager() |
542 |
.getGeometryType(geometryTypeToUse, Geometry.SUBTYPES.GEOM3D));
|
|
547 |
.getGeometryType(geometryTypeToUse, subtype));
|
|
543 | 548 |
} catch (Exception e) { |
544 | 549 |
attr.setGeometryType(geometryTypeToUse); |
545 |
attr.setGeometrySubType(Geometry.SUBTYPES.GEOM3D);
|
|
550 |
attr.setGeometrySubType(subtype);
|
|
546 | 551 |
} |
547 | 552 |
ID_FIELD_GEOMETRY = attr.getIndex(); |
548 | 553 |
|
... | ... | |
562 | 567 |
private IProjection projection; |
563 | 568 |
private List types; |
564 | 569 |
private LegendBuilder leyendBuilder; |
565 |
private AbstractMemoryStoreProvider store; |
|
570 |
private AbstractMemoryStoreProvider storeProvider;
|
|
566 | 571 |
private Envelope envelope; |
567 | 572 |
|
568 |
public Reader initialice(AbstractMemoryStoreProvider store, File file, |
|
573 |
public Reader initialice(AbstractMemoryStoreProvider storeProvider, File file,
|
|
569 | 574 |
IProjection projection, LegendBuilder leyendBuilder) { |
570 |
this.store = store;
|
|
575 |
this.storeProvider = storeProvider;
|
|
571 | 576 |
this.file = file; |
572 | 577 |
this.projection = projection; |
573 | 578 |
this.leyendBuilder = leyendBuilder; |
574 | 579 |
if (leyendBuilder != null) { |
575 |
leyendBuilder.initialize(store); |
|
580 |
leyendBuilder.initialize(storeProvider);
|
|
576 | 581 |
} |
577 | 582 |
return this; |
578 | 583 |
} |
... | ... | |
581 | 586 |
return this.envelope; |
582 | 587 |
} |
583 | 588 |
|
584 |
public void begin(FeatureStoreProviderServices store) { |
|
589 |
public void begin(FeatureStoreProviderServices storeProviderServices) {
|
|
585 | 590 |
|
586 |
types = getFeatureTypes(store); |
|
591 |
types = getFeatureTypes(storeProviderServices);
|
|
587 | 592 |
|
588 | 593 |
if (leyendBuilder != null) { |
589 | 594 |
leyendBuilder.begin(); |
... | ... | |
653 | 658 |
|
654 | 659 |
DGNReader dgnReader = new DGNReader(file.getAbsolutePath(), getDGNParameters().logErrors()); |
655 | 660 |
|
656 |
if (dgnReader.getInfo().dimension == 2 || getDGNParameters().ignoreZs()) {
|
|
657 |
envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
|
|
658 |
} else {
|
|
659 |
envelope = geomManager.createEnvelope(SUBTYPES.GEOM3D);
|
|
660 |
}
|
|
661 |
// FIXME: De momento forzamos a que todas las geometr?as que se
|
|
662 |
// creen sean 3D porque el m?todo getFeatureTypes solo puede
|
|
663 |
// crear los geometryAttributes como 3D
|
|
664 |
int subtypeHeader;
|
|
665 |
subtypeHeader = Geometry.SUBTYPES.GEOM3D;
|
|
661 | 666 |
|
667 |
envelope = geomManager.createEnvelope(subtypeHeader); |
|
668 |
|
|
662 | 669 |
FeatureType type = getDefaultType().getNotEditableCopy(); |
663 | 670 |
|
664 | 671 |
int counterOfElement = 0; |
... | ... | |
752 | 759 |
|
753 | 760 |
zvalue = 0; |
754 | 761 |
try { |
755 |
int subtype; |
|
762 |
int subtypeElement;
|
|
756 | 763 |
switch (elemento.stype) { |
757 | 764 |
case DGNFileHeader.DGNST_COMPLEX_HEADER: |
758 | 765 |
parentElement = (DGNElemComplexHeader) elemento; |
... | ... | |
768 | 775 |
zvalue = p.getZ(); |
769 | 776 |
} else { |
770 | 777 |
OrientablePrimitive geom = null; |
771 |
subtype = getGeometrySubType(dgnmultipoint); |
|
778 |
subtypeElement = getGeometrySubType(dgnmultipoint);
|
|
772 | 779 |
if (dgnmultipoint.isPolygon()) { |
773 |
geom = (OrientablePrimitive) geomManager.create(Geometry.TYPES.SURFACE,subtype); |
|
780 |
geom = (OrientablePrimitive) geomManager.create(Geometry.TYPES.SURFACE,subtypeHeader);
|
|
774 | 781 |
} else { |
775 |
geom = (OrientablePrimitive) geomManager.create(Geometry.TYPES.CURVE,subtype); |
|
782 |
geom = (OrientablePrimitive) geomManager.create(Geometry.TYPES.CURVE,subtypeHeader);
|
|
776 | 783 |
} |
777 | 784 |
|
778 | 785 |
// Si es una curva nos saltamos los dos primeros y los dos ultimos vertices. |
... | ... | |
835 | 842 |
elShapeArc.transform(mT); |
836 | 843 |
|
837 | 844 |
OrientablePrimitive geom = null; |
838 |
subtype = getGeometrySubType(dgnarc); |
|
845 |
subtypeElement = getGeometrySubType(dgnarc);
|
|
839 | 846 |
if (dgnarc.isSurface()) { |
840 | 847 |
geom = (OrientablePrimitive) geomManager.create( |
841 |
Geometry.TYPES.SURFACE, subtype); |
|
848 |
Geometry.TYPES.SURFACE, subtypeHeader);
|
|
842 | 849 |
} else { |
843 | 850 |
geom = (OrientablePrimitive) geomManager.create( |
844 |
Geometry.TYPES.CURVE, subtype); |
|
851 |
Geometry.TYPES.CURVE, subtypeHeader);
|
|
845 | 852 |
} |
846 | 853 |
geom.setGeneralPath(elShapeArc); |
847 |
if ((subtype == Geometry.SUBTYPES.GEOM3D || subtype == Geometry.SUBTYPES.GEOM3DM)
|
|
854 |
if ((subtypeElement == Geometry.SUBTYPES.GEOM3D || subtypeElement == Geometry.SUBTYPES.GEOM3DM)
|
|
848 | 855 |
&& !ignoreZs) { |
849 | 856 |
for (int i = 0; i < geom.getNumVertices(); i++) { |
850 | 857 |
Point originalvertex = geom.getVertex(i); |
851 | 858 |
Point vertex = |
852 |
(Point) geomManager.create(Geometry.TYPES.POINT, subtype); |
|
859 |
(Point) geomManager.create(Geometry.TYPES.POINT, subtypeElement);
|
|
853 | 860 |
vertex.setCoordinateAt(0,originalvertex.getX()); |
854 | 861 |
vertex.setCoordinateAt(1,originalvertex.getY()); |
855 | 862 |
vertex.setCoordinateAt(2, zvalue); |
... | ... | |
865 | 872 |
|
866 | 873 |
case DGNFileHeader.DGNST_TEXT: |
867 | 874 |
DGNElemText dgntext = (DGNElemText) elemento; |
868 |
subtype = getGeometrySubType(dgntext); |
|
869 |
Point point = (Point) geomManager.create(TYPES.POINT, subtype); |
|
875 |
subtypeElement = getGeometrySubType(dgntext);
|
|
876 |
Point point = (Point) geomManager.create(TYPES.POINT, subtypeHeader);
|
|
870 | 877 |
point.setCoordinateAt(0, dgntext.getPoint().getX()); |
871 | 878 |
point.setCoordinateAt(1, dgntext.getPoint().getY()); |
872 |
if (subtype == Geometry.SUBTYPES.GEOM3D) { |
|
873 |
point.setCoordinateAt(2, dgntext.getPoint().getZ()); |
|
879 |
if (subtypeHeader == Geometry.SUBTYPES.GEOM3D) { |
|
880 |
if(subtypeElement == Geometry.SUBTYPES.GEOM2D){ |
|
881 |
point.setCoordinateAt(2, 0); |
|
882 |
} else { |
|
883 |
point.setCoordinateAt(2, dgntext.getPoint().getZ()); |
|
884 |
} |
|
874 | 885 |
} |
875 | 886 |
|
876 | 887 |
data.set(ID_FIELD_HEIGHTTEXT, dgntext.getHeight()); |
... | ... | |
900 | 911 |
addFeature(data, dgnReader); |
901 | 912 |
} // for |
902 | 913 |
|
903 |
EditableFeatureType featureType = store.getFeatureStore().getDefaultFeatureType().getCopy().getEditable(); |
|
914 |
EditableFeatureType featureType = storeProvider.getFeatureStore().getDefaultFeatureType().getCopy().getEditable();
|
|
904 | 915 |
FeatureAttributeDescriptor fad = (FeatureAttributeDescriptor) featureType.get(featureType.getDefaultGeometryAttributeName()); |
905 | 916 |
featureType.remove(fad.getName()); |
906 | 917 |
EditableFeatureAttributeDescriptor efad = featureType.add(fad.getName(), fad.getType(), fad.getSize()); |
907 | 918 |
efad.setDefaultValue(fad.getDefaultValue()); |
908 | 919 |
|
909 | 920 |
GeometryType gty = null; |
910 |
int geometrySubtype; |
|
911 |
if (dgnReader.is3D()) { |
|
912 |
geometrySubtype = Geometry.SUBTYPES.GEOM3D; |
|
913 |
} else { |
|
914 |
geometrySubtype = Geometry.SUBTYPES.GEOM2D; |
|
915 |
} |
|
916 | 921 |
|
917 |
gty = geomManager.getGeometryType(fad.getGeomType().getType(),geometrySubtype);
|
|
922 |
gty = geomManager.getGeometryType(fad.getGeomType().getType(),subtypeHeader);
|
|
918 | 923 |
|
919 | 924 |
efad.setGeometryType(gty); |
920 | 925 |
|
921 | 926 |
efad.setPrecision(fad.getPrecision()); |
922 | 927 |
featureType.setDefaultGeometryAttributeName(fad.getName()); |
923 | 928 |
|
929 |
|
|
924 | 930 |
if (xmlbfw != null) { |
925 | 931 |
try { |
926 | 932 |
xmlbfw.write("</DGN>\n"); |
Also available in: Unified diff