POST
|
Fair answer, in this case I don't think it's a bad thing. In the bigger picture, because it wasn't intended, I'm not 100% happy with it, but that's ok for now. At least I've been given a good explanation. As for the Do Loop, it's purpose is to prevent the form from closing when the user hits 'OK' without having filled out the required parameters. Without it, they're warned that they didn't fill everything out, but because the OK button hides the form (with the expectation that it will proceed with the rest of the code), they have to re-run the Add-In. It's not required, but I like the idea that if they forget 1 thing, they don't have to go back and re-do everything. Thus the reason as well to handle form closing event. If they hit cancel or 'X' I know they don't want to continue, but the code doesn't unless I tell it. My knowledge is rather limited, so I may be misunderstanding things, but that's the reason I have those in place.
... View more
01-22-2014
11:25 AM
|
0
|
0
|
691
|
POST
|
Thanks for the helpful reply. That makes some sense to me. That behaviour wasn't intentional, but I don't see it as being bad (at least in this particular case)...is that bad practice that the variables are remaining as is? I have an additional question as well. When the form closes (either cancel or 'X') it should be setting bContinue = False. Shouldn't this exiting of the main Subroutine call the garbage collection and dereference any variables? Mainly wondering if I should "fix" the fact that the variables aren't being dereferenced. Thanks again! Here's the code that the Add-In button click runs, if it helps make sense of my problem: Do
' Declare and initialize variables.
Dim pUID As IUID
Dim pLayer As ILayer
Dim pEnumLayer As IEnumLayer
Dim pMxDoc As IMxDocument
Dim pMap As IMap
pMxDoc = My.ArcMap.Document
pMap = pMxDoc.FocusMap
' Set UID to retrieve IFeatureLayer which can be QI'd to ILayer.
pUID = New UID
pUID.Value = "{40A9E885-5533-11d0-98BE-00805F7CED21}"
' Get list of all feature layers in the map. True means recursive so it will return all feature layers in the table of contents.
' Set iterator to the front of the list.
pEnumLayer = pMap.Layers(pUID, True)
pEnumLayer.Reset()
' Get first layer in list, and QI to ILayer (to make use of the .Name property).
pLayer = pEnumLayer.Next
' Clear the combo boxes in case the user has already attempted to proceed without filling all parameters out.
frmProgress.cbTWPLayer.Items.Clear()
frmProgress.cbLSDLayer.Items.Clear()
' Iterate through layers to populate combo box list.
Do Until pLayer Is Nothing
frmProgress.cbLSDLayer.Items.Add(pLayer.Name)
frmProgress.cbTWPLayer.Items.Add(pLayer.Name)
pLayer = pEnumLayer.Next()
Loop
' Display the form.
frmProgress.ShowDialog()
' OK and Cancel buttons determine whether or not to proceed.
If Not Procedures.bContinue Then
Exit Sub
Else
' Store information from combo boxes.
sLSD = frmProgress.cbLSDLayer.Text
sTWP = frmProgress.cbTWPLayer.Text
If sGPXPathPublic = "" Or sGDBPathPublic = "" Or sLSD = "" Or sTWP = "" Then
MsgBox("You must fill out all parameters.")
Continue Do
Else
Call Procedures.Main(frmProgress)
Exit Sub
End If
End If
Loop
... View more
01-22-2014
10:59 AM
|
0
|
0
|
691
|
POST
|
Once they hit OK on the form (assuming all parameters have been filled out), the program does a whole bunch of stuff (irrelevant for now). If they hit cancel or the 'X' button, the intention is to quit out of the Add-In (don't proceed with aforementioned stuff). ArcMap would remain open in this case. The issue is that, if they click the Add-In again, I want it to be a clean slate. Since it's not, that means my code is somehow doing something it shouldn't be...e.g. remembering variables.
... View more
01-22-2014
10:43 AM
|
0
|
0
|
691
|
POST
|
Hey all, I have an Add-In where the user browses to a FGDB (returns a string of the FGDB path and adds it to a label on the form). I have another label that has the string of a file path, and then 2 combo boxes (choose a layer). The user is unable to proceed unless all parameters are filled out, so if they navigate to a FGDB, but forget to add the required layers, they close the form, add the data, and re-open the form. EDIT: "Close the form" = stop the Add-in, add the data, then re-launch the add-in. However, my form is remembering the file paths (they're also stored in a public string variable). My question is, what am I doing incorrectly about closing the form and not disposing (?) of all the variables. The combo boxes are cleared, but the variables and the labels which store the paths remain intact. Here's the code for the form: Public Class frmProgress Private Sub btnBrowseGPX_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowseGPX.Click Call Procedures.GetGPXPath() End Sub Private Sub btnBrowseGDB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowseGDB.Click Call Procedures.GetGDBPath() End Sub Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click ' Close the form, but continue with the code in Procedures. Me.Hide() bContinue = True End Sub Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click ' Exit the Do loop in Procedures using the continue boolean and close the form. bContinue = False Me.Close() End Sub Private Sub frmProgress_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If e.CloseReason = Windows.Forms.CloseReason.UserClosing Then bContinue = False e.Cancel = False End If End Sub End Class The program has a Do loop so that if they attempt to proceed without filling out the parameters, it will get mad, but keep the form open. Thus the reason for the Me.FormClosing handle. Anyways, I'm going to review some other Add-Ins I have which have similar functionality, I'm sure it's just a small oversight, but if you can think of anything of the bat, that would be greatly appreciated!
... View more
01-22-2014
10:20 AM
|
0
|
14
|
1295
|
POST
|
I put the code from above into a try block with: Try Dim pPCS As IProjectedCoordinateSystem Dim pSRFactory As ISpatialReferenceFactory2 Dim pSpatialReference As ISpatialReference Dim pGeometry As IGeometry Dim pGeogPoint As IPoint pSRFactory = New SpatialReferenceEnvironment If iMer = 4 Then pPCS = pSRFactory.CreateProjectedCoordinateSystem(26911) sZone = "12U" ElseIf iMer = 5 Or iMer = 6 Then pPCS = pSRFactory.CreateProjectedCoordinateSystem(26912) sZone = "11U" Else pPCS = Nothing sZone = "xxx" End If pGeogPoint = pFreshPoint pSpatialReference = pPCS pSpatialReference.SetFalseOriginAndUnits(200000, 4000000, 100) pGeometry = pFreshPoint pGeometry.Project(pSpatialReference) Catch ex As Exception ' Print generic exception messages. Console.WriteLine(ex.Message) End Try and it essentially 'skips' the entire try block and proceeds with the remainder of the program. It finishes the program successfully (no more crash), but no message is printed. Any thoughts? Edit: ok I'm successfully able to create a projected coordinate system in a different part of the module (the main sub). There must be something limiting me within the sub I'm working in...somehow. Edit 2: Some success finally. I decided to create a simple function of type spatial reference, pass my integer (for Meridian) and create the spatial reference, then return it. This appears to have worked...fingers crossed!
... View more
12-10-2013
05:31 AM
|
0
|
0
|
585
|
POST
|
Hey Neil, I originally had the integer values, but switched to the longer definition just for some quick testing purposes. That definitely wasn't the problem, the integer values for both the NAD83 and WGS84 projection definitions still fail. This is being developed as an Add-In for ArcMap. ArcMap is running, user clicks the button, choose GPX file, and the code does all the rest. Very strange. I'm sure I had it at least partially working Friday too, can't figure out what happened. I started thinking it might be my logic in the IF statement check. Might just tell it to use Zone 11 (since that's the test data location), and ignore the check for meridian. Anyways, I'll keep this thread updated as I test different things, maybe a miracle will happen haha.
... View more
12-09-2013
10:04 AM
|
0
|
0
|
444
|
POST
|
Thanks for the advice. Yes, my debugging style is message boxes and it was the pPCS = pSRFactory.CreateProjectedCoordinateSystem() line that seemed to be the problem. We typically work with just NAD83 which is why I've defaulted to that. My alternative thought to that would be to project the original geographic data into NAD83 and then set up NAD83 UTM Zones since the datums will then match. Quick check shows failing on UTM Zones for WGS84 as well 😞 Might attempt my alternative in the meantime. Let me know if you come up with any other ideas. I appreciate the help in eliminating some options. Thanks!
... View more
12-09-2013
09:50 AM
|
0
|
0
|
444
|
POST
|
Spoke too soon. The "pFreshPoint" is given a spatial reference above all this code. So it specifically knows it has WGS84 as the spatial reference. I'm sure I'm overlooking something minor, but at this point I'm at least happy you've picked out some things to check. Anything else you can think of? We have some similar code in a different program that does essentially the same thing (just for different file input). I'm going to check against that again, maybe I've missed something. Thanks for your help!
... View more
12-09-2013
09:34 AM
|
0
|
0
|
444
|
POST
|
Interesting point Neil. The feature class that the point are being "run" from, is the result of some previous code which calls the Geoprocessing tool "GPX to Feature" which converts a standard .gpx file into a feature class (in this case, inside a file geodatabase). When I examine the result in ArcCatalog (or look at the tools help), it indicates a default spatial reference of WGS84. However, perhaps telling the code to specify is the answer. Sure it exists...but does the code know that? Perhaps not. Will try that. Thanks!
... View more
12-09-2013
09:21 AM
|
0
|
0
|
444
|
POST
|
Thanks for the quick reply Neil, you've been my saviour more times than I can count and your help is always extremely appreciated! Unfortunately, I'm pretty amateur with debugging...and I'm using VS2010 express, so I don't know if there are some limitations. However, now that you mention it, I think perhaps I should have included a transformation. Even though in my neck of the woods, the WGS84 and NAD83 datum are almost identical, if I do it through the toolbox, ESRI automatically adds a transformation (obviously because datums are switching). So it's quite possible my code is failing because I'm not telling the code to transform the data? I thought of that earlier, but wasn't sure if it was necessary because no other code snippet included that. I'm going to try that. I know for a fact that my data is all points and they are part of a WGS84 feature class.
... View more
12-09-2013
09:04 AM
|
0
|
0
|
444
|
POST
|
Hey folks, I'm at a loss as to what's going on. This code (from what I can remember) was working before I left on Friday, yet this morning during testing I'm getting a crash. Quick explanation, it's part of a larger program to convert a GPX file into a feature class in a file geodatabase. Everything is great except when I try to determine the point's UTM coordinates. For those familiar, I'm in Canada where we use the dominion land survey. Long story short W4M = UTM Zone 12, W5M (and part of 6) is Zone 11. The code loops through the point and determines a bunch of locational information such as decimal degrees, the LSD-SEC-TWP ... etc... Here's the troublesome code: Dim pPCS As IProjectedCoordinateSystem Dim pSRFactory As ISpatialReferenceFactory2 Dim pSpatialReference As ISpatialReference Dim pGeometry As IGeometry Dim pGeogPoint As IPoint pSRFactory = New SpatialReferenceEnvironment If iMer = 4 Then pPCS = pSRFactory.CreateProjectedCoordinateSystem(ESRI.ArcGIS.Geometry.esriSRProjCSType.esriSRProjCS_NAD1983UTM_12N) sZone = "12U" ElseIf iMer = 5 Or iMer = 6 Then pPCS = pSRFactory.CreateProjectedCoordinateSystem(ESRI.ArcGIS.Geometry.esriSRProjCSType.esriSRProjCS_NAD1983UTM_11N) sZone = "11U" Else pPCS = Nothing sZone = "xxx" End If pSpatialReference = pPCS pSpatialReference.SetFalseOriginAndUnits(200000, 4000000, 100) pGeogPoint = pFreshPoint pGeometry = pGeogPoint pGeometry.Project(pSpatialReference) From what I can see, it makes it to my If statement, then crashes. I think the problem is the "pPCS = pSRFactory.CreateProjectedCoordinateSystem" line. I can't see what I'm doing wrong, all the snippets I've seen, have similar code setup. Any sort of help is much appreciated. Edit: pFreshPoint is a point feature (we're currently in a larger Do loop to run through the points and perform this to each point). Let me know if more info is required.
... View more
12-09-2013
08:46 AM
|
0
|
10
|
2553
|
POST
|
Update: it appears I may have overlooked the code I'm modifying as I just found a snippet that appears to create a spatial reference for temporary use, calculating geometry. The original code creates a geographic coordinate system (NAD83), to calculate decimal degrees. I think at this moment, I'll close this and re-open if I fail at modifying the snippet for my own use.
... View more
12-03-2013
03:45 PM
|
0
|
0
|
223
|
POST
|
Hey all, I'm modifying an existing program we use which originally took input from a .dxf layer (which had a spatial reference of a UTM Zone). Now, I'm asking the user for a .GPX file, then use code to geoprocess (GPX To Feature), and then from there do some other functions that are not really relevant, except for one: calculating geometry. My goal is to populate fields for easting and northing, using the data frame coordinate system (see further below). The points I'll be getting (from my above processing) will be a feature class in a geodatabase in Geographic WGS84 (the default spatial reference of the GPX to Feature tool). I believe using IPoint.X and IPoint.Y will return values based on the layer (correct me if I'm wrong) which would result in incorrect data for what I'm after. So, essentially I want to select a field, let's call them "UTM_E" and "UTM_N" and basically: perform a right-click -> Calculate Geometry, using meters as the unit, and the data frame as opposed to the layer, and the appropriate X or Y coordinate drop-down choice. Seems simple enough to me, but I really don't know where to look. I think what I'm going to do is tell the user to pick UTM Zone 11 or 12 as the data frame projection at the start of the program (the user will know for sure where the points are), and then go from there. Anyways, I feel like a push in the right direction will suffice, so any suggestions are most welcome, and if it's not possible, what would be a useful alternative? Thanks very much!
... View more
12-03-2013
12:49 PM
|
0
|
1
|
770
|
POST
|
No problem, glad I could help! Was hoping some veterans might be able to confirm, but I think if they see something incorrect they will notify us. Cheers,
... View more
11-28-2013
10:47 AM
|
0
|
0
|
372
|
POST
|
http://downloads2.esri.com/support/TechArticles/W26496_W25918_DEPRECATION_PLAN_FOR_ARCGIS_101_and_102_FINAL_050713.pdf According to the 10.2 deprecation plan above, 10.2 is the last major release to include VBA compatibility. As far as I know, VB.NET and Visual Studio will be supported and the preferred language (over VBA). Someone may be able to provide more info, but the only limitations I'm aware of is the actual version of Visual Studio that's supported. 2008 for ArcGIS 10.0, 2010 for ArcGIS 10.1 (and 10.2 I believe). I'm currently using VS2010, VB.NET...I believe ESRI will support this combo for the foreseeable future. Hope this helps! Edit: didn't mean to ignore Java/C# etc... those are also fully supported languages as far as I'm aware, but I'm only familiar with/keep tabs on VB.NET support.
... View more
11-28-2013
05:07 AM
|
0
|
0
|
372
|
Title | Kudos | Posted |
---|---|---|
1 | 10-14-2016 12:23 PM |
Online Status |
Offline
|
Date Last Visited |
11-11-2020
02:24 AM
|