Avances ventana selección de campos

ConfiguracionSimplificada
Elena 2021-07-22 15:56:25 +02:00
parent 886d285227
commit 41a3070fff
7 changed files with 240 additions and 129 deletions

View File

@ -11,11 +11,14 @@ using System.Collections.ObjectModel;
using ArcGIS.Core.Geometry;
using ArcGIS.Core.Data;
using ArcGIS.Desktop.Mapping;
using ArcGIS.Core.Internal.CIM;
namespace OliviaAddInPro.Helper
{
public static class HelperGdb
{
public static string out_st = string.Empty;
[Flags]
public enum TiposOpenFileDlg
{
@ -25,38 +28,28 @@ namespace OliviaAddInPro.Helper
OpenGdb=8,
}
//Dado el tipo de FtClass y una posición inicial abre un diálogo de búsqueda de ftclass
//si se cancela o no es una feature class lo que se ha abierto devuelve null
//si no, devuelve la featureclass directamente abierta
public static FeatureClass OpenFtClassDialog(TiposOpenFileDlg tipo, string initialLoc = "")
{
Item it = OpenFileDialog( tipo, initialLoc);
//FeatureClass fc = new FeatureClass();
// return fc;
return null;
FeatureClass fc = null;
string path = OpenFileDialog( tipo, initialLoc);
if(!string.IsNullOrEmpty(path))
{
fc = GetFtClass(path);
}
return fc;
}
public static async Task<Geodatabase> OpenGdb(string path)
//Libera el objeto
public static void Free(IDisposable obj)
{
try
{
await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => {
// Opens a file geodatabase. This will open the geodatabase if the folder exists and contains a valid geodatabase.
using (
Geodatabase geodatabase =
new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(path))))
{
return geodatabase;
}
});
}
catch (GeodatabaseNotFoundOrOpenedException exception)
{
// Handle Exception.
}
return null;
obj.Dispose();
}
//Devuelve el Path del archivo seleccionado o un string vacío si se ha cancelado
public static Item OpenFileDialog(TiposOpenFileDlg tipo, string initialLoc="")
public static string OpenFileDialog(TiposOpenFileDlg tipo, string initialLoc="")
{
string titulo;
titulo = "Abrir Archivo";
@ -100,9 +93,9 @@ namespace OliviaAddInPro.Helper
};
bool? ok = aNewFilter.ShowDialog();
if ((ok ?? true) && aNewFilter.Items.Count() > 0)
return aNewFilter.Items.First();
return aNewFilter.Items.First().Path;
else
return null;
return string.Empty;
}
/*public static bool SelecPolig(string title, int wnd_handle, out string text_sal, out IGeometry geom_sal)
@ -114,31 +107,198 @@ namespace OliviaAddInPro.Helper
}*/
public static Table GetTable(string pathLyr)
//Dado un path comprueba que sea de una gdb, termina en .gdb, o si tiene .gdb en medio lo corta ahí
//y si no tiene devuelve vacío
public static string GetPathGdb(string path)
{
Table tb=null;
Geodatabase fileGeodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(pathLyr)));
// FeatureLayer lyr = new FeatureLayer();
return tb;
string pathGdb = string.Empty;
int i = 0;
string gdbext = ".gdb";
if(path.Contains(gdbext))
{
i = path.IndexOf(gdbext, 0, path.Length);
pathGdb = path.Substring(0, i + 4);
}
public static ObservableCollection<string> GetFields(FeatureClass fc)
return pathGdb;
}
//Dado un path aunque sea de una feature class, devuelve el path de la gdb que la contiene, o si
//es de gdb directamente, y si no tiene .gdb, devuelve null
public static Task<Geodatabase> GetGdb(string pathGdb)
{
ObservableCollection<string> fields = new ObservableCollection<string>();
return fields;
Geodatabase fileGeodatabase = null;
return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
{
string path = GetPathGdb(pathGdb);
if (!string.IsNullOrEmpty(path))
{
try
{
fileGeodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(path)));
}
catch (Exception ex)
{
out_st = "Error al abrir Geodatabase " + path + ": " + ex.Message;
return null;
}
}
return fileGeodatabase;
});
//return fileGeodatabase;
}
public static ObservableCollection<string> GetAttributes(FeatureClass fc, string fieldName)
//Dado un path de una feature class devuelve la ftclass abierta directamente,
//o null si ha habido algún problema o no lo ha encontrado
public static FeatureClass GetFtClass(string pathFtClss)
{
ObservableCollection<string> attribs = new ObservableCollection<string>();
return attribs;
FeatureClass ftclss = null;
Geodatabase gdb = GetGdb(pathFtClss).Result;
if (gdb != null)
{
ftclss = GetFtClass(System.IO.Path.GetFileNameWithoutExtension(pathFtClss), gdb).Result;
}
else //mira a ver si es shapefile
{
ftclss = GetFtClassFromShp(pathFtClss).Result;
}
public static Geometry GetGeomSel(string pathLyr, string selField, ObservableCollection<string> selAttributes, out string textoSal)
return ftclss;
}
//Dado el path de una gdb y el nombre de una feature class, devuelve la
//feature class abierta, o null si hay algun problema
public static Task<FeatureClass> GetFtClass(string nameFtclss, Geodatabase gdb)
{
FeatureClass ftclss = null;
return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
{
try
{
ftclss = gdb.OpenDataset<FeatureClass>(nameFtclss);
}
catch (Exception ex)
{
out_st = "Error al abrir Feature Class " + nameFtclss + ": " + ex.Message;
return null;
}
return ftclss;
});
}
//Abre una feature class cuando es un shapefile
public static Task<FeatureClass> GetFtClassFromShp(string pathShp)
{
FeatureClass ftclss = null;
return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
{
if (pathShp.Contains(".shp"))
{
try
{
string shpname = System.IO.Path.GetFileNameWithoutExtension(pathShp);
var shapeFileConnPath = new FileSystemConnectionPath(new Uri(pathShp), FileSystemDatastoreType.Shapefile);
var shapefile = new FileSystemDatastore(shapeFileConnPath);
ftclss = shapefile.OpenDataset<FeatureClass>(shpname);
}
catch (Exception ex)
{
out_st = "Error al abrir Shapefile " + pathShp + ": " + ex.Message;
return null;
}
}
return ftclss;
});
}
//devuelve el campo dado el nombre
private static Task<ArcGIS.Core.Data.Field> GetFieldByName(FeatureClass ftClss, string fieldName)
{
FeatureClassDefinition ftcldef = ftClss.GetDefinition();
ArcGIS.Core.Data.Field field=null;
return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
{
try
{
field = ftcldef.GetFields().First(x => x.Name.Equals(fieldName));
}
catch (Exception ex)
{
out_st = "No se encuentra el campo " + fieldName + ": " + ex.Message;
return null;
}
return field;
});
}
//Devuelve una lista con los campos de una feature class
public static Task<ObservableCollection<string>> GetFields(FeatureClass fc)
{
FeatureClassDefinition ftcldef=null;
IReadOnlyList<ArcGIS.Core.Data.Field> fields = null;
ObservableCollection<string> fields_st = new ObservableCollection<string>();
return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
{
try
{
ftcldef = fc.GetDefinition();
fields = ftcldef.GetFields();
foreach (ArcGIS.Core.Data.Field f in fields)
{
fields_st.Add(f.Name);
}
}
catch (Exception ex)
{
out_st = "Error al leer los campos " + fc.GetName() + ": " + ex.Message;
return fields_st;
}
return fields_st;
});
}
//Devuelve comilla simple si el campo es de texto, o nada si es númerico
//var whereClause = $"{SelectedField} = {Quote(f)}{FieldValue}{Quote(f)}";
public static string Quote(ArcGIS.Core.Data.Field f)
{
return f.FieldType == FieldType.String ? "'" : "";
}
//Dado un nombre de campo, devuelve los atributos que aparecen distintos
public static Task<ObservableCollection<string>> GetAttributes(FeatureClass fc, string fieldName)
{
ObservableCollection<string> attribs_st = new ObservableCollection<string>();
return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
{
try
{
FeatureClassDefinition ftcldef = fc.GetDefinition();
ArcGIS.Core.Data.Field field = ftcldef.GetFields().First(x => x.Name.Equals(fieldName));
string whereClause = $"";
ArcGIS.Core.Data.QueryFilter queryFilter = new ArcGIS.Core.Data.QueryFilter { WhereClause = whereClause };
using (RowCursor rowCursor = fc.Search(queryFilter))
{
while (rowCursor.MoveNext())
{
using (Row row = rowCursor.Current)
{
attribs_st.Add(Convert.ToString(row[fieldName]));
}
}
}
}
catch (Exception ex)
{
out_st = "Error al leer los campos " + fc.GetName() + ": " + ex.Message;
return attribs_st;
}
return attribs_st;
});
}
/*public static Geometry GetGeomSel(string pathLyr, string selField, ObservableCollection<string> selAttributes, out string textoSal)
{
string _textosal = "";
Geometry geomsal = null;
@ -170,9 +330,9 @@ namespace OliviaAddInPro.Helper
//Actualiza el texto de salida
_textosal = _textosal + HelperGlobal.RevisaText(val_st[i]);
}
}*/
}
textoSal = _textosal;
return geomsal;
}
}*/
}
}

