Corel Draw: докер - первые шаги

Corel Draw: докер - первые шаги

Corel Draw: докер - первые шаги
Corel Draw: докер - первые шаги
23/3/2024
Как взаимодействует докер с VBA Corel Draw. Создание вывода сообщения в рабочую область.
Предыдущая статья: как создать докер.
Для работы нам понадобится текстовый редактор + Script редактор самого Корела.Сперва избавимся от неправильного фона. В папке скрипта, расположенной C:\Program Files\Corel\CorelDRAW Graphics .....\Programs64\Addons\myScripts есть html файл нашего докера. В моем случае myScripts.html. Открываем его в текстовом редакторе.
Поменяем фон на следующий, добавив в раздел style новый стиль.
<style type="text/css">

........

p, div, button {background:ButtonFace;}
</style>
Сделаем его сразу и для кнопок. После сохранения файла нужно щелкнуть по докеру правой кнопкой мыши и нажать обновить.
Теперь добавим первую кнопку в докер и уберем не нужную строку.
<body topmargin="0" leftmargin="0" bgcolor="#000000">

<button>Проверка</button>

</body>
</html>
Но кнопке нужно событие на Onclick. Добавим простой скрипт.
<body topmargin="0" leftmargin="0" bgcolor="#000000">

<button onclick="tester()">Проверка</button>

<script type="text/javascript">
document.onload=startUP(); // 1

function startUP(){
window.external.Application.InitializeVBA(); // 2 Turn on VBA
}

function tester(){
var doc = window.external.Application;
presetScript = doc.GMSManager.RunMacro("myScripts", "Macros.main"); //3
return presetScript;
}
</script>

</body>
Объясню, что мы сделали.
1 — запустили скрипт, который запускается при открытие докера.
2 — этот скрипт активирует взаимодействие с VBA. Можно выставить это в настройках Корела, но просто сделаем это по умолчанию.
3 — запускаем код, расположенный в VBA. «myScripts» — название главного файла, где искать запускаемую процедуру. «Macros.main» — ищем в модуле Macros процедуру и запускаем ее.
Не торопитесь обновлять докер, чтобы он не выдал ошибку. Перейдем в редактор Script самого Корела. Находится он на вкладке Инструменты. Может быть мне включить русифицированную версию Корела? Сообщите в комментарии.
Найдите наш докер по названию в скобочках и переименуйте его.
В файле html мы его назвали: «myScripts».
Все идет нормально. Открываем модуль Macros и пишем нашу процедуру main. Только не удалите процедуру запуска докера!!
Теперь переходим в окно Корела и обновляем докер. Нажимаем кнопку и вуаля!
Если у вас что-то не заработало и выдает ошибку, то скорее это синтаксическая ошибка. Помните, что javascript, в html который, чувствителен к регистру. для него myscripts и myScripts разные объекты.

Вывод текста в определенное место документа.

Начнем с получения координат куда выводить.

Функция, получения местоположения вывода.

Может быть два варианта получения места вывода (с моей точки зрения 😉).
1 – если ничего не выделено, то вывод справа от листа в активном документе.
2 – если что-то выделено, то вывод справа от выделения.
Но сперва изменим название нашей процедуры вызова на Префлайт(Preflight). Что это — объясню в следующем посте.
<body topmargin="0" leftmargin="0" bgcolor="#000000">

<button onclick="preflight()">Проверка</button>

<script type="text/javascript">
document.onload=startUP(); // 1

function startUP(){
window.external.Application.InitializeVBA(); // 2 Turn on VBA
}

function preflight(){
var doc = window.external.Application;
presetScript = doc.GMSManager.RunMacro("myScripts", "Macros.preflight"); //3
return presetScript;
}
</script>

</body>
</html>
И в редакторе VBA script переименуем процедуру и вставим новый модуль:
Модуль назовем utils
В нем создадим функцию getCoordinates:
Function getCoordinates()


End Function
а в Macros переименуем процедуру и вызовем эту функцию:
Sub preflight()
Dim coords
coords = getCoordinates()

