POST
|
OK - it's finally working. I added the clearInMemory function as suggested by jamesfreddyc and then put everything into the add-in and began debugging thatway. arcpy.env.overwriteOutput = True works correctly when using the add-in, not with copy-and-pasting into the Python window. Thanks all for your help.
... View more
04-15-2014
06:51 AM
|
0
|
0
|
162
|
POST
|
Changed my code to include the double slash and I'm still getting an error about in_memory/dissolved existing when I run the script for a second time.
... View more
04-15-2014
05:55 AM
|
0
|
0
|
732
|
POST
|
I write in PyScripter and then copy-and-paste into the ArcMap python window. Once it 'works' that's when I will drop the code into an add-in that I can share with my colleagues.
... View more
04-14-2014
08:39 AM
|
0
|
0
|
732
|
POST
|
Using.. arcpy.env.overwriteOutput = True The process runs again, but on the 2nd time around it updates with the newPolygon geometry from the 1st time.
... View more
04-14-2014
08:13 AM
|
0
|
0
|
732
|
POST
|
OK - I am now seeing the correct in_memory title in the TOC sources, and the script works fine. But when I try and run it a second time, I get another error telling me that dataset in_memory/dissolved already exists, even though: arcpy.Delete_management(r"in_memory/dissolved") returns True. But then I try: arcpy.Exists(r"in_memory/dissolved") and that returns True. How can this be? Is it because I am working from the Python console?
... View more
04-14-2014
07:20 AM
|
0
|
0
|
732
|
POST
|
Here's my script that I'm writing before I convert it into an Add-in button. It seems like it's actually creating a feature class called "in_memory" in my default.gdb... layers = get_layers() bigArea = 0 bigAreaPIN = None with arcpy.da.SearchCursor(layers['parcels_fc'], ["Shape_Area", "PIN10"]) as rows: for row in rows: if row[0] > bigArea: bigArea = row[0] bigAreaPIN = row[1] else: pass del rows print bigArea, bigAreaPIN arcpy.Dissolve_management(layers['parcels_fc'], "in_memory") with arcpy.da.SearchCursor("in_memory", ["SHAPE@"]) as rows: for row in rows: newPolygon = row[0] del rows subparcels = [] with arcpy.da.UpdateCursor(layers['parcels_fc'], ["PIN10", "SHAPE@"]) as rows: for row in rows: if row[0] == bigAreaPIN: row[1] = newPolygon rows.updateRow(row) else: subparcels.append(row[0]) rows.deleteRow() del rows with arcpy.da.InsertCursor(layers['superparcel'], ["original", "superparcel"]) as insert: for x in subparcels: insert.insertRow((x,bigAreaPIN)) del insert arcpy.RefreshActiveView() arcpy.Delete_management("in_memory") Any idea what I'm doing wrong here?
... View more
04-14-2014
07:02 AM
|
0
|
11
|
2716
|
POST
|
Hello, I am working with a 2D building footprints feature class, which contains a height attribute. I would like to create 3D extrusions from a given angle, but export them for use in a 2D map viewer, similar to classic Google Maps - you have a sense of the third dimension of each building footprint. I've attached a photo from Google Maps of the particular effect I'm going for. Is this possible in ArcMap/ArcScene? I've seen a YouTube tutorial that uses symbology as representation to create a drop shadow effect but I was looking for something slightly more real-looking. [ATTACH=CONFIG]33015[/ATTACH] Thanks in advance. Jimmy
... View more
04-10-2014
07:42 AM
|
0
|
1
|
622
|
POST
|
Hi, I'm writing/maintaining an add-in and finding that debugging is near impossible because I can't clear out old add-ins. Here's my workflow: 1) write/edit add-in code 2) remove add-in from toolbar, delete add-in from addin manager, close ArcMap 3) run makeaddin 4) reinstall add-in 5) launch arcmap however, basic changes in the code just don't come through - it's like there is a copy of the add-in living somewhere that I am unableto remove. Has anyone else come across this issue?
... View more
12-30-2013
05:51 AM
|
0
|
2
|
669
|
POST
|
So I uploaded my feature service to AGO so that I can edit features in the field. However, when I edit features and select the dropdown menu for the main attribute, the order of options is completely screwed up from the order of the symbology I uploaded. Any way to fix this besides manually clicking 'move up' and 'move down'?
... View more
11-12-2013
06:41 AM
|
0
|
1
|
1867
|
POST
|
Hello, I've got a very simple add-in that's just a drop-down menu that updates one attribute for the selected polygon. Whenever I open the keyboard shortcuts window, or, ever since I upgraded to 10.2, even click on the drop down menu containing the commands, I get an error of this type: TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: 'assign_269' object is not callable Here's a sample of the add-in: import arcpy
import pythonaddins
mxd = arcpy.mapping.MapDocument("CURRENT")
layerList = arcpy.mapping.ListLayers(mxd)
df = arcpy.mapping.ListDataFrames(mxd)[0]
tableList = arcpy.mapping.ListTableViews(mxd)
for layer in layerList:
if "Footprints_Edit" in layer.name:
footprints_fc = layer
if "Parcels_Edit" in layer.name:
parcels_fc = layer
if "Address" in layer.name:
address_fc = layer
for table in tableList:
if "Assessing" in table.name:
assessing_table = table
if "Condos" in table.name:
condo_table = table
def rows_as_update_dicts(cursor):
colnames = cursor.fields
for row in cursor:
row_object = dict(zip(colnames, row))
yield row_object
cursor.updateRow([row_object[colname] for colname in colnames])
class assign_101(object):
"""Implementation for btype_toolbar_addin.assign_civic_fraternal (Button)"""
def __init__(self):
self.enabled = True
self.checked = False
def onClick(self):
fcount = int(arcpy.GetCount_management(footprints_fc).getOutput(0))
if fcount <= 20:
with arcpy.da.UpdateCursor(footprints_fc,["BTYPE"]) as brows:
for row in rows_as_update_dicts(brows):
row['BTYPE'] = 101
else:
print "Too many footprints selected. Please select less than 20."
arcpy.RefreshActiveView()
....
I have about 60 classes/buttons that all look like thatone, just the particular code is changed from 101 to some other number.
... View more
11-05-2013
09:33 AM
|
0
|
1
|
407
|
POST
|
Thanks, I implemented your changes and everything works beautifully.
... View more
10-24-2013
06:32 AM
|
0
|
0
|
277
|
POST
|
Hello, I am writing an add-in to work with many different MXDs that I have to work with, they all use the same naming convention for the layers. Currently my addin is structured like this: import x, y, z mxd = arcpy.mapping.MapDocument("current") df = arcpy.mapping.ListDataFrames(mxd)[0] layerList = arcpy.mapping.ListLayers(mxd) tableList = arcpy.mapping.ListTableViews(mxd) for layer in layerList: if "Footprints_Edit" in layer.name: footprints_fc = layer if "Parcels_Edit" in layer.name: parcels_fc = layer etc.. etc.. class Button(object) ... class Button2(object) ... This works fine, except, I'd like to be able to pass the add-in around to other people. Now, because the assigning-variables logic happens at the top of the add-in, if the add-in is present in the toolbar before the .mxd is loaded, it won't find the expected layers and using the tools will throw an error: the only way to get it to work is to remove the add-in, close ArcMap, re-open, and load the .mxd. This is a pain. Now, I tried putting the assign-variables logic as the first step in each button's onClick method, but that causes all sorts of slowness for what should be quick operations. Is there some better way to look for and assign these layers that I am missing? I tried throwing everything in a function and then adding this to onClick: if not footprints_fc: assignLayers() but that doesn't seem to work. Any thoughts? Thanks in advance.
... View more
10-17-2013
12:17 PM
|
0
|
2
|
760
|
POST
|
I did not know about GetCount. That is exactly what I am looking for. Thanks for pointing that out to me!
... View more
10-08-2013
06:07 AM
|
0
|
0
|
478
|
POST
|
I have a small add-in that I use for a building footprints map. Essentially, the add-in reads the data from the parcel layer, and copies the data to the buildings layer (I use this when I have to 'split' a building that lies over multiple parcels). The code is set up to work with one (manually selected) parcel and one footprint, no more. However, if I were to click the add-in when no parcel or footprint was selected, it assigns the last record of the parcel data to every footprint! If I am in an edit session, it's OK, but I would like to let other people use this add-in. I understand why I get this behavior (the search/update cursor are looping through every record if none is selected) Is there some pre-script logic I can add to make sure that only one record is updated? Here is my code:
import arcpy
import pythonaddins
import webbrowser
import threading
mxd = arcpy.mapping.MapDocument("CURRENT")
layerList = arcpy.mapping.ListLayers(mxd)
tableList = arcpy.mapping.ListTableViews(mxd)
for layer in layerList:
if "Footprints_Edit" in layer.name:
footprints_fc = layer
if "Parcels_Edit" in layer.name:
parcels_fc = layer
if "Address" in layer.name:
address_fc = layer
for table in tableList:
if "Assessing" in table.name:
assessing_table = table
if "Condos" in table.name:
condo_table = table
def rows_as_update_dicts(cursor):
colnames = cursor.fields
for row in cursor:
row_object = dict(zip(colnames, row))
yield row_object
cursor.updateRow([row_object[colname] for colname in colnames])
class assignparceldata(object):
"""Implementation for building_footprints_Addin_addin.assignParcelData (Button)"""
def __init__(self):
self.enabled = True
self.checked = False
def onClick(self):
parcelfields = ["PIN","PADDRESS"]
with arcpy.da.SearchCursor(parcels_fc,parcelfields) as rows:
for row in rows:
new_pin = row[0]
new_paddress = row[1]
print "Assigning parcel: PIN is %s, Address is %s" % (new_pin,new_paddress)
footprint_fields = ["BUILDINGID", "TAXID","BADDRESS"]
with arcpy.da.UpdateCursor(footprints_fc,footprint_fields) as brows:
for row in rows_as_update_dicts(brows):
row['TAXID'] = new_pin
row['BADDRESS'] = new_paddress
print "Updating building footprint %d with parcel info: PIN is (%s), address is (%s)" % (row['BUILDINGID'], new_pin, new_paddress)
... View more
10-08-2013
05:32 AM
|
0
|
2
|
1986
|
Online Status |
Offline
|
Date Last Visited |
11-11-2020
02:24 AM
|