<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.gis-lab.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wasposa</id>
	<title>GIS-Lab - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.gis-lab.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wasposa"/>
	<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/w/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Wasposa"/>
	<updated>2026-06-22T08:59:37Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25981</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25981"/>
		<updated>2018-04-09T09:18:28Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Опубликована|mapinfo-smartpanels}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&lt;br /&gt;
&lt;br /&gt;
Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&lt;br /&gt;
&lt;br /&gt;
Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64.zip]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами по их настройке, удалению и добавлению в SmartPanels. Второй пункт отвечает за отображение списка всех зарегистрированных панелей, позволяет  их показывать или скрывать. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img10a.png|450px|center|Меню SmartPanels в Mapinfo до 16 версии]]&lt;br /&gt;
[[Image:SmartPanels_img10b.png|450px|center|Меню SmartPanels в Mapinfo в 16 версии]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img11.png|center|frame|Настройка загрузчика MSVisualStudio]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта:'' Файл – Проект – Cоздать – Библиотека классов (.NET Framework)''&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img12.png|center|frame|Общий вид меню «Создание проекта».]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода.&amp;lt;/p&amp;gt;&lt;br /&gt;
Свойства: &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически сохранять и восстанавливать при запуске.&lt;br /&gt;
Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img13.png|center|frame|Класс CloneLayout.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и одну кнопку. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img15.png|center|frame|Пользовательские элементы управления.]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img16.png|center|frame|Измененный класс CloneLayout.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img17.png|750px|center|Добавление созданного плагина]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img18.png|center|frame|Новый плагин в MapInfo]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа.&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img19.png|center|frame|Измененный класс LayoutControl]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img20.png|center|frame|Плагин в действии]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Poland.png&amp;diff=25956</id>
		<title>Файл:Poland.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Poland.png&amp;diff=25956"/>
		<updated>2018-03-29T10:35:37Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25955</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25955"/>
		<updated>2018-03-28T06:01:08Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Заключение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64.zip]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами по их настройке, удалению и добавлению в SmartPanels. Второй пункт отвечает за отображение списка всех зарегистрированных панелей, позволяет  их показывать или скрывать. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img10a.png|450px|center|Меню SmartPanels в Mapinfo до 16 версии]]&lt;br /&gt;
[[Image:SmartPanels_img10b.png|450px|center|Меню SmartPanels в Mapinfo в 16 версии]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img11.png|center|frame|Настройка загрузчика MSVisualStudio]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта:'' Файл – Проект – Cоздать – Библиотека классов (.NET Framework)''&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img12.png|center|frame|Общий вид меню «Создание проекта».]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода.&amp;lt;/p&amp;gt;&lt;br /&gt;
Свойства: &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически сохранять и восстанавливать при запуске.&lt;br /&gt;
Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img13.png|center|frame|Класс CloneLayout.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и одну кнопку. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img15.png|center|frame|Пользовательские элементы управления.]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img16.png|center|frame|Измененный класс CloneLayout.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img17.png|750px|center|Добавление созданного плагина]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img18.png|center|frame|Новый плагин в MapInfo]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа.&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img19.png|center|frame|Измененный класс LayoutControl]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img20.png|center|frame|Плагин в действии]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25954</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25954"/>
		<updated>2018-03-27T14:13:44Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64.zip]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами по их настройке, удалению и добавлению в SmartPanels. Второй пункт отвечает за отображение списка всех зарегистрированных панелей, позволяет  их показывать или скрывать. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img10a.png|450px|center|Меню SmartPanels в Mapinfo до 16 версии]]&lt;br /&gt;
[[Image:SmartPanels_img10b.png|450px|center|Меню SmartPanels в Mapinfo в 16 версии]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img11.png|center|frame|Настройка загрузчика MSVisualStudio]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта:'' Файл – Проект – Cоздать – Библиотека классов (.NET Framework)''&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img12.png|center|frame|Общий вид меню «Создание проекта».]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода.&amp;lt;/p&amp;gt;&lt;br /&gt;
Свойства: &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически сохранять и восстанавливать при запуске.&lt;br /&gt;
Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img13.png|center|frame|Класс CloneLayout.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и одну кнопку. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img15.png|center|frame|Пользовательские элементы управления.]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img16.png|center|frame|Измененный класс CloneLayout.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img17.png|750px|center|Добавление созданного плагина]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img18.png|center|frame|Новый плагин в MapInfo]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа.&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img19.png|center|frame|Измененный класс LayoutControl]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img20.png|center|frame|Плагин в действии]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25953</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25953"/>
		<updated>2018-03-27T14:09:35Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64.zip]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами по их настройке, удалению и добавлению в SmartPanels. Второй пункт отвечает за отображение списка всех зарегистрированных панелей, позволяет  их показывать или скрывать. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img10a.png|450px|center|Меню SmartPanels в Mapinfo до 16 версии]]&lt;br /&gt;
[[Image:SmartPanels_img10b.png|450px|center|Меню SmartPanels в Mapinfo в 16 версии]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img11.png|center|frame|Настройка загрузчика MSVisualStudio]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта:'' Файл – Проект – Cоздать – Библиотека классов (.NET Framework)''&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img12.png|center|frame|Общий вид меню «Создание проекта».]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода.&amp;lt;/p&amp;gt;&lt;br /&gt;
Свойства: &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически сохранять и восстанавливать при запуске.&lt;br /&gt;
Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img13.png|center|frame|Класс CloneLayout.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и одну кнопку. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img15.png|center|frame|Пользовательские элементы управления.]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img16.png|center|frame|Измененный класс CloneLayout.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img17.png|400px|center|Добавление созданного плагина]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img18.png|center|frame|Новый плагин в MapInfo]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25952</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25952"/>
		<updated>2018-03-27T14:01:52Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64.zip]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами по их настройке, удалению и добавлению в SmartPanels. Второй пункт отвечает за отображение списка всех зарегистрированных панелей, позволяет  их показывать или скрывать. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img10a.png|450px|center|Меню SmartPanels в Mapinfo до 16 версии]]&lt;br /&gt;
