Команды HotActions 3.0

Материал из dgraphic
Перейти к навигации Перейти к поиску

Общие принципы

Типы Данных

Сценарий использует четыре типа данных: строки, числа с плавающей запятой, целые числа и вектора. Для простоты интерпретации данных в следующих главах, мы будем использовать Венгерскую нотацию для указания типа данных специфического параметра. Например, iSpeed подразумевает, что параметр iSpeed имеет тип «целое», а fX – параметр с плавающей точкой. Параметр типа «строка», обозначается при помощи кавычек вокруг параметра.

String Текст; строки типа «текст» должны быть включены в кавычки; примеры: «Camera1», «End of Track».
Float Число с плавающей точкой, например, 10.0.
Int Целое число, например, 10.
Vector Вектор – комбинация трёх чисел с плавающей точкой, например, 1.0, 2.0, 3.0.
Color Цвет – комбинация трех целых чисел от 0 до 255 (Red, Green, Blue)

Команды разделяются символом конца строки (нажатие Enter) или точкой с запятой (;), если несколько команд находятся на одной строке.

Разделители команд и другие системные символы

Новые системные символы и разделители команд введенные в HotActions 3.0:

| Вертикальная черта. Используются для разделения типа объекта и его подтипа. (см.. главу «…..» )
$<…> Треугольные скобки, следующие после символа ‘$’, в которые заключается имя параметра. При обработке скрипта на месте этой конструкции будет подставлено значение соответсвующего параметра.
{ … } Фигурные скобки. Используются для ограничения блоков команд, имеющих общие начальные тэги, с целью визуального структурирования (а также минимизации текста) скрипта.

Т.е. подобные строки

<tag11>…<tag1N>.<tag21>…<tag2N> = значение1

<tag11>…<tag1N>.<tag31>…<tag3N> = значение2

можно оформить так:

<tag11>…<tag1N> //общая часть вынесена перед скобками

{

<tag21>…<tag2N> = значение1

<tag31>…<tag3N> = значение2

}

Например, следующие строки

NODE.'Dummy'.SET.HIDE = 0

NODE.'Dummy'.SET.POS.X = 0

NODE.'Dummy'.SET.POS.Y = -100

NODE.'Dummy'.SET.POS.Z = 100

NODE.'Dummy'.PLAY = 1

NODE.'Dummy'.SET = 0

можно с помощью фигурных скобок и точек с запятой отформатировать таким образом:

NODE.'Dummy'

{

SET
{
HIDE = 0
POS { X = 0; Y = -100; Z = 100 }
}
PLAY = 1
SET = 0

}

Основной формат представления команд

Большинство команд сценария представляет собой следующую конструкцию:

<путь к объекту>.<поле1>[.<полеN>] = <значение1>[,<значениеN>]

Как правило, <путь к объекту> представляет собой составную конструкцию, состоящая из 4-х полей, разделенных точками:

<Тип Документа>.’<Имя Документа>’.<Тип Объекта>.’<Имя Объекта>’

<Тип Документа> - тэг типа документа, содержащего объект

<Имя Документа> - имя документа, содержащего объект. Это имя всегда указано в заголовке окна соответствующего документа, а также видно в дереве документов проекта.

<Тип Объекта> - тэг основного типа объекта (может включать подтипы, разделенные символом ‘|’)

<Имя Объекта> - имя объекта, к которому применяется команда. Все доступные имена объектов, как правило, видны в соответствующем документе.

Примеры путей:

SCENE.’Simple.3d’.NODE.’Dummy03’

SCENE.’Tutorial.3d’.CAMERA.’Camera01’

PROJECT.’MyProject.vs’.ACTION.’Modify Camera01’

PROJECT.’Class.vs’.LINK_TO|NODE.’Modify Camera02’

ACTLIB.’Joystick.acl’.ACTION.’Init Joystick’

HOTSET.’Common.vs’.HOTBAR.’Cameras’

<Имя Документа> и <Имя Объекта> всегда рекомендуется заключать в одинарные кавычки, поскольку они могут содержать пробелы, точки и прочие разделительные символы.

Поле <Тип Объекта> как правило, состоит из одного тэга (основного типа), но может включать подтипы, разделенные вертикальной чертой. Обычно указание подтипов используется для точной адресации объектов, имеющих одинаковые имена, например:

