Layer aus VBA-Skript heraus schließen

Hallo zusammen.
Ich habe in einem VBA-Skript ein Schummerungsbild erzeugt. Es wird mir am Schluß als Layer in ArcMap geladen.
Ich würde das gerne sofort wieder "entladen", da ich es nicht geöffnet brauche.

Daher zwei Fragen, für die ich bisher keine Antwort gefunden habe:

- kann man
"pgeoProcessor.Execute "Hillshade_3d", HillshadeParameter, Nothing"
dazu bringen, da Schummerungsbild NICHT als Layer zu öffnen? (Dann bräuchte ich es nicht wieder zuzumachen)

- wie kann man einen Layer aus einem vba-Skript heraus schließen. Also nicht nur "pLayer.Visible = false" setzen, sondern richtig "entladen" ?

Danke schon mal.

Andi
Wirklich keiner eine Idee, wie man ein Layer automatisch schließt?
Naja, ich habe ja bis jetzt auch noch nichts dazu gefunden... ;)
Public Sub RemoveSelectedLayerorTable()

' Get the map
Dim pDoc As IMxDocument
Dim pMap As IMap
Set pDoc = ThisDocument
Set pMap = pDoc.FocusMap

' Get the selected layer or table
Dim pSelItem As IUnknown
Set pSelItem = pDoc.SelectedItem
If pSelItem Is Nothing Then
MsgBox "No Feature layer or table selected"
Exit Sub
' Remove a Layer and refresh the map
ElseIf TypeOf pSelItem Is IFeatureLayer Then
pMap.DeleteLayer pDoc.SelectedLayer
Dim pActiveView As IActiveView
Set pActiveView = pMap
pActiveView.Refresh
' Remove a table
ElseIf TypeOf pSelItem Is IStandaloneTable Then
Dim pStTab As IStandaloneTable
Dim pStTabColl As IStandaloneTableCollection
Set pStTab = pSelItem
Set pStTabColl = pMap
pStTabColl.RemoveStandaloneTable pStTab
Else
MsgBox "Selected item is not a table or layer"
Exit Sub
End If

' refresh the TOC
pDoc.UpdateContents

End Sub
Hi,
Habe es eben auch gefunden:
http://edndoc.esri.com/arcobjects/9.0/Samples/Tabl es/Remove_a_layer_or_table_from_ArcMap.htm

Mein Problem: das Ding läuft durch und landet dann bei
"Selected item is not a table or layer"
Grüble gerade darüber nach, warum ;)




-----
' Get the map
Dim pMxDocument As IMxDocument
Dim pMap As IMap
Set pMxDocument = ThisDocument
Set pMap = pMxDocument.FocusMap

' Get the selected layer or table
Dim pSelItem As IUnknown
Set pSelItem = pMxDocument.SelectedItem

If pSelItem Is Nothing Then
MsgBox "No Feature layer or table selected"
Exit Sub
' Remove a Layer and refresh the map
ElseIf TypeOf pSelItem Is IFeatureLayer Then
pMap.DeleteLayer pMxDocument.SelectedLayer
Dim pActiveView As IActiveView
Set pActiveView = pMap
pActiveView.Refresh
' Remove a table
ElseIf TypeOf pSelItem Is IStandaloneTable Then
Dim pStTab As IStandaloneTable
Dim pStTabColl As IStandaloneTableCollection
Set pStTab = pSelItem
Set pStTabColl = pMap
pStTabColl.RemoveStandaloneTable pStTab
Else
MsgBox "Selected item is not a table or layer"
'Exit Sub (soll ja weiterlaufen)
End If
'Datenfenster und Inhaltsverzeichnis aktualisieren
' pMxDocument.ActiveView.Refresh
pMxDocument.UpdateContents
------
Wenn ich vor
' Get the selected layer or table
den LayerCount abfrage mit
MsgBox "pMap.LayerCount" & pMap.LayerCount
erhalte ich als Ergebnis "1"
Also ist ein LLayer vorhanden.

Mal sehen, was mir die Info bringt...

hm
wenn ich nach
Dim pSelItem As IUnknown
Set pSelItem = pMxDocument.SelectedItem

die Zeile
MsgBox "pSelItem" & pSelItem
eintrage, erhalte ich die Meldung
"Fehler beim Kompilieren, Methode oder Datenobjekt nicht gefunden"