[[Image:SmartPanels_img10b.png|450px|center|Меню SmartPanels в Mapinfo в 16 версии]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img11.png|center|frame|Настройка загрузчика MSVisualStudio]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта:'' Файл – Проект – Cоздать – Библиотека классов (.NET Framework)''&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img12.png|center|frame|Общий вид меню «Создание проекта».]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода.&amp;lt;/p&amp;gt;&lt;br /&gt;
Свойства: &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически сохранять и восстанавливать при запуске.&lt;br /&gt;
Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img13.png|center|frame|Класс CloneLayout.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и одну кнопку. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img15.png|center|frame|Пользовательские элементы управления.]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25951</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25951"/>
		<updated>2018-03-27T13:58:25Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64.zip]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами по их настройке, удалению и добавлению в SmartPanels. Второй пункт отвечает за отображение списка всех зарегистрированных панелей, позволяет  их показывать или скрывать. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img10a.png|450px|center|Меню SmartPanels в Mapinfo до 16 версии]]&lt;br /&gt;
[[Image:SmartPanels_img10b.png|450px|center|Меню SmartPanels в Mapinfo в 16 версии]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img11.png|center|frame|Настройка загрузчика MSVisualStudio]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта:'' Файл – Проект – Cоздать – Библиотека классов (.NET Framework)''&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img12.png|center|frame|Общий вид меню «Создание проекта».]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода.&amp;lt;/p&amp;gt;&lt;br /&gt;
Свойства: &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически сохранять и восстанавливать при запуске.&lt;br /&gt;
Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img13.png|center|frame|Общий вид меню «Создание проекта».]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25950</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25950"/>
		<updated>2018-03-27T13:48:46Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64.zip]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами по их настройке, удалению и добавлению в SmartPanels. Второй пункт отвечает за отображение списка всех зарегистрированных панелей, позволяет  их показывать или скрывать. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img10a.png|450px|center|Меню SmartPanels в Mapinfo до 16 версии]]&lt;br /&gt;
[[Image:SmartPanels_img10b.png|450px|center|Меню SmartPanels в Mapinfo в 16 версии]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img11.png|frame|Настройка загрузчика MSVisualStudio]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img12.png|frame|Общий вид меню «Создание проекта».]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25949</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25949"/>
		<updated>2018-03-27T13:47:15Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64.zip]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами по их настройке, удалению и добавлению в SmartPanels. Второй пункт отвечает за отображение списка всех зарегистрированных панелей, позволяет  их показывать или скрывать. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img10a.png|450px|center|Меню SmartPanels в Mapinfo до 16 версии]]&lt;br /&gt;
[[Image:SmartPanels_img10b.png|450px|center|Меню SmartPanels в Mapinfo в 16 версии]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Image:SmartPanels_img11.png|450px|center|frame|Настройка загрузчика MSVisualStudio]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25948</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25948"/>
		<updated>2018-03-27T13:39:35Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64.zip]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами по их настройке, удалению и добавлению в SmartPanels. Второй пункт отвечает за отображение списка всех зарегистрированных панелей, позволяет  их показывать или скрывать. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Изображение:SmartPanels_img10a.png|450px|center|frame|Меню SmartPanels‎&lt;br /&gt;
Изображение:SmartPanels_img10b.png‎|450px|center|frame|Меню SmartPanels‎&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img10b.png&amp;diff=25947</id>
		<title>Файл:SmartPanels img10b.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img10b.png&amp;diff=25947"/>
		<updated>2018-03-27T13:36:54Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img10a.png&amp;diff=25946</id>
		<title>Файл:SmartPanels img10a.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img10a.png&amp;diff=25946"/>
		<updated>2018-03-27T13:36:04Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25945</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25945"/>
		<updated>2018-03-27T13:24:57Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64.zip]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25944</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25944"/>
		<updated>2018-03-27T13:24:06Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Описание */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SPInstaller64.zip&amp;diff=25943</id>
		<title>Файл:SPInstaller64.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SPInstaller64.zip&amp;diff=25943"/>
		<updated>2018-03-27T13:23:43Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25942</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25942"/>
		<updated>2018-03-27T13:22:28Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25941</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25941"/>
		<updated>2018-03-27T13:21:06Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]] для 32 разрядной версии и [[Медиа:SPInstaller64.zip]] для 64 разрядной.  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25940</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25940"/>
		<updated>2018-03-27T13:17:29Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [[Медиа:SPInstaller32.zip‎]].  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SPInstaller32.zip&amp;diff=25939</id>
		<title>Файл:SPInstaller32.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SPInstaller32.zip&amp;diff=25939"/>
		<updated>2018-03-27T13:04:30Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: Установщик SartPanels. 32 разрядная версия&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Установщик SartPanels. 32 разрядная версия&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25938</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25938"/>
		<updated>2018-03-27T12:58:38Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Примеры реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img1.png|800px|center|frame|Вкладки документов и прикрепляемые панели.]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img2.png|800px|center|frame|Вид окна &amp;quot;Информация&amp;quot; SmaprtPanels.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img3.png|800px|center|frame|Настройка окна &amp;quot;Информация&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img4.png|800px|center|frame|Выбранный населенный пункт (ОКАТО) в центре карты.]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img5.png|800px|center|frame|Представление результатов  переписи населения в иерархическом списке.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img6.png|800px|center|frame|Представление результатов  переписи населения в виде круговой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img7.png|800px|center|frame|Представление результатов  переписи населения в виде столбчатой диаграммы.]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img8.png|800px|center|frame|Использование панорамы Yandex.]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:SmartPanels_img9.png|800px|center|frame|Использование панорамы Google.]]&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [http://www.mapinfo.ru/product/mapinfo-plugin].  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25937</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25937"/>
		<updated>2018-03-27T11:31:47Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Примеры реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo. Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее.&amp;lt;ref&amp;gt;в MapInfo 16 версии это уже штатный функционал, но и режим отображения окон документов только один – &amp;quot;во все окно&amp;quot;.&amp;lt;/ref&amp;gt; Вторым дополнением к пользовательскому интерфейсу &amp;lt;ref&amp;gt;Данная возможность обеспечивается непосредственно SmartPanels&amp;lt;/ref&amp;gt; является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img3.png]]&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&amp;lt;/p&amp;gt;&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img4.png]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img7.png]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img9.png]]&lt;br /&gt;
