字段重命名(Rename Field) Geoprocessing Tool (10.1)

Rename Field Geoprocessing Tool (10.1)

Thumbnail
Geoprocessing tools to rename fields and rename field aliases for tables in the geodatabase. Geoprocessing Sample Geoprocessing Sample 修改者 foxchris11
上次修改时间: 2013年1月3日






此示例提供一个地理处理工具,可用于重命名地理数据库中的表或功能的类中的字段。 在 10.1 要允许用户更改字段名称添加到新的功能,这是目前只能暴露在用户界面中。 此地理处理工具使您能够完成相同的但因为它是一个地理处理工具它可以在模型生成器中使用,并可以为 python 调用。 这将有助于自动更新的字段名称的过程。 重命名字段工具中,除了重命名字段别名还提供了工具的工作方式类似,但特定于修改字段别名。

若要使用这些工具下载附的 zip 文件并提取到位置您想要安装这些工具。 进入重命名字段工具文件夹浏览和查找自述文件文本的文件,其中包含有关如何注册的工具和其他信息的说明。 这些工具用.Net 生成和下载以及中提供源代码。


因为这个GP使用VS+AO/AE编写的,所以需要对生成的dll注册


关于注册参考 ESRIRegAsm  

文件中也同样提供了已经写好的批处理文件
Echo Registering RenameFieldsGPTool.dll
set COMMONPROGRAMFILESLOCATION=%COMMONPROGRAMFILES%
IF NOT "%PROCESSOR_ARCHITECTURE%" == "x86" set COMMONPROGRAMFILESLOCATION=%COMMONPROGRAMFILES(x86)%
"%COMMONPROGRAMFILESLOCATION%\ArcGIS\bin\ESRIRegasm.exe" "%~dp0\RenameFieldGPTool.dll" /p:desktop
64BitGP运行的批处理文件
Echo Registering RenameFieldsGPTool.dll
set COMMONPROGRAMFILESLOCATION=%COMMONPROGRAMFILES%
IF NOT "%PROCESSOR_ARCHITECTURE%" == "x86" set COMMONPROGRAMFILESLOCATION=%COMMONPROGRAMFILES(x86)%
"%COMMONPROGRAMFILESLOCATION%\ArcGIS\bin\ESRIRegasm.exe" "%~dp0\RenameFieldGPTool.dll" /p:desktop /regfile:64Background.reg
"%SYSTEMROOT%\regedit.exe" /S "%~dp0\64Background.reg"

然后,我们就可以加载ArcToolbox工具即可


在下载文件有相关的源代码,通过源代码我们可以学到两个技能
1:怎么通过代码方式来创建自己的ArcToolbox工具
2:使用那些即可来完成修改字段名称以及别名

以下是相关代码,附件里面更加完整。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geoprocessing;
using ESRI.ArcGIS.Geodatabase;

namespace RenameFieldGPTool
{
    [Guid("b838084c-4bc4-4b2b-a428-a6a234ed60e8")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("RenameFieldsGPTool.RenameFieldGPFunction")]
    public class RenameFieldGPFunction : ESRI.ArcGIS.Geoprocessing.IGPFunction2, IGPToolBackground
    {
        private string m_ToolName = "RenameField";
        private string m_metadatafile = "RenameField.xml";
        private IArray m_Parameters;
        private IGPUtilities m_GPUtilities;
        private IGeoProcessor gp;

        public RenameFieldGPFunction()
        {
            m_GPUtilities = new GPUtilitiesClass();
            gp = new GeoProcessorClass();
        }

        #region "IGPFunction2 Implementations"
        public ESRI.ArcGIS.esriSystem.UID DialogCLSID
        {
            get { return null; }
        }

        public string Name
        {
            get { return m_ToolName; }
        }

        public string DisplayName
        {
            get { return "Rename Field"; }
        }

        public ESRI.ArcGIS.esriSystem.IName FullName
        {
            get
            {
                IGPFunctionFactory functionFactory = new RenameFieldGPFunctionFactory();
                return (IName)functionFactory.GetFunctionName(m_ToolName);
            }
        }

        public bool IsLicensed()
        {
            return true;
        }

        public string MetadataFile
        {
            get
            {
                string filePath;
                filePath = System.IO.Path.GetDirectoryName
                    (System.Reflection.Assembly.GetExecutingAssembly().Location);
                filePath = System.IO.Path.Combine(filePath, m_metadatafile);
                return filePath;
            }
        }

