আর্কম্যাপ অ্যাডইন সরঞ্জামদণ্ডে যোগ না করে ফর্ম থেকে কাস্টম আইটিউলকে সক্রিয় করছেন?


11

আমি আরকম্যাপ 10.0 এর জন্য একটি অ্যাড-ইন-এ কাজ করছি যা আর্কম্যাপে একটি সরঞ্জামদণ্ড যুক্ত করে। OpenModelessDialogCommandসেই সরঞ্জামদণ্ডের একটি কমান্ড ( ) বোতামটি একটি মোডলেস উইনফোর্ডস ডায়ালগটি খুলবে, যা থেকে কোনও সরঞ্জাম ( MyTool) সক্রিয় করা যায় যাতে মানচিত্রের কোনও বৈশিষ্ট্য নির্বাচন করা যায়।

আমার Config.esriaddinxএই কমান্ড এবং সরঞ্জামদণ্ডের ঘোষণা রয়েছে:

<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>

MyToolফর্মটি সক্রিয় করার সাথে আমার যে সমস্যা হচ্ছে তা হ'ল । ইন্টারনেটে আমি যা কিছু পেয়েছি তা হ'ল লাইনগুলির সাথে কোড নমুনা:

// get a reference to an instance of MyTool:
ICommandItem myTool = ArcMap.Application.Document.CommandBars.Find("MyTool");
 // activate MyTool: 
ArcMap.Application.CurrentTool = myTool;

তবে এটিকে আপাতদৃষ্টিতে প্রয়োজন হয় যে MyToolআমার অ্যাড-ইনের একটি কমান্ড বারে (উদাহরণস্বরূপ সরঞ্জামদণ্ড) হাজির। তবে বিষয়টি তেমন নয়। সুতরাং, আমি এটি পরবর্তী চেষ্টা করেছি:

ITool myTool = new MyTool();
ArcMap.Application.CurrentTool = myTool;  // Type mismatch! An ICommandItem is expected.

এমনকি আমি AxToolbarControlআমার ফর্মটিতে একটি অদৃশ্য যোগ করার এবং MyToolসেখানে একটি বোতাম যুক্ত করার চেষ্টা করেছি ; তবে তারপরে কীভাবে SetBuddyControlখোলা নথির মানচিত্রে সেই সরঞ্জামদণ্ডটি (মাধ্যমে ) সংযুক্ত করতে হয় তা নিয়ে আমি সমস্যায় পড়ছি । আমি চাই না যে সরঞ্জামটি আলাদাভাবে AxMapControlকাজ করতে পারে, আমি এটি আর্কম্যাপে প্রদর্শিত মূল মানচিত্রের সাথে সরাসরি কাজ করতে চাই।

প্রশ্ন:
আমি কীভাবে কোনও কাস্টম সরঞ্জাম সক্রিয় করব যা কোনও সরঞ্জামদণ্ডে যুক্ত হয় না (বা অন্য কমান্ড বার, সে ক্ষেত্রে)?


আপনি যদি ভাবেন যে আমার উত্তরটি আপনার পক্ষে কাজ করবে যদি কমান্ডবার বিজ্ঞাপন হিসাবে কাজ করে, আপনার প্রশ্নের সাথে সম্ভবত একটি "বাগ" ট্যাগ যুক্ত করুন। জনসাধারণকে দেখানো নোংরা লন্ড্রি প্রায়শই একজন বিক্রেতাকে বাগ ঠিক করার জন্য ভাল অনুপ্রেরণা দেয়।
কर्क কুইকেনডাল

@ কির্ক, আমি এটি করতে যাচ্ছিলাম, তবে আমি পারব না - আমি এখানে নতুন ট্যাগ তৈরি করার মতো পর্যাপ্ত র‌্যাঙ্ক পাইনি, এবং bugএখনও উপস্থিত বলে মনে হচ্ছে না; ট্যাগগুলি নিজে সম্পাদনা করতে নির্দ্বিধায় অনুভব করুন।
স্ট্যাকেক্স

উত্তর:


7

