VBA to C# Conversion

519
5
11-21-2010 02:59 AM
shravanshravan
New Contributor
Could anyone help me in converting the below VBA code into C#, i appreciate for the help you guys do.



Public Sub DumpAttributesToFileExample()

'Open a new text file to write to
Open "c:/temp/outfile.txt" For Output As #1

Dim pMxDoc As IMxDocument
Dim pMap As IMap
Dim pFLayer As IFeatureLayer
Dim pFClass As IFeatureClass

Set pMxDoc = ThisDocument
Set pMap = pMxDoc.FocusMap

'Get reference to layer in table of contents (0 is topmost layer)
Set pFLayer = pMap.Layer(0)
Set pFClass = pFLayer.FeatureClass

'Use a Query Filter to select a subset of features using
'a simple SQL where clause
Dim pQFilter As IQueryFilter
Set pQFilter = New QueryFilter
pQFilter.WhereClause = ""

'Establish a cursor used for looping
Dim pFCursor As IFeatureCursor
Set pFCursor = pFClass.Search(pQFilter, True)
Dim pFeature As IFeature
Set pFeature = pFCursor.NextFeature
 
'Loop thru all features and write attributes to output file
Do Until pFeature Is Nothing


'Note: below, pFeature.value(1) and pFeature.value(2) use field index numbers of the 2nd and 3rd fields in the table
'to write the values in these fields to output file. Also, the _ character continues an expression to the next line


Print #1, "Field #2 = " & pFeature.Value(1)   & " and Field #3 = " & pFeature.Value(2)
Set pFeature = pFCursor.NextFeature

Loop

Close #1

End Sub
0 Kudos
5 Replies
JeffreyHamblin
New Contributor III
Assuming you are creating an Add-in button, Here is a mostly straight across conversion:

using System;
using System.IO;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;

protected override void OnClick()
{
    DumpAttributesToFileExample("c:/temp/outfile.txt");
}

private void DumpAttributesToFileExample(string fileName)
{
    StreamWriter outFile = new StreamWriter(new FileStream(fileName,
                FileMode.Create, FileAccess.Write));
    try
    {

        IMap map = ArcMap.Document.FocusMap;
        IFeatureLayer featureLayer = (IFeatureLayer)map.get_Layer(0);
        IFeatureClass featureClass = featureLayer.FeatureClass;

        IQueryFilter queryFilter = new QueryFilterClass();
        queryFilter.WhereClause = "";

        IFeatureCursor featureCursor = featureClass.Search(queryFilter, true);
        IFeature feature = null;

        while ((feature = featureCursor.NextFeature()) != null)
        {
            string output = "Field #2 = " + feature.get_Value(1).ToString() + 
                    " and Field #3 = " + feature.get_Value(2).ToString();
            outFile.WriteLine(output);
        }
    }
    finally
    {
        outFile.Close();
    }
}



-Jeff
0 Kudos
shravanshravan
New Contributor
Thank you Jeff, I appreciate for taking time from your busy schedule and working on this.
0 Kudos
AlainHajj
New Contributor
Please can anyone help me in converting this code below for IQueryFilter example from VBA to C#.
Also if anyone can help me to give me a code for IQueryFilter , ISpatialFilter and ITopologicalOperater in C# .
If anyone can reply me on Alain_hatch@hotmail.com
Thank you for your effort and time.



Option Explicit
Enum WorkspaceType
enumGeodatabase = 0
enumPersonalGeodatabase = 1
enumShape = 2
enumCoverage = 3
End Enum

Private Sub Command1_Click()
Dim iWorkspaceConnect As Integer

'Uncomment the Workspace type of choice
'iWorkspaceConnect = enumGeodatabase
'iWorkspaceConnect = enumPersonalGeodatabase
iWorkspaceConnect = enumShape
'iWorkspaceConnect = enumCoverage

On Error GoTo MyError

Dim pPropset As IPropertySet
Set pPropset = New PropertySet

Dim pFact As IWorkspaceFactory
Dim pWorkspace As IWorkspace

Select Case iWorkspaceConnect
Case enumGeodatabase ' Geodatabase (SDE)
With pPropset
.SetProperty "Server", "hephaestus"
.SetProperty "Instance", "sde8_mss"
.SetProperty "Database", "sde"
.SetProperty "user", "sde"
.SetProperty "password", "go"
.SetProperty "version", "sde.DEFAULT"
End With

Set pFact = New SdeWorkspaceFactory
MsgBox "Geodatabase"
Case enumPersonalGeodatabase ' Personal Geodatabase (Access)
pPropset.SetProperty "DATABASE", "d:\\data\\Access Data\\SDETest.mdb"
Set pFact = New AccessWorkspaceFactory
MsgBox "Personal Geodatabase"
Case enumShape ' Shapefile
pPropset.SetProperty "DATABASE", "D:\\data\\SDEtestData\\Greeley"
Set pFact = New ShapefileWorkspaceFactory
MsgBox "Shapefile"
Case enumCoverage ' Coverage
pPropset.SetProperty "DATABASE", "D:\\data\\Coverage"
Set pFact = New ArcInfoWorkspaceFactory
MsgBox "Coverage"
End Select

' Open the Workspace
Set pWorkspace = pFact.Open(pPropset, Me.hWnd)

Dim pFeatureWorkspace As IFeatureWorkspace
Set pFeatureWorkspace = pWorkspace

