Объект "LinearValueSelector"
Всем доброго времени суток!
Сегодня разбор объекта, который косвенно упоминался в статье про Plan_Marker (выводы п.2)
Логика объекта следующая:
1. Выводит заданную строку
2. Позволяет активным спотом (АС) листать список строк, заданных в массиве.
Применение - по личному усмотрению. Как вариант - настроить несколько видов списков через "избранное", размещать в подходящих местах - графах основной надписи, шапках таблиц, текстовках, которые тянутся из проекта в проект. Да, есть автотекст. Но на вкус и цвет...
Вполне логичные "шаблоны" - список фамилий, должностей, организаций, ГОСТов, СНиПов...
Скрин 1. Работа с "избранным"
Скрин 2. Параметры объекта
ES - edit mode spot - параметр-координата АС1 отвечает за выбор "режима" объекта.
SCC, CX - АС2, отвечает за выбор значений из перечисления.
SVC - параметр-счетчик, определяет сколько по порядку(до первого пустого значения) значений задано в массиве ENUM.
SS - шаг перемещения АС2
RECT_X, RECT_Y - вычисляют ширину и высоту самой длинной в заданном перечислении(Enum) строки текста при выбранном стиле(размер, шрифт, аттрибуты) шрифта.
Enum - массив значений, которые нужно листать спотом АС2.
Итак, скрипты.
1. ОСНОВНОЙ СКРИПТ
Define Style "St1" F, FS, 7, 1*FB+2*FI+4*FUStyle "St1"
CT=0
FOR XX=1 to Vardim1(Enum)
! Что-то вроде Enum[xx]="", Enum[xx]=String.Empty, Enum[xx]=Null, в GDL не сработает, ну и ладно бы, так ведь и ошибку не покажет! И как обрабатывать ситуацию с пустой строкой? в руководстве об этом тоже не пишут, а решение такое:
If (STRLEN(Enum[xx])=0) then
CT=XX-1
GOTO 1
endif
СТ=XX
NEXT XX
1:
! После цикла в СТ количество записей в перечислении
! Находим самую длинную строку в перечислении, шрифты у нас не моноширинные поэтому
! пользуемся не STRLEN, а STW:
MSW=0
For X=1 to SVC
If (STW(Enum[x])>MSW) then
MSW=STW(Enum[x])
endif
NEXT X
width = MSW / 1000 * GLOB_SCALE
! Запрос высоты шрифта со стилем St1
n = REQUEST ("Height_of_style", "St1", height)
! пересчет в масштаб
height = height / 1000 * GLOB_SCALE
! назначаем параметры
PARAMETERS RECT_X=width
PARAMETERS RECT_Y=height
2. СКРИПТ ПАРАМЕТРОВ
! передаем СТ параметрPARAMETERS SVC=CT
! шаг движения спота АС2
VALUES "SS" RECT_X/SVC
! Заполняем параметр SCC координатами спота АС2 соответствующими данному ENUM и
! стилю шрифта
SPX=0
FOR V=1 to SVC
SPX=SPX+SS
PARAMETERS CX[V]=SPX
NEXT V
FOR V=1 to SVC
PUT CX[V]
NEXT V
VALUES "SCC" GET(NSP)
dim fontNames[]
n = request("FONTNAMES_LIST", "", fontNames)
values "F" fontNames, custom
VALUES "FS" Range[1,)
! Спот АС1: значение 0 - режим размещения, rect_y - выбор значения перечисления
VALUES "ES" 0, RECT_Y
3. 2D СКРИПТ:
! АС1HOTSPOT2 0, 0, 3, ES, 1+128 ! Base
HOTSPOT2 0, -1, 4, ES, 3 ! Ref
HOTSPOT2 0, ES, 5, ES, 2 ! Mov
! Если редактирование - рисуем рамку и спот АС2
if (ES = Rect_Y) Then
Line_type BLT
Pen BLP
Rect2 0,0, Rect_X, RECT_Y
HOTSPOT2 0, RECT_Y/2, 6, SCC, 1+128 ! Base
HOTSPOT2 -1, RECT_Y/2, 7, SCC, 3 ! Ref
HOTSPOT2 SCC, RECT_Y/2, 8, SCC, 2 ! Mov
! Жалеем зрение пользователя, обозначаем дислокацию АС2:
circle2 SCC, RECT_Y/2,RECT_Y/8
endif
! Вывод текста по индексу АС2
Text2 0,0, Enum[INT(SCC/SS)]
Вот что у нас в итоге получилось:
Скрин 3. Режимы работы объекта
Еще пара штрихов:
Скрин 4. Установка узловых спотов
Скрин 5. Редактирование переменной-массива,
при разработке объекта.
Скачать готовый объект(для AC-16) и видео ролик по использованию объекта можно здесь:
Архив(rar), 2,1мб
Как всегда все вопросы, пожелания, предложения - в комменты.
Архив(rar), 2,1мб
Как всегда все вопросы, пожелания, предложения - в комменты.
Комментарии
Отправить комментарий