View File

@ -1,69 +0,0 @@
/*
Copyright 2019 Esri
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace OliviaAddInPro
{
public class OptionsMenuItem : INotifyPropertyChanged
{
public OptionsMenuItem(BitmapImage imageUri, string optionString, PaneLimpiezaSubBase subPanelViewModel)
{
_imageSource = imageUri;
_optionString = optionString;
_subPanelViewModelBase = subPanelViewModel;
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnNotifyPropertyChanged(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
private PaneLimpiezaSubBase _subPanelViewModelBase;
public PaneLimpiezaSubBase SubPanelViewModel
{
get { return _subPanelViewModelBase; }
set {
_subPanelViewModelBase = value;
OnNotifyPropertyChanged("SubPanelViewModel");
}
}
private ImageSource _imageSource;
public ImageSource ImageSource
{
get { return _imageSource; }
set { _imageSource = value; }
}
private string _optionString;
public string OptionString
{
get { return _optionString; }
set { _optionString = value; }
}
}
}

View File

@ -43,9 +43,9 @@ namespace OliviaAddInPro
private void Button_Click(object sender, RoutedEventArgs e)
{
Item it=HelperGdb.OpenFileDialog(HelperGdb.TiposOpenFileDlg.OpenFtrClassLine | HelperGdb.TiposOpenFileDlg.OpenFtrClassPoint);
if(it!=null && it.Path.Length > 0)
label_capalimp.Content = it.Name;
string capa=HelperGdb.OpenFileDialog(HelperGdb.TiposOpenFileDlg.OpenFtrClassLine | HelperGdb.TiposOpenFileDlg.OpenFtrClassPoint);
if(!string.IsNullOrEmpty(capa))
label_capalimp.Content = System.IO.Path.GetFileNameWithoutExtension(capa);
else
label_capalimp.Content = Resource1.String_selec_capa;
}

View File

@ -42,7 +42,7 @@ namespace OliviaAddInPro
string texto="";
if (fc != null)
{
texto = System.IO.Path.GetFileName(fc.GetName());
//texto = fc.GetName();
//saca la ventana de selección de campo
ShowProWndSelectFields selfwnd = new ShowProWndSelectFields(fc, true);
if(selfwnd.SelAttributes.Count>0)
@ -51,11 +51,12 @@ namespace OliviaAddInPro
//HelperGdb.GetGeomSel(it.Path, selfwnd.SelField, selfwnd.SelAttributes, out texto);
}
}
if(!ok)
texto= Resource1.String_selec_capa;
if (!ok)
{
texto = Resource1.String_selec_capa;
}
label_caparestr.Content = texto;
HelperGdb.Free(fc);
}
private void button_capaniv_Click(object sender, RoutedEventArgs e)

View File

@ -7,6 +7,7 @@
xmlns:extensions="clr-namespace:ArcGIS.Desktop.Extensions;assembly=ArcGIS.Desktop.Extensions"
mc:Ignorable="d" Height="300" Width="243.123"
WindowStartupLocation="CenterOwner" Icon="OliviaIconPro.ico" ResizeMode="NoResize" Closed="ProWindow_Closed" Closing="ProWindow_Closing"
d:DataContext="{Binding Path=ui.ShowProWndSelectFields}"
>
<controls:ProWindow.Resources>
<ResourceDictionary>
@ -18,9 +19,9 @@
<StackPanel HorizontalAlignment="Left" Height="272" VerticalAlignment="Top" Width="233" Margin="0,0,0,-1.6">
<Label Margin="15,0,0,0" Content="Campo"/>
<ComboBox Margin="10,5,9.6,0"
ItemsSource="{Binding Path=Fields, Mode = TwoWay}" Name="comboBoxFields" SelectedItem="{Binding Path=SelField, Mode = TwoWay}" SelectionChanged="comboBoxFields_SelectionChanged"/>
ItemsSource="{Binding Path=Fields, Mode=TwoWay}" Name="comboBoxFields" SelectedItem="{Binding Path=SelField, Mode = TwoWay}" SelectionChanged="comboBoxFields_SelectionChanged"/>
<Label Margin="15,0,0,0" Content="Atributo"/>
<ListBox Margin="10,5,9.6,0" Height="127" ItemsSource="{Binding Path=Attributes, Mode = TwoWay}" Name="listBoxAttributes" SelectedItem="{Binding Path=SelAttributes, Mode = TwoWay}" SelectionMode="{Binding SelMode}"/>
<ListBox Margin="10,5,9.6,0" Height="127" ItemsSource="{Binding Path=Attributes}" Name="listBoxAttributes" SelectedItem="{Binding Path=SelAttributes, Mode = TwoWay}" SelectionMode="{Binding SelMode}"/>
<Button Margin="167,25,9.6,0" Content="Aceptar" Opacity="0.75" Click="Button_Click"/>
</StackPanel>

View File

@ -14,6 +14,8 @@ using System.Windows.Navigation;
using System.Windows.Shapes;
using OliviaAddInPro.Helper;
using ArcGIS.Core.Data;
using System.Collections.ObjectModel;
using ArcGIS.Desktop.Internal.Framework.Controls;
namespace OliviaAddInPro.View
{
@ -24,6 +26,7 @@ namespace OliviaAddInPro.View
{
private bool ok = false;
public FeatureClass fc = null;
public string err_st = string.Empty;
public ProWndSelectFields()
{
InitializeComponent();
@ -33,7 +36,13 @@ namespace OliviaAddInPro.View
{
if(comboBoxFields.SelectedIndex>0)
{
listBoxAttributes.ItemsSource = HelperGdb.GetAttributes(fc, comboBoxFields.SelectedItem.ToString());
ObservableCollection<string> attribs_st =
HelperGdb.GetAttributes(fc, comboBoxFields.SelectedItem.ToString()).Result;
if (attribs_st.Count==0)
{
OliviaGlob.ponMsg(HelperGdb.out_st, MessageType.Error);
}
listBoxAttributes.ItemsSource = attribs_st;
}
}

View File

@ -11,6 +11,7 @@ using ArcGIS.Core.Data;
using System.Windows.Controls;
using ArcGIS.Desktop.Mapping;
using ArcGIS.Desktop.Core;
using ArcGIS.Desktop.Internal.Framework.Controls;
namespace OliviaAddInPro.View
{
@ -24,7 +25,8 @@ namespace OliviaAddInPro.View
private string selField = string.Empty;
private bool multiSelAtt = true;
private string pathLyr = string.Empty;
FeatureClass ftClass = null;
private FeatureClass ftClass = null;
public string err_st=string.Empty;
public bool res = false;
@ -34,12 +36,19 @@ namespace OliviaAddInPro.View
ftClass = fc;
//pathLyr = it.Path;
multiSelAtt = _multiSelAtt;
fields = HelperGdb.GetFields(fc);
fields = HelperGdb.GetFields(ftClass).Result;
if (fields.Count == 0)
{
OliviaGlob.ponMsg(HelperGdb.out_st, MessageType.Error);
}
else
{
attributes.Clear();
selAttributes.Clear();
selField = string.Empty;
muestra();
}
}
private void muestra()
{
//already open?