End Sub
Мы будем из этой функции получать область куда выводить текст и присваивать его переменной coords.
Function getCoordinates()
ActiveDocument.Unit = cdrMillimeter
ActiveDocument.ReferencePoint = cdrTopLeft
Dim sr As ShapeRange, X As Double, Y As Double, w As Double, h As Double, cHK As Long
Set sr = ActiveSelectionRange 'получаем выделенные объекты
cHK = checkGuid(sr) 'проверяем, не выделена ли случайно направляющая, так как у нее нет начала и конца
If cHK > 0 Then
sr.GetPosition X, Y 'если есть выделение, то получаем его позицию
sr.GetSize w, h ' тут получаем размер выделения
Else
ActiveDocument.ActivePage.GetSize w, h ' если нет выделения, то получаем размер активной страницы
X = 0: Y = Y + h ' делаем оступ на странице вправо на все ширину
End If
X = X + w + 20 ' отступаем на 20мм
getCoordinates= X & " " & Y ' возвращаем две величины, разделенные пробелом (можно и массив вернуть, но дайте поизвращаться)

End Function

Function checkGuid(sr As ShapeRange) ' check guidelines
Dim i As Long, cHK As Long
cHK = sr.Count
For i = 1 To sr.Count
If sr.Shapes(i).Type = cdrGuidelineShape Then cHK = 0
Next i
checkGuid = cHK
End Function
Опа! я добавил две функции в модeль utils. Но прокомментировал.
ActiveDocument.Unit = cdrMillimeter устанавливает единицы измерения активного документа в миллиметры по умолчанию.
ActiveDocument.ReferencePoint = cdrTopLeft устанавливает нулевую точку отсчета в верхний левый угол листа докуметна.
Кстати, из процедуры Sub вернуть данные нельзя, только из Function.

Функция, вывода текста.

Тепрь создадим еще модуль text.
В него будем записывать текстовые функции. Чтобы потом было проще искать, давать будем функциям префикс text_.
Function text_makeText(text, xx, yy, size, style, align)
Dim sh As Shape, font
font = "Arial" 'выбрать шрифт
Set sh = ActiveLayer.CreateArtisticText(xx, yy, text) ' создать объект текст в нужных координатах
sh.Fill.UniformColor.CMYKAssign 0, 0, 0, 100 ' назначить черную заливку текста
sh.Outline.SetNoOutline ' не надо обводку
sh.text.FontProperties.Name = font ' установить шрифт
If Len(style) > 0 Then sh.text.FontProperties.style = style ' установить стиль
sh.text.AlignProperties.Alignment = align ' установить выравнивание
sh.text.FontProperties.size = size ' установить размер
Set makeTekst = sh ' вернуть объект текста если он нужен
End Function
Не буду я перекрашивать комментарии в зеленый 🙄.
теперь возвращаемся в Macros и переписываем нашу главную процедуру.
Sub preflight()
Dim coords, txt
coords = Split(getCoordinates(), " ")

Call text_makeText("Вот наш первый текст", CDbl(coords(0)), CDbl(coords(1)), 16, cdrNormalFontStyle, cdrLeftAlignment)
End Sub
Получаем координаты вывода и тут же делим их по разделителю на массив. Да! можно сразу массив возвращать, но я хотел показать еще другие функции VBA.
CDbl – преобразует наш текст или число целое в дробное число. Мы передаем координаты вывода в функцию.
cdrNormalFontStyle – выводить, как нормальный текст
16 – размер шрифта
cdrLeftAlignment – выравнивание влево текста.
Вуаля! нажимаем кнопку в Кореле и получаем текст справа от листа, так как ничего не выделено.
Да у редактора Скрипта в Кореле — проблема. Он не печатает на русском. Вам придется печатать в другом редакторе, копировать и вставлять. Это проще, чем заморачиваться с поддержкой русского в Корел VBA.
На этом пока всё. Продолжим в следующем посте.
Комментарии: