Hi Uwe und auch alle anderen,
du hattest mir das nette Bsp. mit dem Bild einfügen geschrieben. Leider klappt das mit den Koordinaten zuweisen nicht wirklich. Kann ja dann nicht arcid.Picture eine Koordinate zuweisen...oder doch? Wäre nett, wenn du das nochmal erläutern könntest.
Danke dir.
Sabine
du hattest mir das nette Bsp. mit dem Bild einfügen geschrieben. Leider klappt das mit den Koordinaten zuweisen nicht wirklich. Kann ja dann nicht arcid.Picture eine Koordinate zuweisen...oder doch? Wäre nett, wenn du das nochmal erläutern könntest.
Danke dir.
Sabine
- Anmelden oder Registieren, um Kommentare verfassen zu können
Gespeichert von Gast am Mi., 09.03.2005 - 08:51
PermalinkUwe möge mir widersprechen, aber ich sehe in Deinem Fall ebenfalls ein Problem darin, über die CommandItem.Execute-Sub eine saubere Referenz auf ein PictureElement zu erhalten. Wenn es nur eins ist, ist das natürlich relativ simpel, Du wirst Dich aber nie darauf verlassen können, daß Dein Kunde nicht vorher schon ein anderes eingefügt hat.
Kurz: Ich würde für den "Bild-Einfüge-Dialog" lieber direkt die Windows-Api nutzen. Ein fertiges Klassenmodul dazu findest Du z.B. auf der Seite von Karsten Pries
http://www.kpries.de/Entwicklertools/filedialog.htm
Ist zwar für Access geschrieben, läßt sich aber ganz einfach anpassen: Einfach als cls in ArcView importieren und dort das hWndAccessApp durch hwnd ersetzen. Der Aufruf an sich ist dann auch nicht mehr viel länger als die der CommandItems.
Über den FileDialog erhälst Du dann einen Dateinamen zurück, den Dein Kunde ausgewählt hat. Diesen wiederum kannst Du entsprechend nutzen, um Dein Bild zu laden und zu verschieben. Bsp ist für AV 8.3, kann sein daß Du beim createObjekt eine ander Bibliothek (carto) für 9.0 verwenden mußt?:
Option Explicit
Private Sub DeinButton_Click()
Dim fd As FileDialog
Dim strfilename As String
Set fd = New FileDialog
With fd
.Filter1Suffix = "*.bmp;*.jpg;*.jpeg"
.Filter1Text = "Graphikdateien"
.ShowOpen
End With
If fd.FileName <> "" Then
strfilename = fd.FileName
InsertPicture 5, 5, 15, 15, strfilename
End If
End Sub
Public Sub InsertPicture(xmin As Long, ymin As Long, xmax As Long, ymax As Long, strfilename As String)
Dim pDoc As IMxDocument
Dim pGraphicsContainer As IGraphicsContainer
Dim pElement As IElement
Dim pPicElement As IPictureElement
Dim pEnvelope As IEnvelope
Set pDoc = ThisDocument
Set pPicElement = CreateObject("esriCore.jpgPictureElement")
pPicElement.ImportPictureFromFile strfilename
'pPicElement.MaintainAspectRatio = True
'pPicElement.SavePictureInDocument = True
Set pEnvelope = New Envelope
pEnv.PutCoords xmin, ymin, xmax, ymax
Set pElement = pPicElement
pElement.Geometry = pEnvelope
'pElement.Locked = True
Set pGraphicsContainer = pDoc.PageLayout
pGraphicsContainer.AddElement pElement, 0
pDoc.ActiveView.Refresh
End Sub
Viele Grüße
Jörg Ostendorp
Gespeichert von uwelangehh am Do., 10.03.2005 - 13:24
Permalinkdanke fuer dein Beispiel!
Hallo Sabine,
der Vollstaendigkeit halber:
Wenn du die ArcMap-Funktion Picture mit VBA aufrufst, dann ist die neue Bildgrafik meines Wissens das erste Element im GraphicsContainer. Die Position kannst du dann wie folgt festlegen:
Sub InsertPicture2()
' Variablendeklarationen
Dim pMxDoc As IMxDocument
Dim pGraphicsContainer As IGraphicsContainer
Dim pElement As IElement
Dim pEnv As IEnvelope
Dim pCommandItem As ICommandItem
' ArcMap-Befehl zum Einfuegen einer Bildgrafik in das Layout bestimmen
Set pCommandItem = Application.Document.CommandBars.Find(arcid.Picture)
' ArcMap-Befehl ausfuehren
pCommandItem.Execute
Set pMxDoc = Application.Document
' Pointer auf den Grafik-Container setzen
Set pGraphicsContainer = pMxDoc.PageLayout
pGraphicsContainer.Reset
' Die eingefuegte Grafik ist das erste Element
Set pElement = pGraphicsContainer.Next
' Ausdehnung fuer die Bildgrafik definieren
Set pEnv = New Envelope
pEnv.PutCoords 1, 1, 3, 3
' ... und aendern
pElement.Geometry = pEnv
' Abschlussmeldung
MsgBox " Die eingefügte Grafik wurde an die Position:" & vbCrLf & vbCrLf & _
pEnv.xmin & vbCrLf & _
pEnv.xmax & vbCrLf & _
pEnv.ymin & vbCrLf & _
pEnv.ymax & vbCrLf & vbCrLf & _
"gesetzt."
End Sub
Gruss
Uwe
Gespeichert von Gast am Do., 10.03.2005 - 15:56
Permalink> danke fuer dein Beispiel!
Na gleichfalls! ;-)
> Die eingefuegte Grafik ist das erste Element
Ja klar, sollte wohl morgends besser keine Postings loslassen...
Aber noch eine kleine Ergänzung zu Deinem Beispiel. Man sollte unbedingt prüfen, ob auch tatsächlich etwas eingefügt wurde oder nicht. Wenn man einfach abbricht, wird ansonsten ein neuer Datenrahmen oder eine bereits vorhandene Grapik eingefügt. Da der Graphik-Container soweit ich das sehe nicht über eine Count-Property verfügt müßte man halt zählen. Also:
...
Dim i As Long
Dim j As Long
Set pMxDoc = Application.Document
Set pGraphicsContainer = pMxDoc.PageLayout
pGraphicsContainer.Reset
'Ausgangszustand merken
Do
Set pElement = pGraphicsContainer.Next
i = i + 1
Loop While Not pElement Is Nothing
Set pCommandItem = Application.Document.CommandBars.Find(arcid.Picture)
pCommandItem.Execute
'Prüfen, ob sich was verändert hat
Set pGraphicsContainer = pMxDoc.PageLayout
pGraphicsContainer.Reset
Do
Set pElement = pGraphicsContainer.Next
j = j + 1
Loop While Not pElement Is Nothing
'Nur weiter machen, wenn sich die Anzahl des Containers verändert hat..
If i=j then
exit sub/goto exitproc)
end if
...
Viele Grüße
Jörg Ostendorp
Gespeichert von uwelangehh am Do., 10.03.2005 - 17:00
PermalinkUwe
Gespeichert von Gast am Di., 15.03.2005 - 14:38
Permalinköhm.. Sollte nach dem Komma noch was kommen?
Ansonsten "Hallo" zurück! ;-)
Jörg Ostendorp
Gespeichert von Gast am Di., 15.03.2005 - 14:50
PermalinkGespeichert von uwelangehh am Di., 15.03.2005 - 14:54
Permalinkhier der Inhalt meiner letzten Mail fuer Puristen:
*
Uwe
Gespeichert von Gast am Di., 15.03.2005 - 17:37
PermalinkAber Bilder von Fremdseiten werden bei mir standardmäßig
halt erstmal blockiert...
Viele Grüße
Jörg Ostendorp