Saya sedang mengerjakan add-in untuk ArcMap 10.0 yang menambahkan toolbar ke ArcMap. Satu perintah ( OpenModelessDialogCommand
) tombol pada toolbar yang membuka dialog WinForms modeless, dari mana alat ( MyTool
) dapat diaktifkan untuk misalnya memilih fitur pada peta.
My Config.esriaddinx
berisi deklarasi perintah dan toolbar ini:
<Commands>
<!-- this is the command that opens the modeless WinForms form, from where
MyTool is available: -->
<Button id="OpenModelessFormCommand" ... />
<!-- MyTool is not directly referenced in any toolbar defined in this file: -->
<Tool id="MyTool" class="MyTool" ... />
</Commands>
<Toolbars>
<Toolbar ...>
<Items>
<Button refID="OpenModelessFormCommand" />
</Items>
</Toolbar>
</Toolbars>
Apa yang saya punya masalah dengan mengaktifkan MyTool
dalam formulir. Yang saya temukan di internet adalah contoh kode di sepanjang baris:
// get a reference to an instance of MyTool:
ICommandItem myTool = ArcMap.Application.Document.CommandBars.Find("MyTool");
// activate MyTool:
ArcMap.Application.CurrentTool = myTool;
Namun, ini tampaknya mengharuskan yang MyTool
benar - benar muncul di bilah perintah (misalnya bilah alat) dari add-in saya. Tapi bukan itu masalahnya. Jadi, saya sudah mencoba ini selanjutnya:
ITool myTool = new MyTool();
ArcMap.Application.CurrentTool = myTool; // Type mismatch! An ICommandItem is expected.
Saya bahkan telah melihat ke dalam menambahkan yang tidak terlihat AxToolbarControl
ke formulir saya dan menambahkan tombol untuk MyTool
itu; tapi kemudian saya mengalami masalah tentang bagaimana menghubungkan bilah alat itu (via SetBuddyControl
) ke peta dokumen yang dibuka. Saya tidak ingin alat berfungsi secara terpisah AxMapControl
, saya ingin alat itu bekerja secara langsung dengan peta utama yang ditunjukkan di ArcMap.
Pertanyaan:
Bagaimana cara mengaktifkan alat khusus yang tidak ditambahkan ke bilah alat apa pun (atau bilah perintah lainnya, dalam hal ini)?
sumber
bug
sepertinya belum ada; silakan mengedit tag sendiri.Jawaban:
Ini bekerja untuk saya menggunakan ArcGIS 10 SP1. Alat khusus saya tidak ada di bilah alat:
sumber
Saya belum pernah mencoba ini, tetapi sepertinya itu harus berfungsi: Dalam formulir modeless Anda memiliki dua variabel anggota, yang pertama (m_Tool) mereferensikan ITool Anda dan yang kedua (m_Application) mereferensikan IApplication. Dalam konstruktor untuk formulir modeless Anda, minta instantiate ITool dan panggil OnCreate , melewati referensi IApplication.Pada formulir modeless Anda memiliki tombol itu, ketika diklik set m_Application. CurrentTool = m_Tool. Juga, daripada melakukan dialog modeless, saya akan merekomendasikan menggunakan jendela dockable mungkin menggunakan WPF di dalamnya .
Perbarui Dalam upaya untuk menebus posting ini, saya mencoba meretas sesuatu bersama-sama. Sepertinya Anda harus dapat membuat toolbar secara dinamis, menyembunyikannya, menambahkan alat ke sana (mendapatkan ICommandItem untuk diatur ke CurrentTool), lalu menghapus toolbar tanpa pengguna mengetahui bahwa alat itu ada di toolbar. Namun, ICommandBar.Dock dan ICommandItem.Delete tampaknya tidak berfungsi untuk tocar dinamis. IMHO ini adalah bug.
sumber
Dock
juga tidakDelete
berfungsi, tetapi ini awal yang baik. Saya akan melihatDelete
masalah lebih lanjut, saya pikir.CommandBars.Find
masalah tiba-tiba terpecahkan sendiri, untuk beberapa alasan yang tidak diketahui), tetapi saya memberikan jawaban ini centang centang tandai karena ini mungkin apa yang akan saya lakukan.Saya tidak tahu mengapa Anda perlu menambahkan alat di toolbar. Karena, saya telah bekerja dengan beberapa hal serupa dan saya belum menemukan kebutuhan untuk menambahkannya di bilah alat.
Dalam kasus saya, ketika pengguna mengklik tombol di jendela dockable, alat akan diaktifkan. Untuk melakukan pekerjaan ini, kelas alat saya terlihat seperti berikut:
Simpan bidang statis tipe pahat di kelas pahat
Jadi, setiap kali saya perlu instantiate alat ini, saya menyebutnya dengan cara berikut:
Setelah bekerja dengan alat ini, saya harus keluar dari alat contoh. Jadi saya sebut
SelectionTool.ExitToolInstance()
metode.Prosedur ini berfungsi dengan baik untuk saya.
sumber
Saya biasanya menyelesaikan ini dengan membuat perintah (OpenModelessDialogCommand dalam kasus Anda) juga alat (
ITool
). Setelah mengklik perintah, saya membuka formulir. Lalu saya juga bisa mengaktifkannya sebagai alat kapan saja.Jika alat yang ingin Anda aktifkan bukan milik Anda, Anda dapat menyampaikan panggilan dari ITool Anda (diimplementasikan seperti di atas) ke instance alat lainnya.
sumber
Jika Anda memiliki akses ke objek peta, banyak alat dapat dijalankan dengan melakukan panggilan ke onCreate mengirim misalnya objek MapControl untuk menghubungkannya ke peta. Setelah itu hanya menjalankan metode onClick.
Jangan bekerja pada semua alat ESRI karena beberapa perlu ditambahkan ke toolbar.
sumber
IMap
antarmukaIMxDocument
, tapi jelas itu tidak sama, kan?MapControl
objek (jika saya benar-benar membutuhkannya) melaluiIApplication
atau objek apa pun yang dapat dijangkau dari sana.IApplication
objek keOnCreate
- tetapi itu tidak cukup (setidaknya tidak untuk alat kustom saya), karena alat tidak diaktifkan olehOnCreate
, dan karenanya tidak akan menerima peristiwa input apa pun.