PROJECT.’Class.vs’.LINK_TO|NODE.’Camera01’ - путь к объекту типа «ссылка на узел»

PROJECT.’Class.vs’.LINK_TO|СAMERA.’Camera01’ - путь к объекту типа «ссылка на камеру»

К заданному этим путем объекту, собственно, и применяется присоединенная к пути команда <поле1>[.<полеN>] = <значение1>[,<значениеN>], например:

ACTLIB.’Joystick.acl’.ACTION.’Init Joystick’.CONTINUE = 1

SCENE.’Tutorial.3d’.CAMERA.’Camera01’.SET.FOV = 30

PROJECT.’Class.vs’.LINK_TO|NODE.’Modify Camera02’.PLAY.RANGE = 20, 100 (здесь команды выделены жирным для наглядности)

Опряделенный ряд команд относится не к отдельным объектам документов, а к документу в целом. В этих случаях путь состоит из двух тэгов, а не из четырех:

<Тип Документа>.’<Имя Документа>’

Примеры таких команд c сокращенными путями:

SCENE.’Simple.3d’.RESET = 1

MOVIE.’Sport.avi’.PLAY.RANGE = 0, 10

В каждом нижеследующем разделе в начале будут описаны пути доступа к объектам указанного типа, а потом следовать описание команд и их параметров, присоединяемых к этим путям.

Системные команды

Основные команды остались такими же, как в HotActions 1.6, за исключением команды SYS.MACRO, которая отменена и выполняться в данной версии программы не будет. Заметим, что как и прежде, в системных параметрах не используется путь к объекту (либо можно сказать, что этим путем является тэг SYS) Итак, в HotActions 3.0 добавились команды:

SYS.OPEN = «File», <ShowState=1>

Открывает документ с именем File. File может содержать путь к файлу документа (абсолютный или относительный). Окно документа может быть открыто невидимым, если указать ShowState, равным 0

SYS.PAUSE = 1

Приостанавливает выполнение команд сценария текущего экшена (т.е. ставит его на паузу). Чтобы продолжить выполнение команд, необходимо из другого экшена вызвать команду <ActionPath>.CONTINUE = 1, где <ActionPath> - путь к экшену, поставленному на паузу.

SYS.PARAM.'ParamName' = Value

Используется вместо отмененной команды SYS.MACRO. Присваивает значение глобальному параметру (т.е. параметру проекта) с именем 'ParamName'. Тип присваиваемого значения должно быть совместимо с типом параметра. (см. таблицу совместимости в главе «Параметры»). Если параметр с указанным именем в проекте отсутствует, он создается и получает по-умолчанию тип String.

Команды работы с экшенами

Экшены (Actions) могут быть созданы как в документе проекта, так и в отдельных библиотеках. Поэтому пути к ним могут выглядеть следующим образом:

PROJECT.’ProjectName.vs’.ACTION.’ActionName’'- если экшен находится в проекте
ACTLIB.’LibName.acl’.ACTION.’ActionName’'- если экшен находится в отдельной библиотеке


Внимание! Здесь и далее в описаниях команд путь к объекту для удобства чтения опущен (но всегда подразумевается!).

.PLAY = iTimes'
Исполняет экшен iTimes раз
.STOP = 1'
Прерывает исполнение запущенного экшена.
.CONTINUE = 1'
Продолжает выполнение скрипта экшена, приостановленного на команде
SYS.PAUSE (см. “Системные команды”)
.WAIT = STOP'
Приостанавливает выполнение всех последующих команд сценария до тех пор, пока исполнение данного экшена не дойдет до конца.
Аналог команды SYS.WAIT = “<путь к экшену>.STOP” (cм. «Системные команды»)
.RESET = 1'
Устанавливает значения Всех локальных параметров экшена в значения по-умолчанию (если имеются).
.PARAM.‘ParamName’ = Value'
Присваивает значение Value локальному параметру ‘ParamName’ данного экшена (см. «Параметры»). Тип Value должен быть совместим с типом указанного параметра

Команды работы с объектами сцены

Команды работы с виртуальными камерами

Путь к объекту сцены типа Камера (Camera) имеет следующий вид:

SCENE.’SceneName.3d’.CAMERA.’CameraName’

Команды (присоединяются к пути справа):

