Урок 12. Открытая архитектура Spotlight
Декоративная ручка дверная скоба для ванной mandelli.
На этом уроке Вы познакомитесь с возможностью создания программ, использующих открытую архитектуру Spotlight 7.0, а также приобретете основные навыки работы с входящим в программу Мастером ActiveX.
Spotlight обладает полностью открытой архитектурой, построенной на основе технологии ActiveX. Spotlight, выступая в качестве платформы для разработки ваших собственных приложений, позволяет создавать программы практически неограниченной сложности, разрабатывая их при помощи встроенного редактора кода, поддерживающего языки JavaScript и VisualBasic Script. Таким образом, многие необходимые пользователям возможности и инструменты теперь могут быть реализованы при помощи открытой архитектуры программы.
В качестве примера, иллюстрирующего некоторые возможности открытой архитектуры Spotlight, разработаем простое приложение, приводящие к ортогональному виду выбранные растровые и векторные отрезки, отклоняющиеся от ортогонального направления на угол, не превышающий заданный.
В качестве языка разработки в данном случае используется JavaScript.
Наберите следующую заготовку для программы:
01 var Accuracy=10; // Предельный угол отклонения - ±10°
02 SetOrtho (Accuracy); // Вызов функции с параметром
03 function SetOrtho (Accuracy) { // Функция SetOrtho
04 }
05 function RadToDeg (Angle) { return ((180/3.1416)*Angle); }
06 function DegToRad (Angle) { return ((3.1416/180)*Angle); }
В строке 01 мы определили переменную Accuracy, содержащую предельный угол отклонения отрезков, которые должны быть ортогонализированы.
Строки 02 и 03 содержат соответственно вызов и описание функции SetOrtho, которая будет выполнять необходимые действия. Аргументом функции является определенная выше переменная Accuracy.
Строка 05 содержит описание вспомогательной функции RadToDeg, преобразующей передаваемый ей через аргумент Angle числовое значение угла из радиан в градусы.
Строка 06 содержит вспомогательную функцию DegTpRad, производящую обратное преобразование – из градусов в радианы.
Приступим к формированию функции SetOrtho. Поскольку основное действие функции – это произведение некоторых действий над выбранными объектами, то нам прежде всего необходимо получить данные о наборе выбранных объектов:
var Selection = Document.Selection;
После выполнения данного кода объявленная переменная Selection будет содержать данные о выбранных объектах. Если выбранных данных нет, то дальнейшее выполнение программы не имеет смысла, поэтому предусмотрим такую ситуацию:
if (Selection.Count == 0) Command.Quit();
Если же выбранные данные есть, нам необходимо обработать каждый из выбранных объектов. Удобнее всего это сделать при помощи оператора цикла:
for (var count=1; count<=Selection.Count; count++) {
// Обработка объекта Selection(count)
}
Поскольку приведение к ортогональному направлению имеет смысл только для отрезков, то первым оператором в цикле будет проверка соответствия типа выбранного объекта (Selection(count).EntityType) типу «отрезок» (eLine) и цикл приобретет следующий вид:
for (var count=1; count<=Selection.Count; count++) {
if (Selection(count).EntityType == eLine) {
// Обработка отрезка Selection(count)
}
}
Таким образом, программа к текущему моменту уже имеет следующий вид:
01 var Accuracy=10; // Предельный угол отклонения - ±10°
02 SetOrtho (Accuracy); // Вызов функции с параметром
03 function SetOrtho (Accuracy) { // Функция SetOrtho
04 var Selection = Document.Selection;
05 if (Selection.Count == 0) Command.Quit();
06 for (var count=1; count<=Selection.Count; count++) {
07 if (Selection(count).EntityType == eLine) {
08 // Обработка отрезка Selection(count)
09 }
10 }
11 }
12 function RadToDeg (Angle) { return ((180/3.1416)*Angle); }
13 function DegToRad (Angle) { return ((3.1416/180)*Angle); }
Первой строкой кода, обрабатывающего отрезок, являются запрос угла наклона текущего отрезка, его перевод из радиан в градусы и сохранение данного значения в переменной:
Angle=RadToDeg(Selection(count).Angle);
Прежде чем приступить непосредственно к написанию кода для обработки (ортогонализации) отрезка, составим простую таблицу, иллюстрирующую работу алгоритма ортогонализации:
| ЕСЛИ угол отрезка | БОЛЬШЕ И МЕНЬШЕ | ТО новый угол равен | |
| 0° - Accuracy | 0° + Accuracy | 0° | |
| 90° - Accuracy | 90° + Accuracy | 90° | |
| 180° - Accuracy | 180° + Accuracy | 180° | |
| 270° - Accuracy | 270° + Accuracy | 270° | |
Запишем эти правила на JavaScript:
if (Angle>(0-Accuracy) && Angle<(0+Accuracy)) Angle=0;
if (Angle>(90-Accuracy) && Angle<(90+Accuracy)) Angle=90;
if (Angle>(180-Accuracy) && Angle<(180+Accuracy)) Angle=180;
if (Angle>(270-Accuracy) && Angle<(270+Accuracy)) Angle=270;
Теперь в переменной Angle хранится откорректированное значение угла наклона, и единственное, что нам остается – это присвоить данное значение текущему отрезку из набора Selection, предварив его обратным преобразованием угла из градусов в радианы:
Selection(count).Angle=DegToRad(Angle);
Таким образом, окончательный вариант программы имеет следующий вид:
01 var Accuracy=10; // Предельный угол отклонения - ±10°
02 SetOrtho (Accuracy); // Вызов функции с параметром
03 function SetOrtho (Accuracy) { // Функция SetOrtho
04 var Selection = Document.Selection;
05 if (Selection.Count == 0) Command.Quit();
06 for (var count=1; count<=Selection.Count; count++) {
07 if (Selection(count).EntityType == eLine) {
08 // Обработка отрезка Selection(count)
08 Angle=RadToDeg(Selection(count).Angle);
08 if (Angle>(0-Accuracy) && Angle<(0+Accuracy)) Angle=0;
08 if (Angle>(90-Accuracy) && Angle<(90+Accuracy)) Angle=90;
08 if (Angle>(180-Accuracy) && Angle<(180+Accuracy)) Angle=180;
08 if (Angle>(270-Accuracy) && Angle<(270+Accuracy)) Angle=270;
10 Selection(count).Angle=DegToRad(Angle);
09 }
10 }
11 }
12 function RadToDeg (Angle) { return ((180/3.1416)*Angle); }
13 function DegToRad (Angle) { return ((3.1416/180)*Angle); }
Нажмите кнопку [Сохранить] и сохраните программу под любым именем с расширением .js (например, Ortho.js). Создадим теперь собственную кнопку для только что написанного инструмента ортогонализации.
• Выберите команду Настройка интерфейса из меню Средства.
• Находясь на закладке Панели инструментов, нажмите кнопку [Создать] и создайте панель инструментов с желаемым именем (например, Мои инструменты).