        public object GetRenderer(ESRI.ArcGIS.Geoprocessing.IGPParameter pParam)
        {
            return null;
        }

        public int HelpContext
        {
            get { return 0; }
        }

        public string HelpFile
        {
            get { return ""; }
        }

        public ESRI.ArcGIS.esriSystem.IArray ParameterInfo
        {
            get
            {
                IArray parameters = new ArrayClass();

                IGPParameterEdit3 inputParameter = new GPParameterClass();
                inputParameter.DataType = new DETableTypeClass();
                inputParameter.Direction = esriGPParameterDirection.esriGPParameterDirectionInput;
                inputParameter.DisplayName = "Input Table";
                inputParameter.Name = "input_table";
                inputParameter.ParameterType = esriGPParameterType.esriGPParameterTypeRequired;
                parameters.Add(inputParameter);

                inputParameter = new GPParameterClass();
                inputParameter.DataType = new FieldTypeClass();
                inputParameter.Direction = esriGPParameterDirection.esriGPParameterDirectionInput;
                inputParameter.DisplayName = "Field";
                inputParameter.Name = "field";
                inputParameter.ParameterType = esriGPParameterType.esriGPParameterTypeRequired;
                inputParameter.AddDependency("input_table");

                IGPFieldDomain fieldDomain = new GPFieldDomainClass();
                fieldDomain.AddType(esriFieldType.esriFieldTypeInteger);
                fieldDomain.AddType(esriFieldType.esriFieldTypeSmallInteger);
                fieldDomain.AddType(esriFieldType.esriFieldTypeSingle);
                fieldDomain.AddType(esriFieldType.esriFieldTypeDouble);
                fieldDomain.AddType(esriFieldType.esriFieldTypeString);
                fieldDomain.AddType(esriFieldType.esriFieldTypeDate);
                fieldDomain.AddType(esriFieldType.esriFieldTypeRaster);
                fieldDomain.AddType(esriFieldType.esriFieldTypeGUID);
                inputParameter.Domain = (IGPDomain)fieldDomain;
                parameters.Add(inputParameter);                
                
                inputParameter = new GPParameterClass();
                inputParameter.DataType = new GPStringTypeClass();
                inputParameter.Direction = esriGPParameterDirection.esriGPParameterDirectionInput;
                inputParameter.DisplayName = "New Field Name";
                inputParameter.Name = "new_field_name";
                inputParameter.ParameterType = esriGPParameterType.esriGPParameterTypeRequired;
                parameters.Add(inputParameter);

                IGPParameterEdit3 outputParameter = new GPParameterClass();
                outputParameter.DataType = new DETableTypeClass();
                outputParameter.Direction = esriGPParameterDirection.esriGPParameterDirectionOutput;
                outputParameter.DisplayName = "Output Table";
                outputParameter.Name = "out_table";
                outputParameter.ParameterType = esriGPParameterType.esriGPParameterTypeDerived;              
                IGPFeatureSchema outputSchema = new GPFeatureSchemaClass();
                IGPSchema schema = (IGPSchema)outputSchema;                             
                schema.CloneDependency = true;
                outputParameter.Schema = outputSchema as IGPSchema;
                outputParameter.AddDependency("input_table");
                parameters.Add(outputParameter);

                return parameters;
            }
        }