.SET.FOV = fFOV
Устанавливает FOV (угол зрения по горизонтали) на указанное в градусах значение fFOV. Параметр fFOV может принимать значения от 1 до 179.
.SET.CLIP.NEAR = fDistance
Устанавливает расстояние до ближней плоскости клипирования. . Если параметр fDistance равен 0 (или отрицателен), это означает автоматический режим определения, то есть в каждом кадре вычисляется расстояние от виртуальной камеры до ближайшего к ней объекта.
.SET.CLIP.FAR = fDistance
Устанавливает расстояние до дальней плоскости клипирования. Если параметр fDistance равен 0 (или отрицателен), это означает автоматический режим определения, то есть в каждом кадре вычисляется расстояние от виртуальной камеры до самого отдалённого от неё объекта.
.SET.RANGE.NEAR = fDistance
Устанавливает ближнюю границу fDistance проявления эффекта тумана (Fog). Команды включения эффекта тумана описаны в следующем разделе.
.SET.RANGE.FAR = fDistance
Устанавливает расстояние fDistance, начиная с которого эффект тумана (Fog). исчезает.
.RESET = 1
Возвращает всем свойствам камеры значения по-умолчанию (заданные в сцене).

Команды работы с источниками света

Путь к объекту сцены типа Источник Света (Light) имеет следующий вид:

SCENE.’SceneName.3d’.LIGHT.’LightName’

Команды (присоединяются к пути справа):

.SET.ON = iState
Включает (iState=1) или выключает (iState=0) источник света Light в сцене.
.SET.COLOR = iR, iG, iB
Определяет цвет источника света Light в сцене, iR - красной составляющей, iG - зелёной составляющей, iB - синей составляющей. Параметры iR, iG, iB могут принимать значения в диапазоне от 0 до 255.
.SET.MULT = fMultiplier
Устанавливает коэффициент умножения интенсивности света fMultiplier.
.SET.ATTEN.ON = iState
Включает (iState=1) или выключает (iState=0) использование функции затухания света (Attenuation).
.SET.ATTEN.RANGE = fRange
Устанавливает значение дальней границы затухания света.
.SET.CONE = fHotspotAngle, fFalloffAngle

или

.SET.CONE.HOTSPOT = fHotspotAngle
.SET.CONE.FALLOFF = fFalloffAngle
Устанавливает для направленного источника света (типа Target Spot, Target Direct, Free Spot, Free Direct) углы, задающие конус луча: fHotspotAngle - световое пятно луча, fFalloffAngle - область действия пятна света, регулирующая степень размытия края. Параметры fHotspotAngle, fFalloffAngle могут принимать значения в диапазоне от 0 до 180 градусов.

При попытке применить команду SET.CONE к точечному (ненаправленному) источнику света (тип Omni) в окне Debug Output появится сообщение об ошибке.

.RESET = 1
Возвращает всем свойствам источника света значения по-умолчанию (заданные в сцене).

Команды работы с узлами

Путь к объекту сцены типа Узел (Node) имеет следующий вид:

SCENE.’SceneName.3d’.NODE.’NodeName’

Команды (присоединяются к пути справа):

.SET.HIDE = iHide
Скрывает/показывает объект в сцене; значение 1 для iHide соответствует сокрытию объекта, 0 – показу объекта.
.SET. POS = fPosX, fPosY, fPosZ
Смещает объект на расстояние fPosX, fPosY, fPosZ относительно начального положения в сцене.
.SET.ROT = fRotX, fRotY, fRotZ
Поворачивает объект вокруг осей X,Y,Z на cоответствующие значения в градусах fRotX, fRotY, fRotZ.
.SET.SCL = fSclX, fSclY, fSclZ
Масштабирует объект относительно осей X,Y,Z с соответствующими коэффициентами fSclX, fSclY, fSclZ
.SET.VELPOS = fVelPosX, fVelPosY, fVelPosZ
Устанавливает постоянную скорость д110вижения (смещения) объекта по осям X,Y,Z (единицы сцены в секунду)
.SET.VELROT = fVelRotX, fVelRotY, fVelRotZ
Устанавливает угловую скорость вращения объекта вокруг осей X,Y,Z (градусов в секунду)
.SET.VELSCL = fVelSclX, fVelSclY, fVelSclZ
Устанавливает скорость масштабирования объекта по осям X,Y,Z (<прирост коэффициента масштабирования>/сек)
.RESET = 1
Сбрасывает все трансформации узла (в т.ч. скорости трансформаций) в начальное значение.