der gleiche Fehler, wenn ich stattdessen
MsgBox "pMxDocument.SelectedItem" & pMxDocument.SelectedItem
schreibe.
Mals sehn, ob ich daraus schlauer werde....
Lösung ?
habe es jetzt so versucht:

MsgBox " Layer wieder entfernen"
' Get the map LAyerer
Dim pMxDocument As IMxDocument
Set pMxDocument = ThisDocument

Dim pMap As IMap
Set pMap = pMxDocument.FocusMap
MsgBox "Nummer des ausgewählten Layers " & pMap.LayerCount

Dim pLayer As ILayer
Set pLayer = pMxDocument.SelectedLayer
MsgBox "Name des ausgewählten Layers" & pLayer.Name

pMap.DeleteLayer pMxDocument.SelectedLayer

'Datenfenster und Inhaltsverzeichnis aktualisieren
pMxDocument.ActiveView.Refresh
pMxDocument.UpdateContents

MsgBox "gelöscht-fertig"

Zumindest aus der Spalte Links in ArcMap ist der Layer jetzt raus.

Problem: scheinbar funktioniert das verfahren nur "Halblebig".
Denn wenn ich jetzt versuche, mit dem Windows-Explorer (bzw. TotalCommander) die Dateien auf der Festplatte zu löschen, welche den "Layer" beinhalten , also das eigentliche Bild,
dann geht das nicht, da der Zugriff verweigert wird.

Und mein Grundproblem, dass ich in einen vba-Skript nicht zweimal hintereinander "hillshade_3d"-aufrufen kann, ist auch noch vorhanden.

Wiseo habe ich damit nur solche Probleme?

Hilfe
Hi Andi,

versuch mal die Variablen player, pmap nach dem Durchlauf aus dem Speicher zu löschen. So in der art "player = nothing", vielleicht liegs daran.

Grüße
Lorenz
Achso, und warum machst Du:

"pMap.DeleteLayer pMxDocument.SelectedLayer" und nicht
"pMap.DeleteLayer player"
Du hast doch vorher mit "Dim pLayer As ILayer
Set pLayer = pMxDocument.SelectedLayer"
pLayer (mühsam) definiert.

Grüße
Lorenz
wegen pMap.DeleteLayer pMxDocument.SelectedLayer:
gute Frage, warum ich das so kompliziert mache.
Eigentlich hatte ich das nur eingefügt, um mal nachzuschauen, welcher Name der ausgewählten Layer hat.
Aber schon richtig, eigentlich brauche ich die Zeilen aber gar nicht.
Ich werf das gleich mal raus.

Nein, auch wenn der pLayer-Kram aus dem Skript raus ist, scheinen nicht alle Verbindungen von ArcMap zu den Dateien des Layers aufgelöst zu sein.
Der Versuch, in einem zweiten Durchlauf (mit abgeänderten Variablen/Objektnamen) ein zweites Schummerungsbild über hillshade_3d zu erzeugen, endet immer noch im "Automatisierungsfehler".

Ist ganz "lustig"...
wenn ich die Dateien des Layers auf der Platte löschen will, muß ich zuerst ArcMap beenden. Nur damit werden sie freigegeben.

Mein bisheriger Stand (so viel Ärger mit so einem kleinen Skript...)

'----- Layer wieder aus ArcMap loswerden -----'
MsgBox " Layer wieder aus TOC entfernen"

' Get the map
Dim pMxDocument As IMxDocument
Set pMxDocument = ThisDocument

Dim pMap As IMap
Set pMap = pMxDocument.FocusMap
MsgBox "Nummer des ausgewählten Layers" & pMap.LayerCount

pMap.DeleteLayer pMxDocument.SelectedLayer

'Datenfenster und Inhaltsverzeichnis aktualisieren
pMxDocument.ActiveView.Refresh
pMxDocument.UpdateContents

MsgBox "pMap" & pMap.LayerCount 'hier kommt "0" heraus

MsgBox "gelöscht-fertig"


Mist... ich komme einfach nicht drauf, warum das nicht tut.
Hi Andi,

der layer scheint irgendwie noch im Programm cache zu sein und ist deshalb geschützt. Hmm, kniffig. Wenn man den Layer per "eingebauter Funktion" von Hand "removed" ist der nicht mehr geschützt. Schade, das man nicht an den Quellcode kommt...