===Примечания===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [http://www.mapinfo.ru/product/mapinfo-plugin].  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25936</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25936"/>
		<updated>2018-03-27T11:21:01Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Описание */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo.&lt;br /&gt;
Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее (в MapInfo 16 версии это уже штатный функционал, но там и режим отображения окон документов только один – во все окно). Вторым дополнением к пользовательскому интерфейсу, но который обеспечивает непосредственно SmartPanels, является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img3.png]]&lt;br /&gt;
&lt;br /&gt;
Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img4.png]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img7.png]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img9.png]]&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [http://www.mapinfo.ru/product/mapinfo-plugin].  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25935</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25935"/>
		<updated>2018-03-27T11:20:09Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Описание */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления.&amp;lt;ref&amp;gt;В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести новые или изменить расположение существующих элементов управления.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:justify&amp;quot;&amp;gt;Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП.&amp;lt;ref&amp;gt; Официальный дистрибьютер MapInfo в России и СНГ&amp;lt;/ref&amp;gt; Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&amp;lt;/p&amp;gt;&lt;br /&gt;
====Примечания====&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo.&lt;br /&gt;
Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее (в MapInfo 16 версии это уже штатный функционал, но там и режим отображения окон документов только один – во все окно). Вторым дополнением к пользовательскому интерфейсу, но который обеспечивает непосредственно SmartPanels, является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img3.png]]&lt;br /&gt;
&lt;br /&gt;
Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img4.png]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img7.png]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img9.png]]&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [http://www.mapinfo.ru/product/mapinfo-plugin].  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25934</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25934"/>
		<updated>2018-03-27T11:03:20Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Описание */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления. В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести еще один или изменить расположение существующих;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&lt;br /&gt;
&lt;br /&gt;
Разработчиками предпринимались различные попытки обойти ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MSAccess с использованием MapX, динамическое связывание MapInfo и MSAccess посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был. Однако для его использования необходимо было быть специалистом в C++, а точнее хорошо разбираться в тонкостях создания библиотек DLL (разработка, подключение их в MapBasic, вызов из них внешних подпрограммы и пр.) что, согласитесь, для прикладного программиста MapBasic не является характерным.&lt;br /&gt;
&lt;br /&gt;
Ситуация изменилась коренным образом с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП . Разработка данной утилиты стала возможной, благодаря переходу MapInfo начиная с версии 9.5 на платформу Microsoft .NET. С помощью этой утилиты стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. Утилита является, как бы, посредником между MapInfo и внешним приложением. При этом для разработки прикладного решения не требуется установленного компилятора MapBasic. Все что нужно–это установленная утилита SmartPanel и среда разработки MSVisualStudio.&lt;br /&gt;
&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo.&lt;br /&gt;
Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее (в MapInfo 16 версии это уже штатный функционал, но там и режим отображения окон документов только один – во все окно). Вторым дополнением к пользовательскому интерфейсу, но который обеспечивает непосредственно SmartPanels, является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img3.png]]&lt;br /&gt;
&lt;br /&gt;
Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img4.png]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img7.png]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img9.png]]&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [http://www.mapinfo.ru/product/mapinfo-plugin].  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25927</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25927"/>
		<updated>2018-03-22T07:07:50Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления. В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести еще один или изменить расположение существующих;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&lt;br /&gt;
Предпринимались различные попытки обойти указанные ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MS Access с использованием MapX, динамическое связывание MapInfo и MS Access посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был, но необходимо было быть специалистом в тонкостях создания библиотек DLL, подключения их в MapBasic, вызовам из них внешних подпрограмм и т.п., что, согласитесь, для прикладного программиста MapBasic не является характерным.&lt;br /&gt;
Данная ситуация продолжалось до тех пор, пока не вышла версия MapInfo 9.5, которая была реализована уже на платформе .NET. В соответствующей версии MapBasic была реализована поддержка данной платформы. Но всё равно задача создания и подключения внешних библиотек оставалась нетривиальной.&lt;br /&gt;
Все изменилось с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП, которая является официальным дистрибьютером MapInfo в России и СНГ. С её помощью стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. SmartPanels служит своеобразным посредником между MapInfo и внешним приложением. Для разработки прикладного решения не требуется установленного компилятора MapBasic, все что необходимо - это установленная утилита SmartPanel и среда разработки MS Visual Studio.&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo.&lt;br /&gt;
Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее (в MapInfo 16 версии это уже штатный функционал, но там и режим отображения окон документов только один – во все окно). Вторым дополнением к пользовательскому интерфейсу, но который обеспечивает непосредственно SmartPanels, является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img3.png]]&lt;br /&gt;
&lt;br /&gt;
Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img4.png]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img7.png]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img9.png]]&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [http://www.mapinfo.ru/product/mapinfo-plugin].  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio.&lt;br /&gt;
&lt;br /&gt;
Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img17.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
К сожалению, существует особенность, при которой необходимо перезагружать MapInfo (или SamrtPanels) после установки нового плагина. После перезагрузки в списке установленных плагинов появится новый плагин.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img18.png|700px|||описание]]&lt;br /&gt;
&lt;br /&gt;
Теперь реализуем взаимодействие с MapInfo. В класс  LayoutControl.cs добавим реализацию метода, который будет опрашивать MapInfo на предмет открытых окон и их типа.  Если тип окна «Отчет», то имя окна и его ID будет добавляться в список формы. Для этого будем использовать метод &amp;lt;code&amp;gt;MiHost.MB.GetWindows&amp;lt;/code&amp;gt;, возвращающий коллекцию всех открытых в MapInfo окон. Этот метод может получать в качестве параметра фильтр &amp;lt;code&amp;gt;MbCommands.MiWindowInfo.WindowTypeFilter&amp;lt;/code&amp;gt;, который будет указывать SmartPanels возвращать окна только определенного типа. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void fillList() {&lt;br /&gt;
           listLayout.Items.Clear();&lt;br /&gt;
           foreach (var lw in MiHost.MB.GetWindows(MbCommands.MiWindowInfo.WindowTypeFilter.WIN_LAYOUT)) {&lt;br /&gt;
                 listLayout.Items.Add(string.Format(&amp;quot;{0}#{1}&amp;quot;, lw.WindowID, lw.WindowName));&lt;br /&gt;
            }&lt;br /&gt;
         //Пусть последний элемент списка всегда будет выделенным&lt;br /&gt;
            if (listLayout.Items.Count&amp;gt;0) {&lt;br /&gt;
                listLayout.SelectedIndex = listLayout.Items.Count - 1;&lt;br /&gt;
            }&lt;br /&gt;
        }        &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Хотя SmartPanels и имеет развитый программный интерфейс (API), в большинстве случаев, можно обойтись всего двумя командами - &amp;lt;code&amp;gt;MiHost.MB.EvalCommand&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;MiHost.MB.EvalCommandX&amp;lt;/code&amp;gt;, где X обозначает тип возвращаемого значения (EvalCommandS – для String, EvalCommandI – для Integer и т.п.), первая команда просто выполняет команду, а вторая еще и возвращает полученное значение. На следующем шаге создадим метод, вызываемый при нажатии на кнопку «Клонировать». Данный метод будет определять активный элемент списка и засылать в MapInfo команду на дублирование этого окна.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
        private void btnClone_Click(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (listLayout.SelectedItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                string item = listLayout.SelectedItem.ToString();&lt;br /&gt;
                string idWin = item.Substring(item.IndexOf(&amp;quot;#&amp;quot;)+1);&lt;br /&gt;
                //Засылаем в MI команду на клонирование окна&lt;br /&gt;
                MiHost.MB.EvalCommand(&amp;quot;Run Command WindowInfo(&amp;quot;+idWin+&amp;quot;, 15)&amp;quot;);&lt;br /&gt;
           }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Осталось только определить, как будет обновляться список отчетов. Для этого попросим MapInfo присылать сообщение при открытии или закрытии окон. При получении такого сообщения будем обновлять список отчетов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public LayoutControl()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            //Будем следить за новыми окнами в MI&lt;br /&gt;
            MiHost.AddDocumentWindow += MI_NewWin;&lt;br /&gt;
	     //и за закрытыми окнами в MI&lt;br /&gt;
            MiHost.RemoveDocumentWindow+= MI_RemoveWin;&lt;br /&gt;
        }&lt;br /&gt;
        void MI_NewWin(object sender, EventArgs e) {&lt;br /&gt;
            fillList();&lt;br /&gt;
        }&lt;br /&gt;
        void MI_ RemoveWin(object sender, EventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            fillList();&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
После внесенных изменений класс должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img19.png]]&lt;br /&gt;
&lt;br /&gt;
После сборки решения открываем MapInfo и проверяем результат.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img20.png‎]]&lt;br /&gt;
&lt;br /&gt;
==Заключение==&lt;br /&gt;
&lt;br /&gt;
SmartPanels существенно облегчает жизнь разработчикам приложений MapInfo и позволяет осуществлять проекты любой сложности. Это могут быть как проекты, реализующие конкретные прикладные задачи, так и проекты, расширяющие функциональные возможности MapInfo. В качестве примера последнего можно привести разрабатываемый в настоящий момент плагин, который является аналогом Редактора моделей анализа в QGIS и ModelBuidler в ArcGIS.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img20.png&amp;diff=25926</id>
		<title>Файл:SmartPanels img20.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img20.png&amp;diff=25926"/>
		<updated>2018-03-22T07:00:51Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img19.png&amp;diff=25925</id>
		<title>Файл:SmartPanels img19.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img19.png&amp;diff=25925"/>
		<updated>2018-03-22T06:56:29Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img18.png&amp;diff=25924</id>
		<title>Файл:SmartPanels img18.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img18.png&amp;diff=25924"/>
		<updated>2018-03-22T06:45:48Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img17.png&amp;diff=25923</id>
		<title>Файл:SmartPanels img17.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img17.png&amp;diff=25923"/>
		<updated>2018-03-22T06:28:29Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25921</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25921"/>
		<updated>2018-03-21T15:00:07Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления. В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести еще один или изменить расположение существующих;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&lt;br /&gt;
Предпринимались различные попытки обойти указанные ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MS Access с использованием MapX, динамическое связывание MapInfo и MS Access посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был, но необходимо было быть специалистом в тонкостях создания библиотек DLL, подключения их в MapBasic, вызовам из них внешних подпрограмм и т.п., что, согласитесь, для прикладного программиста MapBasic не является характерным.&lt;br /&gt;
Данная ситуация продолжалось до тех пор, пока не вышла версия MapInfo 9.5, которая была реализована уже на платформе .NET. В соответствующей версии MapBasic была реализована поддержка данной платформы. Но всё равно задача создания и подключения внешних библиотек оставалась нетривиальной.&lt;br /&gt;
Все изменилось с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП, которая является официальным дистрибьютером MapInfo в России и СНГ. С её помощью стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. SmartPanels служит своеобразным посредником между MapInfo и внешним приложением. Для разработки прикладного решения не требуется установленного компилятора MapBasic, все что необходимо - это установленная утилита SmartPanel и среда разработки MS Visual Studio.&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo.&lt;br /&gt;
Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее (в MapInfo 16 версии это уже штатный функционал, но там и режим отображения окон документов только один – во все окно). Вторым дополнением к пользовательскому интерфейсу, но который обеспечивает непосредственно SmartPanels, является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img3.png]]&lt;br /&gt;
&lt;br /&gt;
Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img4.png]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img7.png]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img9.png]]&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [http://www.mapinfo.ru/product/mapinfo-plugin].  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img16.png‎|центр|500]]&lt;br /&gt;
&lt;br /&gt;
На этом основная работа по созданию и регистрации нового плагина выполнена. На этом этапе возможно посмотреть, как будет выглядеть плагин в MapInfo. Для этого необходимо собрать решение:''Сборка – Собрать решение F6'' и дождаться окончания сборки. По умолчанию готовая сборка в виде файла CloneLayout.dll будет находится в каталоге \bin\Debug корневого каталога проекта. Далее необходимо его загрузить в SmartPanels в Mapinfo: меню ''SmartPanels – Настройки – вкладка Плагины - кнопка Добавить''&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img16.png&amp;diff=25920</id>
		<title>Файл:SmartPanels img16.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img16.png&amp;diff=25920"/>
		<updated>2018-03-21T14:54:52Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25919</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25919"/>
		<updated>2018-03-21T14:49:00Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления. В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести еще один или изменить расположение существующих;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&lt;br /&gt;
Предпринимались различные попытки обойти указанные ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MS Access с использованием MapX, динамическое связывание MapInfo и MS Access посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был, но необходимо было быть специалистом в тонкостях создания библиотек DLL, подключения их в MapBasic, вызовам из них внешних подпрограмм и т.п., что, согласитесь, для прикладного программиста MapBasic не является характерным.&lt;br /&gt;
Данная ситуация продолжалось до тех пор, пока не вышла версия MapInfo 9.5, которая была реализована уже на платформе .NET. В соответствующей версии MapBasic была реализована поддержка данной платформы. Но всё равно задача создания и подключения внешних библиотек оставалась нетривиальной.&lt;br /&gt;
Все изменилось с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП, которая является официальным дистрибьютером MapInfo в России и СНГ. С её помощью стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. SmartPanels служит своеобразным посредником между MapInfo и внешним приложением. Для разработки прикладного решения не требуется установленного компилятора MapBasic, все что необходимо - это установленная утилита SmartPanel и среда разработки MS Visual Studio.&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo.&lt;br /&gt;
Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее (в MapInfo 16 версии это уже штатный функционал, но там и режим отображения окон документов только один – во все окно). Вторым дополнением к пользовательскому интерфейсу, но который обеспечивает непосредственно SmartPanels, является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img3.png]]&lt;br /&gt;
&lt;br /&gt;
Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img4.png]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img7.png]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img9.png]]&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [http://www.mapinfo.ru/product/mapinfo-plugin].  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img15.png‎]]&lt;br /&gt;
&lt;br /&gt;
Экранная форма плагина создана. Теперь надо сообщить об этом SmartPanels. В классе CloneLayout.cs необходимо добавить следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Создаем новый объект – панель SmartPanels и его идентификатор&lt;br /&gt;
// Guid необходимо сформировать с помощью меню Средства-Создать GUID&lt;br /&gt;
MiDockPanel pnl = null;&lt;br /&gt;
Guid pnlID = new Guid(&amp;quot;{77BCA491-65DA-4C40-A1AE-B792C77DFDAC}&amp;quot;);&lt;br /&gt;
//Заменияем public List&amp;lt;Guid&amp;gt; RestoredPanels{get{return null;}} на&lt;br /&gt;
public List&amp;lt;Guid&amp;gt; RestoredPanels&lt;br /&gt;
 { &lt;br /&gt;
  get&lt;br /&gt;
  {List&amp;lt;Guid&amp;gt; l = new List&amp;lt;Guid&amp;gt;();&lt;br /&gt;
   l.Add(pnlID);&lt;br /&gt;
   return l;}&lt;br /&gt;
  }&lt;br /&gt;
//Реализовываем метод Init(), который вызывается при инициализации плагина&lt;br /&gt;
public void Init()&lt;br /&gt;
   {&lt;br /&gt;
 //Событие MiHost.Inited вызывается после инициализации всех плагинов.&lt;br /&gt;
 MiHost.Inited += MiHost_Inited;&lt;br /&gt;
 //Добавляем панель &lt;br /&gt;
 pnl = MiHost.AddDockPanel(&amp;quot;Клонирование отчета&amp;quot;, pnlID);&lt;br /&gt;
 //Создаем экземпляр нашего элемента управления&lt;br /&gt;
 LayoutControl ctrl = new LayoutControl();&lt;br /&gt;
 ctrl.Dock = DockStyle.Fill;&lt;br /&gt;
 //Созданная панель должна иметь вид нашего элемента управления		       	  &lt;br /&gt;
 pnl.Controls.Add(ctrl);&lt;br /&gt;
 }&lt;br /&gt;
 //Добавляем метод Init(), который будет выполняться при инициализации плагина&lt;br /&gt;
 //Подробное описание команд см. Документацию	&lt;br /&gt;
 void MiHost_Inited(object sender, EventArgs e)&lt;br /&gt;
 {try&lt;br /&gt;
       {&lt;br /&gt;
        MiHost.AddPanelToMenu(&amp;quot;Клонирование отчета&amp;quot;,SPNet.MbCommands.MenuItemShortcut&lt;br /&gt;
        .CreateShortcut(SPNet.MbCommands.MenuItemShortcut.ModifierKey.Ctrl,(byte)'T'), &amp;quot;Клонирование отчета&amp;quot;,pnl);&lt;br /&gt;
        }&lt;br /&gt;
      catch (Exception except)&lt;br /&gt;
   	{ MessageBox.Show(MiHost.MainHandle,&lt;br /&gt;
         &amp;quot;Произошла ошибка при инициализации плагина:&amp;quot; + except.Message,&lt;br /&gt;
         &amp;quot;Клонирование отчета&amp;quot;,&lt;br /&gt;
         MessageBoxButtons.OK,&lt;br /&gt;
         MessageBoxIcon.Error);&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сделанных изменения класс CloneLayout.cs должен выглядеть следующим образом:&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img15.png&amp;diff=25918</id>
		<title>Файл:SmartPanels img15.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img15.png&amp;diff=25918"/>
		<updated>2018-03-21T14:37:18Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: Wasposa загружена новая версия «Файл:SmartPanels img15.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img15.png&amp;diff=25917</id>
		<title>Файл:SmartPanels img15.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img15.png&amp;diff=25917"/>
		<updated>2018-03-21T14:36:23Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25916</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25916"/>
		<updated>2018-03-21T14:31:16Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления. В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести еще один или изменить расположение существующих;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&lt;br /&gt;
Предпринимались различные попытки обойти указанные ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MS Access с использованием MapX, динамическое связывание MapInfo и MS Access посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был, но необходимо было быть специалистом в тонкостях создания библиотек DLL, подключения их в MapBasic, вызовам из них внешних подпрограмм и т.п., что, согласитесь, для прикладного программиста MapBasic не является характерным.&lt;br /&gt;
Данная ситуация продолжалось до тех пор, пока не вышла версия MapInfo 9.5, которая была реализована уже на платформе .NET. В соответствующей версии MapBasic была реализована поддержка данной платформы. Но всё равно задача создания и подключения внешних библиотек оставалась нетривиальной.&lt;br /&gt;
Все изменилось с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП, которая является официальным дистрибьютером MapInfo в России и СНГ. С её помощью стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. SmartPanels служит своеобразным посредником между MapInfo и внешним приложением. Для разработки прикладного решения не требуется установленного компилятора MapBasic, все что необходимо - это установленная утилита SmartPanel и среда разработки MS Visual Studio.&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo.&lt;br /&gt;
Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее (в MapInfo 16 версии это уже штатный функционал, но там и режим отображения окон документов только один – во все окно). Вторым дополнением к пользовательскому интерфейсу, но который обеспечивает непосредственно SmartPanels, является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img3.png]]&lt;br /&gt;
&lt;br /&gt;
Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img4.png]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img7.png]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img9.png]]&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [http://www.mapinfo.ru/product/mapinfo-plugin].  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community [https://www.visualstudio.com/ru/downloads]. После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img11.png‎]]&lt;br /&gt;
&lt;br /&gt;
После установки MS VisualStudio можно приступать непосредственно к созданию нашего проекта: Файл – Проект – Cоздать – Библиотека классов (.NET Framework)&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img12.png‎]]&lt;br /&gt;
&lt;br /&gt;
В созданном проекте нужно указать ссылку на библиотеку SmarPanels.dll. Данная библиотека находится в корневом каталоге установки SmartPanel. Если при установке утилиты были использованы настройки по умолчанию, то эта библиотека будет находится в каталоге C:\Program Files\ESTI MAP\SmartPanels. Для создания ссылки необходимо в панели «Обозреватель решения» вызвать диалог добавления ссылки путем нажатия правой клавиши мыши на пункте «Ссылки» и далее «Добавить ссылку…». После инициализации проекта был создан класс по умолчанию Class1. Название класса можно оставить без изменений, а можно переименовать, но в любом случае этот класс должен реализовывать интерфейс SPNet.IMiPlugin. Это и есть предопределенный шаблон плагина. В контексте этого интерфейса наш класс должен реализовывать пять свойств и три метода. &lt;br /&gt;
*PluginName - название плагина, которое будет отображаться в списке установленных плагинов.&lt;br /&gt;
*PluginDescription - описание плагина.&lt;br /&gt;
*PluginUID – глобально уникальный идентификатор плагина.&lt;br /&gt;
*PluginVersion - версия плагина.&lt;br /&gt;
*RestoredPanels - список панелей, местоположение которых SmartPanels будет автоматически&lt;br /&gt;
*сохранять и восстанавливать при запуске.&lt;br /&gt;
*Методы:&lt;br /&gt;
*Init - производит инициализацию плагина.&lt;br /&gt;
*LoadPluginSettings - загружает состояние плагина.&lt;br /&gt;
*Dispose - освобождение используемых ресурсов при завершении приложения.&lt;br /&gt;
Для краткости не будем здесь приводить подробное описание этих свойств и методов. В состав дистрибутива SamrtPanel входит полная документация разработчика, где все подробно описано. Для генерации PluginUID можно воспользоваться соответствующим пунктом меню VisualStudio:'' Средства  -  Создать GUID ''. В конечном итоге проект должен выглядеть аналогично снимку ниже. &lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img13.png‎]]&lt;br /&gt;
&lt;br /&gt;
На данном этапе плагин создан и готов к добавлению в SmartPanels, но он еще не имеет визуального представления. Добавим в проект панель для размещения на ней элементов управления:'' Проект – Добавить пользовательский элемент управления… ''. В качестве имени задайте LayoutControl.cs. На созданном элементе управления разместите группирующую панель (Panel в разделе Контейнеры панели Элементы управления), элемент управления «ListBox» и две кнопки. (раздел Стандартные элементы управления). Новый элемент управления должен выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img14.png‎]]&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img13.png&amp;diff=25915</id>
		<title>Файл:SmartPanels img13.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img13.png&amp;diff=25915"/>
		<updated>2018-03-21T14:21:56Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img12.png&amp;diff=25914</id>
		<title>Файл:SmartPanels img12.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img12.png&amp;diff=25914"/>
		<updated>2018-03-21T14:15:14Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img11.png&amp;diff=25913</id>
		<title>Файл:SmartPanels img11.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img11.png&amp;diff=25913"/>
		<updated>2018-03-21T14:13:16Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25912</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25912"/>
		<updated>2018-03-21T14:07:52Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Пример создания плагина для SmartPanel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления. В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести еще один или изменить расположение существующих;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&lt;br /&gt;