Команды проигрывания медиа-трэков

Объект, путь к которому указывается, должен обладать свойствами медиа, т.е. поддерживать проигрывание какого-либо трэка (анимации, видео- или саунд-потока и т.п.). На текущий момент наиболее востребованными объектами такого типа являются Узлы (Nodes), которые могут содержать трэк анимации. Соответственно, в данном случае путь к объекту имеет такой же формат, как для команд узлов (см 4.3):

SCENE.’SceneName.3d’.NODE.’NodeName’

Команды (присоединяются к пути справа):


.PLAY = 1
Проигрывает трэк анимации объекта (в соответствии с нижеизложенными параметрами проигрывания).
.PLAY.RANGE = fBegin, fEnd
Устанавливает точки начала и конца проигрывания трэка анимации (в секундах).
.PLAY.REPEAT = nTimes
Устанавливает количество повторов проигрывания. Если значение nTimes = -1, трэк проигрывается в бесконечном цикле.
.PLAY.SPEED = fSpeed
Устанавливает коэффициент скорости проигрывания (например, если значение = 1.5, трэк будет проигран с полуторной скоростью)
.STOP = 1
Мгновенно останавливает проигрывание трэка.
.PAUSE = nOn (1/0)
Приостанавливает или продолжает проигрывание трэка в зависимости от значения параметра nOn. Если nOn = 1, проигрывание ставится на паузу, если nOn=0 - снимается с нее.
.SEEK = fPos
Мгновенный переход в позицию трэка fPos (задается в секундах)
.PLAY_TO = fPos
Проигрывает трэк анимации с текущей позиции до тех пор, пока позиция в трэке не достигнет fPos (задается в секундах). При этом число повторов, задаваемое командой RANGE, игнорируется. Если fPos меньше текущей позиции, трек проигрывается в обратном направлении.
.STOP_AT = fPos
Устанавливает точку остановки проигрываемого трэка. Как только текущая позиция становится равной fPos (задается в секундах), проигрывание трэка останавливается. Параметр fPos должен находиться в пределах диапазона проигрывания, заданного командой RANGE. Если в момент исполнения команды трэк не запущен, команда игнорируется.
.WAIT = sEvent (PLAY/STOP/PAUSE)
Приостанавливает выполнение всех последующих команд сценария до тех пор, пока не произойдет указанное в параметре sEvent событие:
sEvent = PLAY – трэк начнет проигрывание
sEvent = STOP – трэк остановится
sEvent = PAUSE – трэк станет на паузу

Команды работы с материалами

Путь к объекту сцены типа Материал (Material) имеет следующий вид:

SCENE.’SceneName.3d’.MATERIAL.’MaterialName’

Команды (присоединяются к пути справа):

.SET.AMBIENT = iR, iG, iB
Устанавливает теневой (Ambient) цвет материала.
.SET.DIFFUSE = iR, iG, iB
Устанавливает рассеянный (Diffuse) цвет материала. Имеет эффект только для нетекстурированных материалов (или материалов с выключенными текстурами, см. команду .SET.TEXTURES )
.SET.SPECULAR = iR, iG, iB
Устанавливает цвет блика (Specular) материала.
.SET.OPACITY = iValue (0~100)
Устанавливает значение непрозрачности материала. При значении iValue, равном 0, материал полностью прозрачен, при 100 – полностью непрозрачен.
.SET.SELF_ILLUM= iValue (0~100)
Устанавливает значение самосветимости материала. При значении iValue, равном 100, материал не имеет теней и бликов и имеет только рассеянный (Diffuse) цвет или текстуру .
.SET.GLOSSINESS= iValue (0~100)
Устанавливает значение бликования материала. При увеличении значения iValue размер блика уменьшается. Интенсивность блика прямо пропорциональна Specular цвету материала.
.SET.TEXTURES= iState (0|1)
Включает (iState=1) или выключает (iState=0) использование текстурирования материала.
.RESET = 1
Возвращает всем свойствам материала значения по-умолчанию (заданные в сцене).

Команды работы с параметрами среды

Команды работы с параметрами среды (Environment) относятся к сцене целиком, поэтому путь, с которого начинается команда, имеет следующий вид:

SCENE.’SceneName.3d’.