        public void UpdateMessages(ESRI.ArcGIS.esriSystem.IArray paramvalues, ESRI.ArcGIS.Geoprocessing.IGPEnvironmentManager pEnvMgr, ESRI.ArcGIS.Geodatabase.IGPMessages Messages)
        {
            IGPMessage msg = (IGPMessage)Messages.GetMessage(0);
            if (msg.IsError())
                return;

            IGPValue parameterValue = m_GPUtilities.UnpackGPValue(paramvalues.get_Element(0));
            if (parameterValue.IsEmpty() == false)
            {
                ITable inputTable;
                IQueryFilter qf;
                m_GPUtilities.DecodeTableView(parameterValue, out inputTable, out qf);

                if (inputTable != null)
                {
                    IDataset ds = (IDataset)inputTable;
                    IWorkspace wksp = ds.Workspace;
                    IGeodatabaseRelease2 gdbRelease = wksp as IGeodatabaseRelease2;
                    IObjectClass objectClass = inputTable as IObjectClass;
                    if (objectClass == null || objectClass.ObjectClassID == -1 || (gdbRelease.MajorVersion + 7) < 10)
                    {
                        Messages.ReplaceError(0, -1, "Input table is not supported. This functionality is only supported on a Geodatabase release of ArcGIS 10.0 or greater");
                        return;
                    }

                    IGPValue fieldNameValue = m_GPUtilities.UnpackGPValue(paramvalues.get_Element(2));
                    if (fieldNameValue.IsEmpty() == false)
                    {
                        
                        string fieldName = fieldNameValue.GetAsText();
                        string validFieldName = gp.ValidateFieldName(fieldName, wksp.PathName);
                        if (validFieldName != fieldName)
                        {
                            //GP Warning 304 Renamed field <value> to <value>. Run in Execute
                            Messages.ReplaceError(2, -1, string.Format("Field Name: {0} is not valid for this workspace, consider {1} instead", fieldName, validFieldName));
                        }
                        else
                        {
                            int index = inputTable.FindField(fieldName);
                            if (index > 0)
                            {
                                //GP Warning 12 <value> already exists. Run in Update Messages
                                //Tool still runs (Add Field) and completes succesfully but nothing is added
                                Messages.ReplaceError(2, -1, string.Format("Field Name: {0} already exists in the table, please select a unique name", fieldName));
                            }
                        }                        
                    }
                }
            }
            return;
        }

        public void UpdateParameters(ESRI.ArcGIS.esriSystem.IArray paramvalues, ESRI.ArcGIS.Geoprocessing.IGPEnvironmentManager pEnvMgr)
        {
        }

        public ESRI.ArcGIS.Geodatabase.IGPMessages Validate(ESRI.ArcGIS.esriSystem.IArray paramvalues, bool updateValues, ESRI.ArcGIS.Geoprocessing.IGPEnvironmentManager envMgr)
        {
            if (m_Parameters == null)
                m_Parameters = ParameterInfo;

            // Call UpdateParameters(). 
            // Only Call if updatevalues is true.
            if (updateValues == true)
            {
                UpdateParameters(paramvalues, envMgr);
            }

            // Call InternalValidate (Basic Validation). Are all the required parameters supplied?
            // Are the Values to the parameters the correct data type?
            IGPMessages validateMsgs = m_GPUtilities.InternalValidate(m_Parameters, paramvalues, updateValues, true, envMgr);

            // Call UpdateMessages();
            UpdateMessages(paramvalues, envMgr, validateMsgs);

            // Return the messages
            return validateMsgs;
        }

        public void Execute(ESRI.ArcGIS.esriSystem.IArray paramvalues, ESRI.ArcGIS.esriSystem.ITrackCancel TrackCancel, ESRI.ArcGIS.Geoprocessing.IGPEnvironmentManager envMgr, ESRI.ArcGIS.Geodatabase.IGPMessages message)
        {
            IGPParameter parameter = (IGPParameter)paramvalues.get_Element(0);
            IGPValue parameterValue = m_GPUtilities.UnpackGPValue(parameter);

            ITable inputTable;
            IQueryFilter qf;
            m_GPUtilities.DecodeTableView(parameterValue, out inputTable, out qf);

            if (inputTable == null)
            {
                message.AddError(-1, "Error opening input dataset.");
                return;
            }

            parameter = (IGPParameter)paramvalues.get_Element(1);
            string oldfieldName = parameter.Value.GetAsText();

            parameter = (IGPParameter)paramvalues.get_Element(2);
            string newfieldName = parameter.Value.GetAsText();

            ISchemaLock schemaLock = (ISchemaLock)inputTable;
            IClassSchemaEdit4 classSchemaEdit = (IClassSchemaEdit4)inputTable;
            try
            {
                schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
                try
                {
                    classSchemaEdit.AlterFieldName(oldfieldName, newfieldName);
                }
                catch (Exception)
                {
                    message.AddError(-1, string.Format("Field name cannot be changed for this field: {0}", oldfieldName));
                    return;
                }                
            }
            catch (Exception)
            {
                message.AddError(464, "Cannot get exclusive schema lock. Table is either being edited or in use by another application.");
                return;
            }
            finally
            {
                schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);                
            }            
        }
        #endregion

        public bool CanRunInBackground
        {
            get
            {
                return true;
            }
            set
            {
                return;
            }
        }
    }
}


评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值