nochmal JPG Hilfe!

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
Hallo Sabine,

Uwe 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
Hallo Joerg,

danke 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
Hallo Uwe,

> 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
Hello again,



Uwe
Hallo Uwe,

öhm.. Sollte nach dem Komma noch was kommen?
Ansonsten "Hallo" zurück! ;-)

Jörg Ostendorp
Jörg, hau mal in deinem Browser auf "Bilder anzeigen"
Hello again,

hier der Inhalt meiner letzten Mail fuer Puristen:

*

Uwe
Auweia, das dann wohl wieder fettnäpfchenverdächtig :-)
Aber Bilder von Fremdseiten werden bei mir standardmäßig
halt erstmal blockiert...

Viele Grüße
Jörg Ostendorp