Команды (присоединяются к пути справа):

.ENVIRONMENT.AMBIENT = iR, iG, iB
Устанавливает цвет рассеянного света среды.
.ENVIRONMENT.DIFFUSE = iR, iG, iB
Устанавливает цвет фона сцены.
.ENVIRONMENT.FOG.ON = iState [0|1]
Включает (iState=1) или выключает (iState=0) эффект тумана (дымки).
.ENVIRONMENT.FOG.COLOR = iR, iG, iB
Устанавливает цвет тумана.
.ENVIRONMENT.FOG.DENSITY = fNear(0~100), fFar(0~100)
Определяет степени плотности тумана fNear и fFar (в процентах) на ближней границе и дальней границах проявления эффекта. Границы видимости устанавливаются для каждой камеры индивидуально и команды, определяющие эти границы, описаны в разделе выше.

Параметры сценариев

В командах сценария можно использовать параметры. Параметры бывают глобальные и локальные, а также могут иметь различные типы, соответствующие типам их значений (см. справочное руководство по HotActions, «Параметры»).

Глобальные параметры

Область действия глобальных параметров распространяется на весь проект, поэтому параметры этого типа можно использовать в сценариях любых экшенов, входящий в проект. Глобальный параметр можно определить в сценарии следующим образом:

SYS.PARAM.’ParamName’ = Value

Если параметр с указанным именем не существует, он создается и по-умолчанию будет иметь тип String.

Примеры присвоения значений (создания) глобальных параметров:

SYS.PARAM.’MyMovie’ = “..\Sport.avi”

SYS.PARAM.’CurNode’ = SCENE.’Simple.3d’.NODE.’Camera01’

SYS.PARAM.’Counter’ = 2

SYS.PARAM.’MyText’ = “Hello, World!!!”

Локальные параметры

Локальные параметры являются свойствами экшена, поэтому область их действия (подстановки) распространяется только на сценарий этого экшена. Локальный параметр можно определить (cоздать) в сценарии следующим образом:

<тэговый путь к экшену>.PARAM.’ParamName’ = Value

Если мы определяем локальный параметр экшена, содержащего текущий сценарий, путь к экшену можно не указывать:

PARAM.’ParamName’ = Value

Примеры присвоения значений (создания) локальных параметров:

PARAM.’Image01’ = “Back.jpg” //локальный параметр текущего экшена

PARAM.’Command’ = PLAY

ACTLIB.'Commom.acl'.ACTION.’InitColors’.PARAM.’Color01’ = 233, 34, 89

$<ThisProj>.ACTION.’InitFont’.PARAM.’Size’ = 20

Если какой-либо локальный параметр имеет же имя, что и глобальный, в процессе выполнения сценария будет подставлено значение именно локального параметра (как ближайшего по области действия).

Системные параметры

Существует набор стандартных (системных) параметров, которые всегда имеют определенные значения, в зависимости от контекста их использования.

Параметр Значение
ThisItem Полный тэговый путь экшена, содержащего данный сценарий
ThisItemName Имя экшена, содержащего текущий сценарий
ThisProj Тэговый путь проекта, в контексте которого исполняется текущий сценарий
ThisProjName Имя проекта, в контексте которого исполняется текущий сценарий
ThisProjPath Полный файловый путь проекта, в контексте которого исполняется текущий сценарий
ThisProjDir Файловая директория проекта, в контексте которого исполняется текущий сценарий
ThisScene Тэговый путь основной сцены проекта, в контексте которого исполняется текущий сценарий
ThisSceneName Имя основной сцены проекта, в контексте которого исполняется текущий сценарий
ThisScenePath Полный файловый путь основной сцены проекта, в контексте которого исполняется текущий сценарий
ThisSceneDir Файловая директория основной сцены проекта, в контексте которого исполняется текущий сценарий


Пример: Предположим, загружен проект ‘C:\VS Sets\Test\MyProject.vs', созданный на основе сцены ‘C:\VS Sets\Scenes\Simple.3d' и выполняется экшен с именем 'MyAction’. Если в сценарии этого экшена используются стандартные параметры, то при подстановке они будут иметь следующие значения:

