[Gvsig_desarrolladores] ayuda: agregar un campo a la tabla de la capa activa desde código

Francisco José Peñarrubia fpenarru en gmail.com
Jue Mayo 30 12:28:46 CEST 2013


Hola Tonatiuh.

Para añadir un campo, tienes que poner la capa en edición. Eso cambiará el
driver por un VectorialEditableDriver que podrás usar para modificar la
estructura de la tabla, y editar registros.

Ejemplo de añadir un campo:

private boolean addFieldCAltura(FLyrVect lyrConstru, MapControl mapCtrl)
throws BaseException {
if (lyrConstru.getRecordset().getFieldIndexByName("CAltura") != -1) {
// JOptionPane.showMessageDialog(null,
// PluginServices.getText(this, "field_already_exists") + ": " +
fld.getFieldName());
return false;
}
// Si ese campo no existe, nos ponemos en edición
MapContext mc = mapCtrl.getMapContext();

mc.getLayers().setAllActives(false);
lyrConstru.setActive(true);
IExtension pluginEdit = PluginServices
.getExtension(com.iver.cit.gvsig.StartEditing.class);
pluginEdit.execute(null);


EditableAdapter edAdapter = (VectorialEditableAdapter) lyrConstru
.getSource();
FieldDescription fld1 = new FieldDescription();
fld1.setFieldName("NumPlantas");
fld1.setFieldType(Types.INTEGER);
fld1.setFieldDecimalCount(0);
fld1.setFieldLength(8);

FieldDescription fld = new FieldDescription();
fld.setFieldName("CAltura");
fld.setFieldType(Types.FLOAT);
fld.setFieldDecimalCount(2);
fld.setFieldLength(8);
 FieldDescription fld2 = new FieldDescription();
fld2.setFieldName("EsIndust");
fld2.setFieldType(Types.INTEGER);
fld2.setFieldDecimalCount(0);
fld2.setFieldLength(8);

edAdapter.addField(fld1);
edAdapter.addField(fld);
edAdapter.addField(fld2);
 int iField = edAdapter.getRecordset().getFieldIndexByName("CONSTRU");
int iFieldRefCat = edAdapter.getRecordset().getFieldIndexByName("REFCAT");
 edAdapter.startComplexRow();
for (int i = 0; i < edAdapter.getRowCount(); i++) {
IRowEdited feat = edAdapter.getRow(i);
Value[] atts = feat.getAttributes();

String aux = atts[iField].toString();
String refCat = atts[iFieldRefCat].toString();
int altura = getCadastralHeight(aux);
atts[atts.length - 3] = ValueFactory.createValue(altura);
atts[atts.length - 2] = ValueFactory.createValue(3.5 * altura);
int isIndustrial = 0;
if (hashConstrucciones.containsKey(refCat)) {
ArrayList<Construccion> aux2 = hashConstrucciones.get(refCat);
for (Construccion c : aux2) {
if (c.getDestino().equalsIgnoreCase("AAL")) {
isIndustrial = 1;
break;
}
}
}
atts[atts.length - 1] = ValueFactory.createValue(isIndustrial);

feat.setAttributes(atts);
edAdapter.modifyRow(i, feat.getLinkedRow(), "fieldAdded",
EditionEvent.ALPHANUMERIC);
}

edAdapter.endComplexRow("fieldAdded");
 saveLayer(mapCtrl, lyrConstru);
 return true;
}


y el método saveLayer:

public void saveLayer(MapControl mapCtrl, FLyrVect layer) throws
BaseException {
layer.setWaitTodraw(true);
layer.setProperty("stoppingEditing", new Boolean(true));
VectorialEditableAdapter vea = (VectorialEditableAdapter) layer
.getSource();

ISpatialWriter writer = (ISpatialWriter) vea.getWriter();
com.iver.andami.ui.mdiManager.IWindow[] views = PluginServices
.getMDIManager().getAllWindows();
for (int j = 0; j < views.length; j++) {
if (views[j] instanceof Table) {
Table table = (Table) views[j];
if (table.getModel().getAssociatedTable() != null
&& table.getModel().getAssociatedTable()
.equals(layer)) {
table.stopEditingCell();
}
}
}
vea.cleanSelectableDatasource();
layer.setRecordset(vea.getRecordset()); // Queremos que el recordset
// del layer
// refleje los cambios en los campos.
ILayerDefinition lyrDef = EditionUtilities
.createLayerDefinition(layer);
String aux = "FIELDS:";
FieldDescription[] flds = lyrDef.getFieldsDesc();
for (int i = 0; i < flds.length; i++) {
aux = aux + ", " + flds[i].getFieldAlias();
}
System.err.println("Escribiendo la capa " + lyrDef.getName()
+ " con los campos " + aux);
lyrDef.setShapeType(layer.getShapeType());
writer.initialize(lyrDef);
vea.stopEdition(writer, EditionEvent.GRAPHIC);
layer.setWaitTodraw(false);
layer.setProperty("stoppingEditing", new Boolean(false));
vea.getCommandRecord().removeCommandListener(mapCtrl);
layer.setEditing(false);
}


Espero que te sirva.

Suerte, y si puedes, comparte los resultados de tu proyecto.

Fran.



El 26 de mayo de 2013 21:21, TONATIUH M B <tonatiuh_esia en msn.com> escribió:

> Buen día a la lista de desarrolladores.
> Intento agregar un campo a la tabla de atributos de la capa activa desde
> código. Cómo obtengo la tabla de la capa activa y cómo agrego el nuevo
> campo o registro a la tabla?
> Estoy terminando una extensión para la versión 1.9 relacionada con redes,
> sobre la asignación de viajes a la red, donde el resultado final es un
> ArrayList con el volumen de viajes para cada arco. Una vez que obtengo el
> ArrayList con el dato para cada arco, pretendo añadirlo, mediante código, a
> un nuevo campo a la tabla de atributos de la capa vectorial activa
> correspondiente a la de la red. He visto el método
> getTableModel.addColumn(Object columnName, Vector columnData), pero no sé
> cómo usarlo ni cómo obtener la tabla de la capa para aplicarlo.
> Intuyo que debo obtener el layer activo con el método siActive():
>
> if ((lyrVect.getShapeType() == FShape.LINE) && (lyrVect.isActive())){
>    this.currentLyr = (FLyrVect) lyrVect;
> }
>
> después obtener la tabla de ese layer y agregar el nuevo campo, que es en
> estos pasos en donde solicito su orientación.
> Intenté lo siguiente, pero no funcionó:
>
> MemoryDriver driver;
> driver = (MemoryDriver) currentLyr.getSource().getDriver();
> driver.getTableModel().addColumn("Hola");
>
> Me manda un error de cast:
> com.iver.cit.gvsig.fmap.drivers.shp.IndexedShpDriver cannot be cast to com
> .iver.cit.gvsig.fmap.drivers.MemoryDriver.
>
> Agradezco de antemano su ayuda.
> Tonatiuh M.
> Tesista, UNAM
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en listserv.gva.es
> Para ver histórico de mensajes, editar sus preferencias de usuario o darse
> de baja en esta lista, acuda a la siguiente dirección:
> http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>
>


-- 
Francisco José Peñarrubia

Equipo gvSIG
Software Colaborativo
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20130530/3d2e1827/attachment.htm 


Más información sobre la lista de distribución gvSIG_desarrolladores