Предпринимались различные попытки обойти указанные ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MS Access с использованием MapX, динамическое связывание MapInfo и MS Access посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был, но необходимо было быть специалистом в тонкостях создания библиотек DLL, подключения их в MapBasic, вызовам из них внешних подпрограмм и т.п., что, согласитесь, для прикладного программиста MapBasic не является характерным.&lt;br /&gt;
Данная ситуация продолжалось до тех пор, пока не вышла версия MapInfo 9.5, которая была реализована уже на платформе .NET. В соответствующей версии MapBasic была реализована поддержка данной платформы. Но всё равно задача создания и подключения внешних библиотек оставалась нетривиальной.&lt;br /&gt;
Все изменилось с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП, которая является официальным дистрибьютером MapInfo в России и СНГ. С её помощью стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. SmartPanels служит своеобразным посредником между MapInfo и внешним приложением. Для разработки прикладного решения не требуется установленного компилятора MapBasic, все что необходимо - это установленная утилита SmartPanel и среда разработки MS Visual Studio.&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo.&lt;br /&gt;
Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее (в MapInfo 16 версии это уже штатный функционал, но там и режим отображения окон документов только один – во все окно). Вторым дополнением к пользовательскому интерфейсу, но который обеспечивает непосредственно SmartPanels, является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img3.png]]&lt;br /&gt;
&lt;br /&gt;
Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img4.png]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img7.png]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img9.png]]&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;br /&gt;
Особый интерес, конечно же, представляет возможность создания собственных плагинов. В качестве примера рассмотрим создание приложения, которое будет не просто приветствовать этот мир, но реализовать полезную функцию – клонировать окно отчета. В стандартном MapIinfo такая возможность отсутствует, в отличие от окна карты.&lt;br /&gt;
Для начала необходимо скачать и установить SmartPanel. Утилита является абсолютно бесплатной и скачать ее можно по ссылке [http://www.mapinfo.ru/product/mapinfo-plugin].  В терминах SmartPanel все подключаемые пользовательские приложения носят названия плагинов. В качестве примеров вместе с самой утилитой распространяются также бесплатные плагины – «Вкладки» и  «Расширенная панель информации». Подробное описание этих плагинов можно найти по той же ссылке.&lt;br /&gt;
После установки в основном меню MapInfo появится новый пункт – SmartPanel.  Данный пункт содержит два элемента: Настройки и Панели. Пункт «Настройки»  предназначен для основных действий с плагинами – их настройка, удаление и добавление в SmartPanel. Второй пункт просто отображает список всех зарегистрированных панелей и позволяет  их скрывать и отображать.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img10.png‎]]&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для добавления своего собственного плагина. Для его создания необходимо установить MS Visual Studio. Вполне подойдет и бесплатная версия этой IDE – Community (https://www.visualstudio.com/ru/downloads). После запуска загрузчика рекомендуется выбрать пункт «Разработка классических приложений .NET»&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img10.png&amp;diff=25911</id>
		<title>Файл:SmartPanels img10.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img10.png&amp;diff=25911"/>
		<updated>2018-03-21T14:05:04Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25910</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25910"/>
		<updated>2018-03-21T13:57:54Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Примеры реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления. В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести еще один или изменить расположение существующих;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&lt;br /&gt;
Предпринимались различные попытки обойти указанные ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MS Access с использованием MapX, динамическое связывание MapInfo и MS Access посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был, но необходимо было быть специалистом в тонкостях создания библиотек DLL, подключения их в MapBasic, вызовам из них внешних подпрограмм и т.п., что, согласитесь, для прикладного программиста MapBasic не является характерным.&lt;br /&gt;
Данная ситуация продолжалось до тех пор, пока не вышла версия MapInfo 9.5, которая была реализована уже на платформе .NET. В соответствующей версии MapBasic была реализована поддержка данной платформы. Но всё равно задача создания и подключения внешних библиотек оставалась нетривиальной.&lt;br /&gt;
Все изменилось с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП, которая является официальным дистрибьютером MapInfo в России и СНГ. С её помощью стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. SmartPanels служит своеобразным посредником между MapInfo и внешним приложением. Для разработки прикладного решения не требуется установленного компилятора MapBasic, все что необходимо - это установленная утилита SmartPanel и среда разработки MS Visual Studio.&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo.&lt;br /&gt;
Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее (в MapInfo 16 версии это уже штатный функционал, но там и режим отображения окон документов только один – во все окно). Вторым дополнением к пользовательскому интерфейсу, но который обеспечивает непосредственно SmartPanels, является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img3.png]]&lt;br /&gt;
&lt;br /&gt;
Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img4.png]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img7.png]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img9.png]]&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25909</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25909"/>
		<updated>2018-03-21T13:57:25Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: /* Примеры реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления. В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести еще один или изменить расположение существующих;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&lt;br /&gt;
Предпринимались различные попытки обойти указанные ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MS Access с использованием MapX, динамическое связывание MapInfo и MS Access посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был, но необходимо было быть специалистом в тонкостях создания библиотек DLL, подключения их в MapBasic, вызовам из них внешних подпрограмм и т.п., что, согласитесь, для прикладного программиста MapBasic не является характерным.&lt;br /&gt;
Данная ситуация продолжалось до тех пор, пока не вышла версия MapInfo 9.5, которая была реализована уже на платформе .NET. В соответствующей версии MapBasic была реализована поддержка данной платформы. Но всё равно задача создания и подключения внешних библиотек оставалась нетривиальной.&lt;br /&gt;
Все изменилось с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП, которая является официальным дистрибьютером MapInfo в России и СНГ. С её помощью стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. SmartPanels служит своеобразным посредником между MapInfo и внешним приложением. Для разработки прикладного решения не требуется установленного компилятора MapBasic, все что необходимо - это установленная утилита SmartPanel и среда разработки MS Visual Studio.&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo.&lt;br /&gt;
Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее (в MapInfo 16 версии это уже штатный функционал, но там и режим отображения окон документов только один – во все окно). Вторым дополнением к пользовательскому интерфейсу, но который обеспечивает непосредственно SmartPanels, является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img3.png]]&lt;br /&gt;
&lt;br /&gt;
Остальные два плагина были созданы под конкретные проекты. Первый из них предназначен для отображения данных переписи населения.&lt;br /&gt;
Задача состояла в представлении данных переписи населения в различных разрезах. В MapInfo имелся слой с населенными пунктами и имелась база данных с результатами переписи. Плагин выполняет две основные задачи:&lt;br /&gt;
*получает от MapInfo уникальный код населенного пункта (код ОКАТО), осуществлял выборку данных из БД их интерпретацию и представление. &lt;br /&gt;
*передает MapInfo команду на позиционирование окна карты в центре с выбранным пользователем в иерархическом списке населенным пунктом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img4.png]]&lt;br /&gt;
&lt;br /&gt;
При использовании специального инструмента «Информация» при выборе населенного пункта на карте происходит отображение информации в различных разрезах&lt;br /&gt;
[[Файл:SmartPanels_img5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img7.png]]&lt;br /&gt;
&lt;br /&gt;
И еще один пример. В данном случае был разработан плагин для отображения панорам Yandex  и Google при выборе точки на карте и использования поискового сервиса Yandex.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img8.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img9.png]]&lt;br /&gt;
&lt;br /&gt;
==Пример создания плагина для SmartPanel==&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img9.png&amp;diff=25908</id>
		<title>Файл:SmartPanels img9.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img9.png&amp;diff=25908"/>
		<updated>2018-03-21T13:53:16Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img8.png&amp;diff=25907</id>
		<title>Файл:SmartPanels img8.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img8.png&amp;diff=25907"/>
		<updated>2018-03-21T13:53:07Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img7.png&amp;diff=25906</id>
		<title>Файл:SmartPanels img7.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img7.png&amp;diff=25906"/>
		<updated>2018-03-21T13:49:15Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img6.png&amp;diff=25905</id>
		<title>Файл:SmartPanels img6.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img6.png&amp;diff=25905"/>
		<updated>2018-03-21T13:49:05Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img5.png&amp;diff=25904</id>
		<title>Файл:SmartPanels img5.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img5.png&amp;diff=25904"/>
		<updated>2018-03-21T13:45:47Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img4.png&amp;diff=25903</id>
		<title>Файл:SmartPanels img4.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img4.png&amp;diff=25903"/>
		<updated>2018-03-21T13:43:47Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img3.png&amp;diff=25902</id>
		<title>Файл:SmartPanels img3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SmartPanels_img3.png&amp;diff=25902"/>
		<updated>2018-03-21T13:36:24Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25901</id>
		<title>Расширение функциональности MapInfo на основе SmartPanels</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_MapInfo_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_SmartPanels&amp;diff=25901"/>
		<updated>2018-03-21T13:32:59Z</updated>

		<summary type="html">&lt;p&gt;Wasposa: Новая страница: «{{Статья|Черновик}} {{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позв…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.}}&lt;br /&gt;
==Описание==&lt;br /&gt;
В данной статье речь пойдет об утилите SmartPanels для MapInfo, позволяющей достаточно просто интегрировать в MapInfo пользовательские специализированные приложения или приложения, расширяющие функциональность MapInfo.&lt;br /&gt;
MapInfo имеет штатный язык программирования MapBasic, который позволяет автоматизировать практически все операции MapInfo. Всем хорош MapBasic, пока дело не доходит до создания с его помощью достаточно развитого пользовательского интерфейса. Тут возникает сразу несколько проблем:&lt;br /&gt;
* большая трудоемкость при создании и размещении элементов управления. В качестве примера можно привести ситуацию, когда в уже созданный диалог с большим количеством элементов управления нужно внести еще один или изменить расположение существующих;&lt;br /&gt;
* невозможность создавать немодальные окна;&lt;br /&gt;
* ограниченный набор элементов управления состоящий всего из 15 элементов.&lt;br /&gt;
С другой стороны, существует достаточно широкий класс задач, где развитой пользовательский интерфейс просто необходим. В качестве характерного примера можно привести тот же кадастровый учет, в котором необходимо отображать большое количество разнообразной информации, привязанной к одному участку.&lt;br /&gt;
Предпринимались различные попытки обойти указанные ограничения MapBasic. К ним можно отнести создание визуальных редакторов диалогов (своеобразные IDE), реализация функционала MapInfo в среде MS Access с использованием MapX, динамическое связывание MapInfo и MS Access посредством механизма DDE и т.п. Но какого-то универсального инструмента не существовало. Точнее он был, но необходимо было быть специалистом в тонкостях создания библиотек DLL, подключения их в MapBasic, вызовам из них внешних подпрограмм и т.п., что, согласитесь, для прикладного программиста MapBasic не является характерным.&lt;br /&gt;
Данная ситуация продолжалось до тех пор, пока не вышла версия MapInfo 9.5, которая была реализована уже на платформе .NET. В соответствующей версии MapBasic была реализована поддержка данной платформы. Но всё равно задача создания и подключения внешних библиотек оставалась нетривиальной.&lt;br /&gt;
Все изменилось с выходом утилиты SmartPanels, разработанной специалистами компании ЭСТИ МАП, которая является официальным дистрибьютером MapInfo в России и СНГ. С её помощью стало возможным быстро подключать (регистрировать) к MapInfo пользовательские приложения, созданные на любом из языков семейства .NET. SmartPanels служит своеобразным посредником между MapInfo и внешним приложением. Для разработки прикладного решения не требуется установленного компилятора MapBasic, все что необходимо - это установленная утилита SmartPanel и среда разработки MS Visual Studio.&lt;br /&gt;
==Примеры реализации==&lt;br /&gt;
Для наглядного представления о том, что представляет из себя SmartPanels, приведем примеры четырех плагинов. Первые два поставляются в качестве примеров вместе со SmartPanels и представляет собой плагины общего назначения, т.е. расширяющие стандартные возможности MapInfo.&lt;br /&gt;
Первый из них - «Вкладки» вносит полезное дополнение к пользовательскому интерфейсу MapInfo. Так при развернутых окнах, в верхней части окон появляются вкладки с именами документов и переключения между ними становится намного удобнее (в MapInfo 16 версии это уже штатный функционал, но там и режим отображения окон документов только один – во все окно). Вторым дополнением к пользовательскому интерфейсу, но который обеспечивает непосредственно SmartPanels, является возможность «прикреплять» панели к одной из сторон окна MapInfo с помощью соответствующих инструментов, отображающихся при перемещении панелей. Если ко одной стороне будет прикреплено несколько панелей, то они также будут отображаться в виде вкладок.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img1.png]]&lt;br /&gt;
&lt;br /&gt;
Второй плагин – «Информация». Его задачей является отображение и редактирование информации по выбранному объекту в настраиваемой пользователем форме. При первом запуске он ничем не отличается от стандартного окна информации MapInfo.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SmartPanels_img2.png]]&lt;br /&gt;
&lt;br /&gt;
Но вызвав с помощью правой клавиши мыши контекстное меню, можно открыть визуальный редактор экранной формы и настроить представление информации в соответствии со своими потребностями.&lt;br /&gt;
Кроме этого он позволяет определять для полей списки предопределенных значений, т.е. определять словари.  Причем эти списки можно создавать как непосредственно в дизайнере форм, так и в обычных таблицах MapInfo или таблицах базы данных, указывая при этом ссылку на них в дизайнере форм. Это значительно ускоряет ввод и редактирование данных, помогая избежать многих ошибок.&lt;/div&gt;</summary>
		<author><name>Wasposa</name></author>
	</entry>
</feed>