4 votos

No se puede editar esta clase de característica. ¿Por qué?

Puedo crear con éxito esta featureclass en la geodatabase por defecto de ArcGIS 10 y añadirla al proyecto, pero no se puede editar. He intentado añadir una característica utilizando FeatureClass.CreateFeatureBuffer() sino que se trata del viejo críptico: {"Error HRESULT E_FAIL has been returned from a call to a COM component."}

Si intento añadir una característica con la barra de herramientas de edición en ArcMap:

No se ha podido completar la tarea de creación de características.

La featureclass SÍ tiene una referencia espacial que coincide con el marco de datos y las otras capas del proyecto.
¿Me estoy perdiendo algo? Debería ser fácil, ¿alguna idea?

private IFeatureClass MakePointFC(IFeatureLayer pLineLayer)
{
    try
    {
        IGxCatalogDefaultDatabase Defaultgdb = ArcMap.Application as IGxCatalogDefaultDatabase;
        Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
        IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
        IWorkspace pWorkspace = workspaceFactory.OpenFromFile(Defaultgdb.DefaultDatabaseName.PathName, 0);

        IFeatureWorkspace workspace = pWorkspace as IFeatureWorkspace;
        UID CLSID = new UID();
        CLSID.Value = "esriGeoDatabase.Object";

        IFields pFields = new FieldsClass();
        IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
        pFieldsEdit.FieldCount_2 = 2;

        IGeoDataset geoDataset = pLineLayer as IGeoDataset;

        IGeometryDef pGeomDef = new GeometryDef();
        IGeometryDefEdit pGeomDefEdit = pGeomDef as IGeometryDefEdit;
        pGeomDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
        pGeomDefEdit.SpatialReference_2 = geoDataset.SpatialReference;

        IField pField;
        IFieldEdit pFieldEdit;

        //pField = new FieldClass();
        //pFieldEdit = pField as IFieldEdit;
        //pFieldEdit.AliasName_2 = "ObjectID";
        //pFieldEdit.Name_2 = "ObjectID";
        //pFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
        //pFieldsEdit.set_Field(0, pFieldEdit);

        pField = new FieldClass();
        pFieldEdit = pField as IFieldEdit;
        pFieldEdit.AliasName_2 = "SHAPE";
        pFieldEdit.Name_2 = "SHAPE";
        pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
        pFieldEdit.GeometryDef_2 = pGeomDef;
        pFieldsEdit.set_Field(0, pFieldEdit);

        pField = new FieldClass();
        pFieldEdit = pField as IFieldEdit;
        pFieldEdit.AliasName_2 = "Distance";
        pFieldEdit.Name_2 = "Distance";
        pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble ;
        pFieldsEdit.set_Field(1, pFieldEdit);

        string strFCName = System.IO.Path.GetFileNameWithoutExtension(System.IO.Path.GetRandomFileName());

        IFeatureClass pFeatureClass = workspace.CreateFeatureClass(strFCName, pFieldsEdit, CLSID, null, esriFeatureType.esriFTSimple, "SHAPE", "");
        return pFeatureClass;

    }
    catch (Exception ex)
    {
        return null;
    }

}

0 votos

Por cierto, si exporto la featureclass a una nueva featureclass, puedo editarla sin problemas.

1 votos

¿Intentaste hacer un casting IGxCatalogDefaultDatabase.DefaultDatabaseName a IName y llamando a IName.Open para abrir el espacio de trabajo en lugar de utilizar la fábrica?

0 votos

Además, ¿probó con un nombre amigable en lugar del devuelto por GetRandomFileName ? ¿Por qué se comenta el código del campo OID? Prefiero utilizar IFieldsEdit.AddField en lugar de setfield.

3voto

Diones Puntos 552

En el código anterior, "esriGeodatabase.Object" debería ser "esriGeodatabase.Feature".

3 votos

+1 Yo ciertamente no lo haría Object si ha marcado esta respuesta como la correcta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X