Сага про HOTSPOTы.
Надеюсь, что расскажу более понятно, чем описано в GDL Reference Guide.
=============================================
HOTSPOT2 x, y [, unID [, paramReference, flags [, displayParam]]]
В прямоугольные скобки заключено то, что является дополнительным, а не обязательным компонентом. Использование дополнительных компонентов дают расширенные возможности. Скобки показывают принцип использования: что, без чего, не может существовать. Вариант трактовки зависимости отличается от приведенного в GDL Reference Guide, где, мне кажется, присутствует описка. В скрипте, сами скобки не пишутся.
Вот возможные варианты:
HOTSPOT2 x, y
HOTSPOT2 x, y , unID
HOTSPOT2 x, y , unID , paramReference, flags
HOTSPOT2 x, y , unID , paramReference, flags, displayParam
x, y: координаты точки. Вместо четко прописанных координат, могут использоваться переменные типа "Линейная величина". Другие типы не поддерживаются. Если подставлять переменные типа "Действительное число" или "Целое число", то они интерпретируются как "Линейная величина".
paramReference: параметр, который может быть отредактирован этой горячей точкой. Поддерживается переменная типа "Линейная величина" и "Угловая величина". Если подставлять переменные типа "Действительное число" или "Целое число", то они интерпретируются как "Линейная величина" или и "Угловая величина". Редактирование происходит как графически, растягиванием за точку, так и вводом числового значения в табло слежения.
displayParam: это параметр, который можно назвать "маской", под которой прячется paramReference. Т.е., при графическом редактировании объекта за точку, в табло слежения показывается изменяемое значение не paramReference, а displayParam. Для правильной работы этой связки двух параметров, в скрипте нужно прописывать их взаимное влияние друг на друга. В displayParam можно использовать переменные типа "Линейная величина", "Угловая величина", "Действительное число" или "Целое число".
paramReference и displayParam могут использовать члены массивов.
unID: уникальный идентификатор, который должен быть уникален для каждой горячей точки, определенной в библиотечном элементе. В основном, он нужен для правильной привязки размеров к библиотечному элементу.
Чтобы не следить за нумерацией всех точек, придуман простой способ написания скрипта. В начале каждого скрипта, который использует горячие точки (2D или 3D срипт), объявляется начальное число от которого начинать отсчет: unID=?, затем идет чередование выражений unID и unID=unID+1.
Например:
unID=1
HOTSPOT2 x1, y2, unID ! 1
unID=unID+1 ! 1+1=2
HOTSPOT2 x2, y2, unID ! 2
unID=unID+1 ! 2+1=3
HOTSPOT2 x3, y3, unID ! 3
Или в одной строке через знак двоеточия.
unID=1
HOTSPOT2 x1, y1, unID : unID=unID+1 ! 1 : 1+1=2
HOTSPOT2 x2, y2, unID : unID=unID+1 ! 2 : 2+1=3
HOTSPOT2 x2, y2, unID : unID=unID+1 ! 3 : 3+1=4
flags: определяет за какой тип редактирования (редактирование длины или угла) отвечает горячая точка и ее роль (атрибут) в редактировании.
1: редактирование длины / точка отсчета, от которой начинается длина.
2: редактирование длины / конечная точка, та которая перемещается удлиняя элемент.
3: редактирование длины / точка задания вектора (всегда невидимая).
4: редактирование угла / точка отсчета, от которой начинается угол. Должна быть отдалена от центра.
5: редактирование угла / точка изменения величины угла.
6: редактирование угла / точка центра угла (всегда невидимая).
7: редактирование угла / точка задания вектора плоскости в которой лежит угол (всегда невидимая). Применяется в 3D-скрипте.
К атрибутам 1 и 4 можно прибавить 256. Тогда эти точки тоже смогут менять свое положение, изменяя начало и одновременно значение длины/угла.
Если к атрибутам 1,2,4,5 прибавить 128, то точки с этими атрибутами станут невидимыми.
Если к атрибуту 6 прибавить 512, то изменится направление угла.
=============================================
Про использование paramReference довольно хорошо рассказано в GDL Reference Guide.
Поэтому подробнее расскажу только про использование displayParam.
Попытаюсь объяснить как с ним работать. Разберем пример с парковочными местами.
Задача: Изменять длину парковки автомобилей на плане за гор.точку и видеть в табло слежения не общую длину, а количество мест.
Нам нужны параметры отвечающие за длину парковки и количество мест.
ParkingLth - тип "Линейная величина" - Длина Парковки
nSite - тип "Целое число" - Количество Мест
Parameter script
Переменную длины парковки (ParkingLth) нужно заставить изменяться по заданной ширине места (2.5 м) и задать минимальное значение.
VALUES "ParkingLth" RANGE [2.5, ] STEP 0, 2.5
Это означает:
- минимальное значение длины парковки будет равным одной ширине парковочного места (2.5 м)
- максимальное значение может быть бесконечным
- шаг растягивания будет равным одной ширине парковочного места (STEP 0, 2.5)
Также введем ограничение для количества мест.
IF nSite < 1 THEN PARAMETERS nSite = 1
Далее прописываем взаимосвязь переменных:
IF GLOB_MODPAR_NAME = "ParkingLth" THEN PARAMETERS nSite = ParkingLth/2.5
IF GLOB_MODPAR_NAME = "nSite" THEN PARAMETERS ParkingLth = nSite * 2.5
Это означает, что если вносится изменение в ParkingLth, то nSite должен тоже изменить свое значение по формуле ParkingLth/2.5.
И наоборот. Если вносится изменение в nSite, то ParkingLth должен тоже изменить свое значение по формуле nSite * 2.5
На плане эта взаимосвязь работает так. Когда вы растягиваете за точку редактирования, то работает ParkingLth изменяя nSite (GLOB_MODPAR_NAME = "ParkingLth"). Когда вы вводите значение в табло слежения, то работает nSite изменяя ParkingLth (GLOB_MODPAR_NAME = "nSite").
2D script
LINE2 0, 0, ParkingLth, 0
FOR i = 0 TO nSite
LINE2 0, 0, 0, 3
ADD2 2.5, 0
NEXT i
HOTSPOT2 0, 0, 1, ParkingLth, 1
HOTSPOT2 ParkingLth, 0, 2, ParkingLth, 2, nSite
HOTSPOT2 -1, 0, 3, ParkingLth, 3
Если нужно чтобы парковка растягивалась в обе стороны, то добавим 256 к атрибуту 1. Затем можно поставить запятую и добавить displayParam (наш nSite). Если его не добавлять, то при растягивании парковки в другую сторону, в табло слежения будет отображатся длина парковки.
Парковка готова к растягиванию с указанием мест.
=============================================
Еще один пример. Запрограммируем линию с кругом на конце. Длина линии будет масштабируемой, а размер круга будет фиксированным. Напомню, что фиксированный, это размер, который задается в единицах измерения бумаги.
Длина линии будет регулироваться переменными A и B. Для радиуса круга создаем два параметра:
RadiusScl - тип "Линейная величина" - Радиус
RadiusFix - тип "Действительное число" - Радиус (мм)
Переменную RadiusScl сделайте невидимой в окне параметров.
Parameter script
IF GLOB_MODPAR_NAME = "RadiusScl" THEN PARAMETERS RadiusFix = RadiusScl *1000/A_
IF GLOB_MODPAR_NAME = "RadiusFix" THEN PARAMETERS RadiusScl = RadiusFix *A_/1000
Можно ввести ограничение на минимальный размер радиуса. Например, 0,5 мм.
Ограничение придется вводить для обоих переменных.
IF RadiusFix < 0.5 THEN PARAMETERS RadiusFix = 0.5
IF RadiusScl < 0.5/1000*A_ THEN PARAMETERS RadiusScl = 0.5/1000*A_
2D script
Делаем значение переменных незавимыми от масштаба.
RadiusScl = RadiusFix /1000*A_
RadiusFix = RadiusFix /1000*A_
Далее все просто.
HOTSPOT2 A, B
LINE2 0, 0, A, B
HOTSPOT2 0, 0, 1, RadiusScl, 1
HOTSPOT2 0, RadiusScl, 2, RadiusScl, 2, RadiusFix
HOTSPOT2 0, -1, 3, RadiusScl, 3
CIRCLE2 0, 0, RadiusScl
Линия с кругом на конце готова.
=============================================
Оба примера в прикрепленном файле.