' Open the FeatureClass
' Coverage data requires that the addition of the geometry type
' when opening the feature class (in this case polgon). The
' feature class name is separated from the geometry type with a
' ":".
Dim pFeatureClass As IFeatureClass
If iWorkspaceConnect = enumCoverage Then
Set pFeatureClass = pFeatureWorkspace.OpenFeatureClass("parcels:polygon")
Else
Set pFeatureClass = pFeatureWorkspace.OpenFeatureClass("parcels")
End If

Dim pQueryFilter As IQueryFilter
Set pQueryFilter = New QueryFilter

' Set the where clause
pQueryFilter.WhereClause = "SUBTYPE = 'INDSTL'"

' Execute the query filter
Dim pFeatureCursor As IFeatureCursor
Set pFeatureCursor = pFeatureClass.Search(pQueryFilter, False)

Dim pFeature As IFeature
Dim n As Long
Dim i As Long
Dim iRecCount As Integer
Dim pPointCollection As IPointCollection
Dim lPnt As Long
iRecCount = 0

' Retrieve the results.
Do
Set pFeature = pFeatureCursor.NextFeature
If Not (pFeature Is Nothing) Then
iRecCount = iRecCount + 1
' Create a list box lstQueryResults and uncoment the next
' five lines to list attributes and values.
' For i = 0 To (pFeature.Fields.FieldCount - 1)
' If Not pFeature.Fields.Field(i).Type = esriFieldTypeGeometry Then
' lstQueryResults.AddItem i & " " & pFeature.Fields.Field(i).Name & " " & pFeature.Value(i)
' End If
' Next i
' Uncoment the next four lines to list feature coordinates.
' Set pPointCollection = pFeature.Shape
' For lPnt = 0 To (pPointCollection.PointCount - 1)
' lstQueryResults.AddItem pPointCollection.Point(lPnt).X & ", " & pPointCollection.Point(i).Y
' Next lPnt
End If
Loop Until (pFeature Is Nothing)
MsgBox iRecCount

Exit Sub

MyError:
If Err.Number <> 0 Then
MsgBox Err.Description
End If
End Sub
0 Kudos
JohnHauck
Occasional Contributor II
Here are a few links:

ITopologicalOperator

ISpatialFilter

IQueryFilter


I'm afraid this is really just a disservice to you....these conversion exercises are a great opportunity to make connections between some code that you understand and the syntax of a new language you are trying to learn. Regarless I converted the code...but no testing. I hope this helps:

 enum WorkspaceType { enumGeodatabase = 0, enumPersonalGeodatabase = 1, enumShape = 2, enumCoverage = 3 }

        private void button1_Click(object sender, EventArgs e)
        {
            try 
         {       
                WorkspaceType iWorkspaceConnect = WorkspaceType.enumShape;
          IPropertySet pPropset = new PropertySet(); 
                IWorkspaceFactory pFact;

                switch (iWorkspaceConnect)
             {
              case WorkspaceType.enumGeodatabase:
                        pPropset.SetProperty("Server", "hephaestus");
                        pPropset.SetProperty("Instance", "sde8_mss");
                        pPropset.SetProperty("Database", "sde");
                        pPropset.SetProperty("user", "sde");
                        pPropset.SetProperty("password", "go");
                        pPropset.SetProperty("version", "sde.DEFAULT");
                        pFact = new SdeWorkspaceFactory();
                        System.Windows.Forms.MessageBox.Show("Geodatabase");
                        break;
                    case WorkspaceType.enumPersonalGeodatabase:
                        pPropset.SetProperty("DATABASE", "d:\\data\\Access Data\\SDETest.mdb");
                        pFact = new AccessWorkspaceFactory();
                        System.Windows.Forms.MessageBox.Show("Personal Geodatabase");
                        break;
                    case WorkspaceType.enumShape:
                        pPropset.SetProperty("DATABASE", "D:\\data\\SDEtestData\\Greeley");
                        pFact = new ShapefileWorkspaceFactory();
                        System.Windows.Forms.MessageBox.Show("Shapefile");
                        break;
                    case WorkspaceType.enumCoverage:
                        pPropset.SetProperty("DATABASE", "D:\\data\\Coverage");
                        pFact = new ArcInfoWorkspaceFactory();
                        System.Windows.Forms.MessageBox.Show("Coverage");
                        break;
                    default:
                        break;
             }

                IWorkspace pWorkspace = pFact.Open(pPropset, 0);
                IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;

                IFeatureClass pFeatureClass;
                if(iWorkspaceConnect == WorkspaceType.enumCoverage)
                    pFeatureClass = pFeatureWorkspace.OpenFeatureClass("parcelsolygon");
                else
                    pFeatureClass = pFeatureWorkspace.OpenFeatureClass("parcels");

                IQueryFilter pQueryFilter = new QueryFilter(){ WhereClause = "SUBTYPE = 'INDSTL'" };
                IFeatureCursor pFeatureCursor = pFeatureClass.Search(pQueryFilter, false);
                IFeature pFeature = pFeatureCursor.NextFeature();

                int iRecCount = 0;
                while (pFeature != null)
             {
                 iRecCount +=1;
                    pFeature = pFeatureCursor.NextFeature();
             }
         }
         catch (Exception ex)
         {
                MessageBox.Show(ex.Message);
         }

        }
0 Kudos
AlainHajj
New Contributor
Thank you lot for your time. I appreciate your effort.
I want to write a code in C# for searching the nearest point of interest of a object for a camera on the map. For that reason I am asking for a sample C# code for buffering or spatial filter or something else. So if I can get a help in this urgently because I don't have much time for my project. Thank you.
0 Kudos