und "set pmap = nothing " bringt nichts?
Hmm, werd bei gelegenheit mal mitsuchen.

Grüße
lorenz
Also warum der zweite Aufruf von
"pgeoProcessor2.Execute "Hillshade_3d", HillshadeParameter2, Nothing"
nicht funktioniert hat, habe ich jetzt herausgefunden.
Ich hatte zwar alle Variablennamen geändert, aber bei
"HillshadeParameter2.Add (in_raster2)
HillshadeParameter2.Add (out_raster2) usw "

nicht "in_raster2" usw. eingetippt, sondern die gleichen Variablen wie beim ersten Aufruf, also "in_Raster1", "out_raster1" usw. verwendet.

Kein Wunder, daß er sich da verschluckt hat.
Ich hab aber auch Tomaten auf den Augen.


jetzt kann ich mein erstes Schummerungsbild erzeugen.
Der Layer verschwindet aus ArcMap linke Spalte (TOC)
Dann wird das zweite Schummerungsbild erzeugt.

Soweit so gut.
Aber wenn ich jetzt in ArcMap den Layer des zweiten Schummerungsbilds von Hand entferne, und dann mit dem WindowsExplorer die Dateien auf der Festplatte löschen will....
dann kann ich zwar die Dateien des zweiten Schummerungsbilds entfernen, nicht jedoch die des ersten.

Seltsam.
Oha,
wenn ich dieses Programmzeilen zum "Löschen" unter auch unter den zweiten Schummerungsbild-mach-Abschnitt kopiere,
dann lassen sich nach erfolgreichem Durchlauf des Skripts auch die Dateien dieses Schummerungsbilds nicht löschen.

Irgendwo hakt es.
Hi Andi, das liegt glaube ich daran, daß der arcCatalog immer seine Finger im Spiel hat und wenn Du den Layer in ArcMAp löschst, verschwindet der zwar aus der MAp ist aber im Catalog immer noch im Speicher.
Aber warum willst Du das gerade (mühsam) erzeugte Schummerungsbild denn gleich wieder löschen?
Ich will/muß eine größere Anzahl von Schummerungsbildern erzeugen. Die muß ich aber nicht unbedingt in ArcMap "auf Halde" liegen haben, da ich sie nur im weiteren Verlauf des VBA-Skripts, nicht aber von Hand weiterverarbeite.
Und wenn ich die weiterverwurschte weiß ich nicht, ob diese "Datei gesperrt"-Geschichte dann nicht die Weiterverarbeitung im Skript stört.

Wäre nett gewesen, die Schummerungsbilder zu erzeugen, eventuell kurz zu sehen, ob sie "existieren" (da ich das einladen als Layer durch hillshade_3d bzw. GeoProcessor anscheinend nicht von vorneherein unterdrücken kann) und dann wieder einen freien Desktiop zu haben, bis ich ein spezielles Bild ggf. von Hand einlade, das ich dann zu dem Zeitpunkt wirklich haben will.

Aber so wie es aussieht, werde ich wohl erst mal alle Schummerungsbilder offen haben. Könnte voll werden ;)
Mal abgesehen davon, daß ich hier nicht soderlich gut mit Arbeitsspeicher bestückt bin.
Und natürlich juckt es, wenn so eine "einfache" und eigentlich grundlegende Funktion wie das Entfernen eines Layers aus ArcMap einfach nicht funktionieren will.
DAs gleiche Problem gab es doch auch schon in ArcVIEW, wenn man da ein Theme aus dem View gelöscht hatte und es dann gleich von der Platte putzen wollte blieb auch immer der dbf file stehen.
Stimmt, da war auch sowas.
Naja, ich werde heute mal noch etwas in mich gehen, vielleicht finde ich doch noch eine Lösung.

Allerdings werde ich das zu Hause machen....
Also dann bis morgen ;)
und nochmals vielen Dank für die Hilfestellung!
Alleine wäre ich noch lange nicht so weit mit dem Kruscht.

Ciao
Andi
:-)
Hallo Andi,
habe mal folgendes probiert:

Private Sub CommandButton1_Click()
Dim aoidoc As IMxDocument
Dim aoimap As IMap
Set aoidoc = ThisDocument
Set aoimap = doc.FocusMap