Параметр Значение
ThisItem PROJECT.'MyProject.vs'.ACTION.'MyAction’
ThisItemName MyAction
ThisProj PROJECT.'MyProject.vs'
ThisProjName MyProject.vs
ThisProjPath C:\VS Sets\Test\MyProject.vs
ThisProjDir С:\VS Sets\Test
ThisScene SCENE.'Simple.3d'
ThisSceneName Simple.3d
ThisScenePath C:\VS Sets\Scenes\Simple.3d
ThisSceneDir C:\VS Sets\Scenes

Использование параметров

Параметры должны использоваться в сценариях в специальных треугольных скобках, начинающихся с символа $:

$<имя параметра>

В процессе интерпретации сценария вместо этой конструкции будет подставлено текущее значение параметра.

Например, в сценарии имеются следующие строки:

SYS.OUTPUT = $<MyText>

$<CurNode>.PLAY = 1

Если параметр MyText в момент выполнения сценария имеет значение “Hello, World!!!”, а CurNode равен SCENE.’Simple.3d’.NODE.’Camera01’, то вышеуказанные команды будут исполнены следующим образом:

SYS.OUTPUT = “Hello, World!!!”

SCENE.’Simple.3d’.NODE.’Camera01’.PLAY = 1

Команды условий

В некоторых случаях при выполнии сценариев требуется выполнять/пропускать ту или иную команду в зависимости от значения какого-либо параметра. Для этой цели существуют команды условий IF и IFNOT.

Форма использования команд следующая:

IF.”<условие>”.<команда> = <параметры команды>

IFNOT.”<условие>”.<команда> = <параметры команды>

В случае команды IF: если значение условия <условие> ненулевое («истинно»), то выполняется команда <команда>, следующая за условием. Если же условие равно нулю («ложно») – <команда> просто игнорируется.

Для команды IFNOT все наоборот: <команда> выполняется если <условие> условие равно нулю и игнорируется в случае его истинности.

Условия всегда рекомендуется заключать в кавычки.

В качестве условия можно использовать одиночные параметры, например:

IF.”$<Error>”.SYS.OUTPUT = “Error!”

если значение параметра Error ненулевое, выполняется SYS.OUTPUT = “Error!”

IFNOT.”$<NodeName>”.RETURN = 1

если значение строкового параметра NodeName непустое и при этом не равно «0», выполняется прерывание выполнения текущего сценария
Непустое значение любой строки и не равное '0' трактуется как истинное условие.

Также в качестве условий можно использовать выражения с операциями отношения: > больше < меньше >= больше или равно <= меньше или равно == равно != не равно

Примеры:

IF.”$<Сounter> > 3”.COMMAND = CmdParam

- значение целочисленного параметра Counter должно быть больше 3, чтобы команда выполнилась

IFNOT.”’$<Type>’==PLAY”.COMMAND = CmdParam

- если значение строкового параметра Type равно PLAY, команда НЕ выполняется

IF.”$<Value1> <= $<Value2>”.COMMAND = CmdParam

- если значение целочисленного параметра Value1 меньше или равно значению параметра Value2, команда выполняется

В случае необходимости выполнить под одним и тем же условием несколько команд, рекомендуется использовать фигурные скобки, например:

IF.”<условие>”

{

<команда1> = <параметры команды1>

<командаN> = <параметры командыN>

}

Возможно использование вложенных команд условия:

IF.”<условие1>”.IF.”<условие2>”[…IF.”<условиеN>”].<команда> = <параметры>

или аналогичная запись c несколькими командами:

IF.”<условие1>”

{

IF.”<условие2>”

{

IF.”<условиеN>

{

<команда1> = <параметры1>

<командаN> = <параметрыN>

}
}

}

Во вложенных командах можно произвольно чередовать команды IF и IFNOT.

Вложенные команды условия при разворачивании в одну линию должны следовать одной цепочкой, не прерываясь обычными командами (и не начинаясь с них).

Например, это правильная запись (команды условий идут с начала одна за другой):

IF.”$<Param1>”.IFNOT.”$<Param2>”.IF.”$<Param3>”.PLAY.SPEED = 1.4

А это – неправильные:

IF.”$<Param1>”.PLAY.IF.”$<Param3>”.SPEED = 1.4 //разрыв в середине цепочки

NODE.'Camera’.STOP.IF.”$<Param3>”.RANGE = 1 //команда условия не с начала



Вернуться к документации "Виртуальные студии Фокус"

Вернуться на главную страницу