Плагин "Измерение длины кривых"

    В этом уроке мы попробуем создать самый простой и самый на мой взгляд нужный и так нехватающий корелу плагин измеряющий длину кривых. Возможно для дизайнеров это абсолютно ненужная функция, в то время людям, использующим Corel для всевозможных технических целей это очень необходимая функция. Заметьте, не нужны никакие сторонние программы, не нужно будет ничего качать, любой даже незнакомый с программированием человек сможет быстро и легко решить для себя эту непростую на первый взгляд задачу.

     Используя свойство кривой "Length", можно увидеть длину кривой не прибегая ни к каким программным ухищрениям. Удивительно, почему такая характеристика кривой как длина, не вынесена в окно свойств самого корела. Видимо оставлено для  "новшеств" будущих версий. Итак создаем новую функцию, назовем ее например MyLength:

Sub MyLength()

End Sub

     Далее используя свойство кривой Length, выведем информационное окно со значением длины выделенной кривой:

Sub MyLength()
 Dim S As Shape
 Dim Ln As Double
Set S = ActiveShape 'присваиваем переменной S все свойства выделенной кривой
Ln = S.Curve.Length 'считываем значение длины кривой
MsgBox Ln           'выводим значение длины с помощью информационного сообщения
End Sub

    Самый простой вариант плагина по определению длины кривой готов. Теперь самое время проверить наш код в действии. Рисуем любой векторный элемент, обязательно конвертируя его в кривую ("convert To Curves" Ctrl+Q) для кореловских примитивов таких как элипс, прямоугольник, полигон. Затем открываем дерево плагинов Tools/Macros/MacroManager (Alt+Shift+F11), находим название нашего проекта, в нем текущий модуль в котором будут все функции которые мы создаем, в том числе MyLength. Запуская его мы видем числовое значение равное длине выделеной кривой.

     Но выделять каждый раз по одной кривой довольно неудобно и мы хотим, чтоб наш плагин выводил значение всех выделенных кривых. Для этого используем цикл, в котором перебираем все наши кривые, а в переменную суммируем все эти значения. Также предварительно конвертируем на всякий случай все наши элементы в кривые и делаем разгруппировку выделения. А группируя все наши действия и сделав отмену в конце, после получения значения длины всех элементов, возвращаем все сделанные конвертации и разгруппировки к первоначальному состоянию. Получаем готовый плагин:

Public Sub MyLength()

ActiveDocument.Unit = cdrMillimeter  'Указываем по-умолчанию единицу измерения
ActiveDocument.BeginCommandGroup     'Указываем что отсюда начинается группа программного кода, которая отменяется одним нажатием "отмена"
ActiveSelectionRange.UngroupAll      'Разгруппировываем выделенные объекты, если таковые есть
ActiveSelectionRange.ConvertToCurves 'Конвертируем все элементы в кривые, т.к. свойсто длины доступно только для кривых
 
 Dim S As Shape
 Dim Ln As Double
 
 For Each S In ActiveSelectionRange
  Ln = Ln + S.Curve.Length
 Next
 
ActiveDocument.EndCommandGroup      'Указываем что здесь заказчивается группа наших действий
ActiveDocument.Undo                 'Так как значение суммарной длины уже хранится в переменной Ln, отменяем все сделанные изменения с кривыми до их первоначального состояния

MsgBox Ln & " мм", , "Длина кривых" 'Выводим значение суммарной длины всех выделенных элементов.

End Sub

     Следует учитывать, что получим ошибку при вычислении длины кривых таких объектов которые нельзя преобразовать в кривые, например, растровые изображения, тени.