aoimap.ClearLayers
aoidoc.UpdateContents

End Sub

Dies entfernt alle layer aus dem projekt. Habe das mal Probeweise gemacht und dann versucht im Explorer die Daten zu löschen. Geht.
Sorry, so natürlich:

Private Sub CommandButton1_Click()
Dim aoidoc As IMxDocument
Dim aoimap As IMap
Set aoidoc = ThisDocument
Set aoimap = aoidoc.FocusMap

aoimap.ClearLayers
aoidoc.UpdateContents

End Sub
Guten Morgen.
Danke für die Routine.
Aber....
Nee, sorry, das tut bei mir nicht so richtig.
Der Layer-Eintrag verschwindet aus ArcMap (allerdings brauche ich noch zusätzlich die Zeile "aoidoc.ActiveView.Refresh", damit das Bild selbst ebenfalls vom Bildschirm verschwindet)

Aber die Dateien kann ich immer noch nicht nicht löschen.

Warum tut das bei Dir, aber nicht bei mir? Mist.

Habe einen Eintrag bei ESRI gefunden:
"Before you remove the layer from the map, you need to disconnect it from its data source"
Verwiesen wird auf
"IDataLayer2::Disconnect"

Soll wohl eine Methode sein, den Layer quasi von der Datei selbst "abzukoppeln"

Jetzt muß ich wohl herausfinden, wie das funktioniert. Leider habe ich bis jetz noch kein Beispiel gefunden.
Also mit folgendem Beitrag habe ich es irgendwie hinbekommen, das auch bei mir die Löscherei eines Layers aus ArcMap funktioniert:
http://forums.esri.com/Thread.asp?c=93&f=992&t=266 685

Der Layer wird aus der Liste links entfernt, das Bild verschwindet auch rechts aus dem Fenster. Und wenn ich am Ende die Dateien mit dem TotalCommander von der Platte lösche, funktioniert das auch.
Also dürften die Dateien wohl wirklich "entkoppelt" sein.

Und so sieht das bei mir aus (ist ja immer nur ein Layer geöffnet und automatisch markiert ist er wohl auch schon):

...

Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap

Dim benutzt As IDataLayer2
Set benutzt = pMxDoc.SelectedLayer
benutzt.Disconnect
pMap.DeleteLayer pMxDoc.SelectedLayer
pMap.Layers.Reset

Set pMap = Nothing
Set pMxDoc = Nothing

...
Bei den weiteren Aufrufen dieser "Routine" lasse ich jeweils nur die DIM-Anweisungen weg.

Jetzt würde mich natürlich interessieren, ob das auch bei jemand anderem funktioniert, sprich, ob die Methode wirklich 'was taugt. Bei DER schweren Geburt....
So ganz begriffen, warum das mit der Übergeberei an ein Objekt "benutzt As IDataLayer2" sein muß, habe ich noch nicht so ganz.
Hauptsache es geht.
Vielleicht so?:

Dim pMap2 As IDataLayer2
Set pMap2 = pMxDocument.SelectedLayer
pMap2.Disconnect

Ich kann übrigens mit deinem Skript die daten ohne Probleme mit dem Explorer von der Platte putzen. Komisch oder?
Ach sehe gerade Du hast das selbst gelöst. :-)
Das ist wirklich seltsam, warum das "alte" Skript bei mir nicht so tut., wie es soll.
Nochmals vielen Dank für die Hilfe, ganz alleine wäre ich da nicht so leicht draufgekommen.
So viel rumgewurschtel für so eine kleine Funktion....

Glaube, das Thema kann ich damit dann aber abschließen, oder?
Es sei denn, es gibt noch Anmerkungen/Verbesserungsvorschläge.
Naja, ich lass' den thread mal noch bis morgen offen.

Ciao
Andi
Hi ANdi,
aber das macht doch auch Spaß, wenn man "nach dem rumgewuschtel" dann die Lösung hat, oder?
Grüße
Stimmt schon, da kann man seinen Spieltrieb ausleben.....

Und dafür mache ich auch gleich mal den nächsten Thread auf..... mit 'ner deftigen Frage zu Raster-Operationen in Bilddateien ;)
So, der neue thread steht.... ;)