• Перейдите на закладку Команды диалогового окна Настройка.
• Переместите на созданную панель инструментов иконку с изображением молотка, расположенную в нижней левой части диалогового окна Настройка.
• Нажмите кнопку [Закрыть] и закройте диалоговое окно Настройка.
• Щелкните левой кнопкой мыши на добавленной на панель инструментов иконке.
• В открывшемся диалоговом окне Редактировать кнопку:
• Нажмите кнопку
• Выберите одну из стандартных или нарисуйте собственную кнопку для вызова написанной программы.

• Нажмите [OK].
Проверим работу созданной программы. Выберите команду Открыть меню Файл и откройте файл sample_1.cws из папки Lesson_12.
• Установите следующие параметры выбора на панели инструментов Выбор:
• тип выбираемых данных – Гибридный выбор;
• режим выбора – Выбрать объекты секущей линией;
• способ выбора – Добавить.

• Выберите растровые и векторные объекты при помощи секущей линии так, как это показано на рисунке справа.
• Нажмите кнопку, которую Вы определили для запуска программы. Оцените результат ее действия.

![]() |
![]() |
| Выбранные растровые и векторные отрезки | После отработки команды |
Добавление интерактивности
В настоящее время написанная нами программа работает с фиксированным значением переменной Accuracy, и для того чтобы изменить это значениt, каждый раз необходимо производить редактирование исходного кода.
Замените первую строчку программы на следующий программный код и сохраните программу под старым именем:
var Accuracy = Prompt("Максимальный угол отклонения объектов от ортогонального направления:","Ортогонализация", 10)
В результате сделанных изменений мы получим возможность вводить желаемое значение предельного отклонения каждый раз при запуске программы, и, таким образом, производить тонкую настройку созданного нами инструмента в каждом конкретном случае.