এটি আমার জন্য আরকজিআইএস 10 এসপি 1 ব্যবহার করে কাজ করেছে। আমার কাস্টম সরঞ্জামটি একটি সরঞ্জামদণ্ডে নেই:

    Dim UIDCls As ESRI.ArcGIS.esriSystem.UID = New ESRI.ArcGIS.esriSystem.UIDClass()
    ' id property of menu from Config.esriaddinx document
    UIDCls.Value = "ClassLibraryAddin_MyTool"
    Dim document As ESRI.ArcGIS.Framework.IDocument = My.ArcMap.Document
    Dim commandItem As ESRI.ArcGIS.Framework.ICommandItem = TryCast(document.CommandBars.Find(UIDCls), ESRI.ArcGIS.Framework.ICommandItem)
    If commandItem Is Nothing Then
        Exit Sub
    End If
    My.ArcMap.Application.CurrentTool = commandItem

1
+1 যদি এটি কাজ করে তবে আমার পোস্ট করা উত্তরটির চেয়ে এটি নিশ্চিত। আমি নিশ্চিত যে আমি এটি চেষ্টা করেছি তবে এসপি 1 ইনস্টল করেছি তাই সম্ভবত এটি একটি কারণ ছিল।
কર્ક কুইকেনডাল

Lbross এর উত্তর আমাকে অনেক সাহায্য করেছিল। পরে আমি অর্কগিস স্নিপেট সন্ধানকারীটিতে প্রায় একই সমাধানটি পেয়েছি: 'বিবৃতিগুলি - উইন্ডোজ ফর্ম.স্নিপেটে একটি সরঞ্জাম ব্যবহার করুন' (আমি সি # ব্যবহার করছি) আমি উত্তরটি ভোট দিতে পারব না কারণ আমার খুব কম খ্যাতি রয়েছে।
dpalmetz

আমি ভোট দিতে বা মন্তব্য যুক্ত করতে পারি না কারণ আমার যথেষ্ট খ্যাতি নেই, তবে ল্যাব্রোস এর উত্তর আমার পক্ষে আরকজিআইএস 10.2 এ কাজ করে। আমি একটি সরঞ্জামদণ্ড ছাড়াই একটি আইটিউল তৈরি করেছি এবং এটি একটি উইন্ডোজ বোতাম
ভেক্টর

3

আমি এটি কখনও চেষ্টা করি নি, তবে মনে হয় এটির মতো কাজ করা উচিত: আপনার মোডলেস ফর্মের দুটি সদস্য ভেরিয়েবল রয়েছে, প্রথমটি (এমটুল) আপনার আইটিউলকে রেফারেন্স করছে এবং দ্বিতীয়টি (এম_প্লিকেশন) আইপ্লিকেশনকে রেফারেন্স করছে। আপনার মোডলেস ফর্মটির জন্য কনস্ট্রাক্টরে এটি আইটিউলটি ইনস্ট্যান্ট করুন এবং আইপ্লিকেশন রেফারেন্সটি পাস করে অনক্রিট কল করুন call

আপনার মোডলেস ফর্মটিতে একটি বোতাম রয়েছে যা ক্লিক করার পরে এম_প্লিকেশন সেট হয়। CurrentTool = m_Tool। এছাড়াও, একটি মোডলেস ডায়লগ না করার পরিবর্তে আমি ডকএবল উইন্ডোটি সম্ভবত এর মধ্যে ডাব্লুপিএফ ব্যবহার করে ব্যবহার করার পরামর্শ দেব ।

আপডেট এই খোঁড়া উত্তর পোস্ট করার জন্য প্রায়শ্চিত্ত করার প্রয়াসে, আমি একসাথে কিছু হ্যাক করার চেষ্টা করেছি। দেখে মনে হচ্ছে আপনার গতিশীলভাবে একটি সরঞ্জামদণ্ড তৈরি করতে সক্ষম হওয়া উচিত, এটি আড়াল করতে, এটিতে সরঞ্জামটি যুক্ত করুন (কারেন্টুলের সাথে সেট করার জন্য একটি আইকোমন্ডআইটিম পেয়েছে), তারপরে কোনও সরঞ্জামদণ্ডে ব্যবহারকারীটি না জেনেও সরঞ্জামদণ্ডটি মুছুন। তবে আইকোমন্ডবার.ডক এবং আইকোমন্ড আইটেম.ডিলিট গতিশীল টোবারগুলির জন্য কাজ করছে বলে মনে হয় না। আইএমএইচও এটি একটি বাগ।

protected override void OnClick()
{
    UID uid = new UIDClass();
    uid.Value = "Microsoft_ArcMapAddin1_Tool1";
    var bar = ArcMap.Application.Document.CommandBars.Create("mybar", esriCmdBarType.esriCmdBarTypeToolbar)
        as ICommandBar;

    // bug, dock doesn't work ...
    bar.Dock(esriDockFlags.esriDockHide);
    bar.Add(uid);

    var itm = bar.Find(uid);
    if (itm != null)
    {
        ArcMap.Application.CurrentTool = itm;
        // bug, delete doesn't work either
        ((ICommandItem)bar).Delete(); 
    }
}

1
এটি কার্যকর হবে না, যেহেতু কারেন্টটুল সম্পত্তি আইকোমন্ড আইটেম প্রত্যাশা করে। আইকোমন্ডম আইটেম রেফারেন্সগুলি সরাসরি তৈরি করা যায় না, তবে কেবল আইকোমন্ডবার্সের মাধ্যমে পুনরুদ্ধার করা যায়।
পেট্র ক্রেবস

কারেন্টটোল সম্পর্কে বেশ সঠিক, তবে আইকোমন্ডবার.এড একটি ইউআইডি থেকে একটি আইকোমন্ড আইটেম তৈরি করে। সমস্যাটি তখন কমান্ডবারের আর প্রয়োজন না হওয়ার পরে কীভাবে মুক্তি পাবেন (বা অন্তত এটি লুকিয়ে রাখবেন) becomes
কर्क কুইকেনডাল

বাহ, আপনার আপডেটে একটি ওয়ার্কিং কোড উদাহরণ যুক্ত করার জন্য ধন্যবাদ। এটি লজ্জাজনক নয় যে Dockকাজও করে না Delete, তবে এটি একটি ভাল শুরু। আমি Deleteমনে করি বিষয়টি আরও খতিয়ে দেখব ।
স্টাকেক্স

কি আকর্ষণীয় ধারণা, আমি অবশ্যই এ থেকে বিস্তারিত জানার চেষ্টা করব। বিটিডব্লু আমি বিশ্বাস করি যে আচরণটি আপনি বর্ণনা করেছেন এটি একটি বাগ।
পেট্র ক্রেবস

আমি একটি পৃথক সমাধান ব্যবহার করে শেষ করেছি (অন্যান্য জিনিসের মধ্যে, আমার সরঞ্জামটিকে একটি সিঙ্গলটন তৈরি করে যাতে আমি সহজেই এটির একটি রেফারেন্স পেতে পারি; CommandBars.Findসমস্যাটি হঠাৎই নিজেই সমাধান হয়ে যায়, কোনও অজানা কারণে) তবে আমি এই উত্তরটি টিক দিচ্ছি চিহ্নিত করুন কারণ এটি সম্ভবত আমি করতাম।
stakx

3

আমি জানি না কেন আপনাকে একটি সরঞ্জামদণ্ডে সরঞ্জামটি যুক্ত করতে হবে। কারণ, আমি কিছু অনুরূপ জিনিস নিয়ে কাজ করেছি এবং এটি সরঞ্জামদণ্ডে যুক্ত করার কোনও প্রয়োজন আমি পাইনি।

আমার ক্ষেত্রে, ব্যবহারকারী যখন ডকযোগ্য উইন্ডোর একটি বোতামে ক্লিক করেন, তখন একটি সরঞ্জাম সক্রিয় হয়। এই কাজটি সম্পাদন করতে, আমার সরঞ্জাম বর্গটি নীচের মত দেখাচ্ছে:

  • আমার সরঞ্জাম আইডিটি হ'ল: "আর্কম্যাপ_স্লেশনটুল"
  • আমার সরঞ্জাম শ্রেণীর নাম: "সিলেকশনটুল"
  • সরঞ্জাম শ্রেণিতে সরঞ্জামের ধরণের স্ট্যাটিক ক্ষেত্রটি রাখুন

    private static ICommandItem _selectionTool;
    private static SelectionTool _instance;
    public static SelectionTool Instance
    {
        get
        {
            if (_instance == null)
            {
                var selectionToolUID = new UID();
                selectionToolUID.Value = "ArcMap_SelectionTool";
                _selectionTool = ArcMap.Application.Document.CommandBars.Find(selectionToolUID, false, false);
                if (_selectionTool == null)
                {
                    MessageBox.Show("Selection tool is not found.");
                    return null;
                }
            }
            if (_selectionTool != null)
                ArcMap.Application.CurrentTool = _selectionTool;
            return _instance;
        }
    }
    
    public static void ExitToolInstance()
    {
        if (_instance != null)
            ArcMap.Application.CurrentTool = null;
    }
    
    public SelectionTool()
    {
        _instance = this;
    }
    
    protected override void OnMouseDown(MouseEventArgs arg)
    {
        if (arg.Button != MouseButtons.Left)
            return;
        //Do Work
    }

সুতরাং, যখনই আমার এই সরঞ্জামটি ইনস্ট্যান্ট করার দরকার হয়, আমি এটিকে নিম্নলিখিত উপায়ে কল করি:

        var toolInstance = SelectionTool.Instance;

সরঞ্জামটির সাথে কাজ করার পরে, আমার সরঞ্জাম উদাহরণটি প্রস্থান করতে হবে। সুতরাং আমি SelectionTool.ExitToolInstance()পদ্ধতি কল ।

এই পদ্ধতিটি আমার পক্ষে ভাল কাজ করে।


1

আমি সাধারণত আপনার কমান্ডটি (আপনার ক্ষেত্রে ওপেনমডলেসডায়ালগকম্যান্ড) টিও একটি সরঞ্জাম ( ITool) তৈরি করে সমাধান করি। কমান্ডটি ক্লিক করার পরে, আমি ফর্মটি খুলি। তারপরে আমি এটিকে যেকোন মুহূর্তে একটি সরঞ্জাম হিসাবে সক্রিয় করতে পারি।

আপনি যে সরঞ্জামটি সক্রিয় করতে চান তা যদি আপনার নিজের না হয় তবে আপনি আপনার আইটুল (উপরের মতো প্রয়োগ করা) থেকে অন্য সরঞ্জামের উদাহরণগুলিতে রিলে করতে পারেন।


0

আপনার যদি মানচিত্রের অবজেক্টে অ্যাক্সেস রয়েছে, অনকারেটে কল করে অনেক সরঞ্জাম চালানো যেতে পারে উদাহরণস্বরূপ মানচিত্রের নিয়ন্ত্রণ মানচিত্রে এটি মানচিত্রের দিকে আবদ্ধ করতে। এর পরে এটি কেবলমাত্র ক্লিক ক্লিক পদ্ধতি চালানো run

tool.OnCreate(control.Object)
tool.OnClick()

সমস্ত ESRI সরঞ্জামগুলিতে কাজ করবেন না কারণ কিছুকে একটি সরঞ্জামদণ্ডে যুক্ত করা দরকার need


আমি কীভাবে এই জাতীয় মানচিত্রের একটি সূত্র পেতে পারি? আমি যে সব কিছু পেতে পারি বলে মনে হয় সেগুলি একটি IMapইন্টারফেস IMxDocument, তবে স্পষ্টভাবে এটি একই নয়, তাই না?
stakx

সম্পাদনা করুন: ডেস্কটপে এটি আইপ্লিকেশন যা হুক অবজেক্ট: help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/…
ম্যাথিয়াস ওয়েস্টিন

দুঃখিত, আমি এই চেষ্টা করেছি; এটা কাজ করে না। এখানে সমস্যাটি হ'ল সরঞ্জামটি তৈরি হয়ে যায়, তবে কখনও সক্রিয় হয় না। দ্বিতীয়ত, আমি এখনও দেখতে পাচ্ছি না যে আমি কীভাবে কোনও MapControlজিনিস পেতে পারি (যদি আমার আসলেই একটি প্রয়োজন হয়) IApplicationবা সেখান থেকে যে কোনও বস্তু পৌঁছতে পারে।
স্টাকেক্স

ডেস্কটপে এটি করার সময় আপনার আইপিপ্লিকেশনটি অনক্রিটে পাস করা উচিত, যদি আমি ডকুমেন্টেশনটি ভুলভাবে না পড়ে থাকি। ম্যাপকন্ট্রোল অবজেক্টে প্রেরণ ইঞ্জিনে আমার জন্য কাজ করে।
ম্যাথিয়াস ওয়েস্টিন

এটি সঠিক বলে মনে হচ্ছে আপনি কোনও IApplicationবস্তুকে পাস করেছেন OnCreate- তবে এটি যথেষ্ট নয় (কমপক্ষে আমার কাস্টম সরঞ্জামের জন্য নয়), কারণ সরঞ্জামটি সক্রিয় হয় না OnCreate, এবং তাই কোনও ইনপুট ইভেন্ট গ্রহণ করবে না।
স্টাকেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.