Объект "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*FU
Style "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 СКРИПТ:

! АС1

HOTSPOT2   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мб

Как всегда все вопросы, пожелания, предложения - в комменты.

Комментарии

Популярные сообщения из этого блога

GDL. Объект для моделей из "оцилиндрованного бревна"

График функции в полярных координатах?! Легко!

Объект "Plan Marker"