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
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
- Anmelden oder Registieren, um Kommentare verfassen zu können
Gespeichert von Andreas Haug am Di., 04.08.2009 - 09:19
PermalinkNaja, ich habe ja bis jetzt auch noch nichts dazu gefunden... ;)
Gespeichert von Lorenzen am Di., 04.08.2009 - 11:16
Permalink' 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
Gespeichert von Andreas Haug am Mi., 05.08.2009 - 09:08
PermalinkHabe 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
------
Gespeichert von Andreas Haug am Mi., 05.08.2009 - 09:16
Permalink' 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....
Gespeichert von Andreas Haug am Mi., 05.08.2009 - 10:21
Permalinkhabe 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
Gespeichert von Lorenzen am Mi., 05.08.2009 - 10:48
Permalinkversuch 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
Gespeichert von Lorenzen am Mi., 05.08.2009 - 10:52
Permalink"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
Gespeichert von Andreas Haug am Mi., 05.08.2009 - 11:20
Permalinkgute 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.
Gespeichert von lorenz am Mi., 05.08.2009 - 12:47
Permalinkder 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
Gespeichert von Andreas Haug am Mi., 05.08.2009 - 13:10
Permalink"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.
Gespeichert von Andreas Haug am Mi., 05.08.2009 - 13:16
Permalinkwenn 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.
Gespeichert von lorenz am Mi., 05.08.2009 - 13:23
PermalinkAber warum willst Du das gerade (mühsam) erzeugte Schummerungsbild denn gleich wieder löschen?
Gespeichert von Andreas Haug am Mi., 05.08.2009 - 13:47
PermalinkUnd 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.
Gespeichert von lorenz am Mi., 05.08.2009 - 13:53
PermalinkGespeichert von Andreas Haug am Mi., 05.08.2009 - 14:07
PermalinkNaja, 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
Gespeichert von lorenz am Mi., 05.08.2009 - 14:16
PermalinkGespeichert von lorenz am Mi., 05.08.2009 - 16:06
Permalinkhabe 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.
Gespeichert von lorenz am Mi., 05.08.2009 - 16:22
PermalinkPrivate Sub CommandButton1_Click()
Dim aoidoc As IMxDocument
Dim aoimap As IMap
Set aoidoc = ThisDocument
Set aoimap = aoidoc.FocusMap
aoimap.ClearLayers
aoidoc.UpdateContents
End Sub
Gespeichert von Andreas Haug am Do., 06.08.2009 - 09:20
PermalinkDanke 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.
Gespeichert von Andreas Haug am Do., 06.08.2009 - 09:50
Permalinkhttp://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.
Gespeichert von lorenz am Do., 06.08.2009 - 10:02
PermalinkDim 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?
Gespeichert von lorenz am Do., 06.08.2009 - 10:03
PermalinkGespeichert von Andreas Haug am Do., 06.08.2009 - 10:09
PermalinkNochmals 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
Gespeichert von lorenz am Do., 06.08.2009 - 10:19
Permalinkaber das macht doch auch Spaß, wenn man "nach dem rumgewuschtel" dann die Lösung hat, oder?
Grüße
Gespeichert von Andreas Haug am Do., 06.08.2009 - 10:22
PermalinkUnd 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.... ;)