svn-gvsig-desktop / tags / v2_0_0_Build_2021 / extensions / extDwg / src / org / gvsig / dwg / fmap / dal / store / dwg / DWGStoreProvider.java @ 34066
History | View | Annotate | Download (19.5 KB)
1 | 29049 | jmvivo | package org.gvsig.dwg.fmap.dal.store.dwg; |
---|---|---|---|
2 | |||
3 | import java.io.File; |
||
4 | import java.io.IOException; |
||
5 | import java.util.ArrayList; |
||
6 | import java.util.HashMap; |
||
7 | import java.util.Iterator; |
||
8 | import java.util.List; |
||
9 | import java.util.Map; |
||
10 | |||
11 | import org.cresques.cts.IProjection; |
||
12 | import org.gvsig.dwg.lib.DwgFile; |
||
13 | import org.gvsig.dwg.lib.DwgObject; |
||
14 | import org.gvsig.dwg.lib.DwgVersionNotSupportedException; |
||
15 | import org.gvsig.dwg.lib.IDwg2FMap; |
||
16 | import org.gvsig.dwg.lib.IDwg3DTestable; |
||
17 | import org.gvsig.dwg.lib.objects.DwgMText; |
||
18 | import org.gvsig.dwg.lib.objects.DwgText; |
||
19 | import org.gvsig.fmap.dal.DALLocator; |
||
20 | import org.gvsig.fmap.dal.DataManager; |
||
21 | import org.gvsig.fmap.dal.DataServerExplorer; |
||
22 | import org.gvsig.fmap.dal.DataStoreNotification; |
||
23 | import org.gvsig.fmap.dal.DataTypes; |
||
24 | 33188 | cordinyana | import org.gvsig.fmap.dal.FileHelper; |
25 | 29049 | jmvivo | import org.gvsig.fmap.dal.exception.DataException; |
26 | import org.gvsig.fmap.dal.exception.InitializeException; |
||
27 | import org.gvsig.fmap.dal.exception.OpenException; |
||
28 | import org.gvsig.fmap.dal.exception.ReadException; |
||
29 | import org.gvsig.fmap.dal.exception.ValidateDataParametersException; |
||
30 | import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor; |
||
31 | import org.gvsig.fmap.dal.feature.EditableFeatureType; |
||
32 | import org.gvsig.fmap.dal.feature.FeatureType; |
||
33 | import org.gvsig.fmap.dal.feature.exception.CreateGeometryException; |
||
34 | import org.gvsig.fmap.dal.feature.exception.PerformEditingException; |
||
35 | 29289 | jmvivo | import org.gvsig.fmap.dal.feature.spi.FeatureProvider; |
36 | 29049 | jmvivo | import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices; |
37 | import org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider; |
||
38 | 31022 | cordinyana | import org.gvsig.fmap.dal.resource.ResourceAction; |
39 | 29049 | jmvivo | import org.gvsig.fmap.dal.resource.exception.AccessResourceException; |
40 | import org.gvsig.fmap.dal.resource.file.FileResource; |
||
41 | import org.gvsig.fmap.dal.resource.spi.ResourceConsumer; |
||
42 | import org.gvsig.fmap.dal.resource.spi.ResourceProvider; |
||
43 | import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer; |
||
44 | import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters; |
||
45 | 29326 | jmvivo | import org.gvsig.fmap.dal.spi.DataStoreProviderServices; |
46 | 29049 | jmvivo | import org.gvsig.fmap.geom.Geometry; |
47 | import org.gvsig.fmap.geom.GeometryLocator; |
||
48 | import org.gvsig.fmap.geom.GeometryManager; |
||
49 | import org.gvsig.fmap.geom.Geometry.SUBTYPES; |
||
50 | import org.gvsig.fmap.geom.exception.CreateEnvelopeException; |
||
51 | import org.gvsig.fmap.geom.primitive.Envelope; |
||
52 | import org.gvsig.fmap.geom.primitive.Point; |
||
53 | import org.gvsig.tools.dynobject.exception.DynMethodException; |
||
54 | import org.gvsig.tools.exception.NotYetImplemented; |
||
55 | import org.gvsig.tools.persistence.PersistentState; |
||
56 | 32880 | jjdelcerro | import org.gvsig.tools.persistence.exception.PersistenceException; |
57 | 29049 | jmvivo | import org.slf4j.Logger; |
58 | import org.slf4j.LoggerFactory; |
||
59 | |||
60 | public class DWGStoreProvider extends AbstractMemoryStoreProvider implements |
||
61 | ResourceConsumer { |
||
62 | private static final Logger logger = LoggerFactory.getLogger(DWGStoreProvider.class); |
||
63 | |||
64 | public static final String NAME = "DWG"; |
||
65 | public static final String DESCRIPTION = "DWG file"; |
||
66 | 33188 | cordinyana | public static final String METADATA_DEFINITION_NAME = NAME; |
67 | 29049 | jmvivo | |
68 | public static final String NAME_FIELD_ID = "ID"; |
||
69 | public static final String NAME_FIELD_GEOMETRY = "Geometry"; |
||
70 | public static final String NAME_FIELD_ENTITY = "Entity"; |
||
71 | public static final String NAME_FIELD_LAYER = "Layer"; |
||
72 | public static final String NAME_FIELD_COLOR = "Color"; |
||
73 | public static final String NAME_FIELD_ELEVATION = "Elevation"; |
||
74 | public static final String NAME_FIELD_THICKNESS = "Thickness"; |
||
75 | public static final String NAME_FIELD_TEXT = "Text"; |
||
76 | public static final String NAME_FIELD_HEIGHTTEXT = "HeightText"; |
||
77 | public static final String NAME_FIELD_ROTATIONTEXT = "Rotation"; |
||
78 | |||
79 | private int ID_FIELD_ID = 0; |
||
80 | private int ID_FIELD_GEOMETRY = 1; |
||
81 | private int ID_FIELD_ENTITY = 2; |
||
82 | private int ID_FIELD_LAYER = 3; |
||
83 | private int ID_FIELD_COLOR = 4; |
||
84 | private int ID_FIELD_ELEVATION = 5; |
||
85 | private int ID_FIELD_THICKNESS = 6; |
||
86 | private int ID_FIELD_TEXT = 7; |
||
87 | private int ID_FIELD_HEIGHTTEXT = 8; |
||
88 | private int ID_FIELD_ROTATIONTEXT = 9; |
||
89 | |||
90 | private IProjection projection;
|
||
91 | private ResourceProvider resource;
|
||
92 | private LegendBuilder legendBuilder;
|
||
93 | |||
94 | private long counterNewsOIDs = 0; |
||
95 | protected GeometryManager geomManager = GeometryLocator.getGeometryManager();
|
||
96 | |||
97 | 29326 | jmvivo | public DWGStoreProvider(DWGStoreParameters parameters,
|
98 | DataStoreProviderServices storeServices) throws InitializeException {
|
||
99 | 33188 | cordinyana | super(parameters, storeServices, FileHelper
|
100 | .newMetadataContainer(METADATA_DEFINITION_NAME)); |
||
101 | 29049 | jmvivo | |
102 | counterNewsOIDs = 0;
|
||
103 | // projection = CRSFactory.getCRS(getParameters().getSRSID());
|
||
104 | |||
105 | 29289 | jmvivo | File file = getDWGParameters().getFile();
|
106 | 29049 | jmvivo | resource = this.createResource(
|
107 | FileResource.NAME, |
||
108 | new Object[] { file.getAbsolutePath() } |
||
109 | ); |
||
110 | |||
111 | resource.addConsumer(this);
|
||
112 | |||
113 | 33188 | cordinyana | this.projection = this.getDWGParameters().getCRS(); |
114 | 29049 | jmvivo | |
115 | |||
116 | try {
|
||
117 | legendBuilder = (LegendBuilder) this.invokeDynMethod(
|
||
118 | LegendBuilder.DYNMETHOD_BUILDER_NAME, null);
|
||
119 | } catch (DynMethodException e) {
|
||
120 | legendBuilder = null;
|
||
121 | } catch (Exception e) { |
||
122 | throw new InitializeException(e); |
||
123 | } |
||
124 | |||
125 | this.initializeFeatureTypes();
|
||
126 | } |
||
127 | |||
128 | 29326 | jmvivo | private DWGStoreParameters getDWGParameters() {
|
129 | return (DWGStoreParameters) this.getParameters(); |
||
130 | } |
||
131 | |||
132 | |||
133 | 33717 | jjdelcerro | public String getProviderName() { |
134 | 29049 | jmvivo | return NAME;
|
135 | } |
||
136 | |||
137 | public boolean allowWrite() { |
||
138 | return false; |
||
139 | } |
||
140 | |||
141 | public Object getLegend() throws OpenException { |
||
142 | this.open();
|
||
143 | if (legendBuilder == null) { |
||
144 | return null; |
||
145 | } |
||
146 | return legendBuilder.getLegend();
|
||
147 | } |
||
148 | |||
149 | public Object getLabeling() throws OpenException { |
||
150 | this.open();
|
||
151 | if (legendBuilder == null) { |
||
152 | return null; |
||
153 | } |
||
154 | return legendBuilder.getLabeling();
|
||
155 | } |
||
156 | |||
157 | private class DWGData { |
||
158 | public ArrayList data = null; |
||
159 | public FeatureType defaultFType = null; |
||
160 | public List fTypes = null; |
||
161 | public Envelope envelope = null; |
||
162 | public IProjection projection;
|
||
163 | public LegendBuilder legendBuilder = null; |
||
164 | public Envelope getEnvelopeCopy() throws CreateEnvelopeException { |
||
165 | if (envelope == null) { |
||
166 | return null; |
||
167 | } |
||
168 | Envelope newEnvelope; |
||
169 | if (envelope.getDimension() == 2) { |
||
170 | newEnvelope = geomManager.createEnvelope(SUBTYPES.GEOM2D); |
||
171 | } else {
|
||
172 | newEnvelope = geomManager.createEnvelope(SUBTYPES.GEOM3D); |
||
173 | |||
174 | } |
||
175 | newEnvelope.setLowerCorner(envelope.getLowerCorner()); |
||
176 | newEnvelope.setUpperCorner(envelope.getUpperCorner()); |
||
177 | return newEnvelope;
|
||
178 | } |
||
179 | } |
||
180 | |||
181 | 31022 | cordinyana | private AbstractMemoryStoreProvider getStoreProvider() {
|
182 | return this; |
||
183 | } |
||
184 | |||
185 | 29049 | jmvivo | public void open() throws OpenException { |
186 | if (this.data != null) { |
||
187 | return;
|
||
188 | } |
||
189 | 31022 | cordinyana | // try {
|
190 | // this.resource.begin();
|
||
191 | // } catch (ResourceExecuteException e2) {
|
||
192 | // try {
|
||
193 | // throw new OpenException(resource.getName(), e2);
|
||
194 | // } catch (AccessResourceException e1) {
|
||
195 | // throw new OpenException(this.getName(), e2);
|
||
196 | // }
|
||
197 | //
|
||
198 | // }
|
||
199 | 29049 | jmvivo | try {
|
200 | 31022 | cordinyana | getResource().execute(new ResourceAction() {
|
201 | public Object run() throws Exception { |
||
202 | ResourceProvider resource = getResource(); |
||
203 | DWGData dwgData = null;
|
||
204 | FeatureStoreProviderServices store = getStoreServices(); |
||
205 | if (resource.getData() != null) { |
||
206 | dwgData = |
||
207 | (DWGData) ((Map) resource.getData()).get(projection.getAbrev());
|
||
208 | // OJO no es del todo correcto (puede llevar
|
||
209 | // reproyeccion)
|
||
210 | 29049 | jmvivo | } else {
|
211 | 31022 | cordinyana | resource.setData(new HashMap()); |
212 | 29049 | jmvivo | } |
213 | 31022 | cordinyana | if (dwgData == null) { |
214 | dwgData = new DWGData();
|
||
215 | dwgData.data = new ArrayList(); |
||
216 | data = dwgData.data; |
||
217 | counterNewsOIDs = 0;
|
||
218 | Reader reader =
|
||
219 | new Reader().initialice(getStoreProvider(), |
||
220 | new File((String) resource.get()), |
||
221 | projection, legendBuilder); |
||
222 | reader.begin(store); |
||
223 | dwgData.defaultFType = |
||
224 | reader.getDefaultType().getNotEditableCopy(); |
||
225 | ArrayList types = new ArrayList(); |
||
226 | Iterator it = reader.getTypes().iterator();
|
||
227 | EditableFeatureType fType; |
||
228 | while (it.hasNext()) {
|
||
229 | fType = (EditableFeatureType) it.next(); |
||
230 | if (fType.getId().equals(
|
||
231 | dwgData.defaultFType.getId())) { |
||
232 | types.add(dwgData.defaultFType); |
||
233 | } else {
|
||
234 | types.add(fType.getNotEditableCopy()); |
||
235 | } |
||
236 | } |
||
237 | dwgData.fTypes = types; |
||
238 | dwgData.legendBuilder = legendBuilder; |
||
239 | 29049 | jmvivo | |
240 | 31022 | cordinyana | resource.notifyOpen(); |
241 | store.setFeatureTypes(dwgData.fTypes, |
||
242 | dwgData.defaultFType); |
||
243 | reader.load(); |
||
244 | // this.envelope = reader.getEnvelope();
|
||
245 | 29049 | jmvivo | |
246 | 31022 | cordinyana | dwgData.envelope = reader.getEnvelope(); |
247 | 29049 | jmvivo | |
248 | |||
249 | 31022 | cordinyana | dwgData.projection = projection; |
250 | 29049 | jmvivo | |
251 | 31022 | cordinyana | reader.end(); |
252 | resource.notifyClose(); |
||
253 | ((Map) resource.getData()).put(projection.getAbrev(),
|
||
254 | dwgData); // OJO la reproyeccion
|
||
255 | } |
||
256 | 29049 | jmvivo | |
257 | 31022 | cordinyana | data = dwgData.data; |
258 | store.setFeatureTypes(dwgData.fTypes, dwgData.defaultFType); |
||
259 | legendBuilder = dwgData.legendBuilder; |
||
260 | setDynValue("Envelope", dwgData.getEnvelopeCopy());
|
||
261 | 32930 | cordinyana | setDynValue("CRS", projection.getAbrev());
|
262 | 31022 | cordinyana | counterNewsOIDs = data.size(); |
263 | return null; |
||
264 | } |
||
265 | }); |
||
266 | 29049 | jmvivo | } catch (Exception e) { |
267 | this.data = null; |
||
268 | try {
|
||
269 | throw new OpenException(resource.getName(), e); |
||
270 | } catch (AccessResourceException e1) {
|
||
271 | 33717 | jjdelcerro | throw new OpenException(this.getProviderName(), e); |
272 | 29049 | jmvivo | } |
273 | 31022 | cordinyana | // } finally {
|
274 | // this.resource.end();
|
||
275 | 29049 | jmvivo | } |
276 | } |
||
277 | |||
278 | |||
279 | public DataServerExplorer getExplorer() throws ReadException { |
||
280 | DataManager manager = DALLocator.getDataManager(); |
||
281 | FilesystemServerExplorerParameters params; |
||
282 | try {
|
||
283 | params = (FilesystemServerExplorerParameters) manager |
||
284 | .createServerExplorerParameters(FilesystemServerExplorer.NAME); |
||
285 | 29289 | jmvivo | params.setRoot(this.getDWGParameters().getFile().getParent());
|
286 | 29049 | jmvivo | return manager.createServerExplorer(params);
|
287 | } catch (DataException e) {
|
||
288 | 33717 | jjdelcerro | throw new ReadException(this.getProviderName(), e); |
289 | 29049 | jmvivo | } catch (ValidateDataParametersException e) {
|
290 | 33717 | jjdelcerro | throw new ReadException(this.getProviderName(), e); |
291 | 29049 | jmvivo | } |
292 | |||
293 | } |
||
294 | |||
295 | |||
296 | |||
297 | 29289 | jmvivo | public void performChanges(Iterator deleteds, Iterator inserteds, Iterator updateds, Iterator originalFeatureTypesUpdated) throws PerformEditingException { |
298 | 29049 | jmvivo | // FIXME Exception
|
299 | throw new UnsupportedOperationException(); |
||
300 | } |
||
301 | |||
302 | public class Reader { |
||
303 | private File file; |
||
304 | private String fileName; |
||
305 | private IProjection projection;
|
||
306 | private List types; |
||
307 | private LegendBuilder leyendBuilder;
|
||
308 | private AbstractMemoryStoreProvider store;
|
||
309 | private Envelope envelope;
|
||
310 | |||
311 | public Reader initialice(AbstractMemoryStoreProvider store, File file, |
||
312 | IProjection projection, |
||
313 | LegendBuilder leyendBuilder) { |
||
314 | this.store = store;
|
||
315 | this.file = file;
|
||
316 | this.fileName = file.getAbsolutePath();
|
||
317 | this.projection = projection;
|
||
318 | this.leyendBuilder = leyendBuilder;
|
||
319 | if (leyendBuilder != null) { |
||
320 | leyendBuilder.initialize(store); |
||
321 | } |
||
322 | return this; |
||
323 | } |
||
324 | |||
325 | public Envelope getEnvelope() {
|
||
326 | return this.envelope; |
||
327 | } |
||
328 | |||
329 | public void begin(FeatureStoreProviderServices store) { |
||
330 | |||
331 | EditableFeatureType featureType = store.createFeatureType(); |
||
332 | |||
333 | featureType.setHasOID(true);
|
||
334 | |||
335 | ID_FIELD_ID = featureType.add(NAME_FIELD_ID, DataTypes.INT) |
||
336 | .setDefaultValue(Integer.valueOf(0)) |
||
337 | .getIndex(); |
||
338 | |||
339 | EditableFeatureAttributeDescriptor attr = featureType.add( |
||
340 | NAME_FIELD_GEOMETRY, DataTypes.GEOMETRY); |
||
341 | attr.setSRS(this.projection);
|
||
342 | attr.setGeometryType(Geometry.TYPES.GEOMETRY); |
||
343 | ID_FIELD_GEOMETRY = attr.getIndex(); |
||
344 | |||
345 | featureType.setDefaultGeometryAttributeName(NAME_FIELD_GEOMETRY); |
||
346 | |||
347 | // FIXME: Cual es el size y el valor por defecto para Entity ?
|
||
348 | ID_FIELD_ENTITY = featureType.add(NAME_FIELD_ENTITY, |
||
349 | DataTypes.STRING, 100)
|
||
350 | .setDefaultValue("")
|
||
351 | .getIndex(); |
||
352 | |||
353 | // FIXME: Cual es el size de Layer ?
|
||
354 | ID_FIELD_LAYER = featureType.add(NAME_FIELD_LAYER, |
||
355 | DataTypes.STRING, 100)
|
||
356 | .setDefaultValue( |
||
357 | "default").getIndex();
|
||
358 | |||
359 | ID_FIELD_COLOR = featureType.add(NAME_FIELD_COLOR, |
||
360 | DataTypes.INT) |
||
361 | .setDefaultValue( |
||
362 | Integer.valueOf(0)).getIndex(); |
||
363 | |||
364 | ID_FIELD_ELEVATION = featureType.add(NAME_FIELD_ELEVATION, |
||
365 | DataTypes.DOUBLE) |
||
366 | .setDefaultValue( |
||
367 | Double.valueOf(0)).getIndex(); |
||
368 | |||
369 | ID_FIELD_THICKNESS = featureType.add(NAME_FIELD_THICKNESS, |
||
370 | DataTypes.DOUBLE) |
||
371 | .setDefaultValue( |
||
372 | Double.valueOf(0)).getIndex(); |
||
373 | |||
374 | // FIXME: Cual es el size de Text ?
|
||
375 | ID_FIELD_TEXT = featureType.add(NAME_FIELD_TEXT, |
||
376 | DataTypes.STRING, 100)
|
||
377 | .setDefaultValue("")
|
||
378 | .getIndex(); |
||
379 | |||
380 | ID_FIELD_HEIGHTTEXT = featureType.add(NAME_FIELD_HEIGHTTEXT, |
||
381 | DataTypes.DOUBLE).setDefaultValue( |
||
382 | Double.valueOf(10)).getIndex(); |
||
383 | |||
384 | ID_FIELD_ROTATIONTEXT = featureType.add(NAME_FIELD_ROTATIONTEXT, |
||
385 | DataTypes.DOUBLE).setDefaultValue( |
||
386 | Double.valueOf(0)).getIndex(); |
||
387 | |||
388 | |||
389 | |||
390 | // FIXME: Parece que el DXF puede tener mas atributos opcionales.
|
||
391 | // Habria que ver de pillarlos ?
|
||
392 | |||
393 | types = new ArrayList(); |
||
394 | types.add(featureType); |
||
395 | |||
396 | if (leyendBuilder != null) { |
||
397 | leyendBuilder.begin(); |
||
398 | } |
||
399 | |||
400 | } |
||
401 | |||
402 | public void end() { |
||
403 | if (leyendBuilder != null) { |
||
404 | leyendBuilder.end(); |
||
405 | } |
||
406 | } |
||
407 | |||
408 | public List getTypes() { |
||
409 | return types;
|
||
410 | } |
||
411 | |||
412 | public EditableFeatureType getDefaultType() {
|
||
413 | return (EditableFeatureType) types.get(0); |
||
414 | } |
||
415 | |||
416 | private Double toDouble(String value) { |
||
417 | if (value == null) { |
||
418 | return Double.valueOf(0); |
||
419 | } |
||
420 | return Double.valueOf(value); |
||
421 | } |
||
422 | |||
423 | public void load() throws DataException { |
||
424 | |||
425 | this.envelope = null; |
||
426 | |||
427 | DwgFile dwgFeatureFile = new DwgFile(file.getAbsolutePath());
|
||
428 | |||
429 | try {
|
||
430 | dwgFeatureFile.read(); |
||
431 | } catch (DwgVersionNotSupportedException e1) {
|
||
432 | throw new UnsupportedDWGVersionException(file.getName(), e1); |
||
433 | } catch (IOException e) { |
||
434 | throw new ReadException(NAME, e); |
||
435 | } |
||
436 | |||
437 | |||
438 | dwgFeatureFile.calculateGisModelDwgPolylines(); |
||
439 | dwgFeatureFile.blockManagement2(); |
||
440 | List entities = dwgFeatureFile.getDwgObjects();
|
||
441 | |||
442 | int id = -1; |
||
443 | try{
|
||
444 | int envelopeSubType = Geometry.SUBTYPES.GEOM2D;
|
||
445 | boolean is3dFile = dwgFeatureFile.isDwg3DFile();
|
||
446 | // if (is3dFile) {
|
||
447 | // envelopeSubType = Geometry.SUBTYPES.GEOM3D;
|
||
448 | // }
|
||
449 | |||
450 | this.envelope = geomManager.createEnvelope(envelopeSubType);
|
||
451 | |||
452 | boolean updateEnvelope = true; |
||
453 | |||
454 | double[] extMin = (double[]) dwgFeatureFile |
||
455 | .getHeader("MSPACE_EXTMIN");
|
||
456 | double[] extMax = (double[]) dwgFeatureFile |
||
457 | .getHeader("MSPACE_EXTMAX");
|
||
458 | if (extMin != null && extMax != null) { |
||
459 | updateEnvelope = false;
|
||
460 | Point point = (Point) geomManager.create( |
||
461 | Geometry.TYPES.POINT, envelopeSubType); |
||
462 | point.setCoordinates(extMin); |
||
463 | this.envelope.setLowerCorner(point);
|
||
464 | point = (Point) geomManager.create(Geometry.TYPES.POINT,
|
||
465 | envelopeSubType); |
||
466 | point.setCoordinates(extMax); |
||
467 | this.envelope.setUpperCorner(point);
|
||
468 | } |
||
469 | |||
470 | |||
471 | Iterator iter = entities.iterator();
|
||
472 | |||
473 | 29292 | jmvivo | FeatureProvider featureProvider; |
474 | 29053 | jmvivo | Envelope gEnvelope; |
475 | 29049 | jmvivo | |
476 | while (iter.hasNext()) {
|
||
477 | id++; |
||
478 | DwgObject entity = (DwgObject) iter.next(); |
||
479 | |||
480 | if (!(entity instanceof IDwg2FMap)) { |
||
481 | 29289 | jmvivo | logger |
482 | 29049 | jmvivo | .warn( |
483 | "load: entity type {}(id:{}) not loadded",
|
||
484 | new Object[] { entity |
||
485 | .getType() }, |
||
486 | id); |
||
487 | |||
488 | continue;
|
||
489 | } |
||
490 | |||
491 | IDwg2FMap dwgEnt = (IDwg2FMap) entity; |
||
492 | Geometry geometry = dwgEnt.toFMapGeometry(is3dFile); |
||
493 | if (geometry == null) { // || geometry.getGeneralPath() == |
||
494 | // null) {
|
||
495 | 29289 | jmvivo | logger |
496 | 29049 | jmvivo | .warn( |
497 | "load: entity {}(id:{}) with null geometry",
|
||
498 | new Object[] { |
||
499 | entity |
||
500 | .getType(), |
||
501 | id }); |
||
502 | |||
503 | continue;
|
||
504 | } |
||
505 | // FIXME: Estas 6 lineas es por si la geometr??a no se ha
|
||
506 | // creado correctamente
|
||
507 | 29053 | jmvivo | gEnvelope = null;
|
508 | 29049 | jmvivo | try {
|
509 | gEnvelope = geometry.getEnvelope(); |
||
510 | } catch (Exception e) { |
||
511 | gEnvelope = null;
|
||
512 | } |
||
513 | if (gEnvelope == null) { |
||
514 | 29289 | jmvivo | logger |
515 | 29049 | jmvivo | .warn( |
516 | "load: entity {}(id:{}) with null envelope",
|
||
517 | new Object[] { entity.getType(), id }); |
||
518 | |||
519 | continue;
|
||
520 | } |
||
521 | // we check for Region of Interest of the CAD file
|
||
522 | if (!this.envelope.intersects(geometry.getEnvelope())) { |
||
523 | 29289 | jmvivo | logger |
524 | 29049 | jmvivo | .warn( |
525 | "load: entity {}(id:{}) out of envelope",
|
||
526 | new Object[] { entity.getType(), id }); |
||
527 | continue;
|
||
528 | } |
||
529 | 29292 | jmvivo | featureProvider = store.createFeatureProvider(store |
530 | 29049 | jmvivo | .getStoreServices().getDefaultFeatureType()); |
531 | |||
532 | 29292 | jmvivo | featureProvider.set(ID_FIELD_ID, id); |
533 | 29049 | jmvivo | |
534 | 29292 | jmvivo | featureProvider.set(ID_FIELD_ENTITY, dwgEnt.toString()); |
535 | 29049 | jmvivo | |
536 | 29292 | jmvivo | featureProvider.set(ID_FIELD_LAYER, dwgFeatureFile |
537 | 29049 | jmvivo | .getLayerName(entity)); |
538 | |||
539 | int colorByLayer = dwgFeatureFile.getColorByLayer(entity);
|
||
540 | int color = entity.getColor();
|
||
541 | if (color < 0) { |
||
542 | color = Math.abs(color);
|
||
543 | } |
||
544 | if (color > 255) { |
||
545 | color = colorByLayer; |
||
546 | } |
||
547 | |||
548 | 29292 | jmvivo | featureProvider.set(ID_FIELD_COLOR, color); |
549 | 29049 | jmvivo | |
550 | if (entity instanceof IDwg3DTestable) { |
||
551 | 29292 | jmvivo | featureProvider.set(ID_FIELD_ELEVATION, |
552 | 29049 | jmvivo | ((IDwg3DTestable) entity).getZ()); |
553 | } |
||
554 | |||
555 | 29292 | jmvivo | featureProvider.set(ID_FIELD_THICKNESS, 0.0);
|
556 | featureProvider.set(ID_FIELD_HEIGHTTEXT, 0.0);
|
||
557 | featureProvider.set(ID_FIELD_ROTATIONTEXT, 0.0);
|
||
558 | featureProvider.set(ID_FIELD_TEXT, "");
|
||
559 | 29049 | jmvivo | |
560 | if (entity instanceof DwgMText) { |
||
561 | DwgMText mtext = (DwgMText) entity; |
||
562 | 29292 | jmvivo | featureProvider.set(ID_FIELD_HEIGHTTEXT, mtext.getHeight()); |
563 | featureProvider.set(ID_FIELD_TEXT, mtext.getText()); |
||
564 | 29049 | jmvivo | } else if (entity instanceof DwgText) { |
565 | DwgText text = (DwgText) entity; |
||
566 | 29292 | jmvivo | featureProvider |
567 | 29049 | jmvivo | .set(ID_FIELD_THICKNESS, text.getThickness()); |
568 | 29292 | jmvivo | featureProvider.set(ID_FIELD_HEIGHTTEXT, text.getHeight()); |
569 | featureProvider.set(ID_FIELD_ROTATIONTEXT, text |
||
570 | 29049 | jmvivo | .getRotationAngle()); |
571 | 29292 | jmvivo | featureProvider.set(ID_FIELD_TEXT, text.getText()); |
572 | 29049 | jmvivo | }// if-else
|
573 | |||
574 | 29292 | jmvivo | featureProvider.setDefaultGeometry(geometry); |
575 | 29049 | jmvivo | |
576 | 29292 | jmvivo | store.addFeatureProvider(featureProvider); |
577 | 29049 | jmvivo | if (this.leyendBuilder != null) { |
578 | 29292 | jmvivo | this.leyendBuilder.process(featureProvider);
|
579 | 29049 | jmvivo | } |
580 | |||
581 | } |
||
582 | |||
583 | } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
|
||
584 | throw new CreateGeometryException(e); |
||
585 | } catch (org.gvsig.fmap.geom.exception.CreateEnvelopeException e) {
|
||
586 | throw new CreateGeometryException(e); |
||
587 | } |
||
588 | |||
589 | } |
||
590 | |||
591 | } |
||
592 | |||
593 | |||
594 | public boolean closeResourceRequested(ResourceProvider resource) { |
||
595 | return true; |
||
596 | } |
||
597 | |||
598 | 29289 | jmvivo | public int getOIDType() { |
599 | 29049 | jmvivo | return DataTypes.LONG;
|
600 | } |
||
601 | |||
602 | public boolean supportsAppendMode() { |
||
603 | return false; |
||
604 | } |
||
605 | |||
606 | 29292 | jmvivo | public void append(FeatureProvider featureProvider) { |
607 | 29049 | jmvivo | // FIXME Exception
|
608 | throw new UnsupportedOperationException(); |
||
609 | } |
||
610 | |||
611 | public void beginAppend() { |
||
612 | // FIXME Exception
|
||
613 | throw new UnsupportedOperationException(); |
||
614 | |||
615 | } |
||
616 | |||
617 | public void endAppend() { |
||
618 | // FIXME Exception
|
||
619 | throw new UnsupportedOperationException(); |
||
620 | } |
||
621 | |||
622 | public void saveToState(PersistentState state) throws PersistenceException { |
||
623 | // TODO Auto-generated method stub
|
||
624 | throw new NotYetImplemented(); |
||
625 | } |
||
626 | |||
627 | public void loadFromState(PersistentState state) throws PersistenceException { |
||
628 | // TODO Auto-generated method stub
|
||
629 | throw new NotYetImplemented(); |
||
630 | } |
||
631 | |||
632 | public Object createNewOID() { |
||
633 | return new Long(counterNewsOIDs++); |
||
634 | } |
||
635 | |||
636 | protected void initializeFeatureTypes() throws InitializeException { |
||
637 | try {
|
||
638 | this.open();
|
||
639 | } catch (OpenException e) {
|
||
640 | 33717 | jjdelcerro | throw new InitializeException(this.getProviderName(), e); |
641 | 29049 | jmvivo | } |
642 | } |
||
643 | |||
644 | public Envelope getEnvelope() throws DataException { |
||
645 | this.open();
|
||
646 | 29326 | jmvivo | return (Envelope) this.getDynValue("Envelope"); |
647 | 29049 | jmvivo | } |
648 | |||
649 | |||
650 | /*
|
||
651 | * (non-Javadoc)
|
||
652 | *
|
||
653 | * @see
|
||
654 | * org.gvsig.fmap.dal.resource.spi.ResourceConsumer#resourceChanged(org.
|
||
655 | * gvsig.fmap.dal.resource.spi.ResourceProvider)
|
||
656 | */
|
||
657 | public void resourceChanged(ResourceProvider resource) { |
||
658 | 29326 | jmvivo | this.getStoreServices().notifyChange(
|
659 | DataStoreNotification.RESOURCE_CHANGED, |
||
660 | 29049 | jmvivo | resource); |
661 | } |
||
662 | |||
663 | public Object getSourceId() { |
||
664 | 29289 | jmvivo | return this.getDWGParameters().getFile(); |
665 | 29049 | jmvivo | } |
666 | |||
667 | 33717 | jjdelcerro | |
668 | public String getName() { |
||
669 | String name = this.getDWGParameters().getFile().getName(); |
||
670 | int n = name.lastIndexOf("."); |
||
671 | if( n<1 ) { |
||
672 | return name;
|
||
673 | } |
||
674 | return name.substring(0, n); |
||
675 | } |
||
676 | |||
677 | public String getFullName() { |
||
678 | return this.getDWGParameters().getFile().getAbsolutePath(); |
||
679 | } |
||
680 | |||
681 | |||
682 | |||
683 | 31022 | cordinyana | public ResourceProvider getResource() {
|
684 | return resource;
|
||
685 | } |
||
686 | |||
687 | } |