Этот раздел собран как рабочая шпаргалка по файлу генератора GBX: как описывать первую строку //params:, какие элементы интерфейса доступны, какие переменные подготавливает докер и какие функции можно использовать для создания объектов CorelDRAW.
Формат первой строки должно начинаться с "//params: " пробел в конце обязательно далее через запятую описываем поля по шаблону имя поля только латиницей т.к. это будет переменной для вставки в код имя поля = значение по умолчанию.
//params: [имя_поля]=[значение_по_умолчанию], ...
true или false — формируют чекбокс (переключатель включено/выключено).text — задаёт простой текстовый заголовок.block — начало раздела интерфейса: заголовок со стрелкой плюс сворачиваемое тело.div — то же тело раздела, но БЕЗ заголовка и без сворачивания. Нужен, когда группу полей надо просто показывать и прятать из кода.Раздел закрывается параметром endblock, началом следующего блока или концом строки.
Начальным состоянием и переключением раздела управляет действие showblock — у него три формы, см. ⚙️ Специальные символы и действия.
list — создаёт выпадающий список. Имена и значения полей описываются ниже с помощью строки//list:имя_списка имя_поля=значение, имя_поля=значение, имя_поля=значение
текстовые подписи для элементов прописываются по аналогии в `//lang:`
пример material=list|show##g/cm3
//list:material g375=11.55, g500=12.7, g585=13.6
//lang: material_g375=Золото 375 проба (9К)
//lang: material_g500=Золото 500 проба (12К)
//lang: material_g585=Золото 585-200 проба (14К)
btn — создаёт кнопку, код которой должен лежать в одноименной папке скрипта с именем параметрапример: параметр my_btn=btn у генератора myscript.js ищет код в gbx/myscript/my_btn.js
для маленького кода код кнопки можно вставить в основной скрипт.
проверка нажатия через условие if (btn=='my_btn')
Сравнение совпадает потому, что имя параметра подставляется и в литерал, и в id кнопки. С кнопкой, которой нет в //params: (например, добавленной через addbtns), так не выйдет — в btn придёт её настоящий id.
//params: knopka1=btn, knopla_sdelaj_ohuenno=btn,sklejka=btn|wide, hideall;
if (btn=="sklejka"){ //это код для иммитации кнопки "собрать"
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/** КРАЙНЕ НЕ РЕКОМЕНДУЮ СБОРКУ ДЕЛАТЬ ТАКИМ СПОСБОМ. используйте стандартные кнопки. **/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
sstop=true; // останавливаем цикл чтобы он не обрабатывал каждый объект а сделал только один раз.
ch_kbx_compens.checked = false; // отключить создание компенсации.
glue_kbx(); // собственно и запускаем функцию сборки
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}else if(btn=="knopka1"){
// тут код внутри скобок
}else if(btn=="knopla_sdelaj_ohuenno"){
// тут код внутри скобок
}else{
// тут весь остальной код внутри скобок
}
Так же можно задать значение текстового поля через val_имя_поля.
Пример. для поля paz_gap=6 можно поменять значение на 4 через val_paz_gap=4.
range — создаёт кнопки вниз - вверх и между ними текстовое поле со значением.параметры задаются в формате |min#4:
min — стартовое (минимальное значение)max — предельное значениеstep — шаг увеличения кнопкамиdef — значение по умолчанию (при первом запуске)dot_size=range|min#1|max#10|def#4|step#2,
folder — создаёт текстовое поле и кнопку для выбора папкиdxf_folder=folder
file — создаёт текстовое поле и кнопку для выбора файлапараметр filter задаёт фильтрацию файлов по типу
dxf_file=file|filter#*.dxf#*.cdr
Вертикальная черта | разделяет альтернативные действия или состояния параметра.
Всё, что идёт после `|`, приводится к НИЖНЕМУ регистру — вместе с аргументами через #. Значит в active#, deactive#, showblock# и filter# можно ссылаться только на параметры, чьи имена целиком строчные: SM=true|deactive#Gor#Vert ищет поля val_gbx_gor и val_gbx_vert, которых нет, и молча ничего не делает. Исключения — btntitle#кнопка#ключ и флаги первой строки вроде useNodes|pFlip: они разбираются из сырой строки и регистр сохраняют.
Специальные действия, которые могут идти через |:
glue — склейка текущего элемента в одну строку с предыдущим.active — активация связанных элементов или параметров по их ID.deactive — деактивация связанных элементов или параметров по их ID.even — проверка значения на чётность.odd — проверка значения на нечётность.mm — отменяет проверку чётности, если установлен чекбокс mm.noscale — не переводить значение из миллиметров в единицы документа. Числовое поле по умолчанию считается через vall(), а тот делит введённое на масштаб документа (WorldScale): поле заполняют в миллиметрах, а генератору нужны единицы. Размерам это и нужно, а количествам, углам, процентам и составляющим цвета — нет: в чертеже с масштабом 1:10 «20 зубьев» превратились бы в 2. Ставится только числовым полям (см. Числа, строки и ловушка нуля), у строковых масштаба нет вовсе. Пример: teeth1=20|noscale, hangle=45|noscale, clapan_angle=45|noscale limit=65 — перед limit=, а не после.un — очень узкий (5%)narrow — узкий (12%)wide — широкий стиль полю ввода (35%)uwide — очень широкая (65%)wide10, wide25, wide30, wide40, wide45, wide50, wide75, wide90 — ширина в процентах прямо в имениmid — средняя ширина (25%)free — без стиля.center — выравнивание по центруleft — выравнивание по левому краюbold — жирное начертание текстаitalic — курсивное начертание текстаnotitle — убирает заголовок у элементаread — делает поле ввода только для чтенияshow — действие для списка - показывает значение в специальном поле.формат |show#prefix#postfix |show## |show##postfix |show#prefix#
check — добавляет чекбокс активности поля. Снятая галочка ГАСИТ поле, и переменная получает false, а не значение. Отсюда три способа спросить:if (!size) // выключено ИЛИ введён ноль
if (size === false) // именно выключено, ноль сюда не попадёт
if (!ch_gbx_size) // сама галочка, у неё своё имя: ch_gbx_<имя_поля>
Ноль от снятой галочки отличается только третьей и второй формой: false в арифметике ведёт себя как ноль (false*2, false+5, false>0 — всё как с нулём), поэтому старые генераторы от этого не ломаются. А вот parseFloat(size) даст NaN вместо нуля, и склейка "H" + size даст "Hfalse" вместо "H0" — если поле идёт в строку или в parse*, пишите (size || 0).
Значение читает getValGBX() — это getVal() плюс проверка на погашенность. Сам getVal() в такой ситуации отдаёт 0, и «галочка снята» неотличимо от «введён ноль»; в остальной панели это не мешает, там галочки проверяют напрямую, поэтому getVal оставлен как был.
showblock — связывает раздел (block/div) с галочкой или радиокнопкой. Форма зависит от того, на чём стоит:имя_блока=block|showblock#поле — начальное состояние раздела при загрузке берётся из сохранённого значения поле; для радиокнопки вариант уточняется третьим ключом: showblock#поле#вариант.
галочка=false|showblock#имя_блока — галочка разворачивает и сворачивает раздел имя_блока.
выбор=вариант1|showblock#имя_блока:вариант2 — то же у радиокнопки, признак ставится на КАЖДЫЙ вариант. По умолчанию раздел открыт на своём варианте, другое условие задаётся третьим ключом: showblock#имя_блока#вариант.
btntitle#кнопка#ключ — только для галочки: пока она стоит, кнопка называется по второму ключу словаря, иначе по своему. Имена берутся как написаны, с регистром. Пример: pQtySplit=false|btntitle#pSplit#pSplitQty — кнопка pSplit покажет lang['gbx_pSplitQty']`limit=` в строке `//params:` — потолок числового поля. Пишется через ПРОБЕЛ после значения по умолчанию, а само выражение вычисляется уже во время работы генератора, поэтому в нём можно пользоваться предварительными переменными:
//params: side_glue_size=30 limit=W/4, clapan_angle=45 limit=65
Ввели больше — значение обрежется, поле в интерфейсе перепишется и сохранится. Работает только для числовых полей (см. Числа, строки и ловушка нуля).
`(выражение limit=выражение)` в теле генератора — то же самое, но разово, прямо в формуле. Разворачивается в ((A > B) ? B : A):
var rtop = Y + H*1.5 + HI + TH*3.5 + (HI limit=H-fixround);
Скобки обязательны, и внутри них не должно быть других скобок: замена идёт регуляркой по самому внутреннему уровню.
`IF(условие, да, нет)` — тернарник без вопросительного знака, если так читается легче:
var w = IF(W>100, 100, W);
Условие — одно сравнение (<, >, =, ==, !=, <=, >=), запятых внутри аргументов быть не должно.
Специальные параметры:
br — разрыв строки (перенос).hr — горизонтальная линия.endblock (необязательно) — закрывает раздел. Раздел также закрывается началом следующего блока или в конце строки.hidethhi — для скрытия полей толщина и высотаhideshippaz — для скрытия кнопок с цветом шипов/пазовhidebtns — для скрытия нижних кнопок "создать" и "склеить"hidetools — для скрытия нижних инструментов перегородки, шипы и гибкий резhideall — для скрытия всех этих блоковaddbtns=btn1|btn2 — Можно добавить кнопки из интерфейса. Пример: addbtns=btn_cmnborder|btn_monoline_font*** служебные параметры
maxLimit=X — Задаёт лимит на предупреждении о выборе большого числа объектов. По умолчанию значение 5. maxLimit=666noduplicateS — параметр который не создает копию объекта S = s.Duplicate() а использует оригинальный объектnoMove — предотвращает перемещение исходного объекта вверхshowLen — включает площади и длины: A и LE у текущего объекта, allA и allLE по всей выборке. Без флага этих переменных НЕТ вообще: обращение к ним даст ошибку с номером строки, а не тихий NaN в геометрии. Дело в цене — площадь разбирает КАЖДЫЙ подпуть объекта (габариты, площадь, стартовый узел), а потом сверяет вложенность каждого подпути с каждым; длина читает DisplayCurve.Length. На выборке в несколько десятков объектов это сотни обращений к Corel на каждое нажатие кнопки, а нужны они единицам генераторов. allA и allLE считаются до перебора, поэтому работают и вместе с noOS.useNodes или useNodes|кнопка — генератор работает с выбранными узлами. Даёт сразу три вещи:1. до тела генератора собирается массив selNodes — выбранные узлы объекта, и selSP — подпуть, в котором они нашлись (null, если выбранных узлов нет). Массив тот же, что отдаёт getSelNodes: с единицы, каждый элемент [x, y, номер узла в подпути], в порядке от начала куска и с учётом перехода через точку старта в замкнутом контуре
2. после выполнения выделение узлов восстанавливается — правка геометрии его снимает, а кнопку обычно жмут несколько раз подряд
3. перебор объектов останавливается на первом (sstop): выбранные узлы бывают только у одного объекта
Плюс не вызывается CreateSelection: объектное выделение не пересоздаётся, и Corel не выходит из режима правки узлов
Если указано имя кнопки (useNodes|pFlip), всё перечисленное включается ТОЛЬКО при нажатии этой кнопки, остальные кнопки генератора работают как обычно. Без имени флаг действует на весь генератор — и остановка перебора тоже, о чём легко забыть: соседняя кнопка, которой нужны все выбранные объекты, обработает только первый
noOS — убирает перебор объектов. все переменные объекта не доступны. Доступны:HI, TH, shft, btn, sr, join, copy, last, color_paz, color_ship, color_vstr, color_grav, color_3mm, color_cut, OScnt, OSstart, toDel, delMe
Плюс allA и allLE, если стоит showLen.
hidebtns и hideall заодно снимают галочку компенсации, и toDel в таком генераторе всегда false — исходник придётся удалять руками.ID параметров используются для связи и взаимного включения/выключения через active и deactive.
пример (все должно быть в 1 строку)
//params: name=korobka, mm=false|glue, paz_wi=7|odd|mm, paz_le=5|odd|mm, paz_hi=5|odd|mm, paz_gap=6, close_dno=open:dno:side, close_side=open|active#make_shoes_cover:close|deactive#make_shoes_cover:vstr|deactive#make_shoes_cover, cover_box=false|deactive#make_shoes_bot_holes#make_shoes_cover, slide_box=false|deactive#make_shoes_bot_holes#make_shoes_cover, round_corners=true, circle_vstr=false,covertext=block, make_shoes_cover=false|active#cover_gap#cover_height#make_shoes_holes|deactive#cover_box#slide_box, cover_gap=1, cover_height=15, endblock,text_shoe_holes=text, make_shoes_holes=true, make_shoes_bot_holes=true|glue, make_shoe_holes_four=false;
Параметры и правила:
самая первая строчка, обязательно начало с "`//params:` ":
name=korobka — имя моделиmm=false|glue — чекбокс mm, действие glue (склейка с предыдущим)paz_wi=7|odd|mm — числовое значение, проверка на нечетность, mm отменяет проверкуpaz_le=5|odd|mm — длина паза, с теми же проверкамиpaz_hi=5|odd|mm — высота паза, с теми же проверкамиpaz_gap=6 — числовое значение, шаг между пазамиclose_dno=open:dno:side — radiobutton с тремя вариантамиclose_side=open|active#make_shoes_cover:close|deactive#make_shoes_cover:vstr|deactive#make_shoes_cover — radiobutton с активацией/деактивацией элементов
cover_box=false|deactive#make_shoes_bot_holes#make_shoes_cover — чекбокс с деактивацией связанных элементовslide_box=false|deactive#make_shoes_bot_holes#make_shoes_cover — чекбокс с деактивацией связанных элементовround_corners=true — чекбоксcircle_vstr=false — чекбоксcovertext=block — начало раздела интерфейсаmake_shoes_cover=false|active#cover_gap#cover_height#make_shoes_holes|deactive#cover_box#slide_box — чекбокс с активацией/деактивацией связанных элементов
cover_gap=1 — числовое значениеcover_height=15 — числовое значениеendblock — закрытие разделаtext_shoe_holes=text — текстовый заголовокmake_shoes_holes=true — чекбоксmake_shoes_bot_holes=true|glue — чекбокс с действием gluemake_shoe_holes_four=false — чекбоксПоле превращается в переменную по одному из двух правил, и решает это ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ из //params:, а не то, что пользователь потом введёт:
0: переменная считается через vall(), то есть поле понимает запятую и выражения («2+2», «W/3»), и к нему применяются odd, even и limit;0, 0.5 и 01: переменная получает СЫРУЮ СТРОКУ из поля. Ни vall(), ни odd/even/limit не работают.То есть gap=0 даёт строку, а gap=1 — число. Нужен ноль по умолчанию — ставьте умолчанием ненулевое число, а в коде приводите сами: var g = vall(gap);
Число проходит ещё и через масштаб документа: vall() делит введённое на WorldScale, потому что поле заполняют в миллиметрах, а код работает в единицах документа. Размерам это и нужно, а количествам, углам, процентам и составляющим цвета — нет, им ставьте `noscale`. У строковых полей (тех самых, с нулём в умолчании) масштаба нет вовсе — там noscale ни на что не влияет.
Галочка от check в саму переменную не входит, но снятая галочка ГАСИТ поле, и переменная получает false — см. `check`. То же самое с полем, погашенным чужим deactive#. if (!foo) работает как раньше, foo === false отличает выключенное поле от введённого нуля, а parseFloat(foo) на выключенном даст NaN.
Панель не «передаёт» параметры в код — она текстом заменяет их имена по всему файлу генератора: paz_wi становится gbx_paz_wi везде, где встретится отдельным словом. Отсюда правила:
kb.gap безопасно всегда;if (btn=="my_btn") совпадает: обе стороны стали gbx_my_btn. Но литерал имени, которого НЕТ в //params:, не перепишется, и такое сравнение не сработает никогда.Строка //script: кладёт JS, который выполняется ОДИН РАЗ сразу после того, как панель построила поля генератора. Строк может быть сколько угодно, они склеиваются по порядку и запускаются одной анонимной функцией.
Это единственное место, где можно дотянуться до уже готовых элементов формы: поправить стили, дособрать список через populateList, повесить свой обработчик.
//script: var el=document.getElementById('val_gbx_marks_out'); if(el){el.style.margin='4px 6px';}
//script: populateList("val_gbx_ppal", PalList);
Тело генератора к этому моменту ещё не выполнялось: ни s, ни W, ни переменных параметров нет. Подстановка имён на эти строки НЕ распространяется — к полям обращаться по полному id val_gbx_<имя>.
Подпись поля панель берёт из lang['gbx_<имя параметра>'], подсказку — из hint['gbx_<имя>']. У радиокнопок ключ длиннее: gbx_<имя>_<вариант>, у пунктов списка — gbx_<имя списка>_<ключ пункта>. Нет ключа — подписью становится само имя параметра.
У генераторов из подпапок gbx\ строк //lang: больше нет: все подписи лежат в wpanel\langs\ru.js ключами gbx_*, а остальные 26 языков из него генерирует wpl.py. Строка //lang: работает ТОЛЬКО для русского, поэтому в релизном генераторе она означает, что весь остальной мир увидит русский текст.
Ключ подписи общий на всю панель, а не свой у каждого генератора: одноимённые параметры с разным смыслом приходится разводить по именам.
Сам генератор в списке описывается там же, ключ — путь к файлу без расширения:
lang["gbx_file_aGBX/abox segments"] = "Сегментные (ломаные)";
hint["gbx_file_aGBX/abox segments"] = "Создаёт из сложного периметра стенки.";
desc["gbx_file_aGBX/abox segments"] = "Что нарисовать и что нажать — развёрнутая справка.";
utub["gbx_file_aGBX/abox segments"] = "https://youtu.be/e0FVWmTgQlg";
utub и vkvi дают значок ролика слева от списка генераторов; какой из двух показать, решает настройка докера.
Предупреждение над полями генератора — ключ gbx_warning_<путь к файлу>. Безымянный gbx_warning одноразовый: он гасится сразу после показа, и его ставит строка //lang: warning= внутри самого файла.
Так же можно добавить свои подписи на русском и других языках.
//lang: — строка для добавления локализованных подписей и описаний если их не существует в языковом пакете самого докера
//lang: " с пробелом в концеЦифровые значения
Shift = 1, Ctrl = 2, Alt = 4;
//lang: title1=Настройка пазов|Тут можно настроить пазы по количеству.
//lang: title2=Вводятся только нечетные значения|Нечетные значения потому что так получается красивая симметрия.
//lang: round_corners=Скругление углов|Скругление углов коробки
//lang: round_corners|en=Round corners
Для кнопок создать и собрать можно добавить свои действия на функциональные кнопки Ctrl+Alt+Shift+...
Учтите, что кнопка собрать сначала выполняет основную сборку шип/пазов, а затем выполняет функциональные кнопки.
Дополнительные файлы генератора myscript.js лежат в ПАПКЕ РЯДОМ С НИМ — gbx/myscript/, а не в js/:
gbx/myscript/make.js — кнопка Создать с любым модификатором;gbx/myscript/glue.js — кнопка Собрать с Ctrl и старше, уже ПОСЛЕ основной сборки шипов и пазов;gbx/myscript/<имя кнопки>.js — код кнопки <имя кнопки>=btn. Нет такого файла — нажатие уходит в основной файл генератора, и разбирать его надо по переменной btn.У каждого такого файла своя первая строка //params: (её служебные флаги действуют на этот запуск), но интерфейс панель строит только по основному файлу.
этот скрипт выполняется для каждого выбранного объекта.
Если вам не нужно выполнять много раз в конце кода последней строчкой пишем
break;
Описывать в начале файла так же как язык.
Сейчас это не работает: чтение номерных подписей из make.js/glue.js в панели отключено, и подписи кнопок Создать/Собрать берутся только из словаря панели. Сами файлы вызываются как прежде — переименовывается только кнопка.
//lang: — строка для добавления функциональных кнопок
//lang: " с пробелом в концеЦифровые значения кнопок Shift = 1, Ctrl = 2, Alt = 4;
Все комбинации это просто сумма цифровых значений
//lang: 5=Собрать со сдвигом|Собрать коробку со сдвигом элементов вправо
//lang: 5|en=Make with shift|Make with shift elements to the right
5 - это сумма 4+1 те. кнопки Shift и Alt
пример:
var rect = rectangle(50,50,200,100,5);
создаст прямоугольник левый нижний угол координата 50,50 шириной 200 и высотой 100мм
shipy(shape, side, ...) или shipy(x1, y1, x2, y2, ...)
Поддерживает инверсию сторон с префиксом "-".
Перед созданием объекта SHAPE, автоматически подготавливаются переменные для упрощённой работы:
!регистр переменных очень важен!
s — Исходный объект (кореловский). (s маленькое)S — Копия исходного объекта (карабокса). Для него применимы все методы (функции) описанные нижеW — Ширина объекта (s.SizeWidth).H — Высота объекта (s.SizeHeight).A — Площадь текущего объекта. Только с флагом `showLen`.allA — Площадь всех объектов. Только с флагом `showLen`.LE — Длина всех кривых текущего объекта. Только с флагом `showLen`.allLE — Длина всех кривых всех объектов. Только с флагом `showLen`.L — Левая координата (s.LeftX).R — Правая координата (s.RightX).T — Верхняя координата (s.Topy).B — Нижняя координата (s.Bottomy).HI — Значение из поля ввода высота коробкиTH — Значение из поля ввода толщинаX — Центр X: либо CenterXY — Центр Y: либо CenterYjoin — Строка "join", используется как флаг режима.copy — Строка "copy", используется как флаг режима.last — Строка "last", заменяет последнюю использованную координату.color_paz — Цвет для пазов.color_ship — Цвет для шипов.color_vstr — Цвет для встречных пазов.color_grav — Цвет для гравировки.color_3mm — Цвет для 3мм.color_cut — Цвет для реза.rnd_num — Случайный номер для идентификации объектовsNum — Номер объекта если случайный номер был присвоен объекту. genNum(s.name)addShape — Признак добавления объекта s в выделение. Если false, то объект s не добавляется в выделение.lastnum — Признак последнего использованного номера. Можно использовать для идентификации объектов в цикле.toDel — Флаг чекбокса удалять исходный объект или нет.compensation — Размер компенсации или ноль если чекбокс не стоит.sfirst и slast — флаги проверка первый это объект или последний.sindex — порядковый номер текущего объекта в OS.Shapes()sstop — флаг для прерывания обхода всех объектов.OScnt — общее количество объектов в OS.Shapes()delMe — если эту переменную присвоить объекту, то при сборке он удалится. S.name(delMe);sLast — Последний объект в выборкеsFirst — Первый объект в выборкеbtn — id нажатой кнопки. Для кнопок из //params: сравнивается прямо с именем параметра: if (btn=='my_btn').shft — модификаторы, с которыми нажали кнопку. Shift = 1, Ctrl = 2, Alt = 4, комбинации складываются.sr — ShapeRange, который генератор вернёт наружу. Объекты в него панель добавляет сама, но можно класть и свои: krug.add(sr).sstring — слепок текущего объекта строкой. Нужен, чтобы отличить исходный объект от результата операции, когда Corel подменил ссылку.OSstart — сколько объектов было в выборке до начала перебора. OScnt генератор может поменять сам, OSstart остаётся исходным.Переменные выше считаются один раз, до начала кода генератора. Если объект после этого подвинуть или изменить его размер, они останутся со старыми значениями:
s.SizeWidth = W * 2;
// W, R, X здесь ещё старые!
reinit() перечитывает их заново:
s.SizeWidth = W * 2;
reinit(); // W, H, L, R, T, B, X, Y, HI, TH снова верные (с showLen ещё A и LE)
reinit() — без аргумента считает по текущему s.reinit(obj) — считает по указанному объекту. Принимает и кореловский объект, и SHAPE (reinit(S)).Саму переменную s при этом не подменяет — меняются только производные значения.
false, если объекта уже нет (удалён), и ничего не трогает.HI и TH пересчитываются с учётом объекта, поэтому выражения вида w/2 или *0.3 в полях ввода дадут новое значение от нового размера.
Не пересчитываются: rnd_num (он случайный, и должен остаться прежним), sNum, allA, allLE (они про всю выборку, а не про текущий объект). A и LE без флага showLen не считаются вовсе, и reinit() их тоже не трогает.
Панель собирает из файла генератора функцию и компилирует её. Номера строк в сообщениях об ошибках — это номера строк вашего файла, считая с первой строки //params:.
с именем файла и номером строки.
появится красное сообщение с диапазоном строк. Лишняя открывающая скобка называется точно — с номером строки, где её открыли.
Строка указывается по последнему пройденному оператору. Если оператор растянут на несколько строк, будет названа та, с которой он начинается.
для того чтобы выполнить только 1 раз для любого количества выбранных объектов есть 2 способа
Оборачивает объект CorelDRAW (Shape) в удобный интерфейс для манипуляций.
W(val) — Ширина. Получить или установить ширину.H(val) — Высота. Получить или установить высоту.L(val) — Левая граница (LeftX).R(val) — Правая граница (RightX).T(val) — Верхняя координата (TopY).B(val) — Нижняя координата (BottomY).X(val) — Центр по оси X. Учитывает флажок ch_sett_center.Y(val) — Центр по оси Y. Учитывает флажок ch_sett_center.LE() — Длина всех кривых объекта. Только чтение.setCenter(x, y) — Задать центр вращения. Без аргументов — геометрический центр, setCenter("R") или setCenter(true) — точка вращения самого объекта. Заданный центр дальше используют rotate, flip, moveTo и copyTo.syncName() — Перечитать имя объекта из Corel и обновить по нему числовой код (.code). Нужно, если имя поменяли мимо name().setColor([R,G,B]) — Устанавливает цвет обводки в RGB.setColor([C,M,Y,K]) — Устанавливает цвет обводки в CMYK.setFill([R,G,B]) — Устанавливает цвет заливки в RGB.setFill([C,M,Y,K]) — Устанавливает цвет заливки в CMYK.copyFill — Копирует заливку объектаcopyOutline — Копирует абрис объектаcopyColor — Копирует и заливку и абрис.setFont(font, size) — Задать шрифт и/или размер если это Текст.name(val) — Получает или устанавливает имя объекта.cut(shape, leavesrc, leavetarget) — Обрезает текущую форму по другой (shape). leavesrc=true — текущий объект не подменять результатом (результат только в возвращаемом SHAPE), leavetarget=true — сохранить и сам резак. Возвращает НОВЫЙ SHAPE с результатом.weld(shape, leavesrc, leavetarget) — Объединяет текущую форму с другой. Флаги те же.intersect(shape, leavesrc, leavetarget) — Создаёт пересечение двух объектов. Флаги те же.join(shape, reduce, dist) — Объединяет и соединяет кривые. reduce — сокращать узлы, dist — дистанция поиска соединения (по умолчанию 0.1).del() — Удаляет текущую форму.copy(x, y) — Копирует объект и смещает на (x, y).copyTo(x, y) — Копирует объект и переносит его центр в (x, y).move(x, y) — Перемещает объект на (x, y).moveTo(x, y) — Перемещает центр объекта в точку (x, y).resize(w, h, aspect) — Изменяет размер формы, добавляя к текущим размерам.setSize(w, h, aspect, dir) — Устанавливает точный размер формы, с учётом пропорций.tosize(w, h, dir) — То же, что setSize, но без пропорций: w и h абсолютные, якорь dir обязателен по смыслу. Ноль и любой минус значат «этот размер не трогать».repeat(dx, dy, hCnt, vCnt, glue) — Строит массив из объектов. При glue=true весь массив сразу сливается в один объект (Combine).group(arr) — Группирует текущий объект с массивом других SHAPE и делает группу текущей.findbyName(name, OS, ingroup) — Ищет объект по имени. Возвращает первую найденную форму (SHAPE) или false. За нестрогим поиском и прочими режимами — прямо в getbyName(name, OS, ingroup, strong, invert, type, query).removeHoles() — Удаляет все отверстия в объекте.breakNodes(nodes, split2) — Разрывает указанные узлы (массив номеров узлов)если split2=true то разваливает деталь и возвращает массив об\ектов (кусков)
add(sr, name) — Добавляет объект в выделение (если sr) либо в любой другой ShapeRange, попутно может дать ему имя. krug.add(sr);range.getShape(i) — если range коллекция - взять i-тый объект. Вместо номера можно передать ИМЯ: range.getShape("dno").createRange() — Создавать коллекцию var range = createRange();Про `dir` у setSize и tosize. Это якорь: какой край останется на месте. Одна буква — T, B, L, R; две — угол, сначала вертикаль: TL, TR, BL, BR. По умолчанию CC — тянется от центра.
flipX(x, mode) — Отражение по оси X. mode: "copy", "join", undefined.flipY(y, mode) — Отражение по оси Y. mode: "copy", "join", undefined.flip([x1,y1,x2,y2], mode) — Отражение относительно произвольной линии.rotate(angle, centerX, centerY, copies, join, reduce) — Поворот на угол вокруг точки. При copies>0 строит круговой массив копий; если при этом angle=0 или 360, шаг считается сам (360/copies). join=true — сразу сваривает копии с оригиналом, reduce передаётся в join.angle() — Получает текущий угол.angle(val) — Устанавливает абсолютный угол.resize(W, H, aspect) — Увеличивает размер на W и H. При aspect=true сохраняет пропорции.setSize(W, H, aspect) — Устанавливает абсолютные размеры. Если aspect=true и один из параметров 0, сохраняет пропорции.scale(k) — Масштабирует форму пропорционально по обоим осям.fitScale(W, H) — Масштабирует форму пропорционально так, чтобы она вписалась в прямоугольник W×H.* Все методы трансформации можно применять как к конкретному объекту, так и к последнему.
«Последний объект» — это тот, который был создан последним любым из примитивов. Имена функций пишутся С ЗАГЛАВНОЙ буквой после last, JS к регистру придирчив.
lastColor(arr) — Установить цвет обводки.lastFill(arr) — Установить цвет заливки.lastMove(x, y) — Сместить на (x, y).lastCopy(x, y) — Копия со смещением на (x, y).lastWeld(obj) — Объединить с другим объектом.lastIntersect(obj) — Пересечь с другим объектом.lastDel() — Удалить последний объект; lastDel(obj) — удалить переданный.lastFlipX(x, mode) — Отразить объект по вертикальной оси X с координатой x (если не задана — по центру объекта).Режимы:
lastFlipY(y, mode) — Отразить объект по горизонтальной оси Y с координатой y (если не задана — по центру объекта).Режимы аналогичны flipX.
lastFlip([x1,y1,x2,y2], mode) — Отразить объект относительно произвольной линии, заданной двумя точками.Режимы те же: изменить текущий, вернуть копию или объединить с копией.
lastJoin(obj) — Объединить с другим объектом.lastRotate(angle[, cx, cy, copies, join]) — Повернуть на угол (в градусах) относительно точки (cx, cy).lastAngle() — Получить текущий угол поворота объекта.lastAngle(val) — Установить абсолютный угол поворота объекта (в градусах).FillXY(X, Y) — Создаёт объект используя интерактивную заливку.contur(shape, gap, dir, split, todel, round, reduce, cut) — Создаёт внутренний (dir=0 или "in") или внешний (dir=1 или другое) контур объекта. Дальше всё необязательное: split — отделять контур от объекта (по умолчанию true), todel — удалить исходник, round — округлять углы, reduce — сокращать узлы, cut — вырезать контур.mode: "qty" — по количеству, "dist" — по расстоянию, "qty_by_gap" — количество по шагу.
even — равномерное распределение (по умолчанию true).
genNum(txt) — Извлекает номер из имени объекта (например: rect_123 → 123).do_flex( OS, opts, mode) - создаёт гибкий рез из объекта. Задавать можно только нужные параметры. Остальные подтянутся из интерфейса.
OS = ActiveShapeRange // активный диапазон выбора объектов или объект
var opts = {
// --- базовые параметры ---
shft: 2, // нажатые клавиши-модификаторы
thickness: 3, // толщина линии/реза (по умолчанию из интерфейса val_gbx_th)
height: 50, // высота реза/перемычки (по умолчанию val_gbx_hi)
gap: 30, // зазор между элементами (10 * thickness)
deleteSource: false, // удалить исходный объект после операции (true/false)
step: 3, // интервал реза (по умолчанию val_kbx_flex_step)
qty: 5, // количество перемычек (по умолчанию val_kbx_flex_qty)
perSize: 2, // размер перемычки (по умолчанию val_kbx_flex_per_size)
makeContour: false, // создавать контур в полтолщины (true/false)
makeSlots: false, // добавлять шипы (true/false)
pazQty: 5, // количество шипов (по умолчанию val_flex_sh_qty)
mmMode: false // режим мм вместо количества шипов (true/false)
};
mode = "flex"; // "startpoint", "restore", "perimetr", "flex"
Пример: do_flex(s); //создать гибкий рез из объекта s по параметрам гибкого реза в докере.
// Расчет соединения деталей под углом
// t1 - толщина шипа (вставляемой детали)
// t2 - толщина детали куда вставляется
// angle - угол наклона (90° = вертикально, 0° = горизонтально)
// mode - режим расчета (0 - close, 1 - open, 2 - full)
Функция возвращает объект с основными параметрами соединения:
tennon — длина шипа (рассчитанная длина выступающей части).slot — ширина паза (рассчитанная ширина отверстия для шипа).cut1 — дополнительная длина/глубина с одной стороны соединения (зависит от режима и угла).cut2 — дополнительная длина/глубина с другой стороны соединения.add1 — вспомогательный параметр: tennon - cut1.add2 — вспомогательный параметр: slot - cut2.debug — объект с отладочной информацией (промежуточные значения для проверки формул).var result = calcAngleJoint(10, 12, 90, 0);
// Результат:
{
tennon: 10,
slot: 12,
cut1: 0,
cut2: 0,
add1: 10,
add2: 12,
debug: {...}
}
lastObject).просто 4 координаты для единичного отрезка.
Первая линия массив из 4х элементов. далее один массив с вложенным массивом кажой последующей точки.
Функция: line(a, b, c, d, e, f, g, h)
Назначение:
Создаёт отрезок или кривую линии с возможностью добавления дополнительных сегментов.
Может использоваться для построения как простой прямой, так и сложной кривой с несколькими сегментами.
Функция поддерживает несколько форматов вызова с разным количеством и типом аргументов:
startLine.startLine (4 или 8 координат),addLines, массив сегментов, где каждый сегмент:SubPath) основной линии.R, применяется фаска (Fillet) к предыдущей вершине.Shape, обёрнутый с помощью createShape.// Простая линия
line(10, 10, 100, 10);
// Кривая с управляющими точками
line(10, 10, 100, 100, 30, 30, 70, 70);
// С дополнительными сегментами
line([10, 10, 100, 10], [
[150, 20], // Прямая
[200, 40, 5], // Прямая с фаской 5
[250, 60, 270, 70, 300, 90], // Кривая
[350, 100, 370, 110, 400, 130, 4] // Кривая с фаской 4
]);
Функция: rectangle(x1, y1, wi, hi, r1, r2, r3, r4)
Назначение:
Создаёт прямоугольник с возможностью задания радиусов скругления углов.
// Прямоугольник 100x50 без скруглений, с левым верхним углом (10,10)
rectangle(10, 10, 100, 50);
// Прямоугольник 100x50 с радиусом скругления 10 для всех углов
rectangle(10, 10, 100, 50, 10);
// Прямоугольник 100x50 с разными радиусами для каждого угла
rectangle(10, 10, 100, 50, 5, 10, 15, 20);
Функция: circle(x, y, r1, r2)
Назначение:
Создаёт окружность или эллипс с заданными параметрами центра и радиусов.
true дуга замыкается в сектор («пирог»), при false остаётся открытой дугой.circle({x:10, y:20, r:5}) или с r2.// Создать окружность с центром (50,50) и радиусом 20
circle(50, 50, 20);
// Создать эллипс с центром (50,50), горизонтальным радиусом 40 и вертикальным радиусом 20
circle(50, 50, 40, 20);
Пример: poly([x1, y1, x2, y2, x3, y3])
Функция: poly(points)
Назначение:
Создаёт многоугольник (полигон) из последовательности точек.
Минимум должен содержать координаты двух точек (4 числа).
// Создать многоугольник из 4 точек
poly([10, 10, 100, 10, 100, 50, 10, 50]);
или
shipy(shape, side, qty_or_len, ph, clo, sgap, lgap, rgap, bylen, colr) или
Поддерживает инверсию сторон с префиксом "-".
либо указываем 4 координаты линии вдоль которой надо рисовать шипы.
Пример 1: shipy(x1, y1, x2, y2, ..., options)
если в первый переметр передать объект, то он рисует шипы вдоль указанной грани (второй параметр T,B,L,R)
Пример 2: shipy(shape, "T", qty, thikness, ...)
Назначение:
Создаёт серию прямоугольных пазов вдоль заданной линии между точками (sx, sy) и (stx, sty).
Пазы чередуются с пропусками и могут быть смещены, повернуты и раскрашены.
false) или длина одного паза (если bylen = true).true — начинается с пропуска, false — с паза. По умолчанию: true.true, qty_or_len интерпретируется как длина паза, иначе — как количество. По умолчанию: false.false) — цвет заливки пазов. Передаётся в виде массива (например, [255, 0, 0]) или кореловского объекта color. Если false — заливка не применяется.Пример:
shipy(0, 0, 100, 0, 5, 10, true, 0, [5, 10], [5, 10], false, [255, 0, 0]);
Создает прямоугольные шипы вдоль линии. Шипы имеют небольшое сужение для лучшей посадки.
x1, y1 - координаты начала линииx2, y2 - координаты конца линииnums - количество шиповth - высота шиповdirection - направление выступа шипов:shift - смещение шипов вдоль линии (опционально):Создает прямоугольные пазы для сопряжения с шипами. Каждый паз создается как отдельный прямоугольный объект.
Параметры идентичны функции line_teeth:
x1, y1 - координаты начала линииx2, y2 - координаты конца линииnums - количество пазов (должно совпадать с количеством шипов)th - глубина пазов (должна совпадать с высотой шипов)direction - направление углубления пазов (противоположное шипам):shift - смещение пазов вдоль линии (должно совпадать со смещением шипов)Для создания сопрягаемых деталей:
nums и th для шипов и пазовdirection) для пазов должно быть противоположным шипамshiftПример:
// Создание шипов
line_teeth(0, 0, 100, 0, 5, 10, "up", "half");
// Создание ответных пазов
line_slots(0, 50, 100, 50, 5, 10, "down", "half");
Функция perf предназначена для создания пунктирного контура объекта и имеет следующие характеристики:
s — входной объект (может быть типа SHAPE или другого типа)punkt_dash — длина штриха пунктираpunkt_gap — длина промежутка между штрихамиСоздаёт и размещает текстовую надпись в документе.
X (число) — координата X точки привязки текста.
Y (число) — координата Y точки привязки текста.
text (строка) — содержимое текстовой надписи.
size (число) — размер шрифта в единицах документа или в миллиметрах (если указан параметр mm).
font (строка) — имя шрифта.
params (массив строк) — набор дополнительных опций для форматирования и выравнивания текста.
"mm" — размер шрифта задаётся в миллиметрах.
"wide", "width" — задаёт ширину текста по size.
"top" — позиционирование по верхней границе (TopY = Y).
"right" — позиционирование по правой границе (RightX = X).
"center" — центр текста ставится в точку (X, Y). Применяется последним, поверх top и right.
"l", "textleft" — выравнивание по левому краю.
"r", "textright" — выравнивание по правому краю.
"c", "textcenter" — выравнивание по центру.
"b", "bold" — полужирный шрифт.
"i", "italic", "cursive" — курсивное начертание.
"u", "under", "underline" — подчёркнутый текст.
Возвращает:
Объект, содержащий созданную текстовую фигуру (txt).
Особенности работы:
Если указан mm или wide, размер текста подгоняется в миллиметрах.
Если используется wide, ширина текста регулируется по высоте size.
При отсутствии top и right текст привязывается по левому нижнему углу в точке (X, Y).
Метод возвращает объект с текстовой фигурой, созданной на активном слое.
text(50, 100, "Hello World", 12, "Arial");
Создаёт текст Hello World размером 12 пунктов шрифтом Arial с привязкой по левому нижнему углу в точке (50, 100).
text(200, 150, "Label", 10, "Times New Roman", ["mm", "bold", "italic", "right"]);
Создаёт текст Label шрифтом Times New Roman размером 10 мм, полужирным курсивом, с привязкой по правому краю в точке (200, 150).
text(100, 50, "Centered Text", 20, "Verdana", ["wide", "c"]);
Создаёт центрированный текст Centered Text шрифтом Verdana с высотой 20 мм и подгонкой ширины текста к размеру 12mm.
Значения всех полей, которые породила строка //params:, панель хранит per-генератор и умеет складывать в именованные профили — файл на генератор в %APPDATA%\wpanel\GBX\. Автору генератора тут делать нечего, но знать полезно: у пользователя поле почти всегда придёт не с тем значением, что стоит умолчанием в //params:. Умолчание срабатывает ровно один раз, при самом первом показе поля.
Цвета и состояние свёрнутых блоков в профиль не входят.
normalizeCoordinates(coords) — Нормализует координаты в объект {x, y} из массива [x, y] или объектаdistXY(x1, y1, x2, y2) — Вычисляет расстояние между двумя точкамиgetEndXY(X, Y, L, ANG) — Находит конечную точку отрезка заданной длины и угла от начальной точкиrotatePoint(x, y, angle, xR, yR) — Поворачивает точку на заданный угол вокруг центра вращенияgetMidPoint(x1, y1, x2, y2) — Находит середину отрезка между двумя точкамиgetTriangleArea(x1, y1, x2, y2, x3, y3) — Вычисляет площадь треугольника по трем точкамisPointOnLine(px, py, x1, y1, x2, y2, tolerance) — Проверяет, лежит ли точка на отрезке с заданной точностьюpolarToCartesian(r, angle) — Преобразует полярные координаты в декартовыcartesianToPolar(x, y) — Преобразует декартовы координаты в полярныеnormalizeAngle(angle) — Нормализует угол в диапазон 0-360 градусовgetAngleDifference(angle1, angle2) — Вычисляет минимальную разность между двумя угламиtoRad(degrees) — Преобразует градусы в радианыtoDeg(radians) — Преобразует радианы в градусыgetLineAngle(x1, y1, x2, y2, inDegrees) — Вычисляет угол наклона линии между двумя точкамиgetAngleByTwoCatets(a, b) — Вычисляет угол по противолежащему и прилежащему катетам (atan)getAngleByTwoCatetsAtan2(a, b) — Вычисляет угол по катетам с использованием atan2getOppositeKatetbyAdjacentKatetandAngle(adjKatet, angle) — Находит противолежащий катет по прилежащему и углуgetAdjacentKatetbyOppositeKatetandAngle(oppKatet, angle) — Находит прилежащий катет по противолежащему и углуgetHypotenuseByCatets(adjKatet, oppKatet) — Вычисляет гипотенузу по двум катетамgetOppositeKatetbyHypotenuseandAngle(hypotenuse, angle) — Находит противолежащий катет по гипотенузе и углуgetAdjacentKatetbyHypotenuseandAngle(hypotenuse, angle) — Находит прилежащий катет по гипотенузе и углуHypotenuseEndPoint(startPoint, adjacentEndPoint, angleInDegrees) — Вычисляет конечную точку гипотенузы по начальной точке, конечной точке прилежащего катета и углу между гипотенузой и прилежащим катетом. Возвращает объект с координатами и длинами сторон.префиксы для файлов от пользователей начинаются на x
xa — GROSSLASERfunction getColor(color) — Приводит входные данные к объекту Color из любого вида: [R,G,B], [C,M,Y,K] или #hex цвета.getSColor(s, byFill, strict) — взять цвет объекта возвращает кореловский ColorgetbyName(name, OS, ingroup, strong) -> ShapeRange : взять объекты по имени
getByFill(color, os) -> ShapeRange : фигуры с заливкой color
getByOutline(color, os) -> ShapeRange : фигуры с обводкой color
getByColor(color, byFill, os) -> ShapeRange : поиск по цвету (fill/outline по приоритету)
copyFill(trgt, src) : копирует заливку
copyOutline(trgt, src) : копирует обводку
copyColor(trgt, src) : копирует заливку и обводку
setFill(S, color) : устанавливает заливку
setColor(S, color, mode) : устанавливает цвет (outline|fill|both)
getColor(color) -> Color : преобразует вход к Color (RGB/CMYK/hex/id/obj)