Trying to take a subset of available layers in the map of an ArcGIS Pro project (aprx) and make sure they are in the right order. (I'm trying to dump the arranged layers into a PDF).
Originally I started out just hiding (setting layer.visible = False) for any layers I don't want. But while there were no errors, it didn't yield the expected results. The resulting layer order in the aprx is not the same as in Pro.
So I thought about removing all layers and adding back in those that I need. While I can do this:
<SPAN class="keyword token">while</SPAN> map<SPAN class="punctuation token">.</SPAN>listLayers<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
map<SPAN class="punctuation token">.</SPAN>removeLayer<SPAN class="punctuation token">(</SPAN>map<SPAN class="punctuation token">.</SPAN>listLayers<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN></SPAN>...to get rid of all layers, I can't do something more refined like:
layerNames <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'layer 1'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'layer 2'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'layer 3'</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">for</SPAN> layerName <SPAN class="keyword token">in</SPAN> layerNames<SPAN class="punctuation token">:</SPAN>
map<SPAN class="punctuation token">.</SPAN>removeLayer<SPAN class="punctuation token">(</SPAN>map<SPAN class="punctuation token">.</SPAN>listLayers<SPAN class="punctuation token">(</SPAN>layerName<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>That blows up even though my layer names...
<SPAN class="keyword token">for</SPAN> layerName <SPAN class="keyword token">in</SPAN> layerNames<SPAN class="punctuation token">:</SPAN>
<SPAN class="operator token">-</SPAN><SPAN class="operator token">-</SPAN><SPAN class="operator token">-</SPAN><SPAN class="operator token">-</SPAN><SPAN class="operator token">></SPAN> <SPAN class="number token">6</SPAN> map<SPAN class="punctuation token">.</SPAN>removeLayer<SPAN class="punctuation token">(</SPAN>map<SPAN class="punctuation token">.</SPAN>listLayers<SPAN class="punctuation token">(</SPAN>layerName<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
IndexError<SPAN class="punctuation token">:</SPAN> list index out of range<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>... are all included in the list that is ...
<SPAN class="punctuation token">[</SPAN>l<SPAN class="punctuation token">.</SPAN>name <SPAN class="keyword token">for</SPAN> l <SPAN class="keyword token">in</SPAN> map<SPAN class="punctuation token">.</SPAN>listLayers<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN></SPAN>
So I can't figure out what's going on. I've tried individual layers and have found a few that worked. But I can't tell what's different about them. Depending on what type of layer it is, it's also hard to compare values for all the attributes..
<SPAN class="string token">'brightness'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'connectionProperties'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'contrast'</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'dataSource'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'definitionQuery'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'extrusion'</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'getSelectionSet'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'is3DLayer'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'isBasemapLayer'</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'isBroken'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'isFeatureLayer'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'isGroupLayer'</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'isNetworkAnalystLayer'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'isNetworkDatasetLayer'</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'isRasterLayer'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'isWebLayer'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'listLabelClasses'</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'listLayers'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'longName'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'maxThreshold'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'minThreshold'</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'name'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'saveACopy'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'setSelectionSet'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'showLabels'</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'supports'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'symbology'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'transparency'</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">'updateConnectionProperties'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'updateLayerFromJSON'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'visible'</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
So if I go the route of removing all layers...
map <SPAN class="operator token">=</SPAN> aprx<SPAN class="punctuation token">.</SPAN>listMaps<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
layers<SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>l <SPAN class="keyword token">for</SPAN> l <SPAN class="keyword token">in</SPAN> map<SPAN class="punctuation token">.</SPAN>listLayers<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">while</SPAN> map<SPAN class="punctuation token">.</SPAN>listLayers<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
map<SPAN class="punctuation token">.</SPAN>removeLayer<SPAN class="punctuation token">(</SPAN>map<SPAN class="punctuation token">.</SPAN>listLayers<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>and then try to add one back...
map<SPAN class="punctuation token">.</SPAN>addLayer<SPAN class="punctuation token">(</SPAN>layers<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">'TOP'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN></SPAN>
I get this error:
C<SPAN class="punctuation token">:</SPAN>\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\utils<SPAN class="punctuation token">.</SPAN>py <SPAN class="keyword token">in</SPAN> fn_<SPAN class="punctuation token">(</SPAN><SPAN class="operator token">*</SPAN>a<SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">**</SPAN>k<SPAN class="punctuation token">)</SPAN>
<SPAN class="number token">189</SPAN> <SPAN class="string token">"Invalid value for %s: %r (choices are: %r)"</SPAN> <SPAN class="operator token">%</SPAN>
<SPAN class="number token">190</SPAN> <SPAN class="punctuation token">(</SPAN>key<SPAN class="punctuation token">,</SPAN> val<SPAN class="punctuation token">,</SPAN> list<SPAN class="punctuation token">(</SPAN>cls<SPAN class="punctuation token">.</SPAN>__args__<SPAN class="punctuation token">[</SPAN>key<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>values<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="operator token">-</SPAN><SPAN class="operator token">-</SPAN><SPAN class="operator token">></SPAN> <SPAN class="number token">191</SPAN> <SPAN class="keyword token">return</SPAN> fn<SPAN class="punctuation token">(</SPAN><SPAN class="operator token">*</SPAN>args<SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">**</SPAN>kw<SPAN class="punctuation token">)</SPAN>
<SPAN class="number token">192</SPAN> <SPAN class="comment token"># Add the old argspec to __doc__</SPAN>
<SPAN class="number token">193</SPAN> doc_addendum <SPAN class="operator token">=</SPAN> <SPAN class="string token">"%s%s"</SPAN> <SPAN class="operator token">%</SPAN> <SPAN class="punctuation token">(</SPAN>fn<SPAN class="punctuation token">.</SPAN>__name__<SPAN class="punctuation token">,</SPAN>
C<SPAN class="punctuation token">:</SPAN>\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\_mp<SPAN class="punctuation token">.</SPAN>py <SPAN class="keyword token">in</SPAN> addLayer<SPAN class="punctuation token">(</SPAN>self<SPAN class="punctuation token">,</SPAN> add_layer_or_layerfile<SPAN class="punctuation token">,</SPAN> add_position<SPAN class="punctuation token">)</SPAN>
<SPAN class="number token">1135</SPAN>
<SPAN class="number token">1136</SPAN> <SPAN class="operator token">*</SPAN> TOP<SPAN class="punctuation token">:</SPAN> Places the layer <SPAN class="operator token">or</SPAN> layers at the top of the TOC layer stack<SPAN class="punctuation token">.</SPAN><SPAN class="string token">""</SPAN>"
<SPAN class="operator token">-</SPAN><SPAN class="operator token">></SPAN> <SPAN class="number token">1137</SPAN> <SPAN class="keyword token">return</SPAN> convertArcObjectToPythonObject<SPAN class="punctuation token">(</SPAN>self<SPAN class="punctuation token">.</SPAN>_arc_object<SPAN class="punctuation token">.</SPAN>addLayer<SPAN class="punctuation token">(</SPAN><SPAN class="operator token">*</SPAN>gp_fixargs<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>add_layer_or_layerfile<SPAN class="punctuation token">,</SPAN> add_position<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="number token">1138</SPAN>
<SPAN class="number token">1139</SPAN> @constants<SPAN class="punctuation token">.</SPAN>maskargs
ValueError<SPAN class="punctuation token">:</SPAN> <SPAN class="operator token"><</SPAN>MappingLayerObject object at <SPAN class="number token">0x0000012704F6B570</SPAN><SPAN class="operator token">></SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>Anyone have any idea what's going on here or what I should do instead?