Введение

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

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

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

Реализация проекта началась в 2007 году.

Сегодня эффективность LABPP подтверждена на крупнейших стройках страны - от небоскребов Москва-Сити АБ Скуратова, до промышленных гигантов СИБУР.

Это руководство в других форматах:

  • Adobe Acrobar PDF
  • Windows стандартный help-файл CHM
  • Word DOC
  • Электронная книга в формате EPUB
  • Для интернет браузеров HTML

Подключение ARCHICAD к различным внешним SQL базам данных выполняется на "раз-два".Просто используйте в тексте программ соответствующие команды, описанные в этом руководстве.

Для разработки и отладки программ имеется встроенный многооконный инструмент BIM Master.

Встроенный интеллектуальный генератор кода позволяет быстро компоновать крупные фрагменты программ на основе свойств модели.

Прямо в язык программирования встроены элементы искусственного интеллекта (ИИ).

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

Примеры диалогов в некоторых приложениях, созданных на базе LabPP_Automat:

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Особенности языка

Введение ››

В качестве основы языка программирования в LabPP_Automat используется широко известный, простой и гибкий язык Си++.
Достоинствами этого языка являются:

  • высокая скорость выполнения;
  • хорошая читаемость, лаконичность и понятность кода;
  • простота создания и обращения к функциям;
  • большая библиотека разнообразных процедур;
  • его освоение намного легче и он более удобный для работы.

Для большего удобства использования конструкций языка в LabPP_Automat добавлен тип данных string.
Если Вы задали функцию MyStringFunc, которая возвращает строковое значение, то можно писать так:

string MyString = MyStringFunc();

Здесь мы сразу объявляем переменную типа "строка" MyString и сразу же записываем в нее значение из функции MyStringFunc().

Имеются ограничения при помощи которых создание программ значительно упрощено:

1. можно использовать только встроенные классы через дескрипторы.
2. отсутствуют указатели.
3. отсутствует тип данных "ссылка".

Программные модули создаются в виде отдельных текстовых файлов.


Моя первая программа

Введение ››

Создайте файл и вставьте в него следующее.

int main()

{

cout << "Здравствуй Мир!)))";

}

В программе labpp выберите и запустите этот файл на выполнение.

Приветствие появится в окне сообщений.

На картинке ниже - способ запуска программных модулей из приложения LabPP_Calc

В левом нижнем улгу окна приложения - кнопки быстрого запуска программных модулей.

Они имеются в любом приложении LabPP.

Самая правая кнопка открывает окно сообщений. Чуть левее - позволяет выбрать программный файл для выполнения.

Еще 4 кнопки слева - для быстрого повторного запуска уже выполнявшейся программы и для заранее запрограммированного выполнения программы с определенным именем файла (задается в конфигурационном файле config.cpp).


Кодировка у файлов программных модулей

Введение ››

Обычно нет необходимости разбираться с кодировками файлов.

Но понимать это просто.

Файлы содержат коды символов. Одни и те же символы могут иметь разные коды в файлах с разными кодировками.

Если Вы не используете специальные символы, например, обозначение степени пишете как "М2" то кодировка программного файла может быть ANSI.

Если же необходимо писать что-то вроде "Площадь, м?", т.е., степень как в Excel в верхнем регистре, то необходимо использовать формат файлов в кодировке UTF8 со спецификацией.

Ниже на картинке показано как сохранять файлы для выполнения в LabPP_Automat в кодировке UTF-8 со спецификацией.


Структура каталогов у LabPP_Automat

Введение ››

Тексты программных модулей могут использоваться самостоятельно или в составе конфигураций для LabPP_Automat.

Каждая конфигурация для LabPP_Automat представляет собой каталог с определенной структурой.

Именем конфигурации служит название этого каталога.

Каталоги конфигураций располагаются в каталоге tsprglist.

Ниже показан пример содержимого каталога tspgrlist.

"GDL генератор", "Ландшафтный дизайн с ценами", "Примеры" и "Технико-экономические показатели" - это конфигурации.

При запуске панели LabPP_Automat предлагает список этих конфигураций для выбора и загрузки для работы в данный момент.

Внутри каждой конфигурации имеется обязательные каталоги.

tsimages - каталог с картинками и иконками. Файл с именем 1.png будет использован в качестве иконки данной конфигурации в стартовом списке.

В каталоге tsprg располагается конфигурационный файл config.cpp и программные модули для запуска в данной конфигурации.

Например:

Файл config.cpp отвечает за вид рабочей панели конфигурации.

В нем задаются размеры и положение окна конфигурации и описание кнопок с присвоением им имен запускаемых программных модулей (файлы *.cpp).

Ниже на рисунке - вид окна одной из конфигураций.

В каталоге LabPP_AutomatAC... располагается программный модуль LabPP_Automat.apx и ключевой файл LabPP_Automat.key.

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

Чтобы создать собственную конфигурацию можно просто скопировать имеющийся каталог какой-либо конфигурации и модифицировать по своему усмотрению.


Конфигурационный файл config.cpp у конфигурации

Введение ›› Структура каталогов у LabPP_Automat ››

Файл config.cpp является обычным программным модулем.

Он так же может содержать разнообразные инструкции, сообщения и запросы.

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


create_button

Введение ›› Структура каталогов у LabPP_Automat ›› Конфигурационный файл config.cpp у конфигурации ››

Создать кнопку с текстовой надписью на панели диалога конфигурации.

Вызов:

ac_request("create_button", string button_caption, int start_x, int start_y, int width, int height, string tooltip, string name_cpp);

или

ac_request("create_button", string button_caption, int start_x, int start_y, int width, int height, string tooltip, string name_cpp, int iarg, double darg, string sarg);

Здесь:

button_caption - надпись на кнопке;

start_x, start_y - координаты левого верхнего угла кнопки на панели диалога;

width, height - ширина и высота кнопки;

tooltip - всплывающая подсказка, которая будет появляться при наведении мыши на кнопку;

name_cpp - имя файла с программой (из каталога tsprg).

iarg, darg и sarg - целое число, число с плавающей точкой и строка - параметры, которые будут переданы в программный модуль при запуске по этой кнопке. Получить параметры в вызываемом модуле можно командой run_cpp("get_args"... :

int iArg1;

double dArg2;

string sArg3;

run_cpp("get_args", iArg1, dArg2, sArg3);


create_iconbutton

Введение ›› Структура каталогов у LabPP_Automat ›› Конфигурационный файл config.cpp у конфигурации ››

Создать кнопку с иконкой на панели диалога конфигурации.

Вызов:

ac_request("create_iconbutton", string icon_filename, int start_x, int start_y, int width, int height, string tooltip, string name_cpp);

или

ac_request("create_iconbutton", string icon_filename, int start_x, int start_y, int width, int height, string tooltip, string name_cpp, int iarg, double darg, string sarg);

Здесь:

icon_filename - имя файла иконки, которая должна быть отрисована на кнопке (из каталога tsimages);

start_x, start_y - координаты левого верхнего угла кнопки на панели диалога;

width, height - ширина и высота кнопки;

tooltip - всплывающая подсказка, которая будет появляться при наведении мыши на кнопку;

name_cpp - имя файла с программой (из каталога tsprg).

iarg, darg и sarg - целое число, число с плавающей точкой и строка - параметры, которые будут переданы в программный модуль при запуске по этой кнопке. Получить параметры в вызываемом модуле можно командой run_cpp("get_args"... :

int iArg1;

double dArg2;

string sArg3;

run_cpp("get_args", iArg1, dArg2, sArg3);


set_palette_size_and_message_place

Руководство по LABPP_Automat для ARCHICAD

Введение ›› Структура каталогов у LabPP_Automat ›› Конфигурационный файл config.cpp у конфигурации ››

Задать размеры главной панели конфигурации и положение в ней окна сообщений.

ac_request("set_palette_size_and_message_place",int start_x, int start_y, int width, int height, int messageplace_start_x, int messageplace_y, int messageplace_width, int messageplace_height);

Здесь:

start_x, int start_y - левый верхний угол панели на экране;

width, height - ширина и высота панели при старте;

messageplace_start_x, int messageplace_y - положение левого верхнего угла окна сообщений в панели;

messageplace_width, messageplace_height - ширина и высота окна сообщений.


Списки для выборки элементов из проекта

Введение ››

Для работы с элементами проекта удобно делать выборки.

Выборки делаются при помощи команд группы "load_elements_list".

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

Затем, обычно, запрашиваем количество элементов в выборке и организуем цикл для обработки элементов.

При обращении к этим командам надо использовать номер списка элементов для выборки.

По умолчанию списков 10, поэтому этот номер может быть от 0 до 9.

Десяти списков, по опыту, более чем достаточно, чтобы обеспечить нужды алгоритма в программном модуле.

Но если этого недостаточно, то командой "set_TSMAX_ELEMLIST_NUMBER" можно установить любое количество этих списков.

Считать текущее заданное количество списков можно командой "get_TSMAX_ELEMLIST_NUMBER"

.


Генезис свойств

Генезис - признак параметра, отвечающий за его происхождение.

Текстовое значение | Числовое значение | Описание
"ANY" | 0 | Любой (для таблиц и т.п.)
"GDL" | 1 | Параметр GDL элемента
"EP" | 2 | Параметр элемента
"UP" | 3 | Пользовательский параметр
"UPb" | 4 | Базовый параметр
"UPub" | 5 | Пользовательский базовый параметр
"UPa" | 6 | Параметр
"Cls" | 7 | Класс
"IFC" | 8 | Параметр IFC
"UTS" | 9 | Параметр LABPP прикрепленный к элементу
"Q" | 10 | Quantity - количественный параметр
"AP" | 11 | Свойство атрибута
"MV" | 12 | Настройки модельного вида
"MV_GDL" | 13 | Настройки GDL из модельного вида
"PInfo" | 14 | Информация о проекте


Окна LABPP

Для приложений на LABPP для ARCHICAD можно создавать многооконный интерфейс.

Окна могут быть модальными и немодальными.

Диалоги, построенные на модальных окнах фокусируют работу программы только на текущем окне.

При этом все остальные действия блокируются до закрытия модального диалога.

А немодальные окна - позволяют работать с проектом и с другими окнами.
Таких окон может быть открыто любое количество.

Их можно перетаскивать за пределы окна ARCHICAD и на другой монитор.

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


Семантика языка C++ для ARCHICAD

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Общая структура программы

Семантика языка C++ для ARCHICAD ››

Программа должна содержать функцию main(), с которой начинается ее выполнение.

Можно создавать подпрограммы. Объявлять переменные.

Переменные могут быть глобальными и локальными.

Общая структура программы показана ниже

int my_global_var1 = 1; // объявление переменной типа целое число и присвоение ей первоначального значения.

double my_global_var2; // объявление переменной вещественного типа

Пример программы.

int main()

{

int my_local_var = 2; // объявление переменной типа целое число

my_local_var = my_func(); // вызов функции my_func() с присвоением результата переменной

}

// объявление собственной функции, возвращающей целое число

int my_func()

{

int my_local_var = 3; // объявление переменной типа целое число внутри функции

return 10; // значение, которое вернет функция

}


Функция main()

Семантика языка C++ для ARCHICAD ››

Каждый программный файл должен содержать базовую функцию main().

Эта функция вызывается при старте программы. Как и все функции C++ ее содержимое заключается в фигурные скобки.

Общая структура

int main()

{

// тело функции заключено в фигурные скобки

return 0;

}

Чтобы была возможность получить данные извне программы имеются два варианта - получение аргументов, с которыми запущена программа (run_cpp("get_args",...)) и получение значений внешних переменных, инициированных другими программами (var_extern_get).


Идентификаторы

Семантика языка C++ для ARCHICAD ››

Идентификаторы - это названия переменных и функций. Названия могут быть только на английском языке. Прописные и строчные буквы не различаются. Так, что переменная int iValue и int IVALUE это одно и то же.


Типы переменных, видимость и виды

Семантика языка C++ для ARCHICAD ››

Имеется несколько способов объявления и использования переменных.

Вид переменных

Пример

Видимость

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

int function()

{

int i;

double d;

string s;

}

В рамках текущей функции

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

int i;

double d;

string s;

int function()

{

}

В рамках текущего исполнительного файла cpp

Номерованные внутренние списки элементов (по умолчанию - от № 0 до № 9)

Собрать элементы зон во внутренний список элементов labpp № 7 и в цикле перебрать их для получения номера помещения и отображения их в окне сообщений.

ac_request("load_elements_list_from_selection", 7,

"ZoneType","MainFilter",2+1024 ,"Classif",

"Классификация ARCHICAD, "ClassifVal", "Помещение");

ac_request("get_loaded_elements_list_count", 7);

int icount = ac_getnumvalue();

ac_request("get_loaded_elements_list_count", 7);

icount = ac_getnumvalue();

cout << "icount=" << icount << "\n";

if (icount == 0)

{

cout << "Нет зон в проекте\n";

return -1;

}

int i;

int ires;

string szonename;

for (i = 0; i < icount; i++)

{

ires = ac_request("set_current_element_from_list",

7, i);

ires = ac_request("get_element_value", "ZoneName");

szonename = ac_getstrvalue();

coutvar << szonename;

}

В рамках текущего исполнительного файла cpp

Объекты

int iTable;

object("create","ts_table", iTable);

object("KeepInMemory", iTable);

В рамках текущего сеанса приложения.

Можно использовать для передачи данных из одного файла cpp к другому.

Значение дескриптора (iTable) можно запомнить в одном файле и считать в другом через внешнюю переменную.

Внешние переменные

var_extern_set("sWorkBookUprFile", "c:\\filename.txt");

string sWorkBookUprFile;

int ires = var_extern_get("sWorkBookUprFile", sWorkBookUprFile, 0);

if (ires != 0)

{

cout << "Не задана внешняя переменная sWorkBookUprFile";

return -1;

}

В рамках текущего сеанса приложения.

Можно использовать для передачи данных из одного файла cpp к другому.

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

bool - логическая (значения 0-ложь/1-истина).

int - целое число.

double - вечественное число (с плавающей точкой).

string - строковая переменная.

Пример.

Объявить переменную типа строка и записать в нее несколько слов.

string mystring;

mystring = "fragment1" + "fragment2";

mystring += "fragment3";


Пакетное объявление и обращение к переменным через идентификаторы, задаваемые текстом - var_by_txt()

Семантика языка C++ для ARCHICAD ››

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

Например в цикле создать переменные от "var_1_1_1" до "var_100_100_100".

Удобно для формирования n-мерных массивов и т.п.

Далее можно обращаться к переменным напрямую:

s = var_67_45_34;

Или присваивать

var_34_23_23 = "значение для 34_23_23";

А так же можно присваивать значения переменной, имя которой формируется на лету в строке:

for (i = 1; i <= 100; i++)

{

for (j = 1; j <= 100; j++)

{

for (k = 1; k <= 100; k++)

{

var_by_txt("set", "var_"+itoa(i)+"_"+itoa(j)+"_"+ itoa(k),

"значение для переменной " + itoa(i) + "_" + itoa(j) + "_" + itoa(k));

}

}

}


init

Семантика языка C++ для ARCHICAD ›› Пакетное объявление и обращение к переменным через идентификаторы, задаваемые текстом - var_by_txt() ››

Объявление переменных с идентификаторами, формируемыми в тексте программы.

Вызов:

var_by_txt("init", string string_with_varnames, string vartype, string local_or_global, void preset_value);

Здесь:

string_with_varnames - строка, содержащая один или список идентификаторов переменных через запятую ("var1" или "var1,var2,var3").

vartype - тип объявляемой переменной - "string", "int", "double", "bool".

local_or_global - в каком уровне видимости создавать переменные - "global" или "local".

preset_value - значение, присваиваемое переменным по умолчанию.

Глобальные переменные можно создавать в цикле.

Локальные переменные в цикле или в других случаях с применением фигурных скобок, создавать нельзя, т.к. после выхода из понижающей области {} они удаляются.
Это как бы мы написали:

if(...)

{

// объявляем локальную переменную k в пониженной области видимости

int k = 1;

}

// здесь, за пределами фигурных скобок уже локальная переменная k не существует.

Чтобы выполнить массовое объявление локальных переменных - сначала сформируйте строку с идентификаторами через запятую, а затем выполните функцию var_by_txt("init"...).

Повторное объявление глобальных переменных может привести к ошибке.

Чтобы избежать этого используйте var_by_txt("is_exist",...).

Пример.

//************************************************************

// Создание переменных с идентификаторами из текстовой строки

// функция var_by_txt()

// LABPP 2021

//************************************************************

int main()

{

test_global_variables();

test_local_variables();

}

// Сформировать имя для переменной

string make_varname(string base, int ii, int jj)

{

return base + "_" + itoa(ii) + "_" + itoa(jj)

}

int test_global_variables()

{

int i,j;

string basename = "glob_var";

cout << "---------------------------\n";

cout << "test_global_variables\n";

// если ранее не создана переменная с именем "glob_var_0_0", то создать все переменные от "glob_var_0_0" до "glob_var_9_9"

if (var_by_txt("is_exist",make_varname(basename,0,0))==false)

{

for (i = 0; i < 10; i++)

{

for (j = 0; j < 10; j++)

{

cout << "объявляем переменную " << make_varname(basename,i,j) << "\n";

var_by_txt("init", make_varname(basename, i, j), "string", "global", "glob value " + itoa(i) + "_" + itoa(j));

}

}

}

string s = glob_var_7_7;

coutvar << s;

glob_var_7_7 = "new value for 7_7";

cout << "Все значения созданных глобальных переменных:\n";

string varname;

for (i = 0; i < 10; i++)

{

for (j = 0; j < 10; j++)

{

varname = make_varname(basename, i, j);

cout << varname + "="<< var_by_txt("get", varname) << "\n";

}

}

return 0;

}

// тест для локальных переменных

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

// { }

// иначе это понижает область видимости.

// Поэтому для локальных переменных сначала формируем строку с именами переменных через запятую.

// Такой прием возможен и для глобальных переменных.

int test_local_variables()

{

int i, j;

string basename = "local_var";

cout << "---------------------------\n";

cout << "test_local_variables\n";

string string_with_varnames;

cout << "формируем список имен переменных в строку через запятую\n";

for (i = 0; i < 10; i++)

{

for (j = 0; j < 10; j++)

{

string_with_varnames += make_varname(basename, i, j) + ",";

}

}

coutvar << string_with_varnames;

// создаем переменные от "local_var_0_0" до "local_var_9_9", инициируем пустой строкой (можно другим значением)

var_by_txt("init", string_with_varnames, "string", "local", "");

// присвоение значений

for (i = 0; i < 10; i++)

{

for (j = 0; j < 10; j++)

{

var_by_txt("set", make_varname(basename, i, j), "local value " + itoa(i) + "_" + itoa(j));

}

}

// прямое обращение к переменной

string s = local_var_7_7;

coutvar << s;

local_var_7_7 = "new value for 7_7";

cout << "Все значения созданных локальных переменных:\n";

string varname;

for (i = 0; i < 10; i++)

{

for (j = 0; j < 10; j++)

{

varname = make_varname(basename, i, j);

cout << varname + "=" << var_by_txt("get", varname) << "\n";

}

}

return 0;

}


is_exist

Семантика языка C++ для ARCHICAD ›› Пакетное объявление и обращение к переменным через идентификаторы, задаваемые текстом - var_by_txt() ››

Проверить существует ли переменная с указанным идентификатором.

bool var_by_txt("is_exist", string varname);

Здесь varname - имя переменной, существование которой проверяем.


set

Семантика языка C++ для ARCHICAD ›› Пакетное объявление и обращение к переменным через идентификаторы, задаваемые текстом - var_by_txt() ››

Задать значение переменной с идентификатором, формируемым при помощи текстовой строки.

Вызов:

var_by_txt("set", string varname, void varvalue);

Здесь:

varname - имя переменной (например "var_0_10_343_34").

varvalue - значение для присвоения переменной.


get

Семантика языка C++ для ARCHICAD ›› Пакетное объявление и обращение к переменным через идентификаторы, задаваемые текстом - var_by_txt() ››

Получить значение переменной по идентификатору, формируемому в текстовой строке.

Вызов:

string s = var_by_txt("get", string varname);

double d = var_by_txt("get", string varname);

int i = var_by_txt("get", string varname);

bool b = var_by_txt("get", string varname);

Здесь varname - идентификатор переменной, заданный текстом ("var_320_ini" и т.п.).

К переменным, созданным массовым тиражом можно обращаться и по идентификатору:

s = var_320_ini;


Комментарии

Семантика языка C++ для ARCHICAD ››

Комментарий до конца строки - // комментарий

После // до конца строки выражение считается комментарием.

Пример:

int i = 0; // здесь мы объявляем переменную - целое число и присваиваем ему значение 0

Комментарий на нескольких строках /* комментарий */

Весть текст между обозначениями /* и */ независимо от количества строк считается комментарием.

Пример:

/*Если нужно написать длинное пояснение на нескольких строках в тексте программы

или закомментировать фрагмент программы,

то удобно сделать так*/


Организация циклов

Семантика языка C++ для ARCHICAD ››


Цикл for

Семантика языка C++ для ARCHICAD ›› Организация циклов ››

Классическая форма организации цикла для C++.

Можно прервать выполнение цикла в любом месте директивой break;

Примечание. Фигурные скобки обязательны. Объявление переменной цикла внутри конструкции for(... ) не допускается.

Пример.

Написать в окне сообщений фразу "Здравствуй Мир!" 10 раз.

int i;

for (i = 0; i < 10; i++)

{

cout << "Здравствуй Мир!";

}


Цикл do-while

Семантика языка C++ для ARCHICAD ›› Организация циклов ››

int i;

i = 0;

do {

cout << i; // Вывести в окно сообщений LabPP_Automat значение i

i++; // Увеличить i на 1

} while (i < 10) // Выполнять цикл покуда i меньше 10


Цикл while

Семантика языка C++ для ARCHICAD ›› Организация циклов ››

int i;

i = 0;

while (i < 10) {

cout << i;

i++;

}


Логические операции

Семантика языка C++ для ARCHICAD ››

== Равенство Истинно, если число или строка слева равно числу или строке справа
!= Неравенство Истинно, если число или строка слева НЕ равно числу или строке справа
< Меньше Истинно, если число слева меньше числа справа
<= Меньше или равно Истинно, если число слева меньше или равно числу справа
> Больше Истинно, если число слева больше числа справа
>= Больше или равно Истинно, если число слева больше или равно числу справа
&& Логическое И. Если выражение слева и справа истинны, то результат - истинно. Если хотя бы одно из выражений слева или справа ложно, то результат - ложно
|| Логическое ИЛИ. Если хотя бы одно выражение слева и справа истинны, то результат - истина. Если оба выражения ложны, то результат - ложно.


Условные переходы

Семантика языка C++ для ARCHICAD ››


Оператор if

Семантика языка C++ для ARCHICAD ›› Условные переходы ››

if (i < 0)

{

cout << "да";

}


Конструкция if-else

Семантика языка C++ для ARCHICAD ›› Условные переходы ››

if (i < 0) // Если выражение в скобках истинно, то выполняется первый фрагмент

{

cout << "да";

}

else // Если выражение в скобках ложно, то выполняется второй фрагмент

{

cout << "нет";

}


Конструкция if-else if-else

Семантика языка C++ для ARCHICAD ›› Условные переходы ››

if (i < 0) // Если выражение в скобках истинно, то выполняется первый фрагмент

{

cout << "i < 0";

}

else if (i == 0) // Если выражение в скобках истинно, то выполняется второй фрагмент

{

cout << "i = 0";

}

else // Если ни одно из выражений не истинно (пунктов else if может быть много)

{

cout << "i > 0";

}


Оператор switch

Семантика языка C++ для ARCHICAD ›› Условные переходы ››

switch (i)

{

case 1:

cout << "i=1";

break;

case 2:

cout << "i=2";

break;

case 10:

cout << "i=10";

break;

default:

// операторы, выполняемые при любом другом значении i

}


Создание собственных функций (подпрограмм)

Семантика языка C++ для ARCHICAD ››

Чтобы легче было понимать и корректировать текст программ можно ее фрагменты выделять в отдельные подпрограммы.

Так же поступают и с повторяющимися фрагментами, содержащими ощутимое количество строк текста программы.

Такие фрагменты записывают ниже функции main() после ее последней фигурной скобки.

Им дают название, оснащают входящими аргументами и возвращаемым значением.

Пример.

Вывести в окно сообщений текст, в зависимости от кода, передаваемого в подпрограмму.

int main()

{

cout << "Строка из функции с арг. 1= " << get_string(1) << ", то же но с арг. 2 = " << get_string(2);

}

// объявление функции, принимает аргумент arg - целое число.

// возвращает строковое значение.

string get_string(int arg)

{

string sresult;

if (arg == 1) // если arg равно 1

{

sresult = "строка 1"; // то присвоить переменной sresult это значение.

}

else if (arg == 2) // если же arg равно 2

{

sresult = "строка 2";

}

else // если же ни 1 ни 2, то при любом другом значении

{

sresult = "строка N"; // присвоить переменной sresult это значение.

}

return sresult; // вернуть в качестве значения функции содержимое переменной sresult.

}

В подпрограмму могут передаваться сразу несколько переменных (аргументов). Тогда они пишутся через запятую.

Пример.

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

double my_func(int a, int b, double c)

{

return 10;

}

Благодаря тому, что текст С++ имеет высокую скорость выполнения, можно создавать любое количество собственных функций.


Директива #include

Семантика языка C++ для ARCHICAD ››

Чтобы использовать один и тот же текст или подпрограммы в разных программных файлах удобно выносить текст программ в заголовочные файлы. Обычно на языке C++ таким файлам дают расширение .h или .hpp.

Пример.

#include "my_heading.hpp"

В этом месте программы будет вставлен код, находящийся в файле my_heading.hpp.

В отличии от обычного программного файла, код в подключаемом файле не должен содержать функцию main()

Если по каким-то причинам файл не будет найден во время выполнения - то будет сообщение об ошибке.

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

#include "..\\my_heading.hpp"


Особая конструкция cpp для ARCHICAD - управляемый #include

Семантика языка C++ для ARCHICAD ›› Директива #include ››

Чтобы иметь возможность управлять содержимым программы в зависимости от параметров проекта можно вставлять особую конструкцию #include с автотекстом внутри.

#include <?PInfo Имя пользовательской переменной в информации о проекте?>
или
#include <?PInfo Имя пользовательской переменной в информации о проекте|альтернативное имя файла.ext?>

Здесь:

PInfo - генезис переменной, откуда следует взять имя файла для #include (PInfo - информация о проекте).

Имя пользовательской переменной в информации о проекте = буквально название переменной из информации о проекте, которая содержит имя файла, который следует подключить директивой #include.

альтернативное имя файла.ext = имя файла, которое препроцессору следует использовать если переменная в проекте отсутствует.


Директива #pragma region

Семантика языка C++ для ARCHICAD ››

#pragma region Создание диалога

// здесь код создания диалога, который может сворачиваться редактором текста

#pragma endregion


Поиск по шаблону (коды REGEX)

Семантика языка C++ для ARCHICAD ››

Вы можете организовать поиск в таблицах или выбор элементов из модели по числовым или текстовым данным.

Текст можно сравнивать по точному совпадению, частично или по встречающимся фрагментам, удовлетворяющим условию.

Удобно, например, когда надо выбрать строки со словом, например, "стена" в любом месте текста.

Тогда для выборки мы зададим строку ".*стена.*".

Здесь .* означают клюбой символ повторенный сколько угодно раз. Т.е. сколько угодно до фрагмента "стена"и сколько угодно после.

Но вероятно где-то есть слово с большой буквы.

Тогда мы пишем ".*[Сс]тена.*". Или даже кто-то написал букву С из английской раскладки.

Можем это учесть - ".*[CcСс]тена.*".

В коде можно указать символ ^ - начало текста и $ - конец текста.

Кодировка REGEX дает широчайшие возможности для гибкой выборки в различных случаях обработки текстовой информации при выборках и т.п.

Например это можно использовать в выборке элементов по названию класса, слоя, ID и т.п.

Пример

Если пустая строка или есть русские буквы или есть символ # - то истина

"(^(?![\\w\\W]))|(?:.*[а-я].*)|(?:.*[#].*)"

Пример

Проверить на наличие текста "подстрока1" или "подстрока2" в любом месте текста:

"(?:.*подстрока1.*)|(?:.*подстрока2.*)"

Пример2

Выбрать внутренние стены в список №1, у которых есть строительный материал не тоньше 250мм, с именем, которое содержит:

...Кирпич ... керамич...

...кирпич ... керамич...

или

...керамич...Кирпич...

...керамич...кирпич...

ac_request_special("load_elements_list", 1, "WallType", 2,

"", "Cls", "Классификация АРХИКАД", "ВВЕТВИ", "Стена из кирпича", "", "И",

"", "UPub", "Расположение", "=", "Внутри", "", "И",

"", "EP", "buildingMaterialName_thickness(\"(?:.*[Кк]ирпич.*керамич.*)|(?:.*керамич.*[Кк]ирпич.*)\")", ">=", 0.250, "", "");

Для тестирования выражений используйте специальную панель, которая идет в комплекте с программами LABPP.

Она запускается через BIM Master.

Панель BIM Master вызывается через (Ctrl+Shift+F9).


Логическое И и логическое ИЛИ в регулярных выражениях

Семантика языка C++ для ARCHICAD ›› Поиск по шаблону (коды REGEX) ››

Символ | между скобками или текстом означает ИЛИ.

Отсутствие этого символа означает И.

Например если надо отобрать текст со словосочетаниями

кирпичный завод

кирпичного завода

завода кирпичного

завод кирпичный

около завода кирпичного стоит другой кирпичный завод

Подойдет такой шаблон:

(?=.*кирпич(ный|ного).*завод.*)|(?=.*завод.*кирпич(ный|ного).*)

Между скобками стоит знак | - это означает что подойдет, если сработает ИЛИ то ИЛИ это.

Но если знак | убрать - это будет означать, что мы хотим чтобы было И то И это.

Т.е. выражение:

(?=.*кирпич(ный|ного).*завод.*)(?=.*завод.*кирпич(ный|ного).*)

отберет нам только текст

около завода кирпичного стоит другой кирпичный завод

Это потому, что в тексте одновременно встречаются оба фрагмента - И тот И этот.

Логическое отрицание - знак !

Если написать так:

(?=.*кирпич(ный|ного).*завод.*)(?=.*завод.*кирпич(ный|ного).*)(?!.*силикат.*)

То будет отброшен текст

около завода кирпичного стоит другой кирпичный завод силикатного кирпича


Функции для работы с оболочкой shell_func

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


get_path

Функции для работы с оболочкой shell_func ››

Получить каталог или путь к файлу.

Вызов:

int res = shell_func("get_path", string what, string result);

Переменная what задает тип возвращаемого пути:

"rootconfig" - каталог, где находится список конфигураций (tsprglist) LabPP_Automat;

"tsimages" - каталог, где находятся иконки конфигурации LabPP_Automat;

"tsprg" - каталог, где находятся программы текущей конфигурации LabPP_Automat;

"lib" - каталог, где находятся библиотечные элементы текущей конфигурации LabPP_Automat;

"rootaddons" - каталог, где находится сам аддонс LabPP_Automat или другое приложение, которое запустило текущий скрипт на выполнение;

"tmp" - каталог для временных файлов, по умолчанию, или заданный командой SETCFG("TMPFolder", string sTMPFolder);

"currentcpp" - каталог, где находится текущий скрипт;

"currentcppfiles" - подкаталог "files".

"currentcppfilename" - имя файла текущего скрипта (если он запущен из файла а не создан на лету из строки);

"curdir" - текущий каталог;

Результат записывается в переменную result


set_cur_dir

Функции для работы с оболочкой shell_func ››

Вызов:

int res = shell_func("set_cur_dir", string path_or_what);

path_or_what - может быть путь ("c:\\my_dir\\") или директива:

"rootconfig" - каталог, где находится список конфигураций (tsprglist) LabPP_Automat;

"tsimages" - каталог, где находятся иконки конфигурации LabPP_Automat;

"tsprg" - каталог, где находятся программы текущей конфигурации LabPP_Automat;

"lib" - каталог, где находятся библиотечные элементы текущей конфигурации LabPP_Automat;

"tmp" - каталог для временных файлов, по умолчанию, или заданный командой SETCFG("TMPFolder", string sTMPFolder);

"rootaddons" - каталог, где находится сам аддонс LabPP_Automat или другое приложение, которое запустило текущий скрипт на выполнение;

"currentcpp" - каталог, где находится текущий скрипт;

"currentcppfiles" - подкаталог "files".

Пример. Установить текущий каталог "C:\MyDir":

string mydir = "C:\\MyDir";

int res = shell_func("set_cur_dir", mydir);

if (res == 0)

{

cout << "Рабочий каталог успешно изменен";

}

else

{

cout << "Установить каталог на " << mydir << " не удалось";

}


shellexecute

Функции для работы с оболочкой shell_func ››

Выполнить операцию программной оболочки.

Обращение.

int res = shell_func("shellexecute", "open", string spath);

Здесь:

spath - путь к программе или файлу, который надо открыть.

Можно открывать файлы, отправлять их на печать и т.д. при помощи соответствующей программы, заданной на уровне операционной системы.
Пример. Открыть файл "Пример.xls", находящийся в каталоге текущей конфигурации LabPP_Automat.

int res = shell_func("set_cur_dir", "rootconfig");

if (res != 0)

{

return -1;

}

res = shell_func("shellexecute", "open", "Пример.xls");

Будет открыт файл Пример.xls при помощи той программы, которая используется по умолчанию для файлов с расширением .xls на компьютере пользователя. Обычно это EXCEL.
Так можно открывать файлы EXCEL из ARCHICAD.


ExecCmd

Функции для работы с оболочкой shell_func ››

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

Вызов:

int ierr = shell_func("ExecCmd", string exenamewithargs, string sresult);

Здесь:

exenamewithargs - имя стороннего программного модуля с аргументами.

Если в пути или имени или аргументах есть пробелы - то пишется в кавычках.

sresult - содержимое консольного вывода этого модуля.

Возвращаемое значение:

-1 - ошибка.

0 - успешное выполнение модуля;

Пример.

Выполнить сторонний программный модуль "TSChild Process.exe" с аргументами "Аргумент 1" и "Аргумент 2" и вывести в окно сообщений.

int main()

{

string sresult;

int ires = shell_func("ExecCmd", "\"C:\\source\\TSChild Process.exe\" \"Аргумент 1\" \"Аргумент 2\"", sresult);

coutvar << sresult;

coutvar << ires;

}

Результат выполнения скрипта в окне сообщений:

Текст исполняемого модуля "TSChild Process.exe" на языке Си++

//************************************************

// Этот exe модуль запускается и пишет на консоли

//************************************************

#include <iostream>

using namespace std;

int main(int argc, char* argv[])

{

if (argc == 2)

{

cout << "Hello World! Привет! " << argv[1] << "\n";

}

else if (argc == 3)

{

cout << "Hello World! Привет! " << argv[1] << " " << argv[2] << "\n";

}

else

{

cout << "Мало аргументов\n";

}

return 1;

}

//***********************************************


file

Функции для работы с оболочкой shell_func ››


copy

Функции для работы с оболочкой shell_func ›› file ››

Копирует файлы.

Вызов:

int err = shell_func("file", "copy", string spath_from, string spath_to);

Здесь:

spath_from - путь к файлу, из которого копируем,

spath_to - путь к файлу, в который копируем.

Возвращаемое значение:

0 - копирование прошло успешно;

-2222 - не найден исходный файл;

-2223 - файл уже существует;

-2224 - устройство переполнено;

-2225 - недостаточно прав пользователя.

-1 - общая ошибка.


is_exist

Функции для работы с оболочкой shell_func ›› file ››

Проверить наличие файла с заданным именем в заданном месте.

Вызов:
int ires = shell_func("file", "is_exist", string spath, bool bexist);

Здесь:

spath - полный путь к файлу, который надо проверить на существование.

bexist - возвращаемое значение (1/0 - файл существует/файл не существует).


delete

Функции для работы с оболочкой shell_func ›› file ››

Удалить заданный файл.

Вызов:

int ires = shell_func("file", "delete", string spath);

Здесь:

spath - полный путь к файлу, который надо удалить.

Пример:

Удалить файл, если он существует.

string filename = "h:\\1.tmp";

ires = shell_func("file", "is_exist", filename, bexist);

if (bexist)

{

cout << "Удаляем файл " << filename << "\n";

ires = shell_func("file", "delete", filename);

}


get_SLANG_CODE

Функции для работы с оболочкой shell_func ››

Получить код языка ("RUS", "INT" и т.п.) на котором работает скрипт в данный момент .

Вызов:

shell_func("get_SLANG_CODE", sLANG);

Код языка | Значение
"CHN" | Китайский упрощенный
"DEU" | Немецкий
"FRA" | Французский
"INT" | Аглийский
"ITA" | Итальянский
"JPN" | Японский
"KOR" | Корейский
"POL" | Польский
"PRT" | Португальский
"RUS" | Русский


Управление окнами labpp

Эти инструкции позволяют управлять немодальными (плавающими) окнами.

Вызов:

int ErrCode = labpp_windows_list_dialog(string sCommand);

Здесь:

sCommand - текстовая команда.

"HideAllWindows" - скрыть все окна приложения LabPP;

"ShowAllWindows" - показать все окна приложения LabPP, которые были открыты, включая окна BIM Master'а и окна диалога формирования фильтра;

"SwitchWindowsVisible" - переключить видимость окон (если отображались, то спрятать и наоборот).


Буффер обмена Windows

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


clipboard_get

Буффер обмена Windows ››

Получить скопированный фрагмент текста из буффера Windows в строковую переменную.

Вызов:

ac_request_special("clipboard_get", string str);


clipboard_set

Буффер обмена Windows ››

ac_request_special("clipboard_set", str);


Функции автоматизации – Automate

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


CloseCurWindow

Функции автоматизации – Automate ››

Закрыть текущее окно.

Обращение.

int iret = ac_request("Automate",CloseCurWindow");

Возвращает 0 если окно успешно закрыто.


Zoom

Функции автоматизации – Automate ››

Показать в окне область заданного размера.

Обращение.

ac_request("Automate","Zoom",double minx, double miny, double maxx, double maxy);

Здесь:

minx, miny - координаты левого нижнего угла окна;

maxx, maxy - координаты правого верхнего угла окна.


GoToView

Функции автоматизации – Automate ››

Переключает ARCHICAD на окно с указанным видом.

Обращение.

int ires = ac_request("Automate","GoToView",int iViewLinkGuid);

Здесь:

iViewLinkGuid - дескриптор объекта ts_guid в котором записан guid вида, в который нужно переключить окно.

Возвращает 0 при успешном переключении.


ChangeWindow

Функции автоматизации – Automate ››

Изменить текущее окно.

Обращение.

int ires = ac_request("automate","ChangeWindow", int iDatabaseDescr);

Здесь: iDatabaseDescr - дескриптор объекта ac_database

Возвращает 0 при успешном переключении


ShowSelectionIn3D

Функции автоматизации – Automate ››

Показать только выбранные элементы в окне 3D.

Если в 2d окне выбраны элементы, то по этой команде открывается окно 3d и в нем показываются только они.

Аналогично нажатию клавиши F5.

Обращение.

ac_request("Automate","ShowSelectionIn3D");


ShowAllIn3D

Функции автоматизации – Automate ››

Показать все элементы в окне 3D.

Аналогично нажатию клавиши F5 при отсутствии выбора.

Обращение.

ac_request("Automate","ShowAllIn3D");


ZoomToElements

Функции автоматизации – Automate ››

Показать отобранные в список элементы в текущем окне (2d или 3d).

Обращение.

ac_request("Automate","ZoomToElements", int iListNumber);

или

ac_request("Automate","ZoomToElements", int iListNumber, double doffset);

Здесь:

iListNumber - номер внутреннего списка элементов.

doffset - расстояние, на которое увеличить или уменьшить базовый фокус в окне.


Redraw

Функции автоматизации – Automate ››

Перерисовать содержимое окна.

Обращение.

int res = ac_request("Automate","Redraw");


Rebuild

Функции автоматизации – Automate ››

Перестроить содержимое окна с или без перестроения всей модели.

Обращение.

int res = ac_request("Automate","Rebuild", bool doregenerate);

Здесь:

doregenarate - 0/1 - без перестроения или с перестроением модели.


Функции окружения - Environment

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


AddLibraries

Функции окружения - Environment ››

формат запроса:

int ires = ac_request("Environment","AddLibraries",string LibPath);


Story_GoTo

Функции окружения - Environment ››

Переход на этаж по индексу

Вызов:

int ires = ac_request("Environment","Story_GoTo", int storyindex);


Функции для работы с базами проекта - database

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


GetCurrent

Функции для работы с базами проекта - database ››

Получить текущую базу в объект базы данных, заданный дескриптором

Вызов:
int err = ac_request("database", "GetCurrent", int iDatabaseDescr);

Здесь:

err - отрицательное число (код ошибки) или 0 при успешном завершении операции;

iDatabaseDescr - дескриптор объекта базы данных

Пример.

int iDatabaseDescr;
object("create", "ac_database", iDatabaseDescr);
int err = ac_request("database", "GetCurrent", iDatabaseDescr);
courvar << err;


Select

Функции для работы с базами проекта - database ››

Показать в ARCHICAD окно базы данных, заданное дескриптором

Вызов:
int err = ac_request("database", "Select", int iDatabaseDescr);

Здесь:

err - отрицательное число (код ошибки) или 0 при успешном завершении операции;

iDatabaseDescr - дескриптор объекта базы данных

Пример.

Переключиться в окно 2D.

int iDatabase2d;
object("create", "ac_database", iDatabase2d);
ac_request("database", "SetType",iDatabase2d, 1);
ac_request("database", "Select", iDatabase2d);


SetTypeID

Функции для работы с базами проекта - database ››

Задать тип базе данных, на которую указывает дескриптор.

Вызов:

ac_request("database", "SetTypeID", int iDatabase, int itype);

Здесь:

iDatabase - дескриптор базы данных;

itype - код типа бд (окно 2d, окно 3d или пр.);

Числовое значение | Текстовое значение | Расшифровка
0 | ZombieWindow |
1 | FloorPlan | 2D окно
2 | Section | Сечение
3 | Detail | Окно детали
4 | 3DModel | 3D окно
5 | Wind_Layout | layout window
6 | Drawing | Чертеж
7 | MyText | custom text
8 | MyDraw | custom draw
9 | MasterLayout | master layout
10 | Elevation | elevation window
11 | InteriorElevation | interior elevation
12 | Worksheet | worksheet
13 | Report | report window
14 | DocumentFrom3D | 3D Document window
15 | External3D | External 3D
16 | Movie3D | movie 3D
17 | MovieRendering | movie rendering
18 | Rendering | rendering window
4096 | IESCommonDrawing | Interactive Schedule window


GetTypeID

Функции для работы с базами проекта - database ››

Получить тип базы данных, на которую указывает дескриптор.

Вызов:

ac_request("database", "GetTypeID", int iDatabase);

Здесь:

iDatabase - дескриптор базы данных;

itype - код типа бд (окно 2d, окно 3d или пр.);

Результат считывается следующим оператором ac_getnumvalue();

Пример.

int iDatabase;
object("create", "ac_database", iDatabase);
ac_request("database", "GetCurrent", iDatabase);
ac_request("database", "GetType", iDatabase);
int itype = ac_getnumvalue();
coutvar << itype;


GetLocOrigo

Функции для работы с базами проекта - database ››

Считать положение точки локального начала координат.

Вызов:

ac_request("database", "GetLocOrigo", int iDatabase, double& x_res, double& y_res, double& z_res);

Здесь:

iDatabase - дескриптор базы данных;

x_res, y_res, z_res - полученные координаты точки локального начала координат;

Пример.

int iDatabase;
object("create", "ac_database", iDatabase);
ac_request("database", "GetCurrent", iDatabase);

double x_res, y_res, z_res;
ac_request("database", "GetLocOrigo", iDatabase, x_res, y_res, z_res);
coutvar << x_res;

coutvar << y_res;

coutvar << z_res;


get_section_infoidtext

Функции для работы с базами проекта - database ››

Получить название сечения по его дескриптору.

Вызов:

int ires = ac_request("database", "get_section_infoidtext", int iDatabase, string & sectioninfoidtextres);

Здесь:

ires - код ошибки или 0;

iDatabase - дескриптор базы данных окна;

sectioninfoidtextres - полученное название сечения;

Пример:

int iDatabase;
object("create", "ac_database", iDatabase);
ac_request("database", "GetCurrent", iDatabase);

string sectioninfoidtextres;
ac_request("database", "get_section_infoidtext", iDatabase, sectioninfoidtextres);
coutvar << sectioninfoidtextres;


get_sectionmarkers2dpositions

Функции для работы с базами проекта - database ››

Получить координаты двух крайних точек обозначения сечения и угол линии между этими точками по дескриптору сечения.

Вызов:

int ires = ac_request("database", "get_sectionmarkers2dpositions", iDatabase, double& sx, double& sy, double& ex, double& ey, double& alph);

Здесь:

iDatabase - дескриптор базы данных окна сечения;

sx,sy,ex,ey - координаты крайних точек обозначения сечения в 2d окне;

alph - угол линии между крайними точками обозначения сечения в 2d окне.

Пример.

double alph;
int ires = ac_request("database", "get_sectionmarkers2dpositions", idatabase, sx, sy, ex, ey, alph);


GetRVMChanges

Функции для работы с базами проекта - database ››

Получить список всех изменений, связанных с базой данных окна.

Вызов:

int ires = ac_request("database","GetRVMChanges", int iDatabaseDescr, int iArrayDescr);

Здесь:

ires - код ошибки или 0;

iDatabaseDescr - дескриптор базы данных;

iArrayDescr - список изменений.

Пример.

Получить общее количество изменений, связанных с текущим окном.

int iArrayDescr;
int iDatabaseDescr;

object("create","ts_array",iArrayDescr);
object("create","ac_database", iDatabaseDescr);
ac_request("database","GetCurrent",iDatabaseDescr);

ts_array(iArrayDescr,"init","ac_RVMChange");
ac_request("database","GetRVMChanges",iDatabaseDescr,iArrayDescr);

int iSize;
ts_array(iArrayDescr,"GetSize",iSize);
cout << "Вообще с листом связано изменений=" << iSize << "\n";

object("delete",iArrayDescr);
object("delete",iDatabaseDescr);


GetRVMLayoutCurrentRevisionChanges

Функции для работы с базами проекта - database ››

Получить список изменений, связанных с базой данных окна, видимых на поле листа.

Вызов:

int ires = ac_request("database","GetRVMLayoutCurrentRevisionChanges", int iDatabaseDescr, int iArrayDescr);

Здесь:

ires - код ошибки или 0;

iDatabaseDescr - дескриптор базы данных;

iArrayDescr - список изменений.

Пример.

Получить общее количество изменений, связанных с текущим окном.

int iArrayDescr;
int iDatabaseDescr;

object("create","ts_array",iArrayDescr);
object("create","ac_database", iDatabaseDescr);
ac_request("database","GetCurrent",iDatabaseDescr);

ts_array(iArrayDescr,"init","ac_RVMChange");
ac_request("database","GetRVMLayoutCurrentRevisionChanges",iDatabaseDescr,iArrayDescr);

int iSize;
ts_array(iArrayDescr,"GetSize",iSize);
cout << "Число изменений, видимых на листе=" << iSize << "\n";

object("delete",iArrayDescr);
object("delete",iDatabaseDescr);


GetTypeName

Функции для работы с базами проекта - database ››

Получить название типа окна.

Вызов:

int ires = ac_request("database","GetTypeName", int iDatabaseDescr);

Здесь:

ires - код ошибки или 0;

iDatabaseDescr - дескриптор базы данных;

Название типа окна возвращается при помощи ac_getstrvalue();

Пример.

string stypename;
int ires = ac_request("database","GetTypeName", iDatabaseDescr);
if(ires == 0){
stypename = ac_getstrvalue();
}

Возвращаемые значения:

"ZombieWindow"

"FloorPlan";

"Wind_Section";

"Wind_Detail";

"Wind_3DModel";

"Wind_Layout";

"Wind_Drawing";

"Wind_MyText";

"Wind_MyDraw";

"Wind_MasterLayout";

"Wind_Elevation";

"Wind_InteriorElevation";

"Wind_Worksheet";

"Wind_DocumentFrom3D";

"Wind_IESCommonDrawing";


GetSizeX, GetSizeY

Функции для работы с базами проекта - database ››

Получить размеры листа.

Вызов:

int ires = ac_request("database","GetSizeX", int iDatabaseDescr);

int ires = ac_request("database","GetSizeY", int iDatabaseDescr);

Здесь:

ires - код ошибки или 0;

iDatabaseDescr - дескриптор базы данных;

Размер возвращается при помощи ac_getnumvalue();

Пример.

int iDatabase;
object("create", "ac_database", iDatabase);
ac_request("database", "GetCurrent", iDatabase);

ac_request("database","GetSizeX", iDatabaseDescr);

double sizeX = ac_getnumvalue();

ac_request("database","GetSizeY", iDatabaseDescr);

double sizeY = ac_getnumvalue();

object("delete", iDatabase);


leftMargin,topMargin,rightMargin,bottomMargin

Функции для работы с базами проекта - database ››

Получить отступы на листе.

Вызов:

int ires = ac_request("database","leftMargin", int iDatabaseDescr);

int ires = ac_request("database","topMargin", int iDatabaseDescr);

int ires = ac_request("database","rightMargin", int iDatabaseDescr);

int ires = ac_request("database","bottomMargin", int iDatabaseDescr);

Здесь:

ires - код ошибки или 0;

iDatabaseDescr - дескриптор базы данных;

Размер возвращается при помощи ac_getnumvalue();

Пример.

int iDatabase;
object("create", "ac_database", iDatabase);
ac_request("database", "GetCurrent", iDatabase);
ac_request("database","leftMargin", iDatabaseDescr);
double leftmargin = ac_getnumvalue();
coutvar << leftmargin;
object("delete", iDatabase);


layoutPageNumber

Функции для работы с базами проекта - database ››

Получить число страниц на листе.

Вызов:

int ires = ac_request("database","layoutPageNumber", int iDatabaseDescr);

Здесь:

ires - код ошибки или 0;

iDatabaseDescr - дескриптор базы данных;

Количество страниц возвращается при помощи ac_getnumvalue();

Пример.

int iDatabase;
object("create", "ac_database", iDatabase);
ac_request("database", "GetCurrent", iDatabase);
ac_request("database","layoutPageNumber", iDatabaseDescr);
double layoutPageNumber = ac_getnumvalue();
coutvar << layoutPageNumber;
object("delete", iDatabase);


layoutName

Функции для работы с базами проекта - database ››

Получить название листа.

Вызов:

int ires = ac_request("database","layoutName", int iDatabaseDescr);

Здесь:

ires - код ошибки или 0;

iDatabaseDescr - дескриптор базы данных;

Название листа возвращается при помощи ac_getstrvalue();

Пример.

int iDatabase;
object("create", "ac_database", iDatabase);
ac_request("database", "GetCurrent", iDatabase);
ac_request("database","layoutName", iDatabaseDescr);
string layoutName = ac_getstrvalue();
coutvar << layoutName;
object("delete", iDatabase);


Вывод в окно сообщений

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


cout

Вывод в окно сообщений ››

Команда cout позволяет выводить информацию в окно сообщений. Числовые данные преобразуются автоматически.

Формат команды:

cout << arg1 << arg2 << argN;

Здесь:

arg1, arg2, argN - любое количество переменных любого типа.

Пример.

Вывести в окно сообщений результат вычисления суммы площадей всех квартир из переменной dsum

cout << "Площадь всех квартир = " << dsum;


coutvar

Вывод в окно сообщений ››

Вывести информацию о значении переменной вместе с ее именем.

Удобно во время отладки программ.

Вызов:

coutvar << my_variable;


setcfg("COUT",...)

Вывод в окно сообщений ››

Включить или выключить вывод сообщений.

Вызов:

setcfg("COUT", int onoff);

здесь onoff - 0/1 запретить/разрешить вывод сообщений.

Если задать 0, то все команды cout и coutvar будут игнорироваться до следующей команды с ключем 1.


Файловые операции

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


open

Файловые операции ››

Открыть файл

Int ires = ts_file(int iFileDescr, "open", string filepath, string what, string mode);

Здесь: iFileDescr - дескриптор объекта файла, полученный при создании объекта командой object("create"..., filepath - путь к файлу в файловой системе, what - что делать если файл не найден ("create" - создать новый, "fail" - выдать ошибку и остановиться, "ignore" - игнорировать и продолжить).

mode - режим открытия файла:

"r" - только для чтения

"w" - только для записи

"we" - для записи очистить файл

"rw" - для чтения и записи

"a" - добавления в конец файла

ires = ts_file(iFileDescr, "open",filepath,"create","we");


write

Файловые операции ››

Записать в файл

int ires = ts_file(int iFileDescr, "write",string stowrite);

Здесь: iFileDescr - дескриптор объекта файла, stowrite - строка для записи в файл. Возвращает 0, если запись прошла успешно. Количество записанных символов можно считать при помощи функции ac_getnumvalue();


read

Файловые операции ››

Считать из файла

int ires = ts_file(int iFileDescr, "read",string &storead);

Здесь: iFileDescr - дескриптор объекта файла, storead - текстовая переменная для считывания из файла. Возвращает 0, если запись прошла успешно. Количество считанных символов можно считать при помощи функции ac_getnumvalue().


close

Файловые операции ››

Закрыть файл

int ires = ts_file(Int iFileDescr,"close");

Здесь: iFileDescr - дескриптор объекта файла. Возвращает 0 при успешном закрытии файла.

Пример.

Создать файл "my_file.txt" на диске "C:" в корневом каталоге и записать в него несколько строк.

string filepath = "c:\\my_file.txt";

int iFileDescr;

object("create", "ts_file", iFileDescr); // создать объект типа файл в памяти

// открыть для записи чистый файл, если его нет, то создать

int ires = ts_file(iFileDescr, "open", filepath, "create", "we");

if (ires != 0)

{

cout << "Файл не удалось открыть:" << filepath; // выдать в окно сообщений

return;

}

ires = ts_file(iFileDescr, "write", "Первая строка\nВторая строка\n"); // записать в файл две строки

if (ires != 0)

{

cout << "Не удалось записать в файл";

return;

}

ires = ts_file(iFileDescr, "write", "Третья строка"); // записать третью строку

ires = ts_file(iFileDescr, "close"); // закрыть файл

object("delete", iFileDescr); // удалить объект файла из памяти

cout << "Завершение программы \n";


SetIsUNICODE

Файловые операции ››

Вызов:

ts_file(iFileDescr, "SetIsUNICODE");

Команда указывает что файл содержит данные в кодировке UTF-8.


SetIsUTF16

Файловые операции ››

Вызов:

ts_file(iFileDescr, "SetIsUTF16");

Команда указывает что файл содержит данные в кодировке UTF-16.

Пример.

Считать таблицу из файла, созданного Excel командой "Сохранить текст в Unicode" (сохраняется таблица с разделителем - табуляция, в кодировке UTF-16).

int main()

{

int iTable;

object("create", "ts_table", iTable);

string sFullPath = "c:\\1.txt";

string csv_source = "";

int iFileDescr;

object("create", "ts_file", iFileDescr);

ts_file(iFileDescr, "SetIsUTF16");

int ires = ts_file(iFileDescr, "open", sFullPath, "ignore", "r");

if (ires == 0)

{

ts_file(iFileDescr, "read", csv_source);

ts_file(iFileDescr, "close");

coutvar << csv_source;

ts_table(iTable, "import_from_csv", csv_source, "\t");

string str;

ts_table(iTable, "print_to_str", str);

coutvar << str;

}

else

{

tsalert(-1, "Error", "Can't open file " + sFullPath, "Check availability of the file", "Ok");

return -1;

}

object("delete", iTable);

object("delete", iFileDescr);

}


Строковые функции

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


strcmp

Строковые функции ››

Сравнение двух строк.

Вызов:

bool result = strcmp(string s1, string s2);

Здесь:

string1 и string2 - строковые переменные для сравнения

Функция возвращает 1 если строки полностью совпадают


tolower

Строковые функции ››

Перевести все символы строки в нижний регистр

Вызов:

string sresult = tolower(string svalue);


toupper

Строковые функции ››

Перевести все символы строки в верхний регистр

Вызов:

string sresult = toupper(string svalue);


alltrim

Строковые функции ››

Удалить с начала и с конца строки все пробелы

Вызов:

string sretult = alltrim(string svalue);


strcontains

Строковые функции ››

Проверяет содержит ли строка указанный фрагмент.

Обращение

int ires = strcontains(string sstring, string sfragment);

Здесь:

sstring - строка, в которой нужно узнать есть ли фрагмент sfragment. Если да, то ires получит 1.


strreplace

Строковые функции ››

Заменить в строке все фрагменты на другие фрагменты.

Вызов:

string sresult = strreplace(string s, string fragmentold, string fragmentnew, int how, int pos, int count);

Здесь:

s - строка, в которой произвести замену фрагмента fragmentold на fragmentnew,

how - откуда отступить начало - 0/1/2 - все/от начала/от конца

pos - сколько отступить

count - сколько заменять (-1 - полностью).

Пример.

Перевести число с плавающей точкой в строку и заменить точку, разделяющую целую и дробную часть на запятую.

double d_value = 126.983;
string s_value = sprintf("%10.3f", d_value);
s_value = strreplace(s_value, ".", ",", 0, 0, -1);
Результат - 126,983


strlen

Строковые функции ››

Получить длину строки.

Вызов:

int ilen = strlen(string s);

Здесь:

s - строка


substr

Строковые функции ››

Отрезать часть строки.

Вызов:

string substr(string source, int startpos, int count);

Здесь:

source - исходная строка, от которой требуется отрезать часть,

startpos - стартовая позиция в строке,

count - количество символов (если -1, то отрезать все до конца).


strposcharset

Строковые функции ››

Установить символ в строке в заданной позиции. Если строка короче - вернуть -1
Отсчет начинается от 0, т.е. первый символ имеет позицию 0.

Вызов:

int strposcharset(string sourcestr, int ipos, char chartoplace, string &strresult);

Здесь:

sourcestr - исходная строка;

ipos - позиция, в которой произвести замену;

chartoplace - символ, на который заменить.

strresult - строка результат.

Пример:

Считать из позиции 2 символ в строке "ABCDE" и записать символ '_' в позицию 4 этой строки.

char ch;

string st, strresult;

st = "ABCDEF";

int iret = strposcharget(st, 2, ch);

coutvar << ch ;

ch = 'W';

iret = strposcharset(st, 1, ch, strresult);

coutvar << strresult;

В итоге в окно сообщений будет выведено:

B

ABCD_F


strposcharget

Строковые функции ››

Получить символ в строке. если строка короче - вернуть -1

Вызов:

int strposcharget(string sourcestr, int ipos, char &charres);


strleft

Строковые функции ››

Получить левую часть строки разделенной фрагментом (сам фрагмент в результат не включается).

Вызов:

string strleft(string str, string substr, bool isfromlast=false);

Здесь:

str - исходная строка,

substr - фрагмент-разделитель.

Если указано isfromlast и оно true - то при наличии нескольких фрагментов считать разделителем последний фрагмент.


strright

Строковые функции ››

Получить правую часть строки разделенной фрагментом.

Вызов:

string strright(string str, string substr, bool isfromlast=false);

Здесь:

str - исходная строка,

substr - фрагмент-разделитель.

Если указано isfromlast и оно true - то при наличии нескольких фрагментов считать разделителем последний фрагмент.

Сам разделяющий фрагмент в результат не записывается


str_regex_search

Строковые функции ››

Проверить строку на наличие фрагмента шаблона регулярного выражения.

В отличии от команды str_regex_match(), шаблон может содержать конструкции типа (?=text) и (?!text). Это позволяет делать запросы с тестированием на то, что строка содержит какие-то фрагменты, а другие фрагменты не содержит.

Например:

(?=Утеплитель)(?=.*минерал.*)(?=.*ват.*)(?!.*рулон.*)

Это означает, что мы хотим выбрать строки, подержащие такой текст:

Минераловатный утеплитель

Утеплитель из минеральной ваты

Утеплитель из минерало-ватных плит

Но в выборку не попадут

Утеплитель рулонный из минеральной ваты

Это удобно, если нужно одним оператором проверить наличие в тексте, например, фрагмента типа "В22", когда есть вероятность, что это написано большой 'В', или маленькой 'в', на английском или русском алфавите (см regex шаблоны) .

Вызов:

bool str_regex_search(string source, string code);

Здесь:

source - строка, в которой производится поиск,

code - регулярное выражение.


str_regex_match

Строковые функции ››

Проверить строку на соответствие шаблону регулярного выражения.

Например, мы можем протестировать соответствует ли текст по форме записи адреса email или форме записи даты или номера телефона и т.п.

Это удобно, если нужно одним оператором проверить наличие в тексте, например, фрагмента типа "В22", когда есть вероятность, что это написано большой 'В', или маленькой 'в', на английском или русском алфавите (см regex шаблоны) .

Вызов:

bool str_regex_match(string source, string code);

Здесь:

source - строка, в которой производится тестирование на соответствие шаблону,

code - регулярное выражение.

Пример.

Проверить соответствует ли текст форме записи адреса email в домене ru.

string code = ".*@.*\.ru";

// шаблон читается как - впереди идет что угодно, затем символ @ затем что угодно, затем точка ру.


str_regex_replace

Строковые функции ››

Заменить фрагмент текста по шаблону regex (регулярные выражения).

Вызов:

string sResult = str_regex_replace(string sCodedValue, string sOriginalValue, string sReplaceFragment);

Здесь:

sCodedValue - шаблон для поиска в формате регулярных выражений (regex, типа "abc[12]"),

sOriginalValue - исходный текст, где требуется заменить фрагменты, удовлетворяющие шаблону,

sReplaceFragment - фрагмент, на который надо заменить все эти фрагменты.

В sResult - результат операции.

Если фрагменты, удовлетворяющие шаблону не найдены, то возвращается строка sOriginalValue без изменения.

Пример.

Заменить в тексте "123 abc 456" часть 12 и 6 на символ #.

string sres = str_regex_replace("(?:12)|(?:[6])", "123 abc 456", string "#");
coutvar << sres;

Результат:

sres = "#3 abc 45#"

Пример.

Выделить из значения заданного пользовательского свойства элемента число слева в конструкции "10001m" или "2200k" при условии, что буква может быть любая.

ac_request_special("get_element_value", "UP", "Технические переменные для отверстий для LabPP\\Маркировка отверстия");

svalue = ac_getstrvalue();

svalue = str_regex_replace("[a-z]", svalue, "#");

svalue = strleft(svalue, "#");

coutvar << svalue;

Результат:

10001 2200 и т.п. в зависимости от значения свойства.


str_regex_substr

Строковые функции ››

Получить из текста подстроку, соответствующую шаблону.

Вызов:

bool str_regex_substr(string source, string code, string usSubstrRes, string usPrefix, string usSuffix);

Здесь:

source - строковая переменная с текстом, из которого требуется получить текст, соответствующий шаблону;

code - шаблон;

usSubstrRes - реальный фрагмент из текста, соответствующая шаблону;

usPrefix - строка, предшествующая фрагменту текста;

usSuffix - строка за фрагментом до конца текста;

Возвращает true - если текст, соответствующий шаблону найден.

Пример: получить из текста ширину и высоту дверного блока

string s = "Дверной блок из алюминиевых профилей (BxH): 1400x2100 мм"; // исходный текст
string usSubstrRes, usPrefix, usSuffix;
string code = "\\(BxH\\)\\: \\d{1,}x.*\\d{1,}"; // шаблон означает: текст, у которого (BxH): "одна или несколько цифр" x "одна или несколько цифр"
bool b = str_regex_substr(s, code, usSubstrRes, usPrefix, usSuffix);
if (b)
{
coutvar << usSubstrRes; // в окно сообщений будет выведено "(BxH): 1400x2100 мм"
code = "\\d{1,}"; // шаблон означает: текст, у которого "одна или несколько цифр"
b = str_regex_substr(usSubstrRes, code, usSubstrRes, usPrefix, usSuffix);
coutvar << usSubstrRes; // в окно сообщений будет выведено "1400"
if (b)
{
code = "\\d{1,}"; // шаблон означает: текст, у которого "одна или несколько цифр"
// для поиска второго числа используем суффикс от прошлого поиска
b = str_regex_substr(usSuffix, code, usSubstrRes, usPrefix, usSuffix);
coutvar << usSubstrRes; // будет выведено "2100"
}
}


straddslashtoregexcodes

Строковые функции ››

заменить в строке '.' на '\.' , '[' на '\[', '(' на '\(' и т.д. для точного сравнения.

Вызов:

string straddslashtoregexcodes(string source);


strremovebaddelimiters

Строковые функции ››

Убрать из текста определенные засоряющие разделители.

Убираются разделители перед и в конце строки. Вместо них ставиться "".

А так же убираются серии разделителей, идущие подряд через пробел вместе с пробелами перед такими сериями и после них.

Вместо серий из разделителей ставится один " ".

Вызов:

string strremovebaddelimiters(string originalstr, string delimiter);

Здесь:

originalstr - оригинальная строка, в которой требуется убрать мусор,

delimiter - разделитель. Он может состоять из нескольких символов, когда у вас текст разделен на части не одним знаком, а целой последовательностью (например "???!!!").

Пример.

Убрать засоряющие "," из текста

int main()
{
string s = ", text,, еще текст ,, , и еще вот текст, ";
string s2 = strremovebaddelimiters(s,",");
coutvar << s2;
// результат: "text еще текст и еще вот текст"
}


str2threekeys

Строковые функции ››

Выделить из строки три ключа для сортировки в таблицах (для 115.2 или 14а.1 и т.п.)

Вызов:

int str2threekeys(string sSource, double& k1,double &k2, double &k3);

Здесь:

sSource - исходная строка.

Функция возвращает кол-во ключей (числовых полей).

Она выявляет три числовых поля. Буквы приводит к числам 10000+код буквы,

в k1,k2 и k3 возвращаются числовые значения этих трех полей или ноль, если поле не найдено.


strCompareLikeABC10_a

Строковые функции ››

Сравнить строки по принципу номеров помещений.

Возвращает -1/0/1 если строка s1 < s2 / s1=s2/ s1 > s2.

Сравнение идет в нижнем регистре.

Вызов:
int strCompareLikeABC10_a(string s1, string s2);

Здесь:

s1 и s2 - сравниваемые строки.

Пример:

Сравнить выше или ниже по списку должно размещаться помещение с именем "ПОМЕЩЕНИЕ 102.2b" относительно помещения с именем "Помещение 102.3.b"

string s1 = "ПОМЕЩЕНИЕ 102.2b";
string s2 = "Помещение 102.3.b";

int ires = strCompareLikeABC10_a(s1, s2);

coutvar << ires;

Результат - в поле сообщений будет выведено значение -1. Это означает, что помещение 102.2b в списке должно располагаться раньше чем помещение 102.3.b.


strreplace_escape_u

Руководство по LABPP_Automat для ARCHICAD

Строковые функции ››

Заменить escape-последовательности типа "\u0420\u0435" на символы.

Вызов:

string strreplace_escape_u(string sSource);

возвращает строку с замененными на символы escape-последовательностями.


strisnumber

Строковые функции ››

Является ли строка числом.
Если в строковой переменной записано число, то возвращает 1, в проитвном случае возвращает 0.

Обращение

bool result = strisnumber(string str);

Здесь:

str - строковая переменная для определения текст это или число.


smallnums

Строковые функции ››

Перевести цифры в тексте в цифры в верхний регистр (unicode).

Вызов:

string sresult = smallnums(string str);

Здесь:

str - строковая переменная с числом.

Пример.

Записать в строковую переменную значение "м?".

string str = "Объем, м" + smallnums("2");


ts_text_mc

Строковые функции ››

Получить текст стандартного сообщения на языке программы.

Вызов:

string sresult = ts_text_mc(int itextcode);

Здесь:

itextcode - индекс сообщения по таблице значений.

Индекс | Текст
1 | Запуск
2 | Старт
3 | Отменить
4 | Продолжить
5 | Ошибка
6 | Информация
7 | Предупреждение
8 | Проверка
9 | Выполнить все
10 | Ok
11 | Создать
12 | Открыть
13 | Закрыть
14 | Считать
15 | Записать
16 | Да
17 | Нет
18 | Помощь

Пример.

Получить текст слова "Запуск" на том языке, на котором работает программа, запустившая скрипт на выполнение.

string str = ts_text_mc(1);


Объект ac_element_guid (ts_guid)

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Объект ac_element

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


ac_request

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


get_floor_name_by_floor_index

ac_request ››

Получить индекс этажа по его имени.

Вызов:

int ires = ac_request("get_floor_index_by_floor_name", string sStoryName);

Индекс этажа считывается вызовом ac_getnumvalue();

Возвращает в ires -1 если этажа с таким именем нет или возникла ошибка.

При успешном завершении возвращает 0.

Пример:

Получить индекс этажа с именем "2-й этаж" и вывести его в окно сообщений.

int ifloorindex;
int ires = ac_request("get_floor_index_by_floor_name", "2-й этаж");
if(ires == 0)
{
ifloorindex = ac_getnumvalue();
coutvar << ifloorindex;
}


get_floor_index_by_floor_name

ac_request ››

Получить имя этажа по его индексу.

Вызов:

int ires = ac_request("get_floor_name_by_floor_index", int iStoryIndex);

Имя этажа считывается вызовом ac_getstrvalue();

Возвращает в ires -1 если этажа с таким индексом нет или возникла ошибка.

При успешном завершении возвращает 0.

Пример:

Получить имя этажа с индексом 1 и вывести его в окно сообщений.

string sStoryName;
int ires = ac_request("get_floor_name_by_floor_index", "2-й этаж");
if(ires == 0)
{
sStoryName = ac_getstrvalue();
coutvar << sStoryName;
}


store_cur_element_to_descr

ac_request ››

Сохранить текущий элемент в объект ac_element_guid.

Чтобы работать с элементом через функции ac_request(... мы делаем элемент текущим. Например это делается когда мы загрузили элементы в один из внутренних списков и выбрали текущую позицию.
Но может потребоваться сохранить его уникальный номер для обработки другими функциями. Тогда создаем объект типа ac_element_guid. При создании объекта получаем его дескриптор - внутренний номер объекта. И с этим дескриптором обращаемся сюда. В результате - в объект ac_element_guid будет записан уникальный номер элемента.

Формат запроса:

ac_request("store_cur_element_to_descr", int &iGuidDescr);

Здесь iGuidDescr - дескриптор объекта типа ac_element_guid, в который будет сохранен уникальный номер текущего элемента.


set_current_element_from_descr

ac_request ››

Сделать текущим для работы с командами ac_reauest(... элемент из объекта ac_element_guid. Это по сути обратная операция указанной выше.

Формат запроса:

ac_request("set_current_element_from_descr", int &iGuidDescr);

Здесь iGuidDescr - дескриптор объекта типа ac_element_guid, который будет установлен в качестве текущего для работы с функциями ac_request(....


set_element_by_guidstr_as_current

ac_request ››

Сделать текущим для работы с командами ac_reauest(... элемент с GUID заданным текстовым аргументом.

Вызов:

ac_request("set_element_by_guidstr_as_current", string sGUID);

Здесь sGUID - текстовая переменная, в которой задан guid элемента текстом.


get_guid_from_element

ac_request ››

Получить уникальный номер элемента ARCHICAD из объекта типа ac_element в объект типа ac_element_guid.

Такое преобразование может потребоваться для технических целей.

Формат запроса:

ac_request("get_guid_from_element",int iElementDescr, int iGuidDescr);

Здесь:

iElementDescr - дескриптор объекта дипа ac_element, из которого будет записан уникальный код в объект типа ac_element_guid, на который указывает iGuidDescr.


load_element_from_guid

ac_request ››

Загрузить в объект типа ac_element данные элемента ARCHICAD, с уникальным номером (guid), который указан в объекте типа ac_element_guid.

Это тоже техническая функция, для создания возможности работать с элементом через механизм специального объекта ac_element.

Вызов:

ac_request("load_element_from_guid",int iElementDescr, int iGuidDescr);

Здесь:

iElementDescr - дескриптор объекта дипа ac_element, в который загружаем уникальный код элемента, записанный в объекте типа ac_element_guid, на который указывает iGuidDescr.


load_elements_list

ac_request ››

Загрузить заданный список элементами ARCHICAD по заданным условиям

Вызов:

ac_request("load_elements_list",int iListNum,string sElemTypeName,"MainFilter",int iMainFilterValue,string filterparametrname, string/double filterparametervalue,...);

Здесь:

iListNum - номер внутреннего списка элементов (от 0...9).

sElemTypeName - название типа элемента. Если нужно выбрать любые элементы - "ZombieElemType", если только колонны, то "ColumnType", стены - "WallType" и т.д.

"MainFilter" - сообщает, что мы задаем параметры для отфильтровывания элементов по типу доступности для редактирования, видимости и т.п. iMainFilterValue - обычно значение для видимых и редактируемых элементов - 3.

Далее идут названия параметров и их значения для дополнительного отбора.

Например "ID","Значение ID" - означает, что нужно выбрать элементы с ID="Значение ID" и т.д.

Фильтр "MainFilter" можно и не указывать. Это равносильно тому, что написать "MainFilter",0.

Т.е. при формировании списка в него попадут все подходящие элементы в проекте без учета основного критерия.

Значение фильтра собирается по формуле.

MainFilterValue=j1+2*j2+4*j3+8*j4+16*J5+32*j6+64*j7+128*j8+256*j9+512*j10+1024*j11+2048*j12+4096*j13+268435456*j14,

где каждое j может быть 0 или 1.

j1: только редактируемые.

j2: на видимом слое.

j3: на текущем этаже

j4: имеет представление в 3d окне

j5: в моем рабочем пространстве

j6: не подчиненные а только независимые элементы

j7: на активном чертеже

j8: отображается внутри обрезанной части базы данных чертежа

j9: указывает, передан ли данному элементу идентификатор изменения в параметре variationID

j10: имеются права доступа к элементу

j11: элемент виден в реновации

j12: дополнительный флаг; проверяет, переопределены ли атрибуты элемента текущим фильтром обновления

j13: дополнительный флаг; проверяет видимость элемента с учетом текущей настройки отображения структуры

j14: только из 2d окна


set_current_element_from_list

ac_request ››

Установить текущим для обработки элемент из заданного списка.

Вызов:

int ires = ac_request("set_current_element_from_list", int listindex, int elemindexinlist);

Здесь:

listindex - номер списка элементов, из которого надо сделать элемент текущим для выполнения операций над ним.

elemindexinlist - интекс элемента в этом списке.

ires - при успешном выполнении равно 0.


add_elements_list

ac_request ››

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


load_elements_list_from_selection и add_elements_list_from_selection

ac_request ››

Тоже, что и load_elements_list, только элементы берутся из числа выбранных элементов в текущем окне ARCHICAD.


load_elements_list_curdb

ac_request ››

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


clear_list

ac_request ››

Очистить указанный список элементов.

Вызов:

ac_request("clear_list",int iListNum);

Здесь:

iListNum - номер внутреннего списка элементов, который нужно очистить.


store_current_element_to_list

ac_request ››

Сохранить текущий элемент в другой список.

Вызов:

ac_request("store_current_element_to_list",int listnum, int index);

Здесь:

listnum - номер списка, в который добавить текущий элемент.

Если индекс index = -1 то добавить в конец списка.

Иначе элемент записать в позицию индекса. В списках индекс начинается с 0.

Список не раздвигается.


get_loaded_elements_list_count

ac_request ››

Определить количество элементов в указанном списке.

Вызов:

ac_request("get_loaded_elements_list_count", int iListNum);

Здесь:

iListNum - номер списка, у которого запрашивается количество элементов.

Результат операции считывается командой ac_getnumvalue();


select_elements_from_list

ac_request ››

Выделить в текущем окне ARCHICAD элементы, содержащиеся во внутреннем списке с указанным номером.

Вызов:

ac_request("select_elements_from_list", int iListNum, bool bClear);

Здесь - iListNum - номер списка,

bClear - снять выделение с элементов перед выделением новых.


Слой - layer

ac_request ››


create

ac_request ›› Слой - layer ››

Создать слой ARCHICAD.

Вызов:

int ires = ac_request("layer","create", string slayername);

Здесь:

slayername - имя слоя, которй необходимо создать.

Если слой успешно создан в ires возвращается 0.

Если произошла ошибка, то возвращается отрицательное значение.


get_index

ac_request ›› Слой - layer ››

Получить индекс слоя в проекте ARCHICAD.

Вызов:

int ires = ac_request("layer","get_index", string slayername);

Здесь:

slayername - имя слоя, у которого требуется получить индекс.

в ires возвращается 0 если обращение произошло без ошибок,

или отрицательное значение если произошла ошибка или такого слоя в проекте нет.

индекс слоя получается функцией ac_getnumvalue();

Пример.

Получить индекс слоя "01 10 Несущие стены", если такого слоя нет - то создать его и вывести в окно сообщений.

string slayername = "01 10 Несущие стены";
int ires = ac_request("layer","get_index",slayername);
if(ires < 0)
{
// layer not exist - create it
ires = ac_request("layer","create",slayername);
if(ires == 0)
{
ires = ac_request("layer","get_index",slayername);
}
else
{
cout << "cann't create layer "<<slayername;
return -1;
}
}

int iLayerIndex = ac_getnumvalue();
cout << "Index of the layer=" << iLayerIndex << "\n";


set_layer_visible

ac_request ›› Слой - layer ››

Управление видимостью слоя.

Оращение:

ac_request("layer", string whatdo);

Здесь whatdo = "ON"/"OFF"/"SWITCH" включить, выключить или переключить состояние (был выключен - включить и наоборот).


get_element_overall_dimensions

ac_request ››

Получить общие габариты элемента.

Это можно использовать для ускорения принятия решения когда требуется определить взаиморасположение элементов и т.п. задач.

Вызов:

ac_request("get_element_overall_dimensions", double &lx, double &ly, double &lz);

Здесь: lx,ly,sz - возвращаемые значения габаритных размеров текущего элемента.


get_quantity_value

ac_request ››

Получить количественные данные из текущего элемента

Вызов:

int iret = ac_request("get_quantity_value", string svaluename);

Здесь:

svaluename - имя расчетного параметра текущего элемента,

iret - 0, если произошло успешное получение данных.

Результат запроса считывается функцией ac_getnumvalue();

Пример.

Выбрать в список №1 элементы с ID="s участка".

Суммировать площади элементов и выдать результат в окно сообщений.

ac_request("load_elements_list",1,"ZombieElemType","ID","s участка","MainFilter",3);
ac_request("get_loaded_elements_list_count", 1);
int icount = ac_getnumvalue();
cout << "Число выбранных элементов=" << icount;
int i; // объявляем переменную цикла.
double value; // для текущих значений
double summa=0; // для суммарной площади
for(i=0;i<icount;i++)
{
ac_request("set_current_element_from_list", 1, i);
ac_request("get_quantity_value", "Surface");
value = ac_getnumvalue();
cout <<"элемент № "<< i << ", площадь="<< value << "\n";
summa += value;
}
cout << "суммарная площадь=" << summa;

Подробности.

Для разных типов элементов доступны различные количественные показатели.

Стены - WallType:

volume - объем

length - средняя длина стены:

volumeсond - условный объем;

volumeaskin - объем покрытия стены со стороны опорной линии;

volumebskin - объем покрытия стены с обратной стороны опорной линии;

volumeaskincond - условный объем покрытия стены со стороны опорной линии;

volumebskincond - условный объем покрытия стены с обратной стороны опорной линии;

surfacereflineside - площадь поверхности со стороны опорной линии;

surfacereflineoppside - площадь поверхности с обратной стороны опорной линии;

surfaceofedge - площадь поверхности торца стены;

surfacereflinesidecond - условная площадь поверхности со стороны опорной линии;

surfacereflineoppsidecond - условная площадь поверхности с обратной стороны опорной линии;

surfacewindows - площадь оконных проемов;

surfacedoors - площадь дверных проемов;

surfacetmptyholes - площадь незаполненных проемов;

columnsvolume - объем колонн в стене;

columnsnumber - количество колонн в стене;

widthofwindows - суммарная ширина всех окон;

widthofdoors - суммарная ширина всех дверей;

minheight - минимальная высота стены;

maxheight - максимальная высота стены;

minheightaskin - минимальная высота покрытия стены со стороны опорной линии;

maxheightaskin - максимальная высота покрытия стены со стороны опорной линии;

minheightbskin - минимальная высота покрытия стены с обратной стороны опорной линии;

maxheightbskin - максимальная высота покрытия стены с обратной стороны опорной линии;

centerlength - длина стены по центральной линии;

area - площадь опоры стены;

petimeter - периметр опоры стены;

grossvolume - общий объем стены;

grosssurfacereflineside - общая площадь поверхности стены по стороне опорной линии;

grosssurfacereflineoppside - общая площадь поверхности стены с обратной стороны опорной линии;

emptyholesvolume - аналитический объем открытий в стене;

emptyholessurfreflineside - аналитическая площадь открытия в стене со стороны опорной линии;

emptyholessurfreflineoppside - аналитическая площадь открытий в стене с обратной стороны опорной линии;

lengthonreflineside - длина стены по со стороны опорной линии;

lengthonreflineoppside - длина стены с обратной стороны опорной линии;

lengthonreflinesidecond - условная длина стены со стороны опорной линии;

lengthonreflineoppsidecond - условная длина стены с обратной стороны опорной линии:

insulationskinthickness - толщина изоляции стены;

wallairskinthickness - толщина воздушной прослойки в стене;

skinreflinethickness - толщина изоляции по стороне опорной линии;

skinreflineoppthickness - толщина изоляции с обратной стороны опорной линии;

reflinelength - длина стены по опорной линии.

Колонна - ColumnType:

surface - площадь;

coresurface - площадь базы колонны;

venesurface - площадь отделки;

volume - объем;

veneervolume - объем отделки;

minheight - минимальная высота;

maxheight - максимальная высота;

perimeter - периметр;

area - площадь;

grosssurfaceofcore - валовая площадь поверхности основы;

grosssurfaceofveneer - валовая площадь поверхности отделки;

coregrossvolume - валовый объем основы колонны;

veneergrossvolume - валовый объем основы колонны;

coretopsurface - площадь поверхности верхней части основы колонны;

corebottomsurface - площадь поверхности опоры основы колонны;

veneertopsurface - поверхность отделки сверху;

veneergrosssurface - валовая поверхность отделки снизу;

coregrosstopandbotsurface - валовая поверхность основы сверху и снизу;

veneergrosstopandbotsurface - валовая поверхность отделки сверху и снизу.

Перемычка - BeamType:

rightlength - длина перемычки с правой стороны опорной линии;

leftlength - длина перемычки с левой стороны опорной линии;

length - средняя длина;

bottomsurface - площадь нижней поверхности;

topsurface - площадь верхней поверхности;

edgesurfaceleft - площадь поверхности слева от опорной линии;

edgesurfaceright - площадь поверхности справа от опорной линии;

edgesurface площадь поверхностей обоих концов перемычки;

holessurface - поверхность вырезов;

holesedgesurface - площадь вырезов на боковых гранях перемычки;

holesnumber - количество вырезов;

volume - объем;

condvolume - условный объем;

holesvolume - объем вырезов;

Окно - WindowType:

openwidthrevside - ширина открытия на стороне раскрытия;

openwidthrevsideopp - ширина открытия на стороне, противоположной стороне раскрытия;

openheightrevside - высота открытия на стороне раскрытия;

openheightrevsideopp - высота отверстия на стороне, противоположной стороне раскрытия;

opensurfacerevside - поверхность открытия на стороне раскрытия;

opensurfacerevsideopp - поверхность открытия на стороне, противоположной стороне раскрытия;

nominalopenwidthrevside - номинальная ширина открытия на стороне раскрытия;

nominalopenwidthrevsideopp - номинальная ширина открытия на стороне, противоположной стороне раскрытия;

nominalopenheightrevside - - номинальная высота открытия на стороне раскрытия;

nominalopenheightrevsideopp - номинальная высота открытия на стороне, противоположной стороне раскрытия;

nominalopensurfacerevside - номинальная поверхность открытия со стороны стороны раскрытия;

nominalopensurfacerevsideopp - номинальная поверхность открытия на стороне, противоположной стороне раскрытия;

volume - объем;

nominalopensurgace - номинальная площадь открытия;

nominalopenvolume - номинальный объем открытия;

surface - площадь;

nominalsillheight - номинальная высота подоконника;

nominalsillheightrevside - высота подоконника на стороне раскрытия;

nominalsillheightrevsideopp - высота подоконника на стороне, противоположной стороне раскрытия;

nominalheadheight - номинальная высота оконной головки;

nominalheadheightrevside высота оконной головки на стороне раскрытия

nominalheadheightrevsideopp - высота оконной головки на стороне, противоположной стороне раскрытия;

sillheightaccvertanchor - высота подоконника в соответствии с вертикальным анкером;

headheightaccvertanchor - высота оконной головки в соответствии с вертикальным анкером.

Двери - DoorType:

openwidthrevside - - ширина открытия на стороне раскрытия;

openwidthrevsideopp - ширина открытия на стороне, противоположной стороне раскрытия;

openheightrevside - высота открытия на стороне раскрытия;

openheightrevsideopp - высота отверстия на стороне, противоположной стороне раскрытия;

opensurfacerevside - поверхность открытия на стороне раскрытия;

opensurfacerevsideopp - поверхность открытия на стороне, противоположной стороне раскрытия;

nominalopenwidthrevside - номинальная ширина открытия на стороне раскрытия;

nominalopenwidthrevsideopp - номинальная ширина открытия на стороне, противоположной стороне раскрытия;

nominalopenheightrevside - номинальная высота открытия на стороне раскрытия;

nominalopenheightrevsideopp - номинальная высота открытия на стороне, противоположной стороне раскрытия;

nominalopensurfacerevside - номинальная поверхность открытия со стороны стороны раскрытия;

nominalopensurfacerevsideopp - - номинальная поверхность открытия на стороне, противоположной стороне раскрытия;"

volume - объем;

nominalopensurgace - номинальная площадь открытия;

nominalopenvolume - номинальный объем открытия;

surface - площадь;

nominalsillheight - номинальная высота подоконника;

nominalsillheightrevside - высота порога двери на стороне раскрытия;

nominalsillheightrevsideopp - высота порога двери на стороне, противоположной стороне раскрытия;

nominalheadheight - номинальная высота дверной головки;

nominalheadheightrevside - номинальная высота дверной головки на стороне раскрытия;

nominalheadheightrevsideopp - высота дверной головки на стороне, противоположной стороне раскрытия;

sillheightaccvertanchor - высота порога в соответствии с вертикальным анкером;

headheightaccvertanchor - высота дверной головки в соответствии с вертикальным анкером.

Объект - ObjectType:

volume - объем;

surface - площадь символа.

Элемент освещения - LampType:

volume - объем;

surface - площадь.

Плита - SlabType:

bottomsurface - площадь опорной поверхности;

surface - площадь верхней поверхности;

edgesurface - площадь боковых граней;

condbottomsurface - условная площадь опорной поверхности;

condtopsurface - условная площадь верхней поверхности;

volume - объем;

condvolume - условный объем;

perimeter - периметр;

holessurface - площадь вырезов;

holesperimeter - периметр вырезов;

grossbottomsurface - общая площадь опорной поверхности;

grosstopsurface - общая площадь верхней поверхности;

grossedgessurface - общая площадь поверхности граней;

grossvolume - общий объем;

grossbottomsurfacewithholes - общая площадь опорной поверхности вместе с вырезами;

grosstopsurfacewithholes - общая площадь верхней поверхности вместе с вырезами;

grossedgessurfacewithholes - общая площадь граней вместе с вырезами;

grossvolumewithholes - общий объем вместе с вырезами.

Крыша - RoofType:

bottomsurface - площадь внутренней поверхности;

topsurface - площадь верхней поверхности;

edgesurface - площадь боковых граней;

condbottomsurface - условная площадь внутренней поверхности;

condtopsurface - условная площадь верхней поверхности;

volume - объем;

сondvolume - условный объем;

perimeter - периметр;

holessurface - площадь вырезов;

holesperimeter - площадь периметра;

grossbottomsurface - общая внутренняя площадь;

grosstopsurface - общая площадь верхней поверхности;

grossedgesurface - общая площадь граней;

areacontourpoligon - площадь крыши по полигонам контура;

grossvolume - общий объем;

insskinthickness - толщина слоя изоляции;

lengthofridgeedgesdiv2 - длина граней реберного типа, деленная на 2;

lengthofvalleyedgesdiv2 - длина граней желобного типа, деленная на 2;

lengthofgableedges - длина фронтонов;

lengthofhipedgesdiv2 - длина ребер типа бедра, деленная на 2;

lengthofeaveedges - длина ребер типа краев;

lengthofpeakedges - длина краев пикового типа;

lengthofsidewalledges - длина ребер типа боковых стенок;

lengthofendwalledges - длина ребер типа окончания стен;

lengthofrtdomeedgesdiv2 - длина ребер типа rtdom, разделенная на 2;

lengthofrthollowedgesdiv2 - длина краев типа rthollow, деленная на 2;

sumofopeningssurfaces - суммарная площадь открытий в крыше;

numofholes - количество вырезов;

numofskylight - количество просветов (skylight).

3d сетка - MeshType:

bottomsurface - площадь опорной поверхности;

topsurface - площадь верхней поверхности;

edgesurface - площадь боковых граней;

volume - объем;

perimeter - периметр;

holessurface площадь вырезов;

holesperimeter - периметр вырезов;

projectedarea - площадь проекции;

Зона - ZoneType:

area - площадь зоны;

perimeter - периметр;

holesperimeter - периметр вырезов;

wallsperimeter - периметр стен;

numberofcornersprojectedarea - количество углов зоны;

numberofconcavecorners - количество вогнутых углов зоны;

surfaceareaofperimeterwall - площадь поверхности стен по периметру зоны;

widthofdoors - ширина всех дверей в стенах по периметру зоны;

surfaceofdoors - площадь всех дверей в стенах по периметру зоны;

widthofwindows - ширина всех окон в стенах по периметру зоны;

surfaceofwindows -площадь поверхности всех окон в стенах по периметру зоны;

floorlevel - уровень пола в зоне;

subfloorthickness - толщина под полом в зоне;

height - высота;

netarea - чистая площадь зоны;

netperimeter - чистый периметр;

volume - объем зоны;

areareducement - величина уменьшения площади;

calcarea - расчитанная площадь;

totalextractedarea - вычтенная площадь у зоны;

reducedextractedarea - уменьшенная площадь зоны;

lowareaofzone - вычтенная нижняя часть зоны;

extractedwallarea - вычтенная площадь за счет стен;

extractedcolumnarea - площадь вычтенная за счет колонн;

extractedfillarea - площадь, вычтенная за счет штриховок;

wallincettopsurface - верхняя поверхность настенной вставки;

wallincetbacksidesurface - задняя сторона стены;

wallincetsidesurface - бортовая поверхность настенной вставки;

tsfloorplintuslength - длина плинтуса с учетом дверей (если под дверью можно проложить плинтус, то считаем);

tsseilingplintuslength - длина потолочного плинтуса;

Штриховка - HatchType:

surface - площадь поверхности;

perimeter - периметр;

holesperimeter - периметр вырезов;

holessurface - площадь вырезов.

Линия - LineType:

length - длина линии.

Полилиния - PolyLineType:

length - длина полилинии.

Дуга - ArcType:

length - длина дуги.

Окружность - CircleType:

length - длина окружности.

Сплайн - _SplineType:

length - длина сплайна

Оболочка - ShellType:

bottom_surface - площадь поверхности снизу;")

top_surface - площадь поверхности сверху;

volume - объем;

surface - площадь поверхности по опорной линии;

holes_surface - площадь вырезов.

Морф - MorphType:

surface - площадь поверхности;

volume - объем;

floorplanprojarea - площадь опоры;

elevation - возвышение;

baseheight - базовая высота - диапазон высоты от самой нижней точки наклонных внутрь граней до самой высокой точки в этаже высоты относительно этажа;

height - высота тела;

floorplanprojperimeter - периметр проекции в плане;

numberofnodes - количество вершин;

numberofedges - количество ребер;

numberofhiddenedges - количество невидимых ребер;

numberofsoftedges - количество "мягких" ребер;

numberofvisiblenodes - количество видимых вершин;

numberoffacenodes - количество лицевых сторон в тела.

length_edges - длина всех ребер (видимых и невидимых).

length_edge_max - длина самого длинного ребра

length_edges_pgons - длина всех ребер (видимых и невидимых) где есть полигоны граней.

length_edge_pgons_max - длина самого длинного ребра, где есть полигоны граней.


get_layer_by_substring

ac_request ››

Получить полное имя слоя по частичному фрагменту.

Требуется, когда пользователи договариваются именовать слои в ARCHICAD с числовыми или текстовыми префиксами.

Например слой "Квартиры" можно написать как "01 Квартиры" или "20 Квартиры". Такой подход встречается когда пользователь хочет установить удобный ему порядок следования слоев в проекте.
Однако с точки зрения программы - это совершенно разные слои.

Чтобы избежать ошибки, удобно пользоваться данной функцией.

Вызов:

int ires = ac_request("get_layer_by_substring",string slayernamefragment, int from);
int ires = ac_request("get_layer_by_substring",string slayernamefragment, int from, int range);

Здесь:

slayernamefragment - фрагмент в имени, который точно определяет слой (например "Квартиры").

from - порядковый номер символа от начала полного имени слоя в проекте, с которого начать сравнение на соответствие.

range - количество символов, которые нужно проверить.

ires - 0, если слой найден.

Полное наименование найденного слоя считывается командой ac_getstrvalue();

Пример.

Получить полное имя слоя "Квартиры" в проекте, если известно, что в организации принято для сортировки слоев пользоваться префиксом типа "01 ".

string smalllayername="Квартиры";
string longlayername;
ires = ac_request("get_layer_by_substring",smalllayername,3); // начать сравнение с 3-й позиции
if(ires != 0) {
tsalert(-1,"Ошибка во время выполнения","Не обнаружен слой",smalllayername);
cout << "Ошибка: Не обнаружен слой - "<< smalllayername << "\n";
}
longlayername = ac_getstrvalue(); // считать полное имя слоя


elem_user_property

ac_request ››

Пользовательские параметры элемента.

В ARCHICAD имеется возможность назначать собственные свойства любому элементу. Эти свойства могут быть числовыми, текстовыми, логическими и т.п. По значению этих свойств элемент может затем быть отобран в интерактивных каталогах, можно сделать ему автозамену при показе в окне и т.п. Следующие команды позволяют манипулировать пользовательскими свойствами элементов в скриптах C++.


get

ac_request ›› elem_user_property ››

Считать значение пользовательского параметра для текущего элемента.

Вызов:

int ires = ac_request("elem_user_property","get", string sparname);

Здесь:

svarname - имя параметра, из которого необходимо получить значение.

ires - 0, если считалось успешно.

Результат получается обращением к функции ac_getnumvalue() или ac_getstrvalue();

Пример.

Считать значение логического параметра "Полезная площадь здания" из текущего элемента.

string sUP = "Полезная площадь здания";
int ires = ac_request("elem_user_property","get",sUP);
if(ires==0)
{
istrue = ac_getnumvalue();
if(istrue==1)
{
cout << "Эта зона относится к полезной площади здания";
}
}

Если в проекте есть пользовательские переменные с одинаковыми именами в разных группах, например переменные "Ширина проема" созданы в группе "Переменные окон" и в группе "Переменные дверей", то чтобы обратиться к переменной "Ширина проема" в группе "Переменные окон" надо указать группу в имени переменной через двойной слэш:
sUP = "Переменные окон\\Ширина проема";


set

ac_request ›› elem_user_property ››

Записать в пользовательский параметр для текущего элемента новое значение.

Вызов:

int ires = ac_request("elem_user_property","set", string sparname, bool/int/double/string value);

Здесь:

svarname - имя параметра.

value - значение параметра по умолчанию. Тип параметра определяется по типу передаваемого здесь значения переменной.

srazdel - раздел, в котором будет создана пользовательская переменная.

ires - 0- если переменная создана успешно.

Пример.

Установить новое значение логического параметра "Полезная площадь здания" для текущего элемента, в положение "истина".

string sUP = "Полезная площадь здания";
int istrue = 1; // Новое значение переменной - 1, значит "истина"
int ires = ac_request("elem_user_property","set",sUP,istrue);
if(ires==0)
{
cout << "Новое значение успешно установлено";
}

Если в проекте есть пользовательские переменные с одинаковыми именами в разных группах, например переменные "Ширина проема" созданы в группе "Переменные окон" и в группе "Переменные дверей", то чтобы обратиться к переменной "Ширина проема" в группе "Переменные окон" надо указать группу в имени переменной через двойной слэш:
sUP = "Переменные окон\\Ширина проема";


create

ac_request ›› elem_user_property ››

Создать пользовательский параметр для текущего элемента.

Вызов:

int ires = ac_request("elem_user_property","create", string sparname, string svartype, bool/int/double/string value, string svartype, string spargroupname);

Здесь:

svarname - имя создаваемого параметра.

value - значение параметра по умолчанию.

svartype - Тип переменной - "String"/"Real"/"Integer"/"Boolean" - текстовое, вещественное, целое или логическое.

spargroupname - раздел, в котором будет создана пользовательская переменная.

ires - 0- если переменная создана успешно.

Пример.

Создать у текущего элемента пользовательский параметр "Полезная площадь здания" в разделе "Раздел ТЭП". Тип параметра - логический. Значение по умолчанию - "ложь".

string sUP = "Полезная площадь здания";
string sUPRazdelName = "Раздел ТЭП";
int ires = ac_request("elem_user_property","create",sUP,0,"Boolean", sUPRazdelName);
if(ires==0)
{
int istrue = ac_getnumvalue();
if(istrue==1)
{
cout << "Эта зона относится к полезной площади здания";
}
}


Property_Import

ac_request ›› elem_user_property ››

Импортировать в проект пользовательские свойства, заданные в тексте XML.

Вызов:

int iret = ac_request("elem_user_property", "Property_Import", string sXMLsource, int conflictResolutionPolicy);

Здесь:

sXMLsource - текст в формате XML с описанием импортируемых пользовательских свойств,

conflictResolutionPolicy - директива как действовать в случае если встречаются свойства с одинаковыми именами:

0 - добавить новое свойство,

1 - заменить старое свойство на новое,

2 - пропустить добавление конфликтующего свойства.

Пример:

Скачать с сайта XML описание свойств и загрузить их в проект:

int do_iButtonloadProperties()

{

cout << "load properties\n";

int iStringDescr;

object("create", "ts_string", iStringDescr);

// загрузка свойств

string spropfname = "Свойства КСИ";

int iret = ts_string(iStringDescr, "ReadFromURL", "http://www.labpp.ru/TSDownload/KSI/" + spropfname + ".txt");

object("read_simple_value", iStringDescr);

string sXMLsource = ac_getstrvalue();

ts_dialogcontrol(iProgressBar, "SetValue", 2);

if (iret == 0)

{

coutvar << sXMLsource;

iret = ac_request("elem_user_property", "Property_Import", sXMLsource, 1);

if (iret == 0)

{

tsalert(-3, "Сообщение", "Свойства успешно загружены", spropfname);

}

}

object("delete", iStringDescr);

}


get_object_property_value

ac_request ››

Получить значение параметра текущего GDL элемента. Применяется для объектов.

Вызов:

int iret = ac_request("get_object_property_value",string parametername);

Результат обращения считывается следующей функцией ac_getnumvalue() или ac_getstrvalue() - для получения числового или текстового значения соответственно.

Возвращает в iret 0- если запрос прошел успешно.

Пример.

Получить из текущего объекта значение текстового параметра "SNAME".

int iret = ac_request("get_object_property_value","SNAME");
string svalue;
if(iret == 0)
{
svalue = ac_getstrvalue();
cout << svalue; // написать полученное значение в окне сообщений
}


set_object_property_value

ac_request ››

Записать новое значение в параметр текущего GDL элемента. Применяется для объектов.

Вызов:

int iret = ac_request("set_object_property_value",string parametername, string/double valuetowrite);

Здесь:

parametername - имя параметра объекта, в который необходимо записать значение;

valuetowrite - логическое, целое, вещественное число или текст значения для этого параметра.

Возвращает в iret 0- если запись прошла успешно.

Пример.

Записать в текущий объект значение текстового параметра "SNAME" - "my new name".

int iret = ac_request("set_object_property_value", "SNAME", "my new name");
if(iret == 0)
{
cout << "Запись прошла успешно";
}


set_object_property_value_curdb

ac_request ››

То же что и set_object_property_value, но без смены текущего окна ARCHICAD.


get_element_value

ac_request ››

Получить значение переменной текущего элемента.

Вызов:

int ires = ac_request("get_element_value", string svaluename);

Здесь:

svaluename - имя переменной элемента.

Возвращаемое значение - 0 - если запрос прошел успешно.

Значение переменной считывается следующим обращением ac_getnumvalue() или ac_getstrvalue();

Пример.

Считать номер этажа у текущего элемента.

int floornum;
int ires = ac_request("get_element_value","StoryIndex");
if(ires == 0)
{
floornum = ac_getnumvalue();
cout << "Номер этажа=" << floornum;
}

Значения svaluename:

TypeID

Получить тип элемента в виде числа.

TypeName

Получить тип элемента в виде текста.

Layer

Получить имя слоя, на котором находится элемент.

ID

Получить ID элемента.

StoryIndex

Получить индекс этажа.

GuidAsText

Получить уникальный идентификатор (guid) элемента в текстовом виде.

Для элементов типа Объект

ObjectName

Получить имя библиотечного элемента.

level

Возвышение по Z

pos.x

Позиция X.

pos.y

Позиция Y.

offset.x

Смещение внутренней точки начала координат от положения pos.x.

offset.y

Смещение внутренней точки начала координат от положения pos.y.

другое имя

Если указано другое имя, оно рассматривается как имя параметра, которое надо считать из объекта.


set_element_value

ac_request ››


assign_element_values

ac_request ››

Присвоить значение переменной элемента. Изменяет данные только в объекте ac_element без воздействия в проекте.

Формат обращения:

ac_request("assign_element_values",int iElemDescr, string paramname, string/double/int paramvalue);


load_element_default_values

ac_request ››

Загрузить в объект элемента значения по умолчанию.


set_element_infoidtext

ac_request ››

Задать ID для текущего элемента.

Вызов:

ac_request("set_element_infoidtext", string svalue);

Здесь: svalue - новое значение ID для текущего элемента.


create_element_on_project

ac_request ››

Создать элемент в проекте на базе текущих значений из объекта типа ac_element.

Вызов:

int ires = acrequest("create_element_on_project",int iElemDescr);

Здесь :

iElemDescr - дескриптор объекта, в котором содержатся данные для создаваемого в проекте элемента.

ires - при успешном создании возвращается 0.


get_element_infoidtext

ac_request ››

Считать ID текущего элемента.

Вызов:

int ires = ac_request("get_element_infoidtext");

Данные получаются следующей функцией ac_getstrvalue();

ires - 0 если считывание прошло успешно.


project_property

ac_request ››


get

Руководство по LABPP_Automat для ARCHICAD

ac_request ›› project_property ››


CalcUnitsAreaDecimals

ac_request ›› project_property ›› get ››

Получить заданное в проекте число точек после запятой.

Вызов:

ac_request("project_property","get","CalcUnitsAreaDecimals");

Результат считывается вызовом функции ac_getnumvalue().


autotext

ac_request ››

Считать, записать или создать автотекст ARCHICAD.

В информации о проекте имеется специальный набор переменных. Можно создавать переменные самостоятельно. Значения этих переменных можно подставлять в текст в различных местах проекта. Значение текста в этих местах всегда будет соответствовать актуальному значению переменной проекта.


get

ac_request ›› autotext ››

Считать значение переменной из информации о проекте.

Вызов:

int iret = ac_request("autotext","get", string svarname);

Здесь: svarname - имя переменной в информации о проекте, которое нужно считать.

iret - 0, если считалось без ошибок.

Результат получается вызовом функции ac_getstrvalue();

Пример.

Считать значение переменной "Адрес объекта" из информации о проекте.

string svaluename = "Адрес объекта";
int iret = ac_request("autotext","get", svarname);
if( iret == 0)
{
string saddress = ac_getstrvalue();
cout << "Адрес = " << saddress;
}
else
{
cout << "Считать адрес не удалось. Возможно переменная " << svaluename << " в проекте не создана";
}


set

ac_request ›› autotext ››

Задать значение переменой в информации о проекте.

Вызов:

int iret = ac_request("autotext","set", string svarname, string svarvalue);

Пример.

Записать новое значение в переменную "Адрес объекта" из информации о проекте.

string svaluename = "Адрес объекта";
string snewvalue;
snewvalue = "г. Москва, Шаболовка, 37";
int iret = ac_request("autotext","set", svarname, snewvalue);
if( iret == 0)
{
cout << "Адрес успешно изменен";
}
else
{
cout << "Записать адрес не удалось. Возможно переменная " << svaluename << " в проекте не создана";
}


create

ac_request ›› autotext ››

Создать в информации о проекте переменную с указанным именем и присвоить ей значение.

int iret = ac_request("autotext","create", string svarname, string svalue);

Здесь:

svarname - имя новой переменной,

svalue - значение для этой переменной,

iret - результат выполнения функции. Если 0 - то переменная создана.

Пример.

Создать новую переменную "Адрес объекта" в информации о проекте и записать первоначальное значение.

string svaluename = "Адрес объекта";
string snewvalue;
snewvalue = "г. Москва, Шаболовка, 37";
int iret = ac_request("autotext","create", svarname, snewvalue);
if( iret == 0)
{
cout << "Переменная успешно создана";
}
else
{
cout << "Создать переменную " << svaluename << " не удалось";
}


get_as_table

ac_request ›› autotext ››

Получить полную таблицу переменных из информации о проекте.

ac_request("autotext", "get_as_table", int iTable, int type);

Здесь:

iTable - дескриптор таблицы для заполнения данными из проекта;

формат колонок таблицы на выходе:

"text" (string) - имена переменных;

"key" (string) - внутренние идентификаторы переменных;

"value" (string) - значения.

type - битовый флаг для фильтрации типов переменных из проекта - 1-фиксированные (fixed)/2-собственные(custom)/4 - прочие (other).

Можно суммировать, например 1+2 означает выбрать фиксированные и собственные переменные (см.пример).

Пример.

Выбрать в iTable все переменные из информации о проекте.

int iTable;

object("create", "ts_table", iTable, "Autotext variables list");

int type=1+2;

ac_request("autotext", "get_as_table", iTable, type);


interface_input2point

ac_request ››

Ввод пользователем точки.

Вызов:

int iret ac_request("interface_input2dpoint",string firstMessage, double &x, double &y);

Здесь:

sFirstMessage - подсказка пользователю при вводе точки,

x, y - координаты введенных точек,

Возвращает 0, если ввод был успешным.


interface_input2dline

ac_request ››

Ввод пользователем 2d линии.

Вызов:

int iret ac_request("interface_input2dline", string sFirstMessage, string sSecondMessage, double x1, double y1, double x2, double y2, double angleInRad, double length);

Здесь:

sFirstMessage, sSecondMessage - подсказка пользователю при вводе первой и второй точки,

x1, y1, x2, y2 - координаты введенных точек,

angleInRad - угол в радианах от положительного направления оси X,

length - длина отрезка.

Возвращает 0, если ввод был успешным.


interface_input3dline

ac_request ››

Ввод пользователем 3d линии.

Вызов:

int iret ac_request("interface_input3dline", string sFirstMessage, string sSecondMessage, double x1, double y1, double z1, double x2, double y2, double z2, double angleInRad, double length);

Здесь:

sFirstMessage, sSecondMessage - подсказка пользователю при вводе первой и второй точки,

x1, y1, z1, x2, y2, z2 - координаты введенных точек,

angleInRad - угол в радианах от положительного направления оси X,

length - длина отрезка

Возвращает 0, если ввод был успешным.


interface_input2dpoly

ac_request ››

Ввод пользователем 2d полигона. Возвращает площадь и периметр.

Формат запроса:

int ires = ac_request("interface_input2dpoly",string sMessage, double &square, double &perimeter);

Здесь:

sMessage - текстовое сообщение пользователю,

square, perimeter в эти переменные возвращается значение площади и периметра фигуры, которую задал пользователь кликами мыши


get_levelfromprojectnull_by_floorindexandlevel

ac_request ››

Зная индекс этажа и высоту от уровня этого этажа (может быть с минусом) получить высоту от ноля проекта.

Вызов:

ac_request("get_levelfromprojectnull_by_floorindexandlevel", int floorInd, double bottomOffset, double &levelfromprojectnull);

Здесь:

floorind - индекс этажа,

bottomOffset - смещение относительно уровня этого этажа,

levelfromprojectnull - результат - смещение по вертикали относительно ноля проекта.

Пример:

Выбрать элементы из проекта.

У элементов типа Морф определить расстояние середины элемента от уровня 0 проекта.

Вариант 1. Сначала выборка всех элементов, затем по ходу опроса элементов определяем нужные по типу.

// загрузить из проекта в список 1 все элементы, у которых присвоено любое значение классификатора ARCHICAD (не обязательно)

ac_request_special("add_elements_list", 1, "ZombieType", 2,

"", "Cls", "Классификация ARCHICAD", "ASSIGNED", "", "");

// запросить количество собранных элементов

ac_request("get_loaded_elements_list_count", 1);

int icount = ac_getnumvalue(); // получить количество в переменную

coutvar << icount; // вывести в окно сообщений

if (icount == 0)

{

cout << "В списке нет элементов";

return -1;

}

// объявляем необходимые переменные для работы

double dLevel, dHeight, elemlevel, elemprojectlevel;

int ielemstoryindex;

string sElemTypeName, sID;

int i;

int ires;

// выполнить цикл icount раз

for (i = 0; i < icount; i++)

{

ires = ac_request("set_current_element_from_list", 1, i); // сделать текущим i-вый элемент из списка 1

ac_request("get_element_value", "TypeName"); // запросить название типа этого элемента

sElemTypeName = ac_getstrvalue();

coutvar << sElemTypeName; // вывести имя типа элемента в окно сообщений

// если это элемент типа Морф:

if (sElemTypeName == "MorphType")

{

ires = ac_request("get_element_value", "ID"); // запросить ID элемента

sID = ac_getstrvalue(); // получить его в переменную

coutvar << sID; // вывести ID в окно сообщений

ires = ac_request("get_element_value", "Level"); // запрашиваем свойство Level (для Морф - высота над уровнем его этажа)

dLevel = ac_getnumvalue(); // получаем его в переменную

coutvar << dLevel; // выводим в окно сообщений

ires = ac_request("get_quantity_value", "max_height"); // запрашиваем максимальный размер Морф по вертикали

dHeight = ac_getnumvalue(); // получаем его в переменную

coutvar << dHeight; // выводим в окно сообщений

elemlevel = dLevel + dHeight / 2; // рассчитываем уровень центра Морф по высоте относительно этажа

ac_request("get_element_value", "StoryIndex"); // запрашиваем индекс этажа

ielemstoryindex = ac_getnumvalue(); // получаем индекс этажа в переменную

// получаем высоту центра Морф относительно 0 проекта в переменную elemprojectlevel

ac_request("get_levelfromprojectnull_by_floorindexandlevel", ielemstoryindex, elemlevel, elemprojectlevel);

coutvar << elemprojectlevel; // выводим в окно сообщений

}

}

Вариант 2. Сразу выбираем только элементы типа Морф, которые классифицированы как "Лестница"

// загрузить из проекта в список 1 элементы типа Морф, у которых присвоено значение классификатора ARCHICAD "Лестница"

ac_request_special("add_elements_list", 1, "MorphType", 2,

"", "Cls", "Классификация ARCHICAD", "=", "Лестница", "");

// запросить количество собранных элементов

ac_request("get_loaded_elements_list_count", 1);

int icount = ac_getnumvalue(); // получить количество в переменную

coutvar << icount; // вывести в окно сообщений

if (icount == 0)

{

cout << "В списке нет элементов типа Морф, классифицированных как \"Лестница\"";

return -1;

}

// объявляем необходимые переменные для работы

double dLevel, dHeight, elemlevel, elemprojectlevel;

string sID;

int ielemstoryindex;

int i;

int ires;

// выполнить цикл icount раз

for (i = 0; i < icount; i++)

{

ires = ac_request("set_current_element_from_list", 1, i); // сделать текущим i-вый элемент из списка 1

ires = ac_request("get_element_value", "ID"); // запросить ID элемента

sID = ac_getstrvalue(); // получить его в переменную

coutvar << sID; // вывести ID в окно сообщений

ires = ac_request("get_element_value", "Level"); // запрашиваем свойство Level (для Морф - высота над уровнем его этажа)

dLevel = ac_getnumvalue(); // получаем его в переменную

coutvar << dLevel; // выводим в окно сообщений

ires = ac_request("get_quantity_value", "max_height"); // запрашиваем максимальный размер Морф по вертикали

dHeight = ac_getnumvalue(); // получаем его в переменную

coutvar << dHeight; // выводим в окно сообщений

elemlevel = dLevel + dHeight / 2; // рассчитываем уровень центра Морф по высоте относительно этажа

ac_request("get_element_value", "StoryIndex"); // запрашиваем индекс этажа

ielemstoryindex = ac_getnumvalue(); // получаем индекс этажа в переменную

// получаем высоту центра Морф относительно 0 проекта в переменную elemprojectlevel

ac_request("get_levelfromprojectnull_by_floorindexandlevel", ielemstoryindex, elemlevel, elemprojectlevel);

coutvar << elemprojectlevel; // выводим в окно сообщений

}


get_floorindexandlevel_by_levelfromprojectnull

ac_request ››

Зная высоту от ноля проекта получить индекс этажа и смещение от этого этажа.

Вызов:

ac_request("get_floorindexandlevel_by_levelfromprojectnull", double levelfromprojectnull, int &floorInd, double &bottomOffset);

Здесь:

levelfromprojectnull - смещение по вертикали относительно ноля проекта.

floorind - результат - индекс этажа,

bottomOffset - результат - смещение относительно уровня этого этажа,


get_storyinfo_as_table

ac_request ››

Получить список этажей в таблицу.

Вызов:

int ierr = ac_request("get_story_info_as_table", int iTableStories);

Здесь:

iTableStories - дескриптор таблицы, в которую будет записан список этажей.

ierr - результат операции (если 0 - успешно).

Имя колонки | Тип данных | Значение
index | int | индекс этажа
floorId | int | уникальный Id этажа
notMine | int | этаж принадлежит другому клиенту (для командных проектов)
dispOnSections | int | показывается на разрезах и видах
level | double | уровень этажа
name | string | имя
realfloornumber | int | реальный номер этажа от уровня земли

Пример.

Считать список этажей в таблицу и показать в окне сообщений.

int iTableStories;

object("create", "ts_table", iTableStories);

ac_request("get_story_info_as_table", iTableStories);

string tsstr;

ts_table(iTableStories, "print_to_str", tsstr);

coutvar << tsstr;

object("delete", iTableStories);

Результат:


elem_classification_get_item_value

ac_request ››

Получить имя класса элемента в заданной классификации.

Вызов:

int err = ac_request("elem_classification_get_item_value",string sclassifname);

Здесь:

err = 0 если считано без ошибок,

sclassifname - имя классификатора,

Результат считывается командой ac_getstrvalue();


elem_classification_get_parent_item_value

ac_request ››

Получить имя родительского класса элемента в заданной классификации.

Вызов:

int err = ac_request("elem_classification_get_item_value",string sclassifname);

Здесь:

err = 0 если считано без ошибок,

sclassifname - имя классификатора,

Результат считывается командой ac_getstrvalue();


hotlinks

ac_request ››

Работа с модулями, вставленными в проект


GetHotlinkNodes

ac_request ›› hotlinks ››

Получить список модулей, вставленных в проект.

Вызов:

int err = ac_request("hotlinks","GetHotlinkNodes",int iTable);

Здесь:

err - возвращает отрицательное число или 0 если нет ошибки,

iTable - дескриптор таблицы, куда записать результат (колонки таблицы сформируются автоматически).

Формат таблицы:

Имя колонки | Тип данных | Значение
guid | string | guid базового модуля
name | stting | имя модуля
type | int | тип 0/1/2 - неизвестный/модуль типа проекта ARCHICAD/dwg или dxf и др.
refFloorName | string | Имя этажа, если привязан к одному этажу
refFloorInd | int | Индекс этажа, если привязан к одному этажу
instancesCount | int | Количество применений в проекте

Пример.

Получить список ставленных в проект модулей и вывести таблицу в окно сообщений, а затем только колонки guid, name и instancesCount с другими заголовками вывести в элемент диалога iListBox.

По кнопке дать возможность посчитать количество элементов балок в модуле из выбранной строки.

//******************************************

// Create dialog and listbox

// Get from project list of the modules

// Print list to message window

// Place 3 columns of the list to listbox

// Calc beams in modules by pressing button

//******************************************

int iDialogDescr; // Дескриптор диалога

int iListBoxNodes, iTableNodes; // Листбокс элементов hotlink nodes

int iTable;

int iButtonCalcElementsCountInModule;

int main()

{

#pragma region Создаем диалог

int x, y, w, h;

object("create", "ts_dialog", iDialogDescr);

ts_dialog(iDialogDescr, "init_dialog", "palette", 0, 0, 450, 310); // Создаем окно диалога как палитку, т.е. немодальное

ts_dialog(iDialogDescr, "set_as_main_panel"); // Если так сделать, то все немодальные окна этого сеанса будут закрываться вместе с этим окном

ts_dialog(iDialogDescr, "SetTitle", "Здесь название назначаем сами");

// листбокс

object("create", "ts_dialogcontrol", iListBoxNodes, "iListBoxNodes");

ts_dialogcontrol(iListBoxNodes, "init_control", "singlesellistbox", iDialogDescr, 3, 3, 450-3, 300-5-22, 48, 20);

ts_dialogcontrol(iListBoxNodes, "SetAnchorToPanelResize", 0, 0, 1, 1);

// кнопка расчета для позиции диалога

int delta = 3;

int yy = 282;

x = 3; y = yy; w = 120; h = 20;

object("create", "ts_dialogcontrol", iButtonCalcElementsCountInModule, "iButtonCalcElementsCountInModule");

ts_dialogcontrol(iButtonCalcElementsCountInModule, "init_control", "button", iDialogDescr, x, y, w, h);

ts_dialogcontrol(iButtonCalcElementsCountInModule, "eventreaction", "Event_ButtonClicked");

ts_dialogcontrol(iButtonCalcElementsCountInModule, "settext", "Рассчет");

ts_dialogcontrol(iButtonCalcElementsCountInModule, "SetAnchorToPanelResize", 0, 1, 0, 0);

ts_dialogcontrol(iButtonCalcElementsCountInModule, "SetToolTip", "Рассчитать количество элеменов балок в модуле");

#pragma endregion

object("create", "ts_table", iTable);

// получить список hotlinks - колонки таблицы сформируются автоматически

ac_request("hotlinks", "GetHotlinkNodes", iTable);

// добавить в конец колонку "количество элементов"

ts_table(iTable, "add_column", -1, "int", "Кол-во элементов");

// вывести список hotlink nodes в окно сообщений

string str;

ts_table(iTable, "print_to_str", str);

coutvar << str;

// задать имена колонок перед экспортом в листбокс

ts_table(iTable, "mapping_columns_to_export",

"guid", "GUID модуля", "",

"name", "Имя модуля", "",

"instancesCount", "Кол-во вхождений в проект", "",

"Кол-во элементов","","" // имя колонки оставляем как есть

);

// задать ширину колонок при экспорте

ts_table(iTable, "set_columns_width_when_export", 100);

// экспортировать таблицу в листбокс

ts_table(iTable, "export_to_dialogcontrol", iListBoxNodes, -1, -1);

//object("delete", iTable); если объект таблицы больше не потребуется, то можно ее удалить

//но если потом будем к ней обращаться из обработчиков событий (кнопки и т.п.) то оставляем в памяти

bool bres;

// запускаем диалог

ts_dialog(iDialogDescr, "invoke", bres);

}

// обработчик событий кнопок на нажатие

int Event_ButtonClicked(int iDescr, string sDescr)

{

if (sDescr == "iButtonCalcElementsCountInModule") {

cout << sDescr << "\n";

do_iButtonCalcElementsCountInModule();

}

}

int do_iButtonCalcElementsCountInModule()

{

// получить имя модуля, выбранного в листбоксе

int item;

string smodulename;

ts_dialogcontrol(iListBoxNodes, "GetSelectedItem", item);

if (item == 0) {

return -1;

}

ts_table(iTable, "select_row", item - 1);

ts_table(iTable, "get_value_of", "name", smodulename);

// выбрать элементы, у которых совпадает имя модуля с выбранным в листбоксе

ac_request_special("load_elements_list", 2, "BeamType", 2,

"", "EP", "hotlinkName", "=", smodulename, "");

ac_request("get_loaded_elements_list_count", 2);

int icount = ac_getnumvalue();

// записать результат в текущую строку таблицы

ts_table(iTable, "set_value_of", "Кол-во элементов", icount);

coutvar << icount;

// экспортировать таблицу в листбокс (вид колонок уже был задан при первом экспорте в main())

ts_table(iTable, "export_to_dialogcontrol", iListBoxNodes, -1, -1);

ts_dialogcontrol(iListBoxNodes, "SelectItem", item);

}


geometry_calc_2d

ac_request ››


is_point_on_element_polygon

ac_request ›› geometry_calc_2d ››

Определить находится ли точка X,Y внутри полигона заданного элемента

int err = ac_request("geometry_calc_2d","is_point_on_element_polygon",double X, double Y, int iElemDescr);
или
int err = ac_request("geometry_calc_2d","is_point_on_element_polygon",double X, double Y, int iElemDescr, bool mainContOnly, double grow_contour, double grow_holes);

Здесь:

X,Y - координаты исследуемой точки;

iElemDescr - дескриптор элемента (не "ts_guid" а именно "ac_element");

mainContOnly - учитывать только внешний контур (без учета вырезов);

grow_contour - на сколько расширить или сузить (если с минусом) внешний контур перед выполнением расчета;

grow_holes - на сколько расширить или сузить (если с минусом) вырезы перед выполнением расчета;

Возвращает 0 при отсутствии ошибки.

Результат считывается следующей функцией ac_getnumvalue() - если 1 - внутри полигона, 0 - снаружи (или в вырезе, если mainContOnly - true)


is_curelem_inside_element_polygon

ac_request ›› geometry_calc_2d ››

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

Вызов:

int ires = ac_request("geometry_calc_2d","is_curelem_inside_element_polygon", int iElemGuidDescr);
или
int ires = ac_request("geometry_calc_2d","is_curelem_inside_element_polygon", int iElemGuidDescr, bool mainContOnly, double grow_contour, double grow_holes, int mode);

Здесь:

iElemmDescr - дескриптор объекта guid элемента ("ts_guid").

mainContOnly - 0/1 - если 0, то анализ идет без учета внутренних вырезов, если 1 - то если элемент iElemDescr находится внутри выреа текущего элемента, то счтается, что он не находится внутри этого элемента.

grow_contour - расстояние в мм, на которое необходимо расширить внешний контур текущего полигонального элемента перед тестированием.

grow_holes - расстояние в мм, на которое необходимо сузить вырезы текущего полигонального элемента перед тестированием.

mode - режим тестирования - у элемента iElemDescr должны попасть внутрь контура: -1 - все точки контура, 0 - точка позиционирования (pos.x pos.y), 1 - хотя бы одна точка контура, 2 - хотя бы две точки контура.


is_point_on_element_refside

ac_request ›› geometry_calc_2d ››

С какой стороны элемента находится заданная точка.

Вызов:

ac_request("is_point_on_element_refside", int px, int py, int elemguid, bool &bIsOnRefSide);

Здесь:

px, py - анализируемая точка;

bIsOnRefSide - рзультат. Внешняя сторона стены или элемента, oppSide - внутренняя сторона стены или элемента.


where_C_leftorright

ac_request ›› geometry_calc_2d ››

Определить с какой стороны вектора находится точка - справа или слева.

Выхов:

ac_request("geometry_calc_2d","where_C_leftorright",double X1, double Y1, double X2, double Y2, double pX, double pY, double &dist);

Здесь:

X1, Y1,X2, Y2 - точки начала и конца вектора,

pX, pY - коодинаты тестируемой точки

dist - результат - расстояние точки от вектора. Меньше 0 - точка слева, 0 - точка на векторе, > 0 - точка справа.

Пример - если вектор снизу вверх, то если точка слева - то возвращает значение < 0, если точка на векторе - то 0, если точка справа - то >0.


getDistPointFrom2dLine

ac_request ›› geometry_calc_2d ››

Получить расстояние от точки до прямой, заданной двумя точками.

ac_request("geometry_calc_2d","getDistPointFrom2dLine",double X1, double Y1,double X2, double Y2, double pX, double pY, double &dist);

Здесь:

X1, Y1, X2, Y2 - координаты прямой;

pX, pY - координаты тестируемой точка;

dist - результат, расстояние точки от прямой;


geometry_calc_3d

ac_request ››


RotatePoint3dAroundVect3d

ac_request ›› geometry_calc_3d ››

Повернуть точку вокруг вектора на заданный угол.

Начало вектора - в точке 0,0,0.

ac_request("geometry_calc_3d","RotatePoint3dAroundVect3d",double rx, double ry, double rz, double alpha, double x, double y, double z, double& resx, double& resy, double& resz);

Здесь:

rx,ry,rz - координаты вектора, вокруг которого осуществить поворот;

alpha - угол поворота;

x,y,z - координаты поворачиваемой точки;

resx, resy, resz - результат.


GetBounds

ac_request ›› geometry_calc_3d ››

Получить размеры габаритного контейнера для текущего элемента.

Вызов:

err = ac_request("geometry_calc_3d","GetBounds",double xMin, double yMin, double zMin, double xMax, double yMax, double zMax);


classification

ac_request ››

Получить имя родительского класса элемента в заданной классификации.

Вызов:

int err = ac_request("elem_classification_get_item_value",string sclassifname);

Здесь:

err = 0 если считано без ошибок,

sclassifname - имя классификатора,

Результат считывается командой ac_getstrvalue();


find_item_by_name

ac_request ›› classification ››

Получить имя класса, заданного текущему элементу в заданном классификаторе.

Вызов:

int err = ac_request("classification","find_item_by_name", string classifname, string itemname, int iGuidItem);

Здесь:

err = 0 если найдено и без ошибок,

sclassifname - имя классификатора,

itemname - имя класса,

iGuidItem - дескриптор объекта ts_guid, в который запишется guid класса чтобы его можно было присваивать элементам модели ARCHICAD.


check_class_is_inbranch

ac_request ›› classification ››

Проверить класс на его нахождение в ветке другого класса в заданном классификаторе.

Вызов:

bool bres = check_class_is_inbranch(UniString classification, UniString classname1, UniString classnametest)

Здесь:

bres - true если класс classnametest находится в какой либо из веток класса clsaaname1.

classnametest - имя класса, который надо протестировать,

classname1 - имя класса, к которому проверяем что он является прародителем класса classnametest.

classification - имя классификатора, в котором это проверяется.


CreateClassificationSystem

ac_request ›› classification ››

Создать новый классификатор.

Вызов:

int err = ac_request("classification","CreateClassificationSystem", int iguiddescr, string name, string description, string source, string editionVersion, int year, int month, int day);

Здесь:

err = 0 если создано без ошибок,

iguiddescr - дескриптор вновьсозданного классификатора,

name - имя создаваемого классификатора,

description - произвольное описание создаваемого классфикатора,

source - произвольный текст, описывающий источник данных,

editionVersion - произвольный текст, описывающий версию,

year - номер года,

month - номер месяца,

day - номер дня, которые требуется указать при создании классификатора.


CreateClassificationItem

ac_request ›› classification ››

Создать класс в классификаторе.

Вызов:

int err = ac_request("classification","CreateClassificationItem", int iguiddescritem/string sguidresultitem, string id, string name, string description, int isystemguid/string ssystemguid, int iparentitemguid, int inextitemguid)

Здесь:

err = 0 если создано без ошибок,

iguiddescritem - дескриптор объекта ts_guid куда будет записан guid создаваемого класса,

или

sguidresultitem - текстовая переменная, куда запишется guid создаваемого класса в текстовом виде,

id - id создаваемого класса,

name - имя создаваемого класса,

description - произвольное описание создаваемого класса,

isystemguid - дескриптор объекта ts_guid с guid'ом классификатора, в котором создаем класс,

или

ssystemguid - guid классификатора, в котором создаем класс - в текстовом виде,

iparentitemguid - дескриптор guid'а родительского класса, к которому хотим создать подкласс (может быть -1, если создавать нужно в корневом разделе классификатора),

или

sparentitemguid - то же но guid в текстовом виде,

inextitemguid - дескриптор элемента, за которым поставить класс (может быть -1)

или

snextitemguid - то же, но в текстовом виде.


DeleteClassificationItem

ac_request ›› classification ››

Удалить класс по его guid.

Вызов:

int err = ac_request("classification","DeleteClassificationItem", int iguiddescritem/string sguiditem)

Здесь:

err = 0 если удаление произошло без ошибок,

iguiddescritem - дескриптор объекта ts_guid удаляемого класса,

или

sguiditem - guid класса в текстовом виде.


set_item_to_curelem

ac_request ›› classification ››

Присвоить класс текущему элементу.

Вызов:

int err = ac_request("classification","set_item_to_curelem", iGuidItem);

Здесь:

err = 0 если присвоено без ошибок,

iGuidItem - дескриптор guid значения класса.

Перед обращением к этой функции надо создать объект типа ts_guid. При его создании нам выдается дескриптор.

Затем находим в нужном классификаторе по имени нужный класс через "find_item_by_name" и получаем guid класса.


GetClassificationSystems

ac_request ›› classification ››

Получить список классификаторов, установленных в проекте.

Вызов:

int iret = ac_request("classification", "GetClassificationSystems", int iTableClassificatorsInProject);

Здесь:

iTableClassificatorsInProject - дескриптор таблицы, в которую будут записаны данные об установленных классификаторах

В iret - код ошибки или 0.

В iTableClassificatorsInProjectLoc формируется таблица с колонками:

"guid" - строка;

"name" - строка;

"description"- строка;

"source" - строка;

"editionVersion"- строка;

"editionDate" - дата.

Пример:

int iTableClassificatorsInProjectLoc;

object("create", "ts_table", iTableClassificatorsInProjectLoc);

iret = ac_request("classification", "GetClassificationSystems", iTableClassificatorsInProjectLoc);


GetClassificationSystem_guid_by_name

ac_request ›› classification ››

Получить guid классификатора по его имени и версии.

Вызов:

int ires = ac_request("classification", "GetClassificationSystem_guid_by_name", string classifsysname, string classifsysver, int isystemguid/string ssystemguid);

Здесь:

classifsysname - имя классификатора,

classifsysver - версия классификатора,

isystemguid - дескриптор объекта ts_guid в который вернется guid классификатора,

или

ssystemguid - текстовая переменная, куда вернется guid классификатора в текстовом виде.

Пример:

Создать класс в классификаторе "Структура ЦИМ".

string classifsysname = "Структура ЦИМ", classifsysver = "1.0";
string systemguid;
int ires = ac_request("classification", "GetClassificationSystem_guid_by_name", classifsysname, classifsysver, systemguid);
if (ires == 0)
{
string id, name, description;
id = "new id"; name = "new name"; description = "new descr";
string snewguid;
ac_request("classification", "CreateClassificationItem", snewguid, id, name, description, systemguid, -1, -1);
}


Classification_Import

ac_request ›› classification ››

Импортировать в проект классификатор, представленный в виде xml текста.

iret = ac_request("classification", "Classification_Import", strinf sXMLsource, int iclassifpolicy, int ipropertypolicy);

Здесь:

sXMLsource - исходный текст классификатора в xml кодировке,

iclassifpolicy - как поступать при конфликтах во время загрузки классификатора:

0 - объединить с существующей классификацией,

1 - заменить,

2 - пропустить.

ipropertypolicy - как поступать при конфликтах во время загрузки параметров у классификации:

0 - объединить,

1 - пропустить.

Пример:

Получить с сайта текст классификатора из файла и загрузить его в проект.

int do_iButtonloadClassificator()

{

string sclassifname = "Классификация КСИ- Oбъекты капитального строительства";

int iStringDescr;

object("create", "ts_string", iStringDescr);

int iret = ts_string(iStringDescr, "ReadFromURL", "http://www.labpp.ru/TSDownload/KSI/" + sclassifname + ".txt");

object("read_simple_value", iStringDescr);

string sXMLsource = ac_getstrvalue();

if (iret == 0)

{

coutvar << sXMLsource;

iret = ac_request("classification", "Classification_Import", sXMLsource, 1, 0);

if (iret == 0)

{

tsalert(-3, "Сообщение", "Классификатор успешно загружен", sclassifname);

}

}

object("delete", iStringDescr);

refresh_classificators_list_for_loaded();

}


GetClassifSystem_By_ClassTtemGuid

ac_request ›› classification ››

Получить данные о классификаторе по guid позиции класса.

Вызов:

int err = ac_request("classification", "GetClassifSystem_By_ClassTtemGuid", int/string guid, int/string classifsystemguid, string name, string description, string source, string editionVersion, string editionDate);

Здесь:

guid - GUID позиции класса, для которого надо узнать данные классификатора. Задается как дескриптор или текст;

classifsystemguid - результат - guid классификатора (текст или дескриптор);

name, description, source, editionVersion, editionDate - результат - данные классификатора.


do_move_rot_and_scale_elemlist

ac_request ››

Переместить или скопировать элементы, собранные в заданном списке на заданное расстояние, с учетом группировки, с поворотом на угол с масштабированием и записать вновь созданные элементы в заданный список.

ac_request("do_move_rot_and_scale_elemlist", int iElemList, double coordtoX, double coordtoY, double coordRotCenterX, double coordRotCenterY, double angle, double scale, bool bDoRotate, bool bWithDelete, int bpt, int mmode, int iElemList2);

Здесь:

iElemList - номер списка элементов, которые копировать или перемещать;

coordtoX, coordtoY - координаты куда переместить;

coordRotCenterX, сoordRotCenterY - координаты центра поворота;

angle - угол в радианах;

scale - масштаб (доли 1);

bDoRotate - поворачивать или нет;

bWithDelete - удалять оригиналы или нет;

bpt - что взять за базовую точку

0 - TopLeft,

1 - TopMiddle,

2 - TopRight,

3 - MiddleLeft,

4 - MiddleMiddle,

5 - MiddleRight,

6 - BottomLeft,

7 - BottomMiddle,

8 - BottomRight,

9 - Default,

10 - ByParentCoordCenter.

mmode - режим учета групп

каждый элемент по отдельности BySingle=0,

по последней группировке ByGroupsBelow=1,

по первой группировке ByGroupsTop=2

все как единое целое ByAll=3

iElemList2 - номер списка элементов, куда поместить вновь созданные элементы.

Пример

Скопировать элемент кровли на расстояние 1 м вправо, находящийся в списке 2 и записано созданный элемент в список 4,

и задать номер многослойной конструкции 111.

int iElemList = 2;

int iElemList2 = 4;

double coordtoX = 1;

double coordtoY = 0;

double coordRotCenterX = 0;

double coordRotCenterY = 0;

double angle = 0;

double scale = 1;

bool bDoRotate = false;

bool bWithDelete = false;

int bpt = 0;

int mmode = 0;

coordtoX = coordtoX + offset;

ac_request("do_move_rot_and_scale_elemlist", iElemList, coordtoX, coordtoY, coordRotCenterX, coordRotCenterY, angle, scale, bDoRotate, bWithDelete, bpt, mmode, iElemList2);

ac_request("set_current_element_from_list", 4, 0);

int compositindex = 111;

ac_request_special("set_element_value", "EP","composite", compositindex);


clearmessagewindow

ac_request ››

Очистить окно сообщений.

Вызов:

ac_request("clearmessagewindow");


get_labpp_product_name

ac_request ››

Получить имя add-ons LABPP. Например, если скрипт запущен из программы LabPP_Calc, то будет выдано "LabPP_Calc".

Вызов:

ac_request("get_labpp_product_name");

Возвращает значение через вызов ac_getstrvalue();

Пример:

ac_request("get_labpp_product_name");
string sproductname = ac_getstrvalue();
if (sproductname != "LabPP_Calc")
{
ts_dialogcontrol(iButton_ToCalc_DS, "disable");
}


ac_request_special

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


get_pie

ac_request_special ››

Считать атрибуты пирога слоев материалов в таблицу 1, и слои в таблицу 2.

Вызов:

ac_request2("get_pie", int pieindex, int iTable1, int iTable2);

Здесь:

pieindex - индекс многослойной конструкции (пирога). Если задать -1, тогда грузим вообще все пироги, которые имеются в проекте;

iTable1 - дескриптор объекта ts_table для заполнения данными пирога слоев (или пирогов слоев);

На выходе она содержит записи со следующими колонками:

"composite_index" тип int - индекс пирога слоев в проекте;

"piename" тип string - название пирога;

"totalThick" тип double - общая толщина пирога;

"nComps" тип int - чсло слоев в пироге.

iTable2 - дескриптор объекта ts_table для заполнения данными о составах пирогов слоев.

На выходе она содержит записи со следующими колонками:

"composite_index" тип int - индекс пирога слоев, к которому относится слой;

"buildingmaterial" тип int - индекс строительного материала в проекте;

"pielayername" тип string - название строительного материала;

"ID" тип string - id стройматериала;

"thickness" тип double - толщина слоя;

"flagbits" тип int - набор битовых характеристик;

"leftright" тип int - описатель положения слоя по отношению к ядру пирога многослойки (слева отделка - 0, ядро - 1, справа отделка 2);

"cutMaterial" тип int - индекс покрытия;

"cutFill" тип int - индекс штриховки;


load_elements_list

ac_request_special ››

Загрузить заданный список элементами ARCHICAD по заданным условиям

Вызов:

Первый вариант:

ac_request("load_elements_list",int iListNum,string sElemTypeName,"MainFilter",int iMainFilterValue,string filterparametrname, string/double filterparametervalue,...);

Здесь:

iListNum - номер внутреннего списка элементов (от 0...9).

sElemTypeName - название типа элемента. Если нужно выбрать любые элементы - "ZombieElemType", если только колонны, то "ColumnType", стены - "WallType" и т.д.

"MainFilter" - сообщает, что мы задаем параметры для отфильтровывания элементов по типу доступности для редактирования, видимости и т.п. iMainFilterValue - обычно значение для видимых и редактируемых элементов - 3.

Далее идут названия параметров и их значения для дополнительного отбора.

Например "ID","Значение ID" - означает, что нужно выбрать элементы с ID="Значение ID" и т.д.

Фильтр "MainFilter" можно и не указывать. Это равносильно тому, что написать "MainFilter",0.

Т.е. при формировании списка в него попадут все подходящие элементы в проекте без учета основного критерия.

Значение фильтра собирается по формуле.

MainFilterValue=j1+2*j2+4*j3+8*j4+16*J5+32*j6+64*j7+128*j8+256*j9+512*j10+1024*j11+2048*j12+4096*j13+268435456*j14,

где каждое j может быть 0 или 1.

j1: только редактируемые.

j2: на видимом слое.

j3: на текущем этаже

j4: имеет представление в 3d окне

j5: в моем рабочем пространстве

j6: не подчиненные а только независимые элементы

j7: на активном чертеже

j8: отображается внутри обрезанной части базы данных чертежа

j9: указывает, передан ли данному элементу идентификатор изменения в параметре variationID

j10: имеются права доступа к элементу

j11: элемент виден в реновации

j12: дополнительный флаг; проверяет, переопределены ли атрибуты элемента текущим фильтром обновления

j13: дополнительный флаг; проверяет видимость элемента с учетом текущей настройки отображения структуры

j14: только из 2d окна

Второй вариант:

ac_request_special("load_elements_list", int iListNum, string ElemTypeName, int iMainFilterValue,
string left_braces1, string genesis1, string parname1, string operation1, string value1, string right_braces1, string operation1and2,
string left_braces2, string genesis2, string parname2, string operation2, string value2, string right_braces2, string operation2and3,
...
string left_bracesN, string genesisN, string parnameN, string operationN, string parvalueN, string right_bracesN);

Здесь:

left_braces1 - открывающие скобки выражения, например "((".

right_braces - закрывающие скобки выражения, например ")))".

Количество скобок должно быть четное и осмысленное.

genesis1 - происхождение сравниваемого параметра,

Возможны значения:

"ANY" - любое,

"GDL" - параметр GDL элемента,

"EP" - параметр элемента проекта,

"UP" - пользовательское свойство,

"UPb" - пользовательское свойство встроенное,

"UPub" - пользовательское свойство встроенное, созданное пользователем проекта,

"UPa" - пользовательское свойство встроенное,

"Cls" - параметр классификатора,

"IFC" - свойство UFC,

"UTS" - собственное свойство, назначенное элементу,

"Q" - количественное свойство

value1 - значение, с которым сравнивается значение параметра.

operation1and2 - операция с нижеследующими выражениями.

Может быть "И" (AND) или "ИЛИ" (OR).

Третий вариант:

ac_request_special("load_elements_list", int iListNum, string ElemTypeName, int iMainFilterValue, int iTableFilter);

Здесь:

iListNum - номер списка, в который нужно загрузить элементы,

ElemTypeName - низвание типа выбираемых элементов,

iMainFilterValue - значение главного фильтра элементов по видимости, доступности и т.п (см.выше).

iTableFilter - дескриптор таблицы, в которой заданы параметры фильтрации.

Этот вариант удобен, если нужно формировать сложные запросы фильтрации по ходу выполнения программы.

Пример:

Загрузить маркеры квартир в список №1 с этажей, у которых индекс 1 и 2.

int iTableFilter;

object("create", "ts_table", iTableFilter);

ts_table(iTableFilter, "create_structure_for_filter_table");

ts_table(iTableFilter, "add_row_to_filter_table", "", "EP", "ObjectName", "CONTAINS", "labelLabPP_Flat", "", "AND");

// дополнить таблицу фильтра элементов индексами этажей

ts_table(iTableFilter, "add_row_to_filter_table", "", "EP", "StoryIndex", "!=", 1, "", "AND");

ts_table(iTableFilter, "add_row_to_filter_table", "", "EP", "StoryIndex", "!=", 2, "", "");

ac_request_special("load_elements_list", 1, "ObjectType", 2, iTableFilter);

object("delete", iTableFilter);


add_elements_list

ac_request_special ››

То же что "load_elements_list", но перед заполнением список не очищается а дополняется новыми элементами, удовлетворяющими условиям выборки.


load_elements_list_from_selection

ac_request_special ››

То же что "load_elements_list", но выборка происходит из выбранных элементов.


add_elements_list_from_selection

ac_request_special ››

То же что "load_elements_list", но выборка происходит из выбранных элементов и перед заполнением список не очищается а дополняется новыми элементами, удовлетворяющими условиям выборки.


load_elements_list_curdb

ac_request_special ››

То же, что и "load_elements_list" но при отборе не происходит переключение в другую базу данных.


copy_elements_to_list_from_list_by_filter

ac_request_special ››

То же, что и "load_elements_list", но отбор делается не из проекта, а из другого списка элементов.


check_cur_element_by_filter

ac_request_special ››

То же что и "load_elements_list", но выборка делается не из проекта, а проверяется текущий элемент на соответствие условиям фильтра.


GetMaterialSurfaceSquare

ac_request_special ››

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

Например, у элементов типа Morph можно назначать различным граням собственное поерытие (удерживайте CTRL+SHIFT и кликайте на нужные грани - они будут выбираться.

Затем в редакторе элемента задайте название материала).

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

Вызов:

int ires = ac_request_special("GetMaterialSurfaceSquare", string materialname);

или

int ires = ac_request_special("GetMaterialSurfaceSquare", int materialindex);

Здесь:

materialname - имя материала (не стройматериала, а материала, т.к. покрытия).

materialindex - индекс материала.

Возвращает -1 если имя материала не найдено.

Пример. Получить площадь поверхности у элемента Morph, у которой задано покрытие "Лестница - ступень".

ires = ac_request_special("GetMaterialSurfaceSquare","Лестница - ступень");

square = ac_getnumvalue();

cout << "Площадь ступеней=" << square << "\n";


GetMaterialSurfaceSquareTable

ac_request_special ››

Суммировать все площади всех граней элемента раздельно по назначенным материалам.

Например, у элементов типа Morph можно назначать различным граням собственное поерытие (удерживайте CTRL+SHIFT и кликайте на нужные грани - они будут выбираться.

Затем в редакторе элемента задайте название материала).

Все площади покрытий можно получить одной командой.

Результат выводится в таблицу.

Вызов:

int ires = ac_request_special("GetMaterialSurfaceSquareTable", int iTableDescr);

Здесь:

iTableDescr - таблица с результатом.

Перед вызовом функции надо создать объект таблицы.

Функция создаст колонки:

"materialindex" - тип целое число;

"materialname" - тип строка;

"square" - тип число с плавающей точкой.

Пример. Получить площади всех поверхностей у выбранного элемента Morph раздельно по материалам и вывести в окно сообщений.

int main()

{

ac_request_special("load_elements_list_from_selection", 1, "MorphType", 0);

ac_request("get_loaded_elements_list_count",1);

int iсount = ac_getnumvalue();

if (icount == 0)

{

cout << "Сначала выберите элемента типа Morph";

return;

}

ac_request("set_current_element_from_list", 1, 0);

int iTableMat;

object("create", "ts_table", iTableMat);

ac_request_special("GetMaterialSurfaceSquareTable", iTableMat);

string str;

ts_table(iTableMat, "print_to_str", strrr);

coutvar << str;

object("delete", iTableMat);

cout << "Программа успешно завершена";

}

Результат:


get_element_value

ac_request_special ››

Считать значение свойства или параметра у текущего элемента.


buildingMaterialName_thickness

ac_request_special ›› get_element_value ››

Для текущего элемента рассчитать общую толщину стройматериалов многослойки или одного материала, которые использованы в назначении элементу при условии, что имя материала отвечает шаблону.

int err = ac_request_special("get_element_value", "EP", "buildingMaterialName_thickness( \"(?=.*Минерал.*)(?=.*ват.*)(?=.*плит.*)\")",int iTableResult);

или

int err = ac_request_special("get_element_value", "EP", "buildingMaterialName_thickness( \"(?=.*Минерал.*)(?=.*ват.*)(?=.*плит.*)\")");

Результат получаем через ac_getnumvalue();

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

Т.е. если в многослойке есть один слой утеплителя одного типа и два слоя утеплителя другого типа - то в результате будет посчитана общая толщина утеплителя, а в таблицу выпадут две строки - утеплитель первого типа с толщиной, и утеплитель второго типа с суммарной толщиной его двух слоев.


buildingMaterialName_used

ac_request_special ›› get_element_value ››

Для текущего элемента рассчитать общую толщину стройматериалов многослойки или одного материала, которые использованы в назначении элементу при условии, что имя материала отвечает шаблону.

int err = ac_request_special("get_element_value", "EP", "buildingMaterialName_used( \"(?=.*Минерал.*)(?=.*ват.*)(?=.*плит.*)\")",int iTableResult);

или

int err = ac_request_special("get_element_value", "EP", "buildingMaterialName_used( \"(?=.*Минерал.*)(?=.*ват.*)(?=.*плит.*)\")");

Результат получаем через ac_getnumvalue();

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

Т.е. если в многослойке есть один слой утеплителя одного типа и два слоя утеплителя другого типа - то в результате будет посчитана общая толщина утеплителя, а в таблицу выпадут две строки - утеплитель первого типа с толщиной, и утеплитель второго типа с суммарной толщиной его двух слоев.

Свойство может указываться в фильтрах для отбора строк по табличному фильтру.

Имя колонки | Тип колонки | Назначение
building_material_index | int | Индекс стройматериала в ARCHICAD
name | string | Имя стройматериала в ARCHICAD
id | string | ID стройматериала в ARCHICAD
thickness | double | Суммарная толщина стройматериала в пироге


set_element_value

ac_request_special ››

Задать значение свойства или параметра текущему элементу.


set_element_value_curdb

ac_request_special ››

То же, что и "set_element_value" но операция выполняется без переключения в другую базу данных.


RunGDLParScript

ac_request_special ››

Выполнить скрипт у текущего GDL объекта.

Вызов:

int ires = ac_request_special("RunGDLParScript");


get_building_material

ac_request_special ››

Получить информацию о стройматериале по его индексу в проекте, или все стройматериалы проекта.

Вызов:

int ires = ac_request_special("get_material", int bmatindex, int iTableBMat);

Здесь:

iTableBMat - таблица, описывающая стройматериал.

Если указать в matindex конкретный индекс стройматериала, то будет только одна строка.

Если указать -1 - то будет записан весь список стройматериалов.

Структура таблицы на выходе:

"building_material_index" тип int - индекс стройматериала,

"name" тип string - название стройматериала,

"id" тип string - ID стройматериала,

"cutMaterial" тип string - материал для сечения стройматериала,

"strMaterialGuid" - guid стройматериала в текстовом виде.


get_build_material_value

ac_request_special ››

Получить значения свойст, назначенных строительному материалу.

Вызов:

int ires = ac_request_special("get_build_material_value", int ibuildmatindex, string genesis, void &variable);

или

int ires = ac_request_special("get_build_material_value", string sbuildmatname, string genesis, void &variable);

Здесь:

ibuildmatindex - индекс строительного материала,

sbuildmatname - название строительного материала.

genesis - имя происхождения свойства, например "UP" - свойство является пользовательским свойством.

variable - переменная, в которую вернется значение запрашиваемого параметра строительного материала.

Для получения значения может быть представлен дескриптор объекта типа ts_table.

Пример:

Считать строительный материал текущего элемента, считать у этого материала значение параметра "Имя стройматериала на английском" и записать все это в пользовательские свойства текущего элемента.

int bmatindex;

string bmatname, bmatid, bmatnameenglish;

// считать у текущего элемента назначенный стройматериал

ac_request("get_element_value", "buildingMaterial");

bmatindex = ac_getnumvalue();

// получить имя этого стройматериала

err = ac_request("get_bmnamebyindex", bmatindex, bmatname, bmatid);

// получить имя этого стройматериала на английском из пользовательского свойства стройматериала

ac_request_special("get_build_material_value", bmatindex, "UP", "Имя стройматериала на английском");

bmatnameenglish = ac_getstrvalue();

// записать все эти свойства стройматериала в пользовательские свойства текущего элемента

ac_request("elem_user_property", "set", "Имя материала у элемента", bmatname);

ac_request("elem_user_property", "set", "Имя материала у элемента на английском", bmatnameenglish);


get_material

ac_request_special ››

Получить информацию о материале (покрытии) по его индексу в проекте, или все материалы (покрытия) проекта.

Вызов:

int ires = ac_request_special("get_material", int matindex, int iTableMat);

Здесь:

iTableMat - таблица, описывающая материал (покрытие).

Если указать в matindex конкретный индекс материала, то будет только одна строка.

Если указать -1 - то будет записан весь список материалов (покрытий).

Структура таблицы на выходе:

"material_index" тип int - индекс материала (покрытия),

"name" тип string - название материала (покрытия),

"texturepath" тип string - текстура,

"surfaceRGB" тип string - код RGB покрытия,

"surfaceRGB255" - тип string - RGB в последовательности через запятую (например "255,100,20").


load_zonerelatedwallstolist

ac_request_special ››

Загрузить во внутренний список стены, ассоциированные с заданной зоной.

Вызов:

int ires = ac_request_special("load_zonerelatedwallstolist", int iZoneGuid, int ilistindex);

Здесь:

iZoneGuid - дескриптор объекта типа ts_guid, содержащий guid зоны, у которой нужно получить список стен.

ilistindex - индекс внутреннего списка элементов, в который надо собрать эти стены.


load_zonerelatedwallparttotable

ac_request_special ››

Загрузить в таблицу список фрагментов стен, ассоциированные с заданной зоной.

Вызов:

int ires = ac_request_special("load_zonerelatedwallstolist", int iZoneGuid, int iTableDescr);

Здесь:

iZoneGuid - дескриптор объекта типа ts_guid, содержащий guid зоны, у которой нужно получить список фрагментов стен.

iTableDescr - дескриптор объекта типа ts_table для получения фрагментов стен.

Функция создаст колонки:

"GUID" - тип строка - guid стены, к которой относится фрагмент;

"roomEdge" - тип целое - номер вершины у полигона зоны, к которому привязан фрагмент стены;

"tBeg" - тип число с плавающей точкой - стартовая позиция фрагмента стены, отсчитывая от точки начала стены.

"tEnd" - тип число с плавающей точкой - финишная позиция фрагмента стены, отсчитывая от точки начала стены.


Attribute_GetNum

ac_request_special ››

Получить количество атрибутов проекта заданного типа.

Вызов:

ac_request2("Attribute_GetNum", int iattrtype, int &icount);

Здесь:

iattrtype - тип атрибута.

Перья - 1,

Слои - 2,

Типы линий - 3,

Типы штриховок - 4,

Пироги материалов - 5,

Материалы - 6,

Города - 7,

Комбинации слоев - 8,

Категории зон - 9,

Шрифты - 10,

Профили - 11,

Таблицы перьев - 12,

Стандарты размеров - 13,

Список модельных видов - 14,

MEP системы - 15,

Энергетические назначения - 16,

Строительные материалы - 17,

Стили маркировки - 18

icount - возвращается количество атрибутов заданного типа.


clipboard_set

ac_request_special ››

Занести значение в буффер Windows. Записанное значение можно вставлять куда угодно штатными средствами Windows (Ctrl+V или Shift+Ins).

Вызов:

ac_request_special("clipboard_set", string str);

Здесь:

str - переменная, содержащая текст, который необходимо занести в буффер Windows.


clipboard_get

ac_request_special ››

Считать строку из буффера Windows.

Вызов:

ac_request_special("clipboard_get",string &str);

Здесь:

str - имя переменной, куда хотим записать содержимое из буффера Windows.


element_user_data

ac_request_special ››

Помимо штатных свойств и параметров имеется возможность создавать любое количество собственных переменных и присваивать им значения.

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

Порядок использования механизма для элемента простой.

Сделать элемент текущим.

Командой "read" считать содержимое уже имеющихся присвоенных ранее переменных этого элемента (обязательно, даже если раньше еще не создавались эти переменные).

Произвести манипуляции с переменными - создать переменную (присвоить значение), считать, удалить и т.п.

Затем, если необходимо зафиксировать изменения - выполнить команду "write".

В текстовце переменные можно записывать таблицы. Преобразование таблиц в текст - см. класс ts_table.


read

ac_request_special ›› element_user_data ››

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

Вызов:

int ires = ac_request_special(""element_user_data","read");


write

ac_request_special ›› element_user_data ››

Записать в текущий элемент все выполненные изменения с переменными.

Вызов:

int ires = ac_request_special("element_user_data","write");


write_to_file

ac_request_special ›› element_user_data ››

Записать блок данных пользовательских данных в файл.

int ires = ac_request_special("element_user_data", "read_from_file", string fullpath);

Возвращает в ires 0 в отсутствии ошибок.

Если возникла ошибка - возвращяется -1.

fullpath - путь к файлу, откуда считать блок данных.

Пример.

Упаковать рабочие таблицы в блок пользовательских данных и записать блок в файл и обратная операция - прочитать из файла и распаковать в таблицы.

int WriteTablesToFile()

{

string str, tmppath, filename;

shell_func("get_path", "tmp", tmppath);

filename = "LabPP_SAINT-GOBAIN.ini";

tmppath += "\\" + filename;

coutvar << tmppath;

ac_request_special("element_user_data", "clear");

ts_table(iTableMaterials, "print_to_str_as_json", str);

coutvar << str;

ac_request_special("element_user_data", "set_variable_value", "iTableMaterials", str);

ts_table(iTableSolutionsMats, "print_to_str_as_json", str);

ac_request_special("element_user_data", "set_variable_value", "iTableSolutionsMats", str);

ts_table(iTableSolutions, "print_to_str_as_json", str);

ac_request_special("element_user_data", "set_variable_value", "iTableSolutions", str);

ts_table(iTableSysProps, "print_to_str_as_json", str);

ac_request_special("element_user_data", "set_variable_value", "iTableSysProps", str);

int ires = ac_request_special("element_user_data", "write_to_file", tmppath);

if (ires < 0)

{

tsalert(-2, "Предупреждение", "Не удалось записать данные в файл " + tmppath, "Этот файл предназначен для быстрой загрузки данных GYPROC. Возможно этот путь не доступен для записи. Настройте config.cpp", "Ok");

return -1;

}

}

int ReadTablesFromFile()

{

string str, tmppath, filename;

filename = "LabPP_SAINT-GOBAIN.ini";

shell_func("get_path", "tmp", tmppath);

tmppath += "\\"+filename;

int ires = ac_request_special("element_user_data", "read_from_file", tmppath);

if (ires < 0)

{

tsalert(-2, "Предупреждение", "Не удалось считать данные из файла " + tmppath, "Этот файл содержит информацию GYPROC из файла Excel для быстрой загрузки", "Ok");

return -1;

}

ac_request_special("element_user_data", "get_variable_value", "iTableMaterials", str);

cout << "-------------------------------------\n";

coutvar << str;

ts_table(iTableMaterials, "load_from_json_str", str);

ac_request_special("element_user_data", "get_variable_value", "iTableSolutionsMats", str);

ts_table(iTableSolutionsMats, "load_from_json_str", str);

ac_request_special("element_user_data", "get_variable_value", "iTableSolutions", str);

ts_table(iTableSolutions, "load_from_json_str", str);

ac_request_special("element_user_data", "get_variable_value", "iTableSysProps", str);

ts_table(iTableSysProps, "load_from_json_str", str);

}


clear

ac_request_special ›› element_user_data ››

Очистить информацию обо всех переменных.

Вызов:

int ires = ac_request_special("element_user_data","clear");


delete_variable

ac_request_special ›› element_user_data ››

Удалить собственную переменную у текущего элемента.

Вызов:

int ires = ac_request_special("element_user_data","delete_variable",string varname);

Здесь:

varname - имя удаляемой переменной.


get_variable_value

ac_request_special ›› element_user_data ››

Считать значение собственной переменной текущего элемента.

Вызов:

int err = ac_request_special("element_user_data","get_variable_value",string varname, void &varnametovalue);

Здесь:

varname - имя переменной;

varnametovalue - переменная соответствующего типа, куда считать значение.

err - при успешном считывании значения - 0.


set_variable_value

ac_request_special ›› element_user_data ››

Задать значение переменной у текущего элемента. Если переменная еще не создана, то в памяти создается переменная с указанным именем и типом, соответствующим типу переменной, примененной задающей значение.

Вызов:

ac_request_special("element_user_data","set_variable_value",string varname, void &varvalue);

Здесь:

varname - имя переменной, которой необходимо задать значение;

varvalue - переменная любого типа, чье значение будет присвоено задаваемой переменной элемента.


linkingElems

ac_request_special ››

Удобно связывать элементы друг с другом для выполнения разнообразных операций.

Эти связи хранятся в проекте. Так что связанные элементы можно потом найти, связать, отвязать и т.д.

Связь односторонняя. Т.е. один элемент может быть связан с другим, а этот другой с первым - нет.

Связь характеризуется битами. Например у числа 1 - установлен последний бит. А у числа 2 - установлен предпоследний бит.

Можно устанавливать или разрывать связи по этим битам одновременно, если указать число 3 (оба бита установлены в 1).

Или по раздельности.

По ходу выполнения программ можно получать связанные элементы, связывать их двусторонней связью (от элемента другому - 1 а от того к первому - 2).

Для этих манипуляций имеются удобные функции, описанные ниже.


uplinkBiWardByFlags

ac_request_special ›› linkingElems ››

Присоединить/отсоединить элемент к списку элементов по заданному биту и одновременно присоединить/отсоединить элементы списка к элементу по другому заданному биту.

Вызов:

int err = ac_request_special("linkingElems", "uplinkBiWardByFlags", int iGuid, int bitvalue_from_to, bool bFromToOn, int bitvalue_to_from, bToFromOn, int iTableGuids);

Здесь:

iGuid - дескриптор объекта типа ts_guid, содержащего guid элемента, который надо связать/отвязать с/от списка элементов.

bitvalue_from_to - целое число, которое задает в двоичном виде какие биты связи от элемента к элементам списка, заданного в таблице iTableGuids надо установить (при bToFromOn==true) или снять (при bFromToOn==false).

bitvalue_to_from - целое число, которое задает в двоичном виде какие биты связи от элементов списка, заданного в таблице iTableGuids к элементу iGuid надо установить (при bFromToOn==true) или снять (при bToFromOn==false);

iTableGuids - дескриптор объекта типа ts_table, в котором содержатся текстовые guid элементов для привязки/отвязки.


getLinkedElemsByFlags

ac_request_special ›› linkingElems ››

Получить список текстовых guid элементов, связанных с заданным элементом по определенному флагу.

Вызов:

ac_request_special("linkingElems", "getLinkedElemsByFlags", iGuid, int bitvalue_from_to, int iTable);

Здесь:

iGuid - дескриптор объекта типа ts_guid, который указывает на элемент.

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

iTable - дескриптор объекта типа ts_table, в который возвращается список текстовых guid связанных элементов.


set_TSMAX_ELEMLIST_NUMBER

ac_request_special ››

Увеличить количество списков для выборок элементов.

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

Вызов:

ac_request_special("set_TSMAX_ELEMLIST_NUMBER", int ineeded_count);

Здесь:

ideeded_count - желаемое количество внутренних списков элементов.

Пример.

Задать количество списков для выборки = 100, если это уже не сделано ранее.

int iicount;

ac_request_special("get_TSMAX_ELEMLIST_NUMBER", iicount);

if (iicount < 100)

{

ac_request_special("set_TSMAX_ELEMLIST_NUMBER", 100);

}

coutvar << iicount;


get_TSMAX_ELEMLIST_NUMBER

ac_request_special ››

Считать количество списков для выборок элементов.

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

Чтобы узнать достаточно ли выделено уже списков, используем эту функцию.

Вызов:

ac_request_special("get_TSMAX_ELEMLIST_NUMBER", int &icurrent_lists_count);

Здесь:

icurrent_lists_count - текущее количество внутренних списков элементов.


set_elemlistname

ac_request_special ››

Задать списку элементов имя. Если имя уже задействовано для другого номера списка, и если для заданного номера уже задано имя - старые назначения удаляются, а назначается новое.

Назначение имени позволяет обращаться в любых командах вместо номера списка - по его имени.

Вызов:

ac_request_special("set_elemlistname", int ilistnum, string slistnewname);

Здесь:

ilistnum - номер списка, которому задается имя.

slistnewname - новое имя списка.


Get_Elements_Collisions

ac_request_special ››

Проверка списков элементов на коллизии.

Вызов:

int ires = ac_request_special("Get_Elements_Collisions",int iList1, int iList2, int iTable_res,
double volumeTolerance, bool performSurfaceCheck, double surfaceTolerance);

Здесь:

iList1, iList2 - номера списков элементов, в которых собраны элементы, проверяемые на коллизии;

iTable_res - дескриптор таблицы, в которую будут записываться результаты проверки.

Имя колонки | Тип | Назначение
GUID1 | строка | guid элемента 1
TypeName1 | строка | тип элемента 1
ID1 | строка | ID элемента 1
hasBodyCollision1 | bool | есть коллизия по объему
hasClearenceCollision1 | bool | есть коллизия по зазору
GUID2 | строка | guid элемента 2
TypeName2 | строка | тип элемента 2
ID2 | строка | ID элемента 2
hasBodyCollision2 | bool | есть коллизия по объему
hasClearenceCollision2 | bool | есть коллизия по зазору

double volumeTolerance - точность по объему,

bool performSurfaceCheck - делать или нет поверхностное тестирование,

double surfaceTolerance - точность по поверхностям;


delete_elements_from_list

ac_request_special ››

Удалить заданное количество позиций элементов в заданном списке начиная с заданного индекса.

Вызов:

ac_request_special("delete_elements_from_list", int/string listindex/listname, int start_index, int count);

Здесь:

listindex или listname - индекс или имя внутреннего списка элементов, в котором надо удалить записи.

start_index - индекс, начиная с которого надо удалить записи элементов.

count - количество удаляемых записей элементов.


delete_elements_from_project

ac_request_special ››

Удалить элементы, указанные в заданном списке из проекта и очистить список.

Вызов:

int err = ac_request_special("delete_elements_from_project", int/string listindex/listname);

Здесь:

listindex или listname - индекс или имя внутреннего списка элементов, в котором надо удалить записи.

start_index - индекс, начиная с которого надо удалить записи элементов.

count - количество удаляемых записей элементов.

Возвращает 0 при успешном выполнении удаления элементов из проекта.


ac_request_attributes

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Таблица типов атрибутов

ac_request_attributes ››

Текстовое значение | Числовое значение | Назначение
"Pen" | 1 | Перо
"Layer" | 2 | Слой
"LineType" | 3 | Тип линии
"FillType" | 4 | Тип штриховки
"CompWall" | 5 | Многослойка
"Material" | 6 | Покрытие
"City" | 7 | Город
"LayerComb" | 8 | Комбинация слоев
"ZoneCat" | 9 | Категория зон
"Font" | 10 | Шрифт
"Profile" | 11 | Профиль
"PenTable" | 12 | Таблица перьев
"DimStand" | 13 | Стандарт размеров
"ModelViewOptions" | 14 | Опции модельного вида
"MepSystem" | 15 | MEP система
"OperationProfile" | 16 | Операционный профиль
"BuildingMaterial" | 17 | Стройматериал
"MarkUpStyle" | 18 | Стиль отметки


create_attr

ac_request_attributes ››

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

Вызов:

int err = ac_request_attributes("create_attr", int/string attrtypeid, string name, string id, int/strnig baseattr);

Здесь:

attrtypeid - тип атрибута;

name - название атрибута;

id - id атрибута

baseattr - название атрибута, взятого за основу.


get_num

ac_request_attributes ››


delete_attr

ac_request_attributes ››

Удалить заданный атрибут заданного типа.

Вызов:

int ires = ac_request_attributes("delete_attr", int/string attrtypeid, int attr_index);

Здесь:

attrtypeid - тип атрибута;

attr_index - индекс атрибута

Возвращает 0 при успешном выполнении операции.


set_attr_value

ac_request_attributes ››

Задать значение свойству атрибута.

Вызов:

int ires = ac_request_attributes("set_attr_value", int/string attrtype, int attrindex/string attrname, int/string genesis, string/bool/int/double value);

Здесь:

attrtypeid - тип атрибута;

attrindex или attrname - индекс или имя типа атрибута;

genesis - генезис свойства ;

value - присваиваемое значение.

Возвращает 0 при успешной записи.


get_attr_value

ac_request_attributes ››

Получить значение свойства атрибута.

Вызов:

int ires = ac_request_attributes("get_attr_value", int/string attrtype, int attrindex/string attrname, string/int genesis, string/bool/int/double value);

Здесь:

attrtypeid - тип атрибута;

attrindex или attrname - индекс или имя типа атрибута;

genesis - происхождение атрибута (генезис) ;

Считывание результата производится фунцией ac_getnumvalue() или ac_getstrvalue().

Возвращает 0 при успешной записи.

Пример.

Считать значение свойства description у стройматериала с заданым индексом

int building_material_index = 12;
ac_request_attributes("get_attr_value", "BuildingMaterial", building_material_index, "AP", "description");
string description = ac_getstrvalue();

coutvar << description;


ac_typeidfromstring

Получить код типа элемента по его названию.

Вызов:

int itype = ac_typeidfromstring(string selemtypename);

Здесь:

selemtypename - текстовое название типа элемента ("ZoneType", "MeshType", "ObjectType" и т.д.)

На выходе выдается числовое значение, соответствующее этому названию.


ac_getresvaluetype

Определяет тип данных результата, полученного при выполнении предыдущей операции.

Вызов:

string stype = ac_getresvaluetype();

В stype будет содержать "String"/"Real"/"Integer"/"Boolean" если результат предыдущей операции - строка, вещественное число, целое число или логический 1/0.


ac_getstrvalue

Возвращает текстовое значение предыдущей операции.

Вызов:

string sresult = ac_getstrvalue();


ac_getnumvalue

Возвращает числовое значение предыдущей операции.

Вызов:

double dresult = ac_getnumvalue();


ac_getupvaluestatus

Определить после операции считывания пользовательского свойства - статус его значения.

Статус может быть Null (пусто), Undefined (не присвоено) или Normal.

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

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

Чтобы понять что свойство является Null или Undefined - требуется выполнить дополнительно эту команду.

Null и Undefined, т.е. 0 и 1 являются близкими и по сути отвечают смыслу Null.

Лучше ориентироваться на значение 2 - т.е. если параметр имеет нормально присвоенное значение - то свойство не Null.

Вызов:

int ires = ac_getupvaluestatus();

Здесь:

ires - Возвращаемое значение:

0 - было считано пустое значение (Null);

1 - значение свойству не было присвоено пользователем (Undefined);

2 - свойство имеет обычное нормальное значение (Normal);

Пример.

Считать свойство и понять оно имеет значение или оно Null.

ac_request_special("get_element_value", "UP", "Переменные водосточной системы\\Координаты элементов водосточной системы");
string svalue = ac_getstrvalue();
int ivalue = ac_getupvaluestatus();
if(ivalue == 2) {
cout << "Свойство имеет нормальное значение";
}
else
{
cout << "Свойство не имеет присвоенного значения или является Null";
}


Гравитация на поверхность

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


do_elements_landing - приземление элементов

Гравитация на поверхность ››

Можно выбрать элементы и "приземлить" их на поверхность других элементов.

Обращение

ac_request("do_elements_landing", int iLandList, int iLandingElemsList, double doffset, int mmode);

Здесь:

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

iLandingElemsList - номер внутреннего списка элементов, где выбраны элементы, которые нужно приземлить.

doffset - высота над поверхностью, на которой остановить приземление.

mmode - 0 - приземлять каждый элемент по отдельности, 1 - приземлять с учетом группирования по младшей группе, 2 - с учетом группирования по старшей группе, 3 - группа элементов как единое целое.


do_surface_landing - приземление по точкам

Гравитация на поверхность ››

Можно выбрать элементы 3d сетки и "приземлить" точки их поверхностей на поверхность других элементов.
Этой же командой приземляются элементы типа "Балка" обеими точками с наклоном по криволинейной поверхности.

Вызов:

ac_request("do_surface_landing", int iLandList, int iLandingElemsList, double doffset);

Здесь:

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

iLandingElemsList - номер внутреннего списка элементов, где выбраны элементы, которые нужно приземлить.

doffset - высота над поверхностью, на которой остановить приземление.


do_point_landing - приземление точки X,Y

Гравитация на поверхность ››

Можно задать координаты X и Y и получить координату Z на поверхности, составленной элементами, собранными в списке iLandList. Если точка лежит не над поверхностью "земли" или находится над отверстием, то приземление не выполняется.

Вызов:

ac_request("do_point_landing", int iLandList, double doffset, double x1,double y1, double &z1);

Здесь:

x1,y1 - исходные координаты точки.

doffset - остаточное смещение над поверхностью.

z1 - результат приземления.

iLandList - номер внутреннего списка с элементами - земля.

Пример.

Выбрать в список №1 любвн элементы со слоя "My land" и приземлить точку с координатами x=1, y=1 на высоту 0, т.е. прямо на поверхность.

ac_request("load_elements_list,1,"ZombieElemType","Layer","My land","MainFilter",3);

double doffset=0;
double x=1, y=1, z=0;
ac_request("do_point_landing", 1, doffset, x,y,z);
cout << "Результат - координата z на поверхности = "<< z;


3d сетки

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


get_lands_combined_contour_coords

3d сетки ››

Сформировать таблицу 2d линий объединенного контура множества геометрических элементов типа 3d сетка, плита, штриховка, крыша, зона, полилиния (т.е. контуры которых ARCHICAD хранит полилинией).

Вызов:

ac_request("get_lands_combined_contour_coords", int iElementsList, int iTablePointsXY_S);

Здесь:

iElementsList - номер списка элементов, для которых требуется собрать контур;

iTablePointsXY_S - дескриптор таблицы, в которую будет записан список точек контура.

Структура таблицы будет сгенерирована автоматически.

Колонки: "x","y" - числовые 2d координаты точек объединенного контура;

"s" - числовой флаг для отслеживания вложенных контуров вырезов (зарезервировано).

Пример.

Получить общий контур из выделенных элементов типа 3d сетка и показать точки в виде таблицы в окне сообщений.

int iTable_Coords2DTableContour;

object("create", "ts_table", iTable_Coords2DTableContour);

ac_request_special("load_elements_list_from_selection", 1, "MeshType", 2);

ac_request("get_loaded_elements_list_count", 1);

int icount = ac_getnumvalue();

cout << "Отобрано элементов для анализа = " << icount << "\n";

ac_request("get_lands_combined_contour_coords", 1, iTable_Coords2DTableContour);

string str;

ts_table(iTable_Coords2DTableContour, "print_to_str", str);

cout << "Контур\n";

coutvar << str;


do_create_contour_around_points

3d сетки ››

Создать контур вокруг набора точек.

Вызов:

ac_request("do_create_contour_around_points", int iTablePointsXYZ, int iTablePointsXY_S, bool bJustSquare, double& dMinZ);

Здесь:

iTablePointsXYZ - дескриптор таблицы точек, вокруг которых сделать контур;

iTablePointsXY_S - дескриптор таблицы, куда записать результат;

bJustSquare - если true, то контур - габаритный прямоугольник, если false - контур - наименьший выпуклый многоугольник.

dMinZ - возвращается минимальная высота среди предоставленных точек;


get_lands_topcoords

3d сетки ››

Получить в таблицу список точек геометрии верхней поверхности множества элементов, собранного в списке.

Затем таблица используется, например, для построения 3d сеток в качестве списка точек или списка линий.

Вызов:

ac_request("get_lands_topcoords", int iElementsList, int iTablePointsXYZ_s_polynum, int iMode);

Здесь:

iElementsList - номер списка элементов, из которого надо выбрать точки поверхностей;

iTablePointsXYZ_s_polynum - дескриптор таблицы, в которую записать результат;

Структура генерируется автоматически.

Колонки:

"x","y","z" - координаты 3d точек поверхности;

"s" - числовой флаг для отслеживания вложенных контуров вырезов (зарезервировано);

"polynum" - уникальный номер полигона или линии в таблице.

iMode - вид, в котором получаем данные о точках - 0/1/2/3.

0 - в таблицу заносятся все точки контуров верхних граней поверхностей элементов. В поле "polynum" записывается порядковый номер грани в рамках списка. Используется для наиболее точного воссоздания поверхностей за счет абсолютно точного воспроизведения всех граней.

1 - в таблицу заносятся только уникальные точки, т.е. для смежных граней точки смежных ребер будут указаны только один раз.

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

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

При значении iMode 0,2 или 3 таблица может использоваться как источник данных для построения 3d сеток по линиям.

Пример.

Записать выделенные элементы 3d сеток в список №1 и

получить список уникальных точек верхних поверхностей в таблицу.

Вывести эту таблицу в окно сообщений.

ac_request_special("load_elements_list_from_selection", 1, "MeshType", 2);

int iTable_Coords3DTable;

object("create", "ts_table", iTable_Coords3DTable);

ac_request("get_loaded_elements_list_count", 1);

int icount = ac_getnumvalue();

cout << "Отобрано элементов для анализа = " << icount << "\n";

string str;

ac_request("get_lands_topcoords", 1, iTable_Coords3DTable, 1);

ts_table(iTable_Coords3DTable, "print_to_str", str);

cout << "\nКоординаты\n";

coutvar << str;


do_create_mesh_by_points_and_lines

3d сетки ››

Создать элемент 3d mesh (3d сетка) из таблицы точек и/или таблицы линий уровня по таблице контура.

Вызов:

ac_request("do_create_mesh_by_points_and_lines", int iTable_Coords3DPointsTable, int iTable_Coords2DTableContour, int iTable_Coords3DPointsTable);

Здесь:

iTable_Coords3DPointsTable - дескриптор таблицы, описывающей 3d точки уровня поверхности (может быть -1, если уровни заданы только линиями);

iTable_Coords2DTableContour - дескриптор таблицы, описывающей 2d точки контура. Если указать -1 - то контуром будут точки будут рассчитаные автоматически по таблицам точек уровня и линий;

iTable_Coords3DPointsTable - дескриптор таблицы, описывающей 3d линии уровней (может быть -1, если уровни задаются только точками).

Пример.

Построить общую поверхность для набора выделенных элементов в виде 3d сетки, у которой координаты уровней заданы точками.

int iTable_Coords3DTable;

object("create", "ts_table", iTable_Coords3DTable);

int iTable_Coords2DTableContour;

object("create", "ts_table", iTable_Coords2DTableContour);

ac_request_special("load_elements_list_from_selection", 1, "MeshType", 2);

ac_request("get_loaded_elements_list_count", 1);

int icount = ac_getnumvalue();

cout << "Отобрано элементов для анализа = " << icount << "\n";

ac_request("get_lands_combined_contour_coords", 1, iTable_Coords2DTableContour);

string str;

ts_table(iTable_Coords2DTableContour, "print_to_str", str);

cout << "Контур\n";

coutvar << str;

ac_request("get_lands_topcoords", 1, iTable_Coords3DTable, 1);

ts_table(iTable_Coords3DTable, "print_to_str", str);

cout << "\nКоординаты\n";

coutvar << str;

ac_request("do_create_mesh_by_points_and_lines", iTable_Coords3DTable, iTable_Coords2DTableContour,-1);

object("delete", iTable_Coords2DTableContour);

object("delete", iTable_Coords3DTable);


Диалоги

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Сообщения или выбор варианта - tsalert

Диалоги ››

Функция вызывает диалог выбора или просто сообщение. Можно создать до трех кнопок включительно.

Формат обращения:

int res = tsalert(int messagecode,string stitle,string smessagebig, string ssmall,string button1,string button2,string button3);

Здесь:

messagecode - числовой код вида окна:

-1 - сообщение об ошибке

-2 - предупреждение

-3 - информационное сообщение.

stitle - заголовок окна, smessagebig - сообщение крупными буквами, ssmall - сообщение ниже мелким текстом, button1 - button3 - тексты для соответствующих кнопок.

В res возвращается результат выбора пользователя.

Если нажата кнопка button1 - результат 1, button2 - 2, button3 - 3. Если пользователь отказался от выбора - выдается 0.

Пример.

Получить от пользователя решение сколько выводить элементов (10, 1 или все). Пояснить что можно попробовать. если пользователь выберет "Все" - сообщить в окно сообщений. Если откажется - тоже сообщить в окно сообщений.

int res = tsalert(-3, "Задайте значение", "Сколько выводить элементов?", "Для пробной выгрузки удобно вывести сначала не все маркеры", "10", "1", "Все");
if (res == 0)
{
cout << "Пользователь отказался";
return;
}


Поиск и выбор файла - dialog_get_filename

Диалоги ››

Функция ac_request с директивой dialog_get_filename вызывает диалог выбора файла.

Формат обращения:

int iret = ac_request("dialog_get_filename",string Title, string Filter, string sStartFolder, string for_what, string &FileNameAndPath);

Здесь: Title - заголовок окна, Filter - строка фильтра для выбора файла, sStartFolder - начальный путь где выбирать файл.

Полный путь к выбранному файлу возвращается в переменную FileNameAndPath.

for_what - текстовая переменная, задающая характер обращения к диалогу "OpenFile" или "Save".

Если iret будет -1 - это означает, что пользователь отказался от выбора.

Пример.

Выбрать программный файл с расширением .cpp. Искать сначала в корневом каталоге диска C:. Дополнительно - запустить этот выбранный программный файл на выполнение.

string sFileNameAndPath;
string sStartFolder = "c:\\";
int iret = ac_request("dialog_get_filename", "Выберите файл для запуска", "cpp", sStartFolder, "OpenFile", sFileNameAndPath);
if (iret == -1)
{
cout << "Пользователь отказался от выбора файла\n";
return -1;
}
run_cpp("run_from_file", sFileNameAndPath);
cout << "Файл выбран и выполнен";

Можно составлять сложные фильтры и группы фильтров по расширениям файлов.

Пример.

Предоставить пользователю выбрать файл из трех вариантов выборки.

вариант1 - Excel с расширениями xls,xslx, xslm;

вариант2 - Archicad с расширениями pln, pla, tpl;

вариант3 - Text с расширениями txt, sx.

Стартовый каталог - текущий;

string FileNameAndPath;
ac_request("dialog_get_filename", "Выберите файл", "Excel,xls,xlsx,xlsm|Archicad,pln,pla,tpl|Text,txt,sx", "", "OpenFile", FileNameAndPath);
coutvar << FileNameAndPath;


editdoubledialog - ввод числа

Диалоги ››

функция ac_request() с директивой "editdoubledialog" вызывает диалог для ввода числа с плавающей точкой.

Формат обращения:

int res = ac_request("editdoubledialog",string smessage, string sstartvalue);

или

int res = ac_request("editdoubledialog",string smessage, double dstartvalue);

Здесь:

smessage - сообщение в заголовке панели диалога, sstartvalue или dstartvalue - число, которое подставлено по умолчанию в строку редактирования диалога.

Возвращает 0 если пользователь отказался от ввода (нажал кнопку "Отменить", нажал кнопку с крестиком на рамке диалога или клавишу "Esc" на клавиатуре).

Если была нажата клавиша "Ok" то возвращается 1.

Пример.

Получить от пользователя дистанцию между элементами. По умолчанию предложить значение 20.

int res = ac_request("editdoubledialog","Введите дистанцию между элементами (м)","20");


editintdialog - ввод целого числа

Диалоги ››

функция ac_request() с директивой "editdoubledialog" вызывает диалог для ввода числа с плавающей точкой.

Формат обращения:

int res = ac_request("editintdialog",string smessage, string sstartvalue);

или

int res = ac_request("editintdialog",string smessage, double dstartvalue);

Здесь:

smessage - сообщение в заголовке панели диалога, sstartvalue или dstartvalue - число, которое подставлено по умолчанию в строку редактирования диалога.

Возвращает 0 если пользователь отказался от ввода (нажал кнопку "Отменить", нажал кнопку с крестиком на рамке диалога или клавишу "Esc" на клавиатуре).

Если была нажата клавиша "Ok" то возвращается 1.

Пример.

Получить от пользователя количество элементов. По умолчанию предложить значение 20.

Вариант 1:

int res = ac_request("editintdialog","Введите количество элементов (шт)","20");

if(res == 1) {

ivalue = ac_getnumvalue();

}

Вариант 2:

int res = ac_request("editintdialog","Введите количество элементов (шт)", 20);

if(res == 1) {

ivalue = ac_getnumvalue();

}

Вариант 3:

int ivalue = 20;

int res = ac_request("editintdialog","Введите количество элементов (шт)",ivalue);

if(res == 1) {

ivalue = ac_getnumvalue();

}


editstringdialog - ввод строки

Диалоги ››

функция ac_request() с директивой "editstringdialog" вызывает диалог для строки.

Формат обращения:

int res = ac_request("editstringdialog",string smessage, string sdefaultstr);

Здесь:

smessage - сообщение в заголовке панели диалога,

sdefaultstr - строка, которая будет подставлена по умолчанию в строку редактирования диалога.

Возвращает 0 если пользователь отказался от ввода (нажал кнопку "Отменить", нажал кнопку с крестиком на рамке диалога или клавишу "Esc" на клавиатуре).

Если была нажата клавиша "Ok" то возвращается 1.

Пример.

Получить от пользователя ФИО архитектора. По умолчанию предложить значение "Иванов В.В.".

string svalue = "Иванов В.В."
int res = ac_request("editstringdialog","Введите ФИО архитектора", svalue);
if(res == 1)
{
svalue = ac_getstrvalue();
}
coutvar << svalue;


editstringlistdialog - выбор строки из списка

Диалоги ››

функция ac_request() с директивой "editstringlistdialog" вызывает диалог для выбора строки из списка popup.

Формат обращения:

int res = ac_request("editstringlistdialog",string smessage, int iTable, string sstr);

или

int res = ac_request("editstringlistdialog",string smessage, int iTable, int index);

или

int res = ac_request("editstringlistdialog",string smessage, string savailablelist, string sselected, string sdelimiter);

Здесь:

smessage - сообщение в заголовке панели диалога,

iTable - дескриптор таблицы, в которой в первой колонке заданы возможные значения для выбора в диалоге.

str - строка, которая будет выбрана в popup элементе диалога;

index - индекс текста строки из таблицы, которая будет выбрана в качестве предустановки в popup элементе диалога.

Обратите внимание, что в ts_table индекспервой строки - 0 а в элементе popup - индекс первой строки - 1. Поэтому 0-я строка из таблицы будет 1-й в элементе popup.В index задается и получается индекс выбора по элементу popup.

savailablelist - список элементов для выбора через разделитель;

sselected - предварительно выбранный элемент;

sdelimiter - разделитель.

Возвращает 0 если пользователь отказался от ввода (нажал кнопку "Отменить", нажал кнопку с крестиком на рамке диалога или клавишу "Esc" на клавиатуре).

Если была нажата клавиша "Ok" то возвращается 1.

Результат получается функцией ac_getstrvalue() - если нужно получить строку или ac_getnumvalue() если нужно получить индекс.

Пример 1.

Получить от пользователя выбранную строку из таблицы.Предложить значение "Иванов В.В."

int iTable;
object("create","ts_table",iTable);
ts_table(iTable,"add_column",-1,"string","h1");
ts_table(iTable,"add_row",0,"Иванов В.В.");
ts_table(iTable,"add_row",0,"Петров В.В.");
ts_table(iTable,"add_row",0,"Сидоров В.В.");
string svalue = "Петров В.В.";
int index;
int res = ac_request("editstringlistdialog","Введите ФИО архитектора", iTable, svalue);
if(res == 1)
{
svalue = ac_getstrvalue();
index = ac_getnumvalue();
}
coutvar << svalue;
coutvar << index;
object("delete",iTable);

Пример 2

string s = "one;two;three";
string ss = "two";
int iires = ac_request("EditStringListDialog", "Тип линии", s, ss,";");
coutvar<<iires;
coutvar<< ss;
return;


editcheckstringsdialog - выбор нескольких строк из списка

Диалоги ››

функция ac_request() с директивой "EditCheckStringsDialog" вызывает диалог для выбора нескольких строк.

Формат обращения:

int res = ac_request("EditCheckStringsDialog",string smessage, int iTable);

или

int res = ac_request("EditCheckStringsDialog", string smessage, string savailablelist, string sselected, string sdelimiter);

Здесь:

smessage - сообщение в заголовке панели диалога,

iTable - дескриптор таблицы из двух колонок - bool с отметкой да/нет и string - текст для выбора.

savailablelist - список возможных вариантов через разделитель;

sselected - список помеченых вариантов через разделитель и возвращаемый набор значений, так же через разделитель;

sdelimiter - разделитель.

Возвращает 0 если пользователь отказался от ввода (нажал кнопку "Отменить", нажал кнопку с крестиком на рамке диалога или клавишу "Esc" на клавиатуре).

Если была нажата клавиша "Ok" то возвращается 1.

Пример.

Получить от пользователя список ФИО архитекторов с отметкой да/нет.

object("create", "ts_table", iTable);

ts_table(iTable, "add_column", -1, "bool", "h1");

ts_table(iTable, "add_column", -1, "string", "h2");

ts_table(iTable, "add_row", 0, false, 1, "Иванов В.В.");

ts_table(iTable, "add_row", 0, true , 1, "Петров В.В.");

ts_table(iTable, "add_row", 0, false, 1, "Сидоров В.В.");

int res = ac_request("EditCheckStringsDialog", "Введите ФИО архитекторов", iTable);

if (res == 1)

{

string str;

ts_table(iTable, "print_to_str", str);

coutvar << str;

}

object("delete", iTable);

str=rowcount=3

0). h1=0 h2=Иванов В.В.

1). h1=1 h2=Петров В.В.

2). h1=0 h2=Сидоров В.В.

Пример 2.

string savailable = "1 значение;2 значение;3 значение";
string sselected = "2 значение;3 значение";
int res = ac_request("EditCheckStringsDialog", "Тип линии", savailable, sselected,";");
if (res == 1)
{
coutvar << sselected;
}


editbooldialog - выбор Да/Нет

Диалоги ››

функция ac_request() с директивой "editbooldialog" вызывает диалог для выбора значения логической переменной - Истина/Ложь (Да/Нет).

Формат обращения:

int res = ac_request("editbooldialog", string smessage, bool bdefaultvalue);

Здесь:

smessage - сообщение в заголовке панели диалога,

bdefaultvalue - значение по умолчанию.

Возвращает 0 если пользователь отказался от ввода (нажал кнопку "Отменить", нажал кнопку с крестиком на рамке диалога или клавишу "Esc" на клавиатуре).

Если была нажата клавиша "Ok" то возвращается 1.

Пример.

Получить от пользователя ФИО архитектора. По умолчанию предложить значение "Иванов В.В.".

bool bRes = false;
int res = ac_request("editbooldialog","Включать заголовки при экспорте данных?", bRes);
if(res == 1)
{
bRes = ac_getnumvalue();
}
coutvar << bRes;


editstringlistandcustomdialog - ввод строки или выбор из списка

Диалоги ››

функция ac_request() с директивой "EditStringListAndCustomDialog" вызывает диалог для выбора нескольких строк.

Формат обращения:

int res = ac_request("EditStringListAndCustomDialog",string smessage, int iTable, string str);

или

int res = ac_request("EditStringListAndCustomDialog",string smessage, int iTable, int index);

или

int res = ac_request("EditStringListAndCustomDialog",string smessage, string savailablelist, string sselected, string sdelimiter);

Здесь:

smessage - сообщение в заголовке панели диалога,

iTable - дескриптор таблицы с одной колонкой string - текст для выбора.

Возвращает 0 если пользователь отказался от ввода (нажал кнопку "Отменить", нажал кнопку с крестиком на рамке диалога или клавишу "Esc" на клавиатуре).

Если была нажата клавиша "Ok" то возвращается 1.

str - строка - предустановленное значение.

savailablelist - список элементов для выбора через разделитель;

sselected - предварительно выбранный элемент и возвращаемое значение;

sdelimiter - разделитель.

index - индекс предустановленной строки;

Результат получается функцией ac_getstrvalue() - если нужно получить строку или ac_getnumvalue() если нужно получить индекс. Обратите внимание, что если ac_getnumvalue() вернет 0 - то значит пользователь ввел собственный текст, которого точно нет в списке iTable или savailablelist;

Пример.

Получить от пользователя строку из предложенных вариантов или любую другую строку.

int iTable;

object("create", "ts_table", iTable);

ts_table(iTable, "add_column", -1, "string", "col");

ts_table(iTable, "add_row", 0, "Row 1");

ts_table(iTable, "add_row", 0, "Row 2");

ts_table(iTable, "add_row", 0, "Row 3");

bool bres = ac_request("EditStringListAndCustomDialog","Enter value", iTable, "Row 0");

if(bres)

{

string sres = ac_getstrvalue();

int ires = ac_getnumvalue();

coutvar << sres;

coutvar << ires;

object("delete", iTable);

}

Пример 2

string s = "one;two;three";
string ss = "two";
int iires = ac_request("EditStringListAndCustomDialog", "Тип линии", s, ss,";");
coutvar<<iires;
coutvar<< ss;
return;


Работа с Excel

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


excel_attach

Работа с Excel ››

Подключить Excel для работы.

В момент запуска программа Excel должна быть открыта.

По умолчанию активной становится текущая страница Excel.

Вызов:

int ires = excel_attach();

Если возвращается 0, то подключение успешное.

Пример.

Подключить текущую таблицу Excel и вывести в текущее положение маркера число 100.1.

int my_variable;
coutvar << my_variable;
int ires = excel_attach();
if (res != 0)
{
cout << "Нет связи с Excel";
return -1;
}

double dvalue = 100.1;
excel_putnumvalue(dvalue);
excel_detach();


excel_detach

Работа с Excel ››

Отключить Excel.

Обращение

excel_detach();


excel_putnumvalue

Работа с Excel ››

Записать в текущую позицию фокуса Excel числовое значение.

Вызов:

excel_putnumvalue(double dvalue);


excel_putstrvalue

Работа с Excel ››

Записать в текущую позицию фокуса Excel текстовое значение.

Обращение

excel_putstrvalue(string svalue);


excel_select_range

Работа с Excel ››

Выделить фокусом Excel указанные ячейки.

Формат обращения:

excel_select_range( string srange);

Здесь: srange - текстовый адрес ячейки Excel.

Пример.

Выделить в текущей таблице Excel ячейки в диапазоне "A2:C4".

excel_select_range( "A2:C4");


excel_visible

Работа с Excel ››

Сделать видимым и вынести окно Excel на передний план.

Обращение

excel_visible();


excel_speedup

Работа с Excel ››

Выполняет действия по ускорению передачи данных в/из Excel. Перед выводом значительных объемов данных в таблицу рекомендуется применять ускорение. По окончании - выключить.

Вызов:

excel_speedup(int what);

Здесь what - 0/1 - отключить/включить ускоренную обработку данных программой Excel.


excel_getnumvalue

Работа с Excel ››

Получить из текущей позиции фокуса Excel числовое значение.

Обращение

double dvalue = excel_getnumvalue();


excel_getstrvalue

Работа с Excel ››

Получить из текущей позиции фокуса Excel текстовое значение.

Обращение

string svalue = excel_getstrvalue();


excel_request

Работа с Excel ››


set_column_width

Работа с Excel ›› excel_request ››

Задает ширину столбца или диапазона столбцов.

Вызов:

excel_request("set_column_width",string sdiapazon, double width);

Здесь: sdiapazon - текстовое значение, описывающее диапазон столбцов. Например: "B:B" - означает столбец B. Если написать "B:D" то ширина будет задана для колонок B,C и D.
width - ширина колонки.

Пример.

Установить ширину колонки B в 18.86:

excel_request("set_column_width","B:B",18.86);


get_column_width

Работа с Excel ›› excel_request ››

Получить ширину колонки или диапазона колонок

Вызов:

excel_request("get_column_width", string sdiapazon, double width);

Здесь: sdiapazon - текстовое значение, описывающее диапазон столбцов. Например: "B:B" - означает столбец B. Если написать "B:D" то ширина будет задана для колонок B,C и D.
в width - будет записана ширина колонки


set_row_height

Работа с Excel ›› excel_request ››

Задать высоту указанной строки или диапазона строк

Вызов:

excel_request("set_row_height", string srowdiapazon, double height);

Здесь: srowdiapazon - строковое значение, определяющее диапазон строк, которым нужно установить высоту. Например "1:1" - первая строка, "2:4" - строки со второй по четвертую.

height - высота строки.

Пример.

Задать высоту для строк со 2-й по 8-ю в 15.75.

excel_request("set_row_height","2:8",15.75);


get_row_height

Работа с Excel ›› excel_request ››

Получить высоту строки или диапазона строк.

Вызов:

excel_request("get_row_height", string srowdiapazon, double height);

Здесь: srowdiapazon - строковое значение, определяющее диапазон строк, которым нужно установить высоту. Например "1:1" - первая строка, "2:4" - строки со второй по четвертую.

в height - будет записана высота строки.


set_borders

Работа с Excel ›› excel_request ››

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

Вызов:

excel_request("set_borders", int border_left,int border_top,int border_right,int border_bottom);

Здесь: border_left, border_top, border_right, border_bottom - переменные, которые задают будет или нет бордюр слева,сверху,справа и снизу, соответственно. 1-да, 0-нет.
Вызов без этих аргументов означает установку всех бордюров:

excel_request("set_borders");


put_selection_values

Работа с Excel ›› excel_request ››

Присвоить значение ширины, высоты и объединения у текущей выбранной ячейки или группы выбранных ячеек.

Вызов:

excel_request("put_selection_values", string varname1, string/int/double/bool varvalue1,..., string varnamen, string/int/double/bool varvaluen);

Здесь:

varname1 - varnamen - имена переменных, которые доступны для ячейки или группы выделенных ячеек в Excel по аналогии с Range в Excel VBA.

varvalue1-varvaluen - задаваемые значения для этих переменных.

Пример 1:

Задать ширину и высоту текущей выбранной ячейки Excel.

excel_request("put_selection_values","Width",10,"Height",20);

Пример 2:

Объединить выбранные ячейки Excel.

excel_request("put_selection_values","MergeCells",1);


put_selection_fontvalues

Работа с Excel ›› excel_request ››

Задать значения для шрифта у текущего выбора Excel (ячейки или группы ячеек).

Вызов:

excel_request("put_selection_fontvalues", string fontparname1, string/double/int/bool fontparvalue1, ... , string fontparnamen, string/double/int/bool/ fontparvaluen);

Здесь:

fontparname1-fontparnamen - имена переменных, которые можно задавать в ячейке Excel (по аналогии с Excel VBA).

fornparvalue1-fontparvaluen - значения для этих переменных.

Пример:

Задать в текущей ячейке Excel размер шрифта 10.32, жирный наклонный.

excel_request("put_selection_fontvalues","Size",10.32,"Bold",1,"Italic",1);


get_selection_area

Работа с Excel ›› excel_request ››

Получить номер строки и колонки левого верхнего и правого нижнего углов текущего выбора в таблице Excel.

Вызов:

excel_request("get_selection_area", int start_row, int start_column, int end_row, int end_column);

Здесь:

start_row, start_column - номер строки и колонки левого верхнего угла текущего выбора Excel,

end_row, end_column - номер строки и колонки правого нижнего угла текущего выбора Excel.

Пример.

В текущей таблице Excel узнать какие ячейки выбраны.

int start_row,start_column,end_row,end_column,rows,columns;
excel_request("get_selection_area",start_row,start_column,end_row,end_column);


merged_cell_info

Работа с Excel ›› excel_request ››

Определить номер колонки и строки верхнего левого и нижнего правого угла объединенной области для текущей ячейки.

Вызов:

excel_request("merged_cell_info", int &merged_start_row, int &merged_start_col, int &merged_rows, int &merged_cols);

Здесь:

merged_start_row, merged_start_col - номер строки и колонки левого верхнего угла объединенной области в которую входит текущая ячейка,

merged_rows - число строк, которые объединены в область,

merged_cols - число колонок, которые объединены в область.


is_merge_cells

Работа с Excel ›› excel_request ››

Определить объединены или нет ячейки текущей выбранной области в таблице Excel.

Вызов:

excel_request("is_merge_cells", int & ismerged);

Здесь:

ismerged - если ячейки в текущей выбранной области таблицы Excel объединены, то в ismerged запишется 1.


set_backcolor

Работа с Excel ›› excel_request ››


get_backcolor

Работа с Excel ›› excel_request ››


set_interior

Работа с Excel ›› excel_request ››


get_interior

Работа с Excel ›› excel_request ››


selection_varvalues

Работа с Excel ›› excel_request ››


selection_font_varvalues

Работа с Excel ›› excel_request ››


sheet_select

Работа с Excel ›› excel_request ››


range_copy

Работа с Excel ›› excel_request ››


booknamedcell

Работа с Excel ›› excel_request ››


save_active_sheet_as_csv

Работа с Excel ›› excel_request ››

Сохранить текущую активную таблицу в файл CSV без вопросов.

Вызов:

int ires = excel_request("save_active_sheet_as_csv", string filename);

Здесь:

filename - полный путь и имя файла куда сохранить текущую страницу Excel в виде файла CSV.

Пример.

Выбрать текущим файл "Управляющий файл.xlsm" (должен быть уже открытым в Excel).

Удалить, если уже существуют временные файлы чтобы программа при сохранении не запрашивала подтверждение.

Сохранить копию в файл "h:\1.xlsx".

Открыть его в Excel.

Сохранить его страницы в файлах "1_Имя таблицы.csv".

Закрыть файл "h:\1.xlsx",

int main()
{
excel_attach();
bool bexist;
int ires;

string sWorkBookUprFile = "Управляющий файл.xlsm";
ires = excel_request("workbook_select", sWorkBookUprFile);
if (ires != 0)
{
tsalert(-1, "Ошибка во время выполнения", "Не получается переключиться в файл excel", sWorkBookUprFile);
excel_detach();
return -1;
}

string filename = "h:\\1.tmp";
ires = shell_func("file", "is_exist", filename, bexist);
if (bexist)
{
cout << "Удаляем файл " << filename << "\n";
ires = shell_func("file", "delete", filename);
}

excel_request("save_copy_as", filename);
excel_request("workbook_open", filename);
ires = save_sheet_as_csv_file("Пироги стен");
if (ires != 0)
{
return;
}
ires = save_sheet_as_csv_file("Пироги колонн");
ires = save_sheet_as_csv_file("Пироги балок");
ires = save_sheet_as_csv_file("Пироги потолков");
ires = save_sheet_as_csv_file("Пироги низа и торца лестниц");
ires = save_sheet_as_csv_file("Пироги полов");
ires = save_sheet_as_csv_file("Плинтуса и торцы фундам. оборуд");
ires = save_sheet_as_csv_file("Узлы");
ires = save_sheet_as_csv_file("Слои_пирогов_отделки");
ires = save_sheet_as_csv_file("Слои_пирогов_полов");
excel_request("workbook_close");

excel_detach();
}

int save_sheet_as_csv_file(string sSheetName)
{
bool bexist;

int ires = excel_request("sheet_select", sSheetName);
if (ires != 0) {
tsalert(-1, "Ошибка во время выполнения", "Не получается переключиться на страницу", sSheetName);
excel_detach();
return -1;
}

string filename;

filename = "h:\\1_" + sSheetName + ".csv";
ires = shell_func("file", "is_exist", filename, bexist);
if (bexist)
{
cout << "Удаляем файл " << filename << "\n";
ires = shell_func("file", "delete", filename);
}
ires = excel_request("save_active_sheet_as_csv", filename);
return ires;
}


save_copy_as

Работа с Excel ›› excel_request ››

Сохранить копию текущего файла Excel без его открытия в Excel.

Вызов:

int ires = excel_request("save_copy_as", string filename);

Здесь:

filename - имя и полный путь к файлу, куда надо сохранить копию текущего файла Excel.


workbook_open

Работа с Excel ›› excel_request ››

Открыть заданный файл в Excel.

Вызов:

int ires = excel_request("workbook_open", string filename);

Здесь:

filename - имя и полный путь к файлу, который надо открыть в Excel.


workbook_close

Работа с Excel ›› excel_request ››

Закрыть текущий файл Excel.

Вызов:

int ires = excel_request("workbook_close");


работа с примечаниями

Работа с Excel ›› excel_request ››


getcomment

Работа с Excel ›› excel_request ›› работа с примечаниями ››

Получить примечания к текущей ячейке.

Вызов:

excel_request("comment", "get", string &scomment);

Здесь: scomment - строковое значение комментария к ячейке.

Пример.

string scomment;
excel_request("comment","get", scomment);
cout << scomment;


clearcomments

Работа с Excel ›› excel_request ›› работа с примечаниями ››

Очистить примечания к текущей ячейке.

Вызов:

excel_request("comment", "clear");


setcomment

Работа с Excel ›› excel_request ›› работа с примечаниями ››

Задать примечания к текущей ячейке.

Вызов:

excel_request("comment", "set", string scomment);

Здесь: scomment - строковое значение комментария к ячейке.

Пример.

string scomment = "Это комментарий к ячейке\n в две строки";
excel_request("comment","set", scomment);


Загрузка и выгрузка табличных данных

Работа с Excel ›› excel_request ››


excel_chart - диаграммы в Excel

Работа с Excel ››


AddChart

Работа с Excel ›› excel_chart - диаграммы в Excel ››

Создать диаграмму в текущей таблице Excel.

Обращение.

excel_chart(int iChartDescr,"AddChart");

Здесь:

iChartDescr - дескриптор объекта excel_chart. Сюда возвращается элемент управления созданной диаграммой.


SetChartType

Работа с Excel ›› excel_chart - диаграммы в Excel ››

Задать тип диаграммы Excel.

Обращение.

excel_chart(int iChartDescr,"SetChartType", int itype);

Здесь:

itype - числовой код типа диаграммы Excel.

Имя типа диаграммы | Код типа | Описание
xl3DArea | -4098 | Трехмерная область.
xl3DAreaStacked | 78 | Трехмерная область с накоплением.
xl3DAreaStacked100 | 79 | 100% с областями с накоплением.
xl3DBarClustered | 60 | Трехмерная кластерная панель.
xl3DBarStacked | 61 | Трехмерная линейчатая диаграмма с накоплением.
xl3DBarStacked100 | 62 | Трехмерная линейчатая диаграмма с накоплением 100.
xl3DColumn | -4100 | Трехмерный столбец.
xl3DColumnClustered | 54 | Трехмерный кластеризованный столбец.
xl3DColumnStacked | 55 | Объемный столбец с накоплением.
xl3DColumnStacked100 | 56 | Трехмерная гистограмма с накоплением 100%.
xl3DLine | -4101 | Трехмерная линия.
xl3DPie | -4102 | Трехмерная круговая диаграмма.
xl3DPieExploded | 70 | Развернутая трехмерная круговая диаграмма.
xlArea | 1 | Область
xlAreaStacked | 76 | Область с накоплением.
xlAreaStacked100 | 77 | 100% с областями с накоплением.
xlBarClustered | 57 | Панель кластера.
xlBarOfPie | 71 | Вторичная гистограмма.
xlBarStacked | 58 | Линейчатая диаграмма с накоплением.
xlBarStacked100 | 59 | 100% линейчатой диаграммы с накоплением.
xlBubble | 15 | Плыв.
xlBubble3DEffect | 87 | Пузырьковая с трехмерными эффектами.
xlColumnClustered | 51 | Кластеризованный столбец.
xlColumnStacked | 52 | Гистограмма с накоплением.
xlColumnStacked100 | 53 | 100% гистограммы с накоплением.
xlConeBarClustered | 102 | Кластеризованная коническая с полосой.
xlConeBarStacked | 103 | Коническая с накоплением.
xlConeBarStacked100 | 104 | 100% нормированной конусной полосы.
xlConeCol | 105 | Столбец объемных конусов.
xlConeColClustered | 99 | Кластеризованный конусный столбец.
xlConeColStacked | 100 | Конусный столбец с накоплением.
xlConeColStacked100 | 101 | 100% конусный столбец с накоплением.
xlCylinderBarClustered | 95 | Кластеризованная цилиндрическая панель.
xlCylinderBarStacked | 96 | Вертикальная полоса цилиндра.
xlCylinderBarStacked100 | 97 | 100% нормированной цилиндрической полосы.
xlCylinderCol | 98 | Столбец 3D-цилиндра.
xlCylinderColClustered | 92 | Кластеризованный конусный столбец.
xlCylinderColStacked | 93 | Конусный столбец с накоплением.
xlCylinderColStacked100 | 94 | 100% нормированный столбец цилиндра.
xlDoughnut | -4120 | Сектор.
xlDoughnutExploded | 80 | Разрезанная кольцевая диаграмма.
xlLine | 4 | Междустрочный.
xlLineMarkers | 65 | Строка с маркерами.
xlLineMarkersStacked | 66 | Линия с накоплением с маркерами.
xlLineMarkersStacked100 | 67 | 100% графика с накоплением с маркерами.
xlLineStacked | 63 | График с накоплением.
xlLineStacked100 | 64 | 100% графика с накоплением.
xlPie | 5 | Кругов.
xlPieExploded | 69 | Разрезанная круговая диаграмма.
xlPieOfPie | 68 | Вторичная круговая диаграмма.
xlPyramidBarClustered | 109 | Кластеризованная пирамида.
xlPyramidBarStacked | 110 | Пирамидальная диаграмма с накоплением.
xlPyramidBarStacked100 | 111 | 100% пирамидальной диаграммы с накоплением.
xlPyramidCol | 112 | Столбец 3D пирамиды.
xlPyramidColClustered | 106 | Кластеризованный столбец пирамиды.
xlPyramidColStacked | 107 | Столбец пирамиды с накоплением.
xlPyramidColStacked100 | 108 | 100% столбца пирамиды с накоплением.
xlRadar | -4151 | Лепестковые.
xlRadarFilled | 82 | Заполненная лепестковая диаграмма.
xlRadarMarkers | 81 | Лепестковая диаграмма с маркерами данных.
xlRegionMap | 140 | Диаграмма карты.
xlStockHLC | 88 | Высокая — минимум — закрытие.
xlStockOHLC | 89 | Открытие — высокая — минимум — закрытие.
xlStockVHLC | 90 | Громкость — высокая — минимальная — закрытие.
xlStockVOHLC | 91 | Volume — Open — High – минимум — Close.
xlSurface | 83 | Трехмерная поверхность.
xlSurfaceTopView | 85 | Поверхность (вид сверху).
xlSurfaceTopViewWireframe | 86 | Поверхность (каркас верхнего уровня представления).
xlSurfaceWireframe | 84 | Трехмерная поверхность (каркасная схема).
xlXYScatter | -4169 | Рабочие.
xlXYScatterLines | 74 | Точечная диаграмма со строками.
xlXYScatterLinesNoMarkers | 75 | Точечная диаграмма со строками без маркеров данных.
xlXYScatterSmooth | 72 | Точечная диаграмма с сглаженными линиями.
xlXYScatterSmoothNoMarkers | 73 | Точечная диаграмма со сглаженными линиями без маркеров данных.


SetChartTitle

Работа с Excel ›› excel_chart - диаграммы в Excel ››

Задать заголовок диаграмме.

Обращение.

excel_chart(int iChartDescr,"SetChartTitle", string sTitle);

Здесь:

iChartDescr - дескриптор объекта excel_chart,

sTitle - новый заголовок


SetSourceDataRange

Работа с Excel ›› excel_chart - диаграммы в Excel ››

задать текущую выделенную область в таблице Excel в качестве источник данных диаграммы

Вызов:

excel_chart(int iChartDescr, "SetSourceDataRange");

Здесь:

iChartDescr - дескриптор диаграммы Excel


Пример

Работа с Excel ›› excel_chart - диаграммы в Excel ››

//------------------------------------------------------

// LABPP

// Создать диаграмму в Excel по данным в ячейках C7:F8

//------------------------------------------------------

int main()

{

excel_attach(); // подключить Excel

int iChartDescr;

object("create","excel_chart", iChartDescr); // создать объект

excel_chart(iChartDescr,"AddChart"); // создать диаграмму на текущей странице таблицы Excel

excel_chart(iChartDescr,"SetChartType",5); // задать тип диаграммы

excel_chart(iChartDescr,"SetChartTitle","Квартирография"); // задать заголовок

excel_select_range("C7:F8"); // выбрать ячейки в таблице Excel

excel_chart(iChartDescr,"SetSourceDataRange"); // задать эти ячейки как источник данных диаграммы

object("delete",iChartDescr); // удалить объект

excel_detach(); // отключить Excel

}


Работа с Word

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


word_attach

Работа с Word ››

Подключение программы Word для обмена данными и управления.

Вызов:

int ires = word_attach();

Возвращает 0, если подключение произошло успешно.


word_detach

Работа с Word ››

Отключение программы Word.

Вызов:

word_detach();


word_visible

Работа с Word ››

Делает видимым и выносит на передний план окно программы Word. При спрятанном окне Word обрабатывает обращения значительно быстрее, т.к. не занимается переформатированием отображения. Так что разумно для ускорения вывода перед записью спрятать окно, а после - показать.

Вызов:

word_visible(int ivisible);

Здесь: ivisible - 0/1 - спрятать/показать окно Word.


word_request

Работа с Word ››

В документах Word имеются возможность использования специальных переменных. По типу автотекста в ARCHICAD, переменные в Word могут быть вставлены в разные места форматированного текста. Так что нам достаточно присвоить им значение и документ оставаясь правильно отформатированным отразит новые данные.


NСчитывание и запись полей переменных - docfield

Работа с Word ›› word_request ››


get

Работа с Word ›› word_request ›› NСчитывание и запись полей переменных - docfield ››

Считать значение переменной документа Word

int ires = word_request("docfield","get", string wordfielsname, string/double/int/bool value);

Здесь:

wordfielsname - имя переменной Word,

string/double/int/bool value - значение любого из перечисленных типов для присвоения переменной Word.

Возвращает 0 при успешном выполнении функции.


set

Работа с Word ›› word_request ›› NСчитывание и запись полей переменных - docfield ››

Задать значение переменной документа Word.

Вызов:

int ires = word_request("docfield","set",string wordfielsname, string/double/int/bool value);

Здесь:

wordfielsname - имя переменной Word,

string/double/int/bool value - значение любого из перечисленных типов для присвоения переменной Word.

Возвращает 0 при успешном выполнении функции.


update_all_docfields

Работа с Word ›› word_request ›› NСчитывание и запись полей переменных - docfield ››

После изменения значений переменных документа Word, чтобы измененные данные отразились в тексте необходимо обновить поля в тексте документа.

Вызов:

word_request("update_all_docfields");


Работа через ts_idispatch

Работа с Word ››

Пример:

Подключиться к открытому документу Word и написать слово, изменить шрифт и написать фразу.

//-----------------------------------------------

// LABPP Word пишем текст в Word и меняем шрифт

// LABPP 2023

//-----------------------------------------------

int main()

{

int iIDispatch_Word;

object("create", "ts_idispatch", iIDispatch_Word);

int ires = ts_idispatch(iIDispatch_Word, "attach", "Word.Application"); // create dispatcher object

if (ires != 0) {

cout << "\nError whan attach to word";

return -1;

}

int iVariant_Selection;

object("create", "ts_variant", iVariant_Selection);

ires = ts_idispatch(iIDispatch_Word, "AutoWrap", iVariant_Selection, "DISPATCH_PROPERTYGET", "Selection", 0);

int iIDispatch_Selection;

object("create", "ts_idispatch", iIDispatch_Selection);

ts_variant(iVariant_Selection, "get_pdispVal", iIDispatch_Selection);

// Для информации об объекте-диспетчере, какие у него есть переменные и функции (не обязательно) ---->

// получить список методов через перенос строки (\n)

string smethodslist;

ires = ts_idispatch(iIDispatch_Selection, "GetIDispatchMethods", smethodslist);

coutvar << smethodslist;

//<----

int iVariant_Null;

object("create", "ts_variant", iVariant_Null);

int iVariant_Text;

object("create", "ts_variant", iVariant_Text);

ts_variant(iVariant_Text, "set_value_simple", "Привет");

ires = ts_idispatch(iIDispatch_Selection, "AutoWrap", iVariant_Null, "DISPATCH_METHOD", "TypeText", 1, iVariant_Text);

int iVariant_Font;

object("create", "ts_variant", iVariant_Font);

ires = ts_idispatch(iIDispatch_Selection, "AutoWrap", iVariant_Font, "DISPATCH_PROPERTYGET", "Font", 0);

int iIDispatch_Font;

object("create", "ts_idispatch", iIDispatch_Font);

ts_variant(iVariant_Font, "get_pdispVal", iIDispatch_Font);

ts_variant(iVariant_Text, "set_value_simple", "GOST 2.304 type A");

ires = ts_idispatch(iIDispatch_Font, "AutoWrap", iVariant_Null, "DISPATCH_PROPERTYPUT", "Name", 1, iVariant_Text);

ts_variant(iVariant_Text, "set_value_simple", "Привет другим шрифтом");

ires = ts_idispatch(iIDispatch_Selection, "AutoWrap", iVariant_Null, "DISPATCH_METHOD", "TypeText", 1, iVariant_Text);

ts_idispatch(iIDispatch_Word, "detach");

object("delete", iIDispatch_Word);

object("delete", iIDispatch_Selection);

object("delete", iVariant_Selection);

object("delete", iVariant_Text);

object("delete", iVariant_Null);

object("delete", iVariant_Font);

object("delete", iIDispatch_Font);

}


Работа с AutoCAD

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


autocad_request

Работа с AutoCAD ››


attach

Работа с AutoCAD ›› autocad_request ››

Подключить программу AutoCAD.

Вызов:

int ires = autocad_request("attach");

Возвращает 0 при успешном подключении.

Пример:

int ires;
ires = autocad_request("attach");
if(ires != 0)
{
cout << "Can't attach AutoCAD\n";
return -1;
}


detach

Работа с AutoCAD ›› autocad_request ››

Отключить программу AutoCAD.

Вызов:

autocad_request("detach");


specify_color_RGB

Работа с AutoCAD ›› autocad_request ››

Задать цвет для вывода в чертеж.

autocad_request("specify_color_RGB", int red, int green, int blue);

Здесь red, green и blue - коэффициенты интенсивности составляющих RGB от 0 до 255.

Пример.

Задать белый цвет для вывода.

autocad_request("specify_color_RGB", 255, 255, 255);


draw_text

Работа с AutoCAD ›› autocad_request ››

Написать текст на чертеже.

autocad_request("draw_text", string stext, int posx, int posy, int textsize);

Здесь stext - текст для вывода,

posx и posy - позиция текста,

textsize - размер текста.

Пример.

Вывести текст "123".

string stext = "123";
autocad_request("draw_text", stext, 1.2, -2.3, 0.2);


draw_polyline

Работа с AutoCAD ›› autocad_request ››

Нарисовать полилинию на чертеже.

autocad_request("draw_polyline", int iCoordTableDesct);

Здесь iCoordTableDescr - номер идентификатора таблицы с координатами (дескриптор).

Формат таблицы координат:

double x, double y, double b

Здесь x,y - координаты точки, b - выпуклость (для линий - 0).

Пример.

Нарисовать полилинией квадрат со стороной 1 м - (0;0),(1;0),(1;1),(0,1),(0;0).

int iTable;
object("create","ts_table",iTable);
ts_table(iTable,"add_column",0,"double","x",0);
ts_table(iTable,"add_column",1,"double","y",0);
ts_table(iTable,"add_column",2,"double","b",0);

ts_table(iTable,"add_row","x",0,"y",0,"b",0);
ts_table(iTable,"add_row","x",1,"y",0,"b",0);
ts_table(iTable,"add_row","x",1",y",1,"b",0);
ts_table(iTable,"add_row","x",0,"y",1,"b",0);
ts_table(iTable,"add_row","x",0,"y",0,"b",0);

autocad_request("draw_polyline", iTable);
object("delete",iTable);


draw_line

Работа с AutoCAD ›› autocad_request ››

Нарисовать линию в AutoCAD.

Вызов:

ires = autocad_drawline( double x1, double y1, double x2, double y2);

Здесь:

x1, y1, x2, y2 - позиции двух точек линии.


draw_arc

Работа с AutoCAD ›› autocad_request ››

Нарисовать дугу в AutoCAD.

Вызов:

int ires = autocad_drawarc( double centerX, double centerY, double radius, double startAngle, double endAngle);

Здесь:

centerX, centerY - позиция центра дуги,

radius - радиус;

startAngle - начальный угол:

endAngle - конечный угол.


Пример - нарисовать контуры зон из ARCHICAD в AutoCAD полилиниями

Работа с AutoCAD ››

//---------------------------------------------

// LABPP

// Нарисовать зоны полилиниями в AutoCAD

// Draws Zone elements in AutoCAD by PolyLines

//---------------------------------------------

int main()

{

int ires;

ires = autocad_request("attach");

if(ires != 0)

{

cout << "Can't attach AutoCAD\n";

return -1;

}

int iTable;

object("create","ts_table",iTable);

ts_table(iTable,"add_column",0,"double","x",0);

ts_table(iTable,"add_column",1,"double","y",0);

ts_table(iTable,"add_column",2,"double","b",0);

ac_request("load_elements_list_from_selection",0,"ZoneType");

ires = ac_request("get_loaded_elements_list_count",0);

int icount = ac_getnumvalue();

if(icount == 0)

{

cout << "You have not selected a Zone element.";

return -1;

}

int rowcount;

int iCoordTable;

object("create","ts_table",iCoordTable);

int i,j;

double xvalue,yvalue,si;

double pi = 3.1415926535;

int itablerowcount;

runtimecontrol("workline", "setmax", icount);

for(i=0;i<icount; i++)

{

runtimecontrol("workline", "setpos", i+1);

ac_request("set_current_element_from_list",0,i);

ac_request("get_gdlelem_property_value","ZoneName");

string szonename = ac_getstrvalue();

cout << "zonename=" << szonename << "\n";

ac_request("get_gdlelem_property_value","ROOM_AREA");

double ra = tsround(ac_getnumvalue(),2);

cout << "room_area=" << ra << "\n";

ac_request("get_gdlelem_property_value","pos.x");

double posx = ac_getnumvalue();

ac_request("get_gdlelem_property_value","pos.y");

double posy = ac_getnumvalue();

string stext = szonename;

autocad_request("specify_color_RGB",0,254,0);

autocad_request("draw_text",stext,posx-0.5,posy,0.2);

stext = "(" + sprintf("%g",ra) + ")";

autocad_request("draw_text",stext,posx-0.5,posy-0.3,0.2);

autocad_request("specify_color_RGB",254,254,0);

ts_table(iTable, "clear_rows");

ac_request("get_element_value","CoordTable",iCoordTable);

ts_table(iCoordTable, "get_rows_count", rowcount);

double lastxvalue, lastyvalue, lastsi;

double radius, firstangle;

double startangle, endangle;

double centerx,centery;

double xfornext, yfornext;

double tg_of_quatro_angle;

for(j=0;j<rowcount;j++)

{

ts_table(iCoordTable,"select_row", j);

ts_table(iCoordTable,"get_value_of","x",xvalue);

ts_table(iCoordTable,"get_value_of","y",yvalue);

ts_table(iCoordTable,"get_value_of","si",si);

//cout << "x="<<xvalue<<", y="<< yvalue << ", si="<< si << "\n";

if(j!=0)

{

if((si!=900)&&(si!=4000))

{

if(si==-1)

{

ts_table(iTable,"add_row",0,xvalue,1,yvalue,2,0);

autocad_request("draw_polyline",iTable);

ts_table(iTable, "clear_rows");

}

else {

ts_table(iTable,"add_row",0,xvalue,1,yvalue,2,0);}

}

else if(si==900)

{

ac_request("geometry_calc_2d","get_length_2point",lastxvalue, lastyvalue, xvalue, yvalue, radius);

ac_request("geometry_calc_2d","get_line_angle",lastxvalue, lastyvalue, xvalue, yvalue, firstangle);

centerx = xvalue;

centery = yvalue;

//cout << "radius=" << radius << " , firstangle="<< firstangle << "\n";

}

else if(si==4000)

{

//cout << "yvalue=" << yvalue << "\n";

if(yvalue > 0)

{

startangle = PI - (xvalue*pi/180.0 - firstangle);

endangle = PI - (-yvalue*pi/180.0 - firstangle);

}

else

{

endangle = PI - (xvalue*pi/180.0 - firstangle);

startangle = PI - (-yvalue*pi/180.0 - firstangle);

}

ac_request("geometry_calc_2d","rotate_point_and_move",centerx, centery, lastxvalue,lastyvalue, endangle, centerx, centery, 1, xfornext, yfornext);

tg_of_quatro_angle = tg((yvalue*pi/180.0)/4);

ts_table(iTable,"get_rows_count", itablerowcount);

ts_table(iTable,"select_row", itablerowcount-1);

ts_table(iTable,"set_value_of",2,tg_of_quatro_angle);

//cout << "tg=" << tg_of_quatro_angle << "\n";

xvalue = xfornext;

yvalue = yfornext;

}

}

else {

ts_table(iTable,"add_row",0,xvalue,1,yvalue,2,0); }

lastxvalue = xvalue;

lastyvalue = yvalue;

lastsi = si;

}

ts_table(iTable,"get_rows_count", itablerowcount);

if(itablerowcount>0) {

autocad_request("draw_polyline",iTable);}

}

object("delete",iCoordTable);

object("delete",iTable);

autocad_request("detach");

return 0;

}


Функция object

Обеспечивает возможность базовых операций над объектами - создание, удаление и т.п.


create

Функция object ››

Формат:

int object("create", string objclass, int descr);

Создает объект типа objclass и возвращает его дескриптор в переменную descriptor.

Возвращает 0 при успешном создании объекта.


delete

Функция object ››

int object("delete", int descr);

Удаляет из памяти объект с дескриптором descr.

Пример.

Cоздать объект ts_table (динамическая таблица) и удалить его.

int TableDescr1;

object("create","ts_table",TableDescr1);

object("delete",TableDescr1);


Объект ts_table

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Функция ts_table

Объект ts_table ››

Функция ts_table позволяет выполнять операции над объектом динамических таблиц.


init (clear)

Объект ts_table ›› Функция ts_table ››

Полностью очистить информацию в таблице включая данные о столбцах.

Вызов:

ts_table(int iTable,"init");

или

ts_table(int iTable,"clear");

Здесь:

iTable - дескриптор объекта типа ts_table, у которого необходимо очистить всю информацию полностью.


clear_rows

Руководство по LABPP_Automat для ARCHICAD

Объект ts_table ›› Функция ts_table ››

Очистить все строки таблицы.

При этом информация о колонках остается.

Вызов:

ts_table(int iTable, "clear_rows");

Здесь:

iTable - дескриптор стираемой таблицы.


add_column

Объект ts_table ›› Функция ts_table ››

Добавить колонку в таблицу. Колонки могут быть строковыми или числовыми.
Вызов:

ts_table(int descriptor, "add_column", int columnnumber, string columntype, string columnname);

или

ts_table(int descriptor, "add_column", int columnnumber, string columntype, string columnname, bool/int/double/string defalutvalue);

Здесь:
descriptor - дескриптор экземпляра объекта таблицы, у которой добавляется колонка.
columnnumber - номер колонки (можно поставить -1 чтобы программа сама создала номер).

columntype - тип значений в колонке ("string", "int", "double", "bool").
columnname - название (заголовок) колонки.

Пример 1.

Добавить в таблицу TableDescr1 текстовую колонку №0 с заголовком "код материала + ед.изм.":

ts_table(TableDescr1, "add_column",0,"string","код материала + ед.изм.");

Пример 2.

Добавить числовую колонку в конец таблицы (номер колонки определить автоматически) со значением поумолчанию -10.1 .

ts_table(TableDescr1, "add_column", -1,"double",szonename, -10.1);


is_column_exist

Объект ts_table ›› Функция ts_table ››

Определить наличие колонки с указанным именем в таблице и если такая колонка существует вернуть ее номер. Если нет - то вернуть -1.
Вызов:

int iret = ts_table(int descriptor, "is_column_exist", string columnname);

Здесь:
descriptor - дескриптор экземпляра объекта таблицы, у которой запрашивается наличие колонки.
columnname - имя колонки колонки

Пример 1.

Добавить в таблицу iTableDescr1 логическую колонку "Есть в проекте" если она не существует.

int ires = ts_table(iTableDescr1, "is_column_exist", "Есть в проекте");
if(ires < 0) {
ts_table(iTableDescr1, "add_column",-1,"bool","Есть в проекте");
}


set_first_key

Объект ts_table ›› Функция ts_table ››

Когда нужно избежать дублирования записей в таблице можно использовать удобный механизм.
Одну или несколько колонок можно задать в качестве так называемого "первичного ключа".

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

Например если задан ключ по колонке 0 и 1, то новая строка "Значение колонки 0" , "Значение колонки 1", "Что-то неважно 1" не будет добавлена если в таблице уже есть "Значение колонки 0" , "Значение колонки 1", "Что-то другое неважно 2".
После этого все добавляемые строки будут анализироваться и если в таблице уже есть строка с таким же значением в колонке(ах), то новая строка создаваться не будет.
А если добавление строки производится не простой директивой "add_row" а "add_row_sum" то в обнаруженной строке будут суммированы значения числовых колонок (см. add_row_sum).

Пример, чтобы сделать колонку №1 ключевой:

ts_table(TableDescr1,"set_first_key",1);

Пример, чтобы сделать колонку с названием "Наименование объекта" ключевой:

ts_table(TableDescr1,"set_first_key","Наименование объекта");


add_row

Объект ts_table ›› Функция ts_table ››

Добавление строки в таблицу.

ts_table(int TableDescr,"add_row", int column1index/string column1name, bool/int/double/string column1value, ... , int columnNindex/string columnNname, bool/int/double/string columnNvalue);

Здесь:

column1index или column1name - индекс (от 0) или название колонки, в которую нужно записать значение column1value;

Если колонка №0 задана как "первичный ключ" (указана в директиве set_first_key), то можно записывать значения колонок за несколько команд:

ts_table(TableDescr1,"add_row", 0, objectname, 1, value_to_column_1);
ts_table(TableDescr1,"add_row", 0, objectname, 2, value_to_column_2);

Данные допишутся в ту же строку со значением в ключевой колонке №0.


add_row_sum

Объект ts_table ›› Функция ts_table ››

Добавление строки с суммированием в числовых колонках со строкой, у которой совпадает значение ключевой колонки.
Проще всего объяснить на актуальном примере.
Имеются объекты "Доска". В этих объектах есть поле "типоразмер" ("100х40","50х40" и т.п.), "единица измерения" ("пог.м","кв.м","куб.м") и "количество".
Мы хотим получить суммарную таблицу, где бы все объекты типа "Доска", в проекте просуммировались следующим образом:

Материал | Ед.изм | Кол-во
Доска 100х50 | пог.м | 1000
Доска 50х40 | куб.м. | 2000
Доска 50х20 | кв.м. | 1900

Для этого создаем таблицу с одной ключевой колонкой и колонками для обычных данных

ts_table(TableDescr1,"add_column",0,"string","имя объекта + типоразмер + ед.изм");
ts_table("TableDescr, "set_first_key",0);
ts_table(TableDescr1,"add_column", 1,"string","objectname");
ts_table(TableDescr1,"add_column", 2,"string","tiporazmer");
ts_table(TableDescr1,"add_column", 3,"string","edizm");
ts_table(TableDescr1,"add_column", 4,"double","kolvo");
ts_table(TableDescr1,"set_columns_to_add_sum", "kolvo");

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

ts_table(TableDescr1,"add_row_sum",0,objectname+tiporazmer+edizm, 1,objectname, 2, tiporazmer, 3, edizm, 4, kolvo);

В результате в таблице все объекты с одинаковыми значением имя+типоразмер+ед.изм. сведутся в единые записи, а в колонке "количество" будет стоять сумма количеств.


sort

Объект ts_table ›› Функция ts_table ››

Сортировка строк таблицы по заданной колонке или по ключевой колонке (если без аргументов). Можно указывать до 7-ми колонок.

Колонки могут задаваться как числовым индексом, так и названием. Можно одни числом, другие названием одновременно.

Вызов:

ts_table(int iTableDescr, "sort", int icolnum1, int icolnum2, ... ,int icolnum7);

или

ts_table(int iTableDescr, "sort", string scolname1, string scolname2, ... ,string scolname7);

Здесь:

icolumn1... icolumn7 - числовые индексы колонок, по которым производить сортировку.

scolname1... icolname7 - текстовые названия колонок.

Пример 1. Сортировать таблицу по колонке №0

ts_table(TableDescr1,"sort",0);

Пример 2. Сортитовать таблицу по ключевым колонкам, указанным ранее директивой "set_first_key".

ts_table(TableDescr1,"sort");

Пример 3. Сортитовать таблицу по колонкам сначала по колонке с индексом 0, затем по колонке с именем "Класс" и потом "Подкласс".

ts_table(TableDescr1,"sort", 0, "Класс","Подкласс");


sort_back

Объект ts_table ›› Функция ts_table ››

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

Колонки могут задаваться как числовым индексом, так и названием. Можно одни числом, другие названием одновременно.

Вызов:

ts_table(int iTableDescr, "sort", int icolnum1, int icolnum2, ... ,int icolnum7);

или

ts_table(int iTableDescr, "sort", string scolname1, string scolname2, ... ,string scolname7);

Здесь:

icolumn1... icolumn7 - числовые индексы колонок, по которым производить сортировку.

scolname1... icolname7 - текстовые названия колонок.

Пример 1. Сортировать таблицу по колонке №0

ts_table(TableDescr1,"sort",0);

Пример 2. Сортитовать таблицу по ключевым колонкам, указанным ранее директивой "set_first_key".

ts_table(TableDescr1,"sort");

Пример 3. Сортитовать таблицу по колонкам сначала по колонке с индексом 0, затем по колонке с именем "Класс" и потом "Подкласс".

ts_table(TableDescr1,"sort", 0, "Класс","Подкласс");


set_columns_to_sort_as_LikeABC10_a

Объект ts_table ›› Функция ts_table ››

Задать колонки, в которых сортировку проводить по принципу номеров помещений.

Вызов:

ts_table(iTable, "set_columns_to_sort_as_LikeABC10_a");

или

ts_table(iTable,"set_columns_to_sort_as_LikeABC10_a",

int colnum1/string colname1,

int colnum2/string colname2,

...

int colnumN/string colnameN

);

Здесь:

colnumN - номер колонки, в которой будет сортироваться значение как ABC10_a;

colname1 - то же можно задать названием колонки.

Предыдущее назначение колонок с сортировкой ABC10_a отменяется.

По умолчанию все колонки с нормальной сортировкой.

Если задать команду без списка колонок, то все колонки будут нормальные.

Пример:

Отсортировать таблицу по колонке с номерами помещений ("Помещение 1001.b1", "ПОМЕЩЕНИЕ 1001.a" и т.п.).

ts_table(iTable, "set_columns_to_sort_as_LikeABC10_a", "Номер помещения");

задать суммирование по колонкам:

ts_table(iTable,"sort","Номер помещения");


search

Объект ts_table ›› Функция ts_table ››

Быстрый поиск в таблице первого совпадающего значения колонки.
Возвращает номер строки или -1, если такая строка отсутствует в таблице.

Пример. Найти строку со значением в колонке №1 "Доска"

int irow = ts_table(TableDescr1,"search",1,"Доска");


search_regex

Объект ts_table ›› Функция ts_table ››

Быстрый поиск строки в таблице по содержимому ячеек, причем для текстовыйх колонок применяется принцип ставнения по шаблону по системе REGEX кодов.
Возвращает номер строки или -1, если такая строка отсутствует в таблице.

Пример.

Найти строку со значением в колонке №1 "Доска"

int irow = ts_table(TableDescr1,"search_regex",1,"Доска", 2, "*");
(см. regex шаблоны)


search_extended

Объект ts_table ›› Функция ts_table ››

Найти в таблице строку, используя расширенный фильтр.

На примере показано как найти в таблице iTable строку, у которой в колонке с названием "Колонка1" значение "СТЕНА", значение в колонке "Колонка2" - содержит "3", в колонке "Колонка3" содержится в любом месте "В22" или "В22" (В - или на русском или на английском) и в колонке "Колонка 4" число больше или равное 2.

bool stoponfirstnoteq = false;
bool add_sum = false;

int ires = ts_table(iTable, "search_extended",
"(", "ANY", "Колонка1", "=", "СТЕНА", "", "AND",
"" , "ANY", "Колонка2", "CONTAINS", "3", "", "AND",
"" , "ANY", "Колонка3", "REGEXMATCH", ".*[BВ]22.*", "", "AND",
"", "ANY", "Колонка4", ">=", 2, ")" );

Здесь

iTable - дескриптор таблицы, в которой надо найти строку;

Возвращает -1 если строка не найдена, или индекс найденой строки (>=0).


search_extended_table

Объект ts_table ›› Функция ts_table ››

Найти в таблице строку, используя расширенный фильтр.

Фильтр берется из таблицы фильтра.

На примере показано как найти в таблице iTable строку, у которой в колонке с названием "Колонка1" значение "СТЕНА", значение в колонке "Колонка2" - содержит "3", в колонке "Колонка3" содержится в любом месте "В22" или "В22" (В - или на русском или на английском) и в колонке "Колонка 4" число больше или равное 2.

bool stoponfirstnoteq = false;

bool add_sum = false;

int iTableFilter;

object("create", "ts_table", iTableFilter);

ts_table(iTableFilter, "create_structure_for_filter_table");

ts_table(iTableFilter, "add_row_to_filter_table", "(", "ANY", "Колонка1", "=", "СТЕНА", "", "AND");

ts_table(iTableFilter, "add_row_to_filter_table", "", "ANY", "Колонка2", "CONTAINS", "3", "", "AND");

ts_table(iTableFilter, "add_row_to_filter_table", "", "ANY", "Колонка3", "REGEXMACH", ".*[BВ]22.*", "", "AND");

ts_table(iTableFilter, "add_row_to_filter_table", "", "ANY", "Колонка4", ">=", 2, ")", "");

int ires = ts_table(iTable, "search_extended", iTableFilter);

Здесь

iTable - дескриптор таблицы, в которой надо найти строку;

iTableFilter - дескриптор таблицы, в которой описаны требования фильтра;

Возвращает -1 если строка не найдена, или индекс найденой строки (>=0).


search_bounds

Объект ts_table ›› Функция ts_table ››

Для таблиц, где в строках записаны границы прямоугольников определить строку, куда попадает указанная точка.

Вызов:

int ires = ts_table(1,"search_bounds", int colnumSX, int columnSY, int columnEX, int columnEY, double posX, double posY, int startrow, int endrow);

ires - результат поиска -1 если не нашлось, или номер строки.

columnSX, columnSY, columnEX, columnEY - числовые индексы или текстовые названия колонок, в которых находятся соответствующие значения, описывающие границы прямоугольников;

posX, posY - координаты точки, которую проверяем в какие границы она попала (ищем строку с прямоугольником, у которого эта точка внутри);

startrow - индекс начальной строки поиска;

endrow - индекс конечной строки поиска. Если -1 - значит искать до конца.

Пример можно посмотреть в файле LABPP_Table_unicode.cpp - быстрое определение ячейки в таблице по координатам щелчка мыши.


select_row

Объект ts_table ›› Функция ts_table ››

Сделать текущей указанную строку в таблице.

Пример.

Сделать текущей первую строку в таблице (индекс строки - от 0 до n-1):

int i=0;
ts_table(TableDescr1,"select_row",i);


seek_from_top, seek_from_bottom, seek_from_current

Объект ts_table ›› Функция ts_table ››

Задание нового положения текущей строки таблицы в виде смещения относительно начала, конца или текущей строки таблицы.

Вызов:

int ires = ts_table(int iTable, "seek_from_top", int ioffset); // смещение от начала
int ires = ts_table(int iTable, "seek_from_bottom", int ioffset); // смещение от конца таблицы
int ires = ts_table(int iTable, "seek_from_current", int ioffset); //смещение от текущей позиции

Здесь:

iTable - дескриптор таблицы;

ioffset - число, задающее смещение.

ires - результат операции - отрицательный или 0 при успешном выполнении.


add_row_from_eq_table

Объект ts_table ›› Функция ts_table ››

Добавить строку в таблицу из аналогичной таблицы.

Вызов:

ts_table(int iTableDescr, "add_row_from_eq_table", in tiTableFrom, int indexrowfrom, bool bsum);

Здесь:

iTableDescr - дескриптор таблицы, к которой добавить строки;

iTableFrom - дескриптор таблицы, из которой взять эти строки;

indexrowfrom - индекс начальной строки в копируемой таблице с которой начать добавление;

bsum - если true, то добавлять строки как add_row_sum (т.е. если есть строка совпадающая по ключевой колонке, то просто суммировать значения в числовых колонках);


add_rows_from_eq_table_by_filter

Объект ts_table ›› Функция ts_table ››

Добавить в таблицу из аналогичной таблицы строки, у которых значения в колонках соответствуют заданным.

Вызов:

ts_table(int iTableDescr, "add_rows_from_eq_table_by_filter", int iTableFrom, bool bstoponfirstnoteq, bool bsum, int icolumnindex1, string value1, ... string scolumnnameN, double valueN);

Здесь:

iTableDescr - дескриптор таблицы, к которой добавить строки;

iTableFrom - дескриптор таблицы, из которой взять эти строки;

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

bsum - если true, то добавлять строки как add_row_sum (т.е. если есть строка совпадающая по ключевой колонке, то просто суммировать значения в числовых колонках);

icolumnindex1...N - номера колонок, в которых искать соответствие;

scolumnname1...N - колонки могут задаваться их названиями;

svalue1... N - текстовые значение для отбора;

dvalue2... N - числовые или другие значения для отбора.

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


add_rows_from_eq_table_by_regex_filter

Объект ts_table ›› Функция ts_table ››

Добавить в таблицу из аналогичной таблицы строки, у которых значения в колонках соответствуют заданным шаблонным значениям в кодировке REGEX.

Вызов:

ts_table(int iTableDescr, "add_rows_from_eq_table_by_regex_filter", int iTableFrom, bool bstoponfirstnoteq, bool bsum, int icolumnindex1, string value1, ... string scolumnnameN, double valueN);

Здесь:

iTableDescr - дескриптор таблицы, к которой добавить строки;

iTableFrom - дескриптор таблицы, из которой взять эти строки;

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

bsum - если true, то добавлять строки как add_row_sum (т.е. если есть строка совпадающая по ключевой колонке, то просто суммировать значения в числовых колонках);

icolumnindex1...N - номера колонок, в которых искать соответствие;

scolumnname1...N - колонки могут задаваться их названиями;

svalue1... N - текстовые значение для отбора;

dvalue2... N - числовые или другие значения для отбора.

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


add_rows_from_eq_table_by_extended_filter

Объект ts_table ›› Функция ts_table ››

Скопировать строки из одной таблицы в другую, используя расширенный фильтр.

На примере показано как скопировать из таблицы iTable в iTableFiltered все записи без суммирования числовых переменных одинаковых строк у которых в колонке с названием "Колонка1" значение "СТЕНА", значение в колонке "Колонка2" - содержит "3", в колонке "Колонка3" содержится в любом месте "В22" или "В22" (В - или на русском или на английском) и в колонке "Колонка 4" число больше или равное 2.

bool stoponfirstnoteq = false;

bool add_sum = false;

ts_table(iTableFiltered, "add_rows_from_eq_table_by_extended_filter", iTable, bool stoponfirstnoteq, bool add_sum,

"(", "ANY", "Колонка1", "=", "СТЕНА", "", "AND",

"" , "ANY", "Колонка2", "CONTAINS", "3", "", "AND",

"" , "ANY", "Колонка3", "REGEXMATCH", ".*[BВ]22.*", "", "AND",

"", "ANY", "Колонка4", ">=", 2, ")" );

Здесь

iTableFiltered - дескриптор таблицы, в которую будут копироваться строки из таблицы iTable;

stoponfirstnoteq - остановить копирование при первом столкновении с неподходящей строкой;

add_sum - при собпадении данных у строк по ключевой колонке - суммировать числовые значения;


add_rows_from_eq_table_by_extended_filter_table

Руководство по LABPP_Automat для ARCHICAD

Объект ts_table ›› Функция ts_table ››

Скопировать строки из одной таблицы в другую, используя расширенный фильтр, передаваемый в виде таблицы.

На примере показано как скопировать из таблицы iTable в iTableFiltered все записи без суммирования числовых переменных одинаковых строк у которых в колонке с названием "Колонка1" значение "СТЕНА", значение в колонке "Колонка2" - содержит "3", в колонке "Колонка3" содержится в любом месте "В22" или "В22" (В - или на русском или на английском) и в колонке "Колонка 4" число больше или равное 2.

bool stoponfirstnoteq = false;

bool add_sum = false;

int iTableFilter;

object("create", "ts_table", iTableFilter);

ts_table(iTableFilter, "create_structure_for_filter_table");

ts_table(iTableFilter, "add_row_to_filter_table", "(", "ANY", "Колонка1", "=", "СТЕНА", "", "AND");

ts_table(iTableFilter, "add_row_to_filter_table", "", "ANY", "Колонка2", "CONTAINS", "3", "", "AND");

ts_table(iTableFilter, "add_row_to_filter_table", "", "ANY", "Колонка3", "REGEXMACH", ".*[BВ]22.*", "", "AND");

ts_table(iTableFilter, "add_row_to_filter_table", "", "ANY", "Колонка4", ">=", 2, ")", "");

ts_table(iTableFiltered, "add_rows_from_eq_table_by_extended_filter", iTable, bool stoponfirstnoteq, bool add_sum);

Здесь

iTableFiltered - дескриптор таблицы, в которую будут копироваться строки из таблицы iTable;

stoponfirstnoteq - остановить копирование при первом столкновении с неподходящей строкой;

add_sum - при собпадении данных у строк по ключевой колонке - суммировать числовые значения;


get_value_of

Объект ts_table ›› Функция ts_table ››

Получить значение из заданной колонки текущей строки таблицы

Пример. Получить значение из колонки №0 текущей строки таблицы в переменную objectname:

string objectname;
ts_table(TableDescr1,"get_value_of",0,objectname);


get_rows_count

Объект ts_table ›› Функция ts_table ››

Получить количество строк в таблице в заданную переменную

int rowcount;
ts_table(TableDescr1,"get_rows_count", rowcount);


get_columns_count

Объект ts_table ›› Функция ts_table ››

Получить количество колонок в таблице в заданную переменную

int colcount;
ts_table(TableDescr1,"get_columns_count", colcount);


set_columnstypes

Объект ts_table ›› Функция ts_table ››

Задать тип определенным колонкам.

Вызов:

ts_table(iTableDescr,"set_columnstypes",string col1name, string stype1, string col2name, string stype2,...);

или

ts_table(iTableDescr,"set_columnstypes",int col1, string stype1, int col2, string stype2,...);

Здесь:

col1name, col2name - колонки по именам, можно непоследовательно,

stype1, stype2 - названия типов ("string", "int", "double", "bool");

col1, col2 - номера колонок.


get_heading_of

Объект ts_table ›› Функция ts_table ››

Получить заголовок определенной колонки таблицы.

Вызов:

ts_table(iTableDescr,"get_heading_of", int col, string &colheading);

Здесь:

col - номер колонки (индекс от 0).


print_to_str

Объект ts_table ›› Функция ts_table ››

Экспорт всего содержимого таблицы в строковую переменную. Удобно при технологической работе для анализа содержимого таблицы в ходе отладки программ. Результат можно выводить через cout << text; в окно сообщений.

Вызов:

ts_table(iTableDescr,"print_to_str", string &text);

Здесь:

text - строка с результатом - содержимое таблицы построчно с кол-вом строк, и перечислением значений с именами колонок.


set_columns_to_add_sum

Объект ts_table ›› Функция ts_table ››

Задать колонки для суммирования при добавлении новой записи, если такая уже есть в таблице (функцией "add_row_sum").

Предыдущее назначение суммируемых колонок отменяется.

По умолчанию все колонки суммируемые.

Если задать команду без списка колонок, то все колонки будут не суммируемые.

Вызов:

отменить суммирование всех колонок для команды "add_row_sum":

ts_table(iTable,"set_columns_to_add_sum");

задать суммирование по колонкам:

ts_table(iTable,"set_columns_to_add_sum",

int colnum1/string colname1,

int colnum2/string colname2,

...

int colnumN/string colnameN

);

Здесь:

colnumN - номер колонки, в которой будет суммироваться значение, если значение первичного ключа (набор колонок, заданных в команде "set_first_key") совпадает с новой записью;

colname1 - то же можно задать названием колонки.

Пример.

Суммировать количество из таблицы iTableMatRes по GUID'у в таблицу iTableMatResTmp и выгрузить ее в Excel, изменив названия и последовательность колонок.

int ires = excel_attach();

if (ires != 0)

{

tsalert(-1, "Ошибка во время выполнения", "Не получается подключиться к файлу excel", sWorkBook);

return -1;

}

ires = excel_request("workbook_select", sWorkBook);

if (ires != 0)

{

tsalert(-1, "Ошибка во время выполнения", "Не получается переключиться в файл excel", sWorkBook);

excel_detach();

return -1;

}

string sSheetName;

sSheetName = "Результат материалы";

ires = excel_request("sheet_select", sSheetName);

if (ires != 0) {

tsalert(-1, "Ошибка во время выполнения", "Не получается переключиться на страницу", sSeetName);

excel_detach();

return -1;

}

int iTableMatResTmp;

object("create", "ts_table", iTableMatResTmp);

ts_table(iTableMatResTmp, "import_columns_from_table", iTableMatRes);

ts_table(iTableMatResTmp, "set_first_key", "GUID материала");

ts_table(iTableMatResTmp, "set_columns_to_add_sum", "Кол-во материала");

ts_table(iTableMatResTmp, "add_rows_from_eq_table_by_filter", iTableMatRes, false, true);

ts_table(iTableMatResTmp, "mapping_columns_to_export",

-1, "Поз.", "",

"Наименование материала (Rus)", "Наименование и техническая характеристика", "",

-1, "Код продукции","",

-1, "Поставщик", "",

"Ед.изм. материала", "Ед.изм.", "",

"Кол-во материала", "Кол-во", "",

-1, "Масса 1 ед.,кг","",

-1, "Примечание", ""

);

ts_table(iTableMatResTmp, "export_to_excel", 1, "A", 1, 0, -1);

breakpoint(101);

object("delete",iTableMatResTmp);

excel_detach();


Функции для выгрузки и загрузки таблиц

Объект ts_table ›› Функция ts_table ››

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


export_to_excel

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Выгрузка таблицы в Excel. Можно выводить все содержимое целиком или можно сначала вывести только заголовок, потом по одной строке в цикле с анализом или вставками между строк.

Вызов:

ts_table(iTableDescr, "export_to_excel", int withheader, string startcolletter, int startexcelrow, int starttablerow, int maxrows);

Здесь:

withheader = 0/1 - с заголовками или без

startcollerrer - "A" или строка с другой буквой - начальная колонка электронной таблицы для экспорта (если "", то начало - текущая колонка где стоит курсор в Excel)

starttablerow - с какой строки начинать вывод из таблицы (0 - с первой)

maxrows - сколько строк выводить. (-1 - все)


import_from_excel

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Импортировать таблицу из Excel.

ts_table(iTableDescr, "import_from_excel", string startcolletter, int startrow, int maxrows, bool add_sum, bool deleteoldrows);

Здесь:

startcolletter - буква колонки (если "" - то с текущей ячейки),

startrow - номер строки (индекс от 1),

maxrows - максимальное количество строк (если -1 - то до первой пустой ячейки в первой колонке),

add_sum - использовать при добавлении строк механизм "add_row_sum" (см. выше) - 0/1,

deleteoldrows - очистить или нет содержимое таблицы перед загрузкой.

Загрузка таблицы останавливается на строке, где в левой колонке ячейка пустая.


import_columns_from_excel

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Импорт колонок из таблицы Excel. Задается начальная ячейка или с текущей, загрузка идет слева направо по заданному количеству колонок или до первой пустой ячейки. Все колонки по умолчанию текстовые. Чтобы задать типы колонок используйте директиву "set_columntypes".

Вызов:

ts_table(iTableDescr, "import_columns_from_excel", string startcolletter, int startrow, int maxcols);

Здесь:

startcolletter - буква начальной колонки в Excel, или "" если с текущей,

startrow - номер строки в Excel (-1 - означает с текущей),

maxcols - количество колонок (-1 - означает до первой пустой ячейки);

Загрузка колонок останавливается на первой пустой ячейке.


import_columns_from_table

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Импортировать заголовки и типы колонок из другой таблицы.

Вызов:

ts_table(iTableDescr, "import_columns_from_table", int iTableDescrFrom);

Здесь:

iTableDescrFrom - дескриптор таблицы, откуда импортировать колонки.


import_columns_from_dialogcontrol

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Импортировать названия колонок из табличного элемента диалога (ListBox и т.п.)

Вызов:

ts_table(iTableDescr, "init_columns_from_dialogcontrol", int iDailogControlDescr);

Здесь:

iDailogControlDescr - дескриптор элемента диалога, из которого брать колонки.


import_from_dialogcontrol

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Импортировать содержимое строк из табличного элемента диалога.

Вызов:

ts_table(iTableDescr, "import_from_dialogcontrol", int iDailogControlDescr);

Здесь:

iDailogControlDescr - дескриптор элемента диалога, из которого брать строки.


export_to_dialogcontrol

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Экспортировать строки таблицы в табличный элемент диалога.

ts_table(iTableDescr, "export_to_dialogcontrol", int iDailogControlDescr, int startrow, int maxrows);

Здесь:

iDailogControlDescr - дескриптор элемента диалога, куда записывать строки,

startrow - начальная строка таблицы (индекс от 0),

maxrows - максимальное количество строк (-1 означает все строки).


export_to_dialogcontrol_by_filter

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Экспортировать строки таблицы в табличный элемент диалога с использованием фильтра по колонкам таблицы.

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

ts_table(iTableDescr, "export_to_dialogcontrol_by_filter", int iDailogControlDescr, int startrow, int maxrows, bool bstoponfirstnoteq, string scolname1, void colvalue1, ...);

Здесь:

iDailogControlDescr - дескриптор элемента диалога, куда записывать строки,

startrow - начальная строка таблицы (индекс от 0),

maxrows - максимальное количество строк (-1 означает все строки).

scolname1... - заголовок колонки в таблице, по которой отфильтровывать строки при экспорте;

colvalue1... - эталонное значение для сравнения.


export_to_dialogcontrol_by_regex_filter

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Экспортировать строки таблицы в табличный элемент диалога с использованием фильтра по колонкам таблицы.

Фильтрация производится с использованием шаблонов REGEX.

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

ts_table(iTableDescr, "export_to_dialogcontrol_by_regex_filter", int iDailogControlDescr, int startrow, int maxrows, bool bstoponfirstnoteq, string scolname1, void colvalue1, ...);

Здесь:

iDailogControlDescr - дескриптор элемента диалога, куда записывать строки,

startrow - начальная строка таблицы (индекс от 0),

maxrows - максимальное количество строк (-1 означает все строки).

scolname1... - заголовок колонки в таблице, по которой отфильтровывать строки при экспорте (можно использовать номер колонки - индексация от 0);

colvalue1... - эталонное значение для сравнения.

(см. regex шаблоны).


export_to_dialogcontrol_by_extended_filter

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Записать содержимое таблицы в табличный элемент диалога с использованием расширенного фильтра.

На примере показано как скопировать из таблицы iTable в табличный элемент диалога (iListBox) все записи от начала до конца таблицы с учетом фильтра - в колонке с названием "Колонка1" значение "СТЕНА", значение в колонке "Колонка2" - содержит "3", в колонке "Колонка3" содержится в любом месте "В22" или "В22" (В - или на русском или на английском) и в колонке "Колонка 4" число больше или равное 2.

int startrow = 0;

bool stoponfirstnoteq = false;

int maxrows = -1;

ts_table(iTable, "add_rows_from_eq_table_by_extended_filter", iListBox, startrow, stoponfirstnoteq, maxrows,

"(", "ANY", "Колонка1", "=", "СТЕНА", "", "AND",

"" , "ANY", "Колонка2", "CONTAINS", "3", "", "AND",

"" , "ANY", "Колонка3", "REGEXMATCH", ".*[BВ]22.*", "", "AND",

"", "ANY", "Колонка4", ">=", 2, ")" );

Здесь

iTable - дескриптор таблицы, из которой будут копироваться строки в табличный элемент диалога;

int startrow - индекс строки, с которой начинать копирование;

int maxrows - количество строк (-1 - все строки до конца таблицы);

bool bstoponfirstnoteq - остановиться при первом несоответствии строки условию фильтра.


export_to_dialogcontrol_by_extended_filter_table

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Записать содержимое таблицы в табличный элемент диалога с использованием расширенного фильтра, переданного в виде таблицы.

Удобно когда необходимо задавать условия фильтров по ходу выполнения программы.

На примере показано как скопировать из таблицы iTable в табличный элемент диалога (iListBox) все записи от начала до конца таблицы с учетом фильтра - в колонке с названием "Колонка1" значение "СТЕНА", значение в колонке "Колонка2" - содержит "3", в колонке "Колонка3" содержится в любом месте "В22" или "В22" (В - или на русском или на английском) и в колонке "Колонка 4" число больше или равное 2.

int startrow = 0;

bool stoponfirstnoteq = false;

int maxrows = -1;

int iTableFilter;

object("create", "ts_table", iTableFilter);

ts_table(iTableFilter, "create_structure_for_filter_table");

ts_table(iTableFilter, "add_row_to_filter_table", "(", "ANY", "Колонка1", "=", "СТЕНА", "", "AND");

ts_table(iTableFilter, "add_row_to_filter_table", "", "ANY", "Колонка2", "CONTAINS", "3", "", "AND");

ts_table(iTableFilter, "add_row_to_filter_table", "", "ANY", "Колонка3", "REGEXMACH", ".*[BВ]22.*", "", "AND");

ts_table(iTableFilter, "add_row_to_filter_table", "", "ANY", "Колонка4", ">=", 2, ")", "");

ts_table(iTable, "add_rows_from_eq_table_by_extended_filter", iListBox, startrow, stoponfirstnoteq, maxrows, iTableFilter);

Здесь

iTable - дескриптор таблицы, из которой будут копироваться строки в табличный элемент диалога;

int startrow - индекс строки, с которой начинать копирование;

int maxrows - количество строк (-1 - все строки до конца таблицы);

bool bstoponfirstnoteq - остановиться при первом несоответствии строки условию фильтра.


resetofffromexport

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Запретить экспорт определенных колонок таблицы. Запрет, выполненный предыдущим вызовом этой функции отменяется. Можно перечислять сколько угодно колонок, можно не подряд.

ts_table(iTableDescr,"resetofffromexport",int col1, int col2);
ts_table(iTableDescr,"resetofffromexport",string col1name, string col2name,...);

Здесь:

col1,col2 - номера колонок (индекс от 0).

col1name, col2name - имена колонок.


export_to_LABPP_Table

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Экспортировать строки таблицы в табличный элемент LABPP_Table.gsm.

ts_table(iTable, "export_to_LABPP_Table", bool withheader, int startcolindex, int startObjectrow, int starttablerow, int maxrows, string digit_delimiter);

или

ts_table(iTable, "export_to_LABPP_Table", bool withheader, int startcolindex, int startObjectrow, int starttablerow, int maxrows, string digit_delimiter, int iLABPP_TableGuidDescr);

Здесь:

withheader = 0/1 - с заголовками или без

startcolindex - индекс колонки в элементе таблицы, с которой надо выводить в таблицу ( начиная с 1);

startObjectrow - индекс строки в в элементе таблицы, с которой надо выводить в таблицу (начиная с 1);

starttablerow - с какой строки начинать вывод из таблицы (начиная с 0-й строки)

digit_delimiter - разделитель целой и дробной части заменить на этот символ ("." или ",")

maxrows - сколько строк выводить. (-1 - все).

Пример.

Создать таблицу и записать ее содержимое в выбранный элемент LABPP_Table в проекте.

int main()

{

int iTable;

object("create", "ts_table", iTable); // создать таблицу

// Создаем колонки таблицы

ts_table(iTable, "add_column", 0, "string", "Моя первая колонка");

ts_table(iTable, "add_column", 1, "double", "Моя вторая колонка с числом");

ts_table(iTable, "add_column", 2, "string", "Примечания");

// Добавляем строки

ts_table(iTable, "add_row", 0, "Строка 1", 1, 10000.1111, 2, "Примечание 1");

ts_table(iTable, "add_row", 0, "Строка 2", 1, 20000.2222);

ts_table(iTable, "add_row", 0, "Строка 3", 1, 30000.335, 2, "Примечание 3");

// Загрузить из выбранных элементов объекты LABPP_Table

ac_request("load_elements_list_from_selection", 1, "ObjectType", "ObjectName", "LABPP_Table", "MainFilter", 2);

ac_request("get_loaded_elements_list_count", 1);

int icount = ac_getnumvalue();

int i;

bool withheader = true;

int startcolindex = 1;

int startObjectrow = 1;

int starttablerow = 0;

int maxrows = -1;

int maxcolumns;

// получить число колонок и строк

ts_table(iTable, "get_columns_count", maxcolumns);

ts_table(iTable, "get_rows_count", maxrows);

// Перебрать все отобранные объекты LABPP_Table. Если нужен только единственный - можно цикл не делать.

for (i = 0; i < icount; i++)

{

// Установить текущим элементом объект из списка 1 № i

ac_request("set_current_element_from_list", 1, i);

// Записать в него содержимое таблицы

ts_table(iTable, "export_to_LABPP_Table", withheader, startcolindex, startObjectrow, starttablerow, maxrows,",");

// Задать в объекте количество использованных строк

ac_request("set_object_property_value", "TS_RowsUsedCount", maxrows+1);

// Задать в объекте количество использованных колонок

ac_request("set_object_property_value", "TS_ColumnsUsedCount", maxcolumns);

// Дать команду объекту выполнить внутренний перерасчет

ac_request("set_object_property_value", "TS_DoRecalcAll", 1);

}

// Удалить из памяти таблицу

object("delete", iTable);

}

В результате выполнения программы в таблицу будут занесены данные.


set_columns_width_when_export

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Задать размер колонок при экспорте в табличный элемент диалога.

Вызов:

ts_table(iTable,"set_columns_width_when_export",40);

Здесь 40 - ширина колонок в пискелях.


mapping_columns_to_export

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Задать новую последовательность колонок при экспорте.

Вызов:

отменить маппирование и при следующем экспорте:

ts_table(iTable,"mapping_columns_to_export");

задать маппирование:

ts_table(iTable,"mapping_columns_to_export",

int basecolnum1/string basecolname1, string altcolname1, bool/int/double/string default1,

int basecolnum2/string basecolname2, string altcolname2, bool/int/double/string default2,

...

int basecolnumN/string basecolnameN, string altcolnameN, bool/int/double/string defaultN

);

Здесь:

basecolnumN - номер базовой колонки, из которой брать данные. Если -1, то будет пустая колонка, заполненная значением defaultN;

basecolnameN - здесь может быть указано имя базовой колонки;

altcolnameN - альтернативное название колонки, если значение "", то берется название базовой колонки;

defaultN - значение, которое будет выводиться в случае, если задана пустая колонка (-1). Если задать "", то заполнения не будет.

Пример.

ts_table(iTableMatRes, "mapping_columns_to_export",

-1, "Поз.", "",

"Наименование материала (Rus)", "Наименование и техническая характеристика", "",

-1, "Тип, марка, обозначение документа, опросного листа", "",

-1, "Поставщик", "",

"Ед.изм. материала", "Ед.измерения", "",

"Кол-во материала", "Кол.", "",

-1, "Масса 1 ед.,кг","",

-1, "Примечание", ""

);


get_base_colindex_by_mapped_column

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

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

Вызов:

int irealycolnum = ts_table(int iTable, "get_base_colindex_by_mapped_column", string sMappingColName);
int irealycolnum = ts_table(int iTable, "get_base_colindex_by_mapped_column", int iMappingColIndex);

Здесь:

irealycolnum - номер базовой колонки, на которую указывает псевдоним или порядковый номер псевдонима.

sMappingColName - псевдоним или индекс (от 0 до N) псевдонима колонки.

Возвращает индекс базовой колонки (область определения от 0 до N) или -1.

Пример.

Получить номера базовых колонок для псевдонима "Ед.изм. материала" и псевдонима с индексом 3 ("Поставщик")

ts_table(iTableMatRes, "mapping_columns_to_export",
-1, "Поз.", "",
"Наименование материала (Rus)", "Наименование и техническая характеристика", "",
-1, "Тип, марка, обозначение документа, опросного листа", "",
-1, "Поставщик", "",
"Ед.изм. материала", "Ед.измерения", "",
"Кол-во материала", "Кол.", "",
-1, "Масса 1 ед.,кг","",
-1, "Примечание", ""
);

int irealycolnum;
irealycolnum = ts_table(iTableMatRes, "get_base_colindex_by_mapped_column", "Ед.изм. материала");
// результат - в irealycolnum теперь номер базовой колонки ("Ед.измерения") в таблице iTableMatRes.

irealycolnum = ts_table(iTableMatRes, "get_base_colindex_by_mapped_column", 3);
// результат - в irealycolnum теперь -1, т.к. в таблице iTableMatRes при маппировании базовая колонка не указана (-1).


get_count_of_mapped_columns

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Узнать сколько колонок таблицы смаппировано для экспорта.

Вызов:

int mappedcolumnscount = ts_table(int iTable,"get_count_of_mapped_columns");

Здесь:

iTable - дескриптор таблицы,

mappedcolumnscount = количество колонок, которые смаппированы для экспорта.


export_to_csv

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Выгрузить содержимое таблицы в текстовую переменную.

ts_table(iTable, "export_to_csv", bool bWithHeadings, string column_separator, string digit_separator, int start_row, int numrows, string csv_result);

Здесь:

iTable - дескриптор таблицы,

bWithHeadings - выводить заголовки таблицы или нет,

column_separator - символ разделителя колонок - обычно ";",

digit_separator - разделитель целой и дробной частей чисел - обычно ",",

start_row - с какой строки выводить таблицу,

num_rows - сколько строк выводить (если -1 - то выводить все);

Пример

//***********************************************

// Импорт ts_table из текста в формате CSV

// и экспорт в этот формат

// LABPP 2021

//***********************************************

int main()

{

int iTable;

object("create", "ts_table", iTable);

string csvstr;

csvstr = "\"Заголовок 1\";\"Заголовок 2\";\"Заголовок 3\"\n\

\"Значение 11 две кавычки \"\" текст\";123.3;\"Значение 31\"\n\

\"Значение 12\";321.21;\"Значение 32\"";

ts_table(iTable, "import_from_csv", csvstr, ";");

string str;

ts_table(iTable, "print_to_str", str);

coutvar << str;

string csv_result;

ts_table(iTable, "export_to_csv", true, ";", "," , 0, -1, csv_result);

coutvar << csv_result;

string FileNameAndPath = "c:\\LabPP\\test_07.csv";

int iret = 0;

int iFileDescr;

object("create", "ts_file", iFileDescr);

iret = ts_file(iFileDescr, "open", FileNameAndPath, "create", "we");

if (iret == 0)

{

ts_file(iFileDescr, "write", csv_result);

ts_file(iFileDescr, "close");

}

else

{

tsalert(-3, "Ошибка записи", "Проверьте, пожалуйста доступность файла для записи", FileNameAndPath);

}

object("delete", iFileDescr);

object("delete", iTable);

}


import_from_csv

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Загрузить таблицу из текстовой переменной в формате CSV.

ts_table(iTable, "import_from_csv", string csv_source, string column_separator);

Здесь:

iTable - дескриптор таблицы,

csv_source - переменная с текстом в формате csv,

column_separator - разделитель колонок - обычно ";".


export_to_ac_object_parameter

Объект ts_table ›› Функция ts_table ›› Функции для выгрузки и загрузки таблиц ››

Выгрузить таблицу в параметр GDL типа массив.

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

Вызов:

int ires = ts_table(int iTable, "export_to_ac_object_parameter", string sParameterName);

Здесь:

iTable - дескриптор таблицы,

sParameterName - имя GDL параметра (массив).

Пример.

У отобранных в список №1 GDL элементов имеется текстовый табличный параметр sMyParameters.

Имя | Значение | Тип
Мой параметр 1 | 8 | число
Мой параметр 2 | значение параметра 2 | текст

Требуется у элемента с индексом 0 в списке №1 :

1. считать значение Мой параметр 1

2. если надо, то создать и записать новый параметр с именем "Мой новый текстовый параметр" и записать туда значение "значение 3"

int iTable;
object("create", "ts_table", iTable);
int ires = ac_request("set_current_element_from_list", 1, 0);
ac_request_special("get_element_value", "GDL","sMyParameters", iTable); // считать содержимое и структуру GDL параметра в таблицу iTable

string str;
ts_table(iTable, "print_to_str", str);
coutvar << str;

//считаем значение Мой параметр 1 в svalue;
ires = ts_table(iTable,"search",0,"Мой параметр 1");
string svalue;
if(ires >=0) {
ts_table(iTable, "select_row", ires);
ts_table(iTable, "get_value_of", 0, svalue);
}

//добавим, если такого еще нет нужно, считаем значение Мой параметр 1 в svalue;
ires = ts_table(iTable,"search",0,"Мой новый текстовый параметр");
if(ires < 0) {
ts_table(Table,"add_row", 0, "Мой новый текстовый параметр", 1, "значение 3", 2, "строка");
}
else
{
ts_table(iTable, "select_row", ires);
ts_table(iTable, "set_value_of", 1, "значение 3");
}

// Записать таблицу назад в параметр текущего элемента. Размер таблицы-параметра GDL - изменить с учетом размера таблицы iTable.

ires = ts_table(iTable, "export_to_ac_object_parameter", "sMyParameters");


set_column_user_value

Объект ts_table ›› Функция ts_table ››

Задать пользовательское значение для определенной колонки таблицы.

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

Вызов:

int ires = ts_table(int iTable, "set_column_user_value", int icol, string/double/int/bool valuetoset);

Здесь:

iTable - дескриптор таблицы;

icol - номер колонки таблицы;

vsluetoset - значение, которое надо присвоить колонке.


get_column_user_value

Объект ts_table ›› Функция ts_table ››

Считать пользовательское значение у определенной колонки таблицы.

Вызов:

int ires = ts_table(int iTable, "get_column_user_value", int icol, string/double/int/bool vartogetvalue);

Здесь:

iTable - дескриптор таблицы;

icol - номер колонки таблицы;

vartogetvalue - имя переменной, куда считать значение.


set_column_user_genesis

Объект ts_table ›› Функция ts_table ››

Задать пользовательское значение генезиса для определенной колонки таблицы.

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

Вызов:

int ires = ts_table(int iTable, "set_column_user_genesis", int icol, string sgenesis);

Здесь:

iTable - дескриптор таблицы;

icol - номер колонки таблицы;

sgenesis - значение генезиса текстом.


get_column_user_genesis

Объект ts_table ›› Функция ts_table ››

Считать пользовательское значение генезиса из определенной колонки таблицы.

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

Значение должно быть раньше записано при помощи команды "get_column_user_genesis".

Вызов:

int ires = ts_table(int iTable, "get_column_user_genesis", int icol, string sgenesis);

Здесь:

iTable - дескриптор таблицы;

icol - номер колонки таблицы;

sgenesis - значение генезиса текстом.


delete_rows

Объект ts_table ›› Функция ts_table ››

Удалить заданное количество строк из таблицы начиная с заданной позиции.

Вызов:

ts_table(int iTable, "delete_rows", int index, int count);

Здесь:

iTable - дескриптор таблицы;

index - индекс строки (в таблице строки нумеруются от 0 до n-1);

count - количество удаляемых строк.

Чтобы удалить все строки используйте "clear_rows".


set_value_of_toallrows

Объект ts_table ›› Функция ts_table ››

Задать значение в ячейка для всех строк таблицы начиная с заданной строки по заданную конечную строку.

Вызов:

ts_table(int iTable, "set_value_of_toallrows", index/string column_index_or_name, bool/int/double/string newvalue, int irowfrom, int irowto);

Здесь:

iTable - дескриптор таблицы;

column_index_or_name - индекс или имя колонки;

newvalue - значение, которое требуется установить ячейкам;

irowfrom - индекс строки, с которой необходимо задать значение (от 0 до n-1);

irowto - индекс последней строки для изменения (если -1 - то до конца таблицы).


Функции стандартной библиотеки

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Преобразование

Функции стандартной библиотеки ››


atoi

Функции стандартной библиотеки ›› Преобразование ››

Перевод строковой переменной в целое число

Вызов:

string ivalue = atoi(string svalue);


itoa

Функции стандартной библиотеки ›› Преобразование ››

Перевод целого числа в строку.

string svalue = itoa(int ivalue);


atof

Функции стандартной библиотеки ›› Преобразование ››

Перевод строковой переменной в число с плавающей точкой

double dresult = atof(string svalue);

Здесь: svalue - число, записанное текстом, возвращаемое значение - число с плавающей точкой.


ctos

Функции стандартной библиотеки ›› Преобразование ››

Перевод кода символа в строку. Функция полезна при динамическом формировании имени колонки в Excel и т.п.

Формат обращения:

string ssymbol = ctos(int isymbolcode);

Здесь:

icymbolcode - код символа.

ssymbol - строковая переменная с символом, соответствующим коду.

Пример:

Сформировать текстовый адрес ячейки Excel во второй колонке во второй строке.

int chcolumn = 'A'+1;
string ssymbol = ctos(chcolumn);
string address = ssymbol+itoa(2)+":"+ssymbol+itoa(2);
cout << address;

В окно сообщений будет выведено "B2:B2"


grad_to_radian

Функции стандартной библиотеки ›› Преобразование ››

Перевести градусы в радианы.

Вызов:

double grad_to_radian(double grad);

Здесь : grad - угол в градусах. Возвращаемое значение - число в радианах.

Перевести градусы в радианы.
Пример. Конвертировать в радианы 180 градусов:

double result = grad_to_radian(180);

В результате переменная result будет содержать число Пи (3.14....).


radian_to_grad

Функции стандартной библиотеки ›› Преобразование ››

Перевести угол в радианах в градусы.

Вызов:

double radian_to_grad(double rad);

Пример. Перевести угол 3.14 в градусы.

double result = radian_to_grad(3.14);

В результате переменная result будет содержать число 180.


sprintf

Функции стандартной библиотеки ›› Преобразование ››

Сформировать строку по принципу printf.

Вызов:

string sprintf( string format, value);

Пример. Вывести чило с двумя знаками после запятой.

string sresult = sprintf("%.2f", 2.024);

В результате переменная sresult будет содержать строку "2.02".

Еще примеры.

Требуемый результат | Формат | Тип параметра | Пример конструкции
001 | "%03i" | int | int m = 10; string s = sprintf("%03i",m);


ecvt_french

Функции стандартной библиотеки ›› Преобразование ››

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

Вызов:

string svalue = ecvt_french(double dvalue);

Пример.

Перевести в строку число 111222333.11.

double dvalue = 111222333.11;
string sresvalue = ecvt_french(svalue);
cout << sresvalue;

Результат - в окне сообщений появится строка "111 222 333,11"


ecvt

Функции стандартной библиотеки ›› Преобразование ››

Переводит число в строку без пробелов, отделяющих тысячные разряды. Разделитель целой и дробной части - точка.

Вызов:

string svalue = ecvt(double dvalue);

Пример.

Перевести в строку число 111222333.11.

double dvalue = 111222333.11;
string sresvalue = ecvt(svalue);
cout << sresvalue;

Результат - в окне сообщений появится строка "111222333.11"


Математические функции

Функции стандартной библиотеки ››


abs

Функции стандартной библиотеки ›› Математические функции ››

Вернуть абсолютное значение.

double dres = abs(double dvalue);

В dres - число dvalue всегда положительное.


max

Функции стандартной библиотеки ›› Математические функции ››

Вернуть максимальное из чисел

Вызов:

double dres = max(double dvalue1, double dvalue2);

В dres - максимальное из dvalue1 и dvalue2


min

Функции стандартной библиотеки ›› Математические функции ››

Вернуть минимальное из чисел

Формат команды:

double dres = min(double dvalue1, double dvalue2);

В dres - минимальное из чисел dvalue1 и dvalue2.


rand

Функции стандартной библиотеки ›› Математические функции ››

Генератор случайных чисел

Вызов:

double dres = rand();

Возвращает случайное число от 0 до 1;


ln

Функции стандартной библиотеки ›› Математические функции ››

Натуральный логарифм.


log

Функции стандартной библиотеки ›› Математические функции ››

Логарифм.


sqrt

Функции стандартной библиотеки ›› Математические функции ››

Корень квадратный.


sqr

Функции стандартной библиотеки ›› Математические функции ››

Корень заданной степени.


pow

Функции стандартной библиотеки ›› Математические функции ››

Возведение в степень.


percent

Функции стандартной библиотеки ›› Математические функции ››

Вычисление процентов числа.


tsround

Функции стандартной библиотеки ›› Математические функции ››

Правильное математическое округление.

Вызов:

double tsround(double dvalue, int numpos);

Здесь:

dvalue - значение, которое нужно округлить.

numpos - количество знаков после запятой.


tsround_best

Функции стандартной библиотеки ›› Математические функции ››

Округление в большую сторону. Один из вариантов алгоритма округления.

Округляет каждый знак после запятой начиная с самого младшего разряда. Так, что если он больше 5, то в больший разряд переходит 1.

Вызов:

double tsround_best(dvalue, int numpos);

Здесь:

dvalue - значение, которое нужно округлить.

numpos - количество знаков после запятой.


floor

Функции стандартной библиотеки ›› Математические функции ››

Функция округляет аргумент до наибольшего целого числа, которое меньше или равно аргументу.

Вызов:

double dresult = floor(double dvalue);


ceil

Функции стандартной библиотеки ›› Математические функции ››

Функция ceil выполняет округление и возвращает ближайшее целое значение к dvalue, но это значение будет не меньше самого dvalue.

Вызов:

double dresult = ceil(double dvalue);


math_const

Функции стандартной библиотеки ›› Математические функции ››

Получить значение математической константы (Пи и т.п.)

Вызов:

double math_const(string sConstName);

Здесь:

sConstName - имя константы.

Константа | Значетие/описание
Pi | 3.14159265359
MinDouble | Минимальное значение double
MaxDouble | Максимальное значение double
e | 2.71828182846


inrange

Функции стандартной библиотеки ›› Математические функции ››

Проверить находится ли значение в рамках заданного диапазона.

Вызов:

bool inrange(double value, string left_parenthesis, double left_margin, double right_margin, string right_parenthesis);

Здесь:

value - тестируемо значение;

left_parenthesis = левая скобка ("]","(" или "[" - "от минус бесконечности", от "left_margin не включительно", от "left_margin включая left_margin");

left_margin - левая граница диапазона;

right_parenthesis = правая скобка ("[",")" или "]" - "до плюс бесконечности", до "right_margin не включительно", до "right_margin включая right_margin");

right_margin - правая граница диапазона;


Тригонометрические функции

Функции стандартной библиотеки ››


cos

Функции стандартной библиотеки ›› Тригонометрические функции ››

Косинус угла. Угол задается в радианах.

Вызов:

double dresult = cos(double cornerinrad);


sin

Функции стандартной библиотеки ›› Тригонометрические функции ››

Синус угла. Угол задается в радианах.

Вызов:

double dresult = sin(double cornerinrad);


arcsin

Функции стандартной библиотеки ›› Тригонометрические функции ››

Аргсинус.


arccos

Функции стандартной библиотеки ›› Тригонометрические функции ››

Арккосинус.


tg

Функции стандартной библиотеки ›› Тригонометрические функции ››

Тангенс


arctg

Функции стандартной библиотеки ›› Тригонометрические функции ››

Арктангенс.


ctg

Функции стандартной библиотеки ›› Тригонометрические функции ››

Котангенс.


arcctg

Функции стандартной библиотеки ›› Тригонометрические функции ››

Арккотангенс.


Функции геометрического преобразования

Функции стандартной библиотеки ››

Обращение к функции ac_request() с директивой geometry_calc_2d предоставляет широкий набор операций для модификации координат и определения взаиморасположения различных элементов.


is_curelem_inside_element_polygon

Функции стандартной библиотеки ›› Функции геометрического преобразования ››

Определить лежит ли текущий элемент внутри полигона элемента, имеющего площадь опоры (штриховка, плита, 3d-сетка и т.п.). Возможно предварительное увеличение или уменьшение контура или отверстий полигона второй фигуры.

Вызов:

bool res = ac_request("geometry_calc_2d"," is_curelem_inside_element_polygon",double x1,double y1, int iElemDescr, bool mainContOnly, double grow_contour, double grow_holes, int mode);


is_point_on_element_polygon

Функции стандартной библиотеки ›› Функции геометрического преобразования ››

Определить лежит ли точка внутри полигона элемента, имеющего площадь опоры (штриховка, плита, 3d-сетка и т.п.)

Обращение

bool res = ac_request("geometry_calc_2d","is_point_on_element_polygon",double x1,double y1, int iElemDedcr, bool mainContOnly, double grow_contour, double, grow_holes);

Здесь:

x1 и y1 - координаты исследуемой точки, iElemDescr - дескриптор объекта, чей полигон проверяется на содержание точки.

mainContOnly – если да, то учитывать только внешний контур второго полигона,

grow_contour и grow_holes – на сколько расширить или сузить контур и отверстия второго полигона.

Пример.

Считать элементы 3d-сеток с ID="Рельеф" в список элементов, взять первый, создать на его базе объект ac_eleemnt_guid, из него получить объект ac_element. Получить рельеф в таблицу координат. И проверить лежит ли точка внутри полигона.

// считать таблицу координат элемент рельефа 3d mesh с ID="Рельеф"
int iMeshCoordTable; // дескриптор таблицы координат полигона
// считать элементы типа 3d-сетка с ID="Рельеф" в список № 2
ac_request("load_elements_list",2,"MeshType","ID","Рельеф","MainFilter",2);
// определить сколько элементов содержит список № 2
ac_request("get_loaded_elements_list_count",2);
int iicount = ac_getnumvalue();
if(iicount == 0)
{
cout << "В проекте отсутствует 3d сетка с ID=Рельеф.\nПрограмма остановлена";
return -1;
}
// создать объект динамической таблицы для координат полигона
object("create","ts_table",MeshCoordTable);
// установить фокус на первом элементе (индекс 0) списка № 2
ac_request("set_current_element_from_list",2, 0);
// создать объект для guid элемента
int iMeshGuidDescr; // дескриптор объекта guid
object("create","ac_element_guid",iMeshGuidDescr);
// записать из текущего элемента в списке № 2 guid в объект iMeshGuidDescr
ac_request("store_cur_element_to_descr", iMeshGuidDescr);
int iMeshElemDedcr; // дескриптор объекта элемента
// создать объект для работы с элементом
object("create","ac_element",iMeshElemDedcr);
// загрузить объект элемент из guid
ac_request("load_element_from_guid",iMeshElemDedcr,iMeshGuidDescr);
// считать таблицу координат полигона
ac_request("get_element_value","SimpleCoordTable",iMeshCoordTable);
// проверить сколько точек содержит полученная таблица координат полигона
int irowcount;
ts_table(iMeshCoordTable, "get_rows_count", irowcount);
cout << "Количество точек в контуре рельефа=" << irowcount << "\n";
object("delete",MeshCoordTable);
double x1=1.1, y1=2.2; // координаты исследуемой точки
// проверить лежит ли точка с координатами x1, y1
int res = ac_request("geometry_calc_2d","is_point_on_element_polygon",x1,y1, iMeshElemDedcr);
if(res == 1)
{
cout << "Точка находится внутри контура полигона элемента";
}


rotate_point_and_move

Функции стандартной библиотеки ›› Функции геометрического преобразования ››

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

Вызов:

ac_request("geometry_calc_2d","rotate_point_and_move",double centerXfrom, double centerYfrom,double pXfrom,double pYfrom, double alpha_rad, double centerXto, double centerYto,double scale,double &pXres, double& pYres);

centerXfrom, centerYfrom - исходные координаты центра поворота,

pXfrom, pYfrom - исходные координаты точки,

alpha_rad - угол поворота точки вокруг центра,

centerXto, centerYto - новые координаты центра поворота,

scale - масштаб в диапазоне ]0,1],

Результат - pXres, PYres - новые координаты точки.


get_cross_point_of_2lines

Функции стандартной библиотеки ›› Функции геометрического преобразования ››

Найти точку пересечения двух прямых, заданных точками.

Обращение

ac_request("geometry_calc_2d","get_cross_point_of_2lines",double l1sX, double l1sY,double l1eX,double l1eY, double l2sX, double l2sY, double l2eX,double l2eY,double& pXres, double& pYres);

Здесь:

l1sX,l1sY,l1eX, l1eY - координаты начальной и конечной точек первой прямой,

l2sX,l2sY,l2eX, l2eY - координаты начальной и конечной точек второй прямой.
Координаты точки пересечения прямых выводятся в pXres и pYres.


get_rot_and_move_point

Функции стандартной библиотеки ›› Функции геометрического преобразования ››

Переместить точку в заданном направлении на заданное расстояние.

Обращение

ac_request("geometry_calc_2d","get_rot_and_move_point",double P1X, double P1Y, double dL, double dAngleRad, double & pXres, double& pYres);

Здесь:

P1X, P1Y - исходные координаты точки, dL - расстояние, на которое нужно переместить точку, dAngleRad - угол против часовой стрелки от положительного направления оси X.

pXres, pYres - координаты перемещенной точки.


get_length_2point

Функции стандартной библиотеки ›› Функции геометрического преобразования ››

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

Вызов:

ac_request("geometry_calc_2d","get_length_2point",double l1sX, double l1sY,double l1eX,double l1eY, double &resLength);

Здесь:

l1sX, l1sY, l1eX, lieY - координаты точек.

Расстояние между точками возвращается в resLength.


is_point_on_line

Функции стандартной библиотеки ›› Функции геометрического преобразования ››

Определить находится ли точка на линии, заданной двумя точками.

Вызов:

bool bres = ac_request("geometry_calc_2d","is_point_on_line",double P1X, double P1Y, double P2X, double P2Y, double PointX, double PointY);

P1X,P1Y,P2X,P2Y - начальная и конечная точки линии.

PointX, PointY - координаты исследуемой точки.

Результат bres - 1 или 0 в зависимости от того, лежит или нет точка на линии.


get_line_angle

Функции стандартной библиотеки ›› Функции геометрического преобразования ››

ac_request("geometry_calc_2d","get_line_angle",double l1sX, double l1sY,double l1eX,double l1eY, double &resAngleInRad);

Здесь:

l1sX,l1sY,l1eX, l1eY - координаты начальной и конечной точек отрезка.

Угол наклона в радианах возвращается в resAngleInRad.


Специальные функции

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


codemeter - измерение времени выполнения фрагмента кода

Специальные функции ››

Формат обращения:

double dvalue = codemeter(int what);

Здесь what - 0 или 1.

Если задан 0, то таймер обнуляется.

Если задана 1 - то функция возвращает время в секундах с момента обнуления счетчика.

Если задана 2 - то функция возвращает время в милисекундах.

Пример.

Определить время выполнения цикла в 10000 проходов.

codemeter(0);
int i;
for(i=0;i<10000;i++)
{
cout << i << "\n";
}
cout<< "Цикл в 10 000 оборотов выполнен за " << codemeter(1) << " секунд";


ac_save_messages_to_file - сохранить текст из окна сообщений в файл

Специальные функции ››

Формат обращения:

ac_save_messages_to_file(string filepath);

Записывает содержимое окна сообщений в файл filepath

Пример.

Записать содержимое окна сообщений в файл c:\my_file.txt:

ac_save_messages_to_file("c:\\my_file.txt");

Обратите внимание на двойной обратный слэш.

В строках C++ одинарный обратный слэш используется в служебных целях. Так что в строках нужно писать двойной слэш, а программа при выполнении автоматически один уберет.


Связь с квартирографией

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


solaris_test

Связь с квартирографией ››

Чтобы использовать функционал квартирографии ARCHICAD необходимо чтобы модуль квартирографии был установлен и доступен для обращения.

Тест выполняется командой ac_request с директивой solaris_test.

Форма обращения

int ires = ac_request("solaris test");

При успешном тестировании возвращается 0.

int res;
res = ac_request("solaris_test");
if(res != 0) {
cout << "Нет связи с LabPP_Solaris\n";
return -1;
}


get_flat_rooms

Связь с квартирографией ››

Получить список помещений квартиры - ac_request("get_flat_rooms"...)

Заполняет заданный внутренний список элементами зон, закрепленных за указанным маркером квартиры.

Обращение

int ires = ac_request("get_flat_rooms",int iFlatGuidObjDescr, int iListNum);

Здесь:

iFlatGuidObjDescr - дескриптор объекта типа guid маркера квартиры/офиса.

iListNum - номер внутреннего списка элементов, в который записать зоны этой квартиры/офиса.

На выходе - 0 - отсутствие ошибки.


runtimecontrol

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


workline

runtimecontrol ››

Управление дорожкой процентов выполнения программы в главном окне.

Формат обращения:

runtimecontrol("workline", string sdirective, int ivalue);

или назначить текущее значение дорожки процентов и одновременно написать это значение в окно сообщений через каждые igap итераций

runtimecontrol("workline", "setpos_and_print_through_gap", int ivalue, int igap);

Здесь:

directive - директива, задающая что сделать"setmin"/"setmax" /"setpos" - установить минимальное, максимальное или текущее значение дорожки процентов,

если задана директива "setpos_and_print_through_gap" - то одновременно с назначением позиции

ivalue - число, в зависимости от директивы.

igap - промежуток, через который выводить счетчик в окно сообщений (например выводить через каждые 100 или 1000).

В окне LabPP_Automat это выглядит так:

В окнах LabPP_Solaris и других программах эта дорожка процентов располагается тоже на главной панели программы.

Пример 1.

Выполнить в цикле показ дорожки процентов и вывести в окно сообщений значения индекса цикла.

int main()
{
int imax = 1000901;
runtimecontrol("workline", "setmax",imax);
int i;
for (i = 0; i < imax; i++)
{
cout << i << "\n";
runtimecontrol("workline", "setpos", i);
}
runtimecontrol("workline", "setpos", 0);
}

Результат:

Пример 2.

Выполнить в цикле показ дорожки процентов и вывести в окно сообщений значения индекса цикла каждые 100 000 итераций и последнее значение 1000901.

int main()
{
int imax = 1000901;
runtimecontrol("workline", "setmax",imax);
int i;
for (i = 0; i < imax; i++)
{
cout << i << "\n";
runtimecontrol("workline", "setpos_and_print_through_gap", i+1, 100000);
}
runtimecontrol("workline", "setpos", 0);
}

Результат:


Команды для управления в приложении LabPP_Calc

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


interface

Команды для управления в приложении LabPP_Calc ››


calc_field

Команды для управления в приложении LabPP_Calc ›› interface ››

Считать или записать содержимое оперативных полей и полей-примечаний калькулятора для ARCHICAD. В приложении имеется 4 поля и под ними для удобства пользователя - поля комментарии.

Вызов:

ac_request("interface", "calc_field", string what, string fieldname, int dochangedot, string svalue,string scomment);

Здесь:

what - выражение "set" или "get" - записать или получить,

fieldname - имя поля "a"/"b"/"c"/"main" - к какому из полей будет применена команда.

dochangedot - заменять запятую на точку при считывании оперативного поля и наоборот при записи или не заменять (1/0).

svalue - текстовое значение оперативного поля,

scomment - текстовое значение для поля-комментария к оперативному полю.

При выполнении команды "set" выполняется сохранение информации для выполнения отката или повторения операций.

Пример.

Записать в операционное поле "a" значение 111.11 автоматически заменяя точку на запятую. В комментарии к этому полю записать, что это площадь квартиры.

ac_request("interface","calc_field","set","a",1,"111.11","s квартиры");


get_active

Команды для управления в приложении LabPP_Calc ›› interface ›› calc_field ››

Получить имя поля калькулятора, у которого нажата кнопка "A","B","C" или "D".

Возвращает значение через ac_getstrvalue() - "a","b","c" или "main".

Пример:

ac_request("interface", "calc_field", "get_active");

string sletter = ac_getstrvalue();


Внешние переменные

После выполнения программы все ее переменные уничтожаются из памяти.

Исключение составляют внешние переменные.

Их можно создавать по ходу выполнения одной программы и считывать в другой без ограничений. Это делается вызовом функций var_extern_get и var_extern_set.

Внешние переменные имеют идентификатор и значение.


var_extern_set

Внешние переменные ››

Задать внешнюю переменную и присвоить ей значение. Значение присваивается в текстовом виде.

Вызов:

var_extern_get(string varname, string varvalue);

или

var_extern_get(string varname, double varvalue);

Здесь:

varname - имя переменной, varvalue значение переменной текст или число.


var_extern_get

Внешние переменные ››

Получение значения внешней переменной из памяти по ее идентификатору

Вызов:

var_extern_set(string varname, string varnameforvalue);

или

var_extern_set(string varname, double varnameforvalue);

Здесь:

varname - имя переменной, varnameforvalue - имя переменной в которую запишется значение внешней переменной.


var_extern_delete

Внешние переменные ››

Удалить из памяти внешнюю переменную.

Вызов:

var_extern_delete( string sVarName);

Здесь:

sVarName - имя переменной, которую необходимо удалить из памяти.

Пример.

Сделать так, чтобы при закрытии окна немодального диалога удалялся из памяти объект таблицы и удалялась переменная.

int main()
{
#pragma region Создание диалога
object("create","ts_dialog",iDialogDescr);
ts_dialog(iDialogDescr, "init_dialog","palette",0,0,450,400);
ts_dialog(iDialogDescr, "set_as_main_panel");
ts_dialog(iDialogDescr, "eventreaction", "Event_PanelCloseRequested"); // задание реакции на событие
ts_dialog(iDialogDescr, "SetTitle","Выгрузка BOQ и BOM");

...

#pragma endregion

ts_dialog(iDialogDescr, "invoke", bres);
}

// Обработчик событий
int Event_PanelCloseRequested(int iDescr, string sDescr)
{
int toret = 0;

int iTableReestrEdinichnyhRascenok; // реестр единичных расценок
int ires = 0;
ires = var_extern_get("iTableReestrEdinichnyhRascenok", iTableReestrEdinichnyhRascenok, 0);
if (ires >= 0)
{
object("delete", iTableReestrEdinichnyhRascenok);
var_extern_delete("iTableReestrEdinichnyhRascenok");
}
return toret;
}

// Создать таблицу, если она еще не создана
int CreateTableIfNeeded()
{
int ires = 0;
ires = var_extern_get("iTableReestrEdinichnyhRascenok", iTableReestrEdinichnyhRascenok, 0);
if (ires != 0)
{
//
object("create", "ts_table", iTableReestrEdinichnyhRascenok);
object("KeepInMemory", iTableReestrEdinichnyhRascenok);
...
}
else
{
ts_table(iTableReestrEdinichnyhRascenok, "reset_cpp_to_current");
}
return 0;
}


Объект ts_idispatcher

Для использования механизма взаимодействия с другими программами через механизм OLE (Windows) удобно пользоваться объектом ts_idispatcher и одноименной функцией.

Это позволяет создавать собственные функции и манипулировать различными программами Windows. Например, если не хватает имеющихся функций в LABPP_Automat для работы с Excel можно создавать свои собственные процедуры.

Пример 1.

Подключиться к текущей активной таблице Excel чтобы считать значение из текущей ячейки.

Полученное значение вывести в окно сообщений программы.

//------------------------------------------------------

// Example

// Read number current cell in Excell table

// LABPP 2022

//------------------------------------------------------

int main()

{

int iIDispatchExcel;

object("create","ts_idispatch",iIDispatchExcel);

ts_idispatch(iIDispatchExcel,"attach","Excel.Application"); // create dispatcher object

int iVariantRange;

object("create","ts_variant",iVariantRange); // create variant object to obtain dispatcher object of the current active cell

int ires = ts_idispatch(iIDispatchExcel, "AutoWrap", iVariantRange, "DISPATCH_PROPERTYGET", "ActiveCell", 0);

if(ires != 0) {

return -1;

}

int iIDispatchActiveCell;

object("create","ts_idispatch",iIDispatchActiveCell);

ts_variant(iVariantRange,"get_pdispVal", iIDispatchActiveCell);

int iVariantParm;

object("create","ts_variant",iVariantParm);

// ts_variant(iVariantParm,"set_dblVal",111.10);

// ts_variant(iVariantParm,"set_bstrVal","Stop War");

ires = ts_idispatch(iIDispatchActiveCell,"AutoWrap", iVariantParm,"DISPATCH_PROPERTYGET", "FormulaR1C1", 0);

// ires = ts_idispatch(iIDispatchActiveCell,"AutoWrap", iVariantParm,"DISPATCH_PROPERTYGET", "Value", 0);

if (ires == 0)

{

string s;

ts_variant(iVariantParm, "get_value_simple",s);

coutvar << s;

int i;

ts_variant(iVariantParm, "get_value_simple",i);

coutvar << i;

double d;

ts_variant(iVariantParm, "get_value_simple",d);

coutvar << d;

}

object("delete",iVariantParm);

object("delete",iVariantRange);

object("delete",iIDispatchActiveCell);

ts_idispatch(iIDispatchExcel,"detach");

object("delete",iIDispatchExcel);

}

Пример 2.

Подключиться к текущей активной таблице Excel чтобы записать значение в текущую ячейку.

//------------------------------------------------------

// Example

// Write number 111.10 to current cell in Excell table

// LABPP 2022

//------------------------------------------------------

int main()

{

int iIDispatchExcel;

object("create","ts_idispatch",iIDispatchExcel);

ts_idispatch(iIDispatchExcel,"attach","Excel.Application"); // create dispatcher object

int iVariantRange;

object("create","ts_variant",iVariantRange); // create variant object to obtain dispatcher object of the current active cell

int ires = ts_idispatch(iIDispatchExcel, "AutoWrap", iVariantRange, "DISPATCH_PROPERTYGET", "ActiveCell", 0);

if(ires != 0) {

return -1;

}

int iIDispatchActiveCell;

object("create","ts_idispatch",iIDispatchActiveCell);

ts_variant(iVariantRange,"get_pdispVal", iIDispatchActiveCell);

int iVariantParm;

object("create","ts_variant",iVariantParm);

// ts_variant(iVariantParm,"set_dblVal",111.10);

ts_variant(iVariantParm,"set_value_simple","Stop War");

int iVariantNull;

object("create","ts_variant",iVariantNull);

ires = ts_idispatch(iIDispatchActiveCell,"AutoWrap", iVariantNull,"DISPATCH_PROPERTYPUT", "FormulaR1C1", 1, iVariantParm);

object("delete",iVariantParm);

object("delete",iVariantRange);

object("delete",iIDispatchActiveCell);

object("delete",iVariantNull);

ts_idispatch(iIDispatchExcel,"detach");

object("delete",iIDispatchExcel);

}


CreateInstance

Объект ts_idispatcher ››

Подключение к сторонней программе Windows через механизм OLE функцией CreateInstance.

Вызов:

int iret = ts_idispatch(int iIDispatchApp,"CreateInstance",string appclassname, string runcontext);

Здесь:

iIDispatchApp - дескриптор объекта ts_idispatch куда будет помещен создаваемый объект программы;

appclassname - имя класса объекта программы ("Excel.Application" - для Excel);

runcontext - контекст размещения объекта.

Значение | Описание
"REMOTE_SERVER" | Программа выполняется на сервере
"LOCAL_SERVER" | Программа выполняется локально
"ALL" | Любое размещение


attach

Объект ts_idispatcher ››

Подключение к сторонней программе Windows через механизм OLE функцией GetActiveObject.

В этом случае мы можем подключиться к уже открытой программе (например к текущей таблице Excel).

Вызов:

int iret = ts_idispatch(int iIDispatchApp,"attach",string appclassname);

Здесь:

iIDispatchApp - дескриптор объекта ts_idispatch куда будет помещен создаваемый объект программы;

appclassname - имя класса объекта программы ("Excel.Application" - для Excel);


detach

Объект ts_idispatcher ››

Отключить объект от программы.

Вызов:

ts_idispatch(int iIDispatch,"detach");

Здесь:

iIDispatch - дескриптор объекта диспетчера программы, который нужно отключить.


AutoWrap

Объект ts_idispatcher ››

Выполнить действия с элементом программы Windows через его диспетчер.

Вызов:

int ires = ts_idispatch(iIDispatch,"AutoWrap", int iVariantRes, string commandtypecall, string commandname, 0);
или
int ires = ts_idispatch(iIDispatch,"AutoWrap", int iVariantRes, string commandtypecall, string commandname, int par_count, int iVariantArg1, ...);

Здесь:

ires - 0 если нет ошибки,

iIDispatch - объект типа ts_idispatch,

iVariantRes - объект типа ts_variant в который записывается результат выполнения обращения.

commandtypecall - форма обращения

Значение | Назначение
"DISPATCH_PROPERTYGET" | Получить
"DISPATCH_PROPERTYPUT" | Присвоить
"DISPATCH_METHOD" | Выполнить
"DISPATCH_PROPERTYPUTREF" | Прочее

commandname - имя команды или переменной программы ( например "ActiveCell" в Excel и т.п.).


Управление выполнением и поведением программы

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Прерывание выполнения длительных процессов ac_process_window

Управление выполнением и поведением программы ››

Для информирования пользователя о ходе выполняемой длительной операции и возможности ее прервать - используется специальное окно.

На следующем примере показано как вызвать такое окно, чтобы показать сколько обработано элементов полов (25), сколько осталось обработать (76), и скольким элементам плинтусов назначена тип пола (24).

Так выглядит окно процесса с информацией по его состоянию.

При наведении курсора мыши окно сообщает что если на него кликнуть - процесс будет остановлен.

bool bStop = false;
ac_process_window("Init", "LABPP"); // иницииновать окно процесса
string sPhase = "полов (запис.плинтусов=";
int iAssigned = 0;

for (i = 0; i < icount; i++)
{
bStop = ac_process_window("SetPhase", sPhase+itoa(iAssigned)+")", icount-i);
if (bStop == true)
{
cout << "\nПроцесс остановлен пользователем\n";
ac_process_window("Close");
return -1;
}
ac_request("set_current_element_from_list", 1, i);
ac_request("elem_user_property", "set", "Тип отделки пола", "");
}
ac_process_window("Close");


Init

Управление выполнением и поведением программы ›› Прерывание выполнения длительных процессов ac_process_window ››

Инициировать окно процесса.

Вызов:

ac_process_window("Init", string sTitle);

Здесь:

sTitle - название процесса.


SetPhase

Управление выполнением и поведением программы ›› Прерывание выполнения длительных процессов ac_process_window ››

Поддержать показ окна процесса, обновить в нем информацию и получить обратную связь от пользователя, если процесс был им остановлен нажатием мыши на окно.

Каждый вызов этой функции увеличивает внутренний счетчик.

Вызов:

bool bStop = ac_process_window("SetPhase", string sPhase, int iCounter2);

Здесь:

sPhase - текст, который будет располагаться в окне под названием процесса.

iCounter2 - дополнительный параметр, который будет отображаться между внутренним счетчиком и sPhase.

Если iCounter2 = -1, то он не отображается.

Возвращает true если пользователь кликал мышкой на окне процесса с целью его остановить.


IsCanceled

Управление выполнением и поведением программы ›› Прерывание выполнения длительных процессов ac_process_window ››

Проверить не поступал ли запрос от пользователя остановить процесс.

Если нажималась кнопка мыши на окне процесса, то вернется true.

Вызов:

bool bStop = ac_process_window("IsCanceled");


Close

Управление выполнением и поведением программы ›› Прерывание выполнения длительных процессов ac_process_window ››

Закрыть окно процесса.

Вызов:

ac_process_window("Close");


throw_process

Управление выполнением и поведением программы ››

Принудительная остановка процесса с сообщением и возможностью вызова панели BIM Master для анализа ситуации.

Вызов:

void throw_process(string smessage);

Здесь:

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

Пример.

Остановить программу если переменная i меньше или равно 0.

int main()

{

int i=0;

if (i <= 0)

{

throw_process("Значение i должно быть больше 0");

}

return 0;

}

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

Он сможет проанализировать, при необходимости, ситуацию при помощи панели BIM Master.


Поведение программы при ошибках считывания/записи переменных элементов

Управление выполнением и поведением программы ››

Функции чтения/записи данных в переменные элементов проекта возвращается код ошибки.

Если 0 - ошибки нет. Если < 0 , то в ходе выполнения операции возникла ошибка.

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

SETCFG("stop_on_err_elem_value_get", bool bStopOnError);

SETCFG("stop_on_err_elem_value_set", bool bStopOnError);

Данные конструкции влияют на текущий сеанс интерпретатора (запуск программы);

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


Остановка процесса помещением файла в каталоге

Управление выполнением и поведением программы ››

Для остановки длительного сильно нагруженного процесса можно использовать простую технику контроля наличия файла с определенным именем в определенном месте диска.

Ниже приведен пример программы, которая в цикле выполняет 100 тыс. операций.

Имеется подпрограмма, которая мониторит наличие файла c:\labpp\stop.txt.

Если такой файл появился - программа его удаляет и запрашивает пользователя следует ли ей остановить процесс выполнения.

Файл может создаваться .bat файлом с размещением его, например, на рабочем столе.

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

int main()

{

int i = 0, j=0;

int ires;

for (i = 0; i < 100000; i++, j++)

{

if (j >= 10000)

{

j = 0;

сoutvar << i;

}

if (check_user_break()) {

break;

}

}

}

bool check_user_break()

{

string stopfilename = "c:\\labpp\\stop.txt";

bool bexist = false;

shell_func("file", "is_exist", stopfilename, bexist);

if (bexist)

{

shell_func("file", "delete", stopfilename);

if (tsalert(-3, "Запрос", "Остановить выполнение?", "", "Да", "Нет") == 1)

{

return true;

}

}

return false;

}


Объект ts_variant

Объекты ts_variant предназначены для хранения данных любого типа в среде Windows.

Этот объект может содержать логическое, целое или вещественное число, строку и даже объект Windows IDispatch для общения и управления другими программами.


get_pdispVal

Объект ts_variant ››

Получить из объекта ts_variant объект ts_idispatch для управления программами или элементами программ через OLE Windows.

Вызов:

int iret = ts_variant(int iVariantRange,"get_pdispVal", int iIDispatchActiveCell);

Здесь:

iVariantRange - дескриптор объекта типа ts_variant, который содержит объект управления IDispatch.

iIDispatchActiveCell - дескриптор объекта типа ts_idispatch, в который надо записать этот элемент управления IDispatch.

Пример.

Получить внутренний элемент управления текущей ячейкой таблицы Excel.

int iIDispatchExcel;

object("create","ts_idispatch",iIDispatchExcel);

ts_idispatch(iIDispatchExcel,"attach","Excel.Application"); // create dispatcher object

int iVariantRange;

object("create","ts_variant",iVariantRange); // create variant object to obtain dispatcher object of the current active cell

int ires = ts_idispatch(iIDispatchExcel, "AutoWrap", iVariantRange, "DISPATCH_PROPERTYGET", "ActiveCell", 0);


get_value_simple

Объект ts_variant ››

Получить простое значение из объекта ts_variant в переменную.

Вызов:

ts_variant(int iVariant, "get_value_simple", bool/int/double/string value_ret);

Здесь:

iVariant - дескриптор объекта типа ts_variant;

valut_ret - имя переменной, в которую надо переписать значение из объекта iVariant.

Пример.

Считать текстовое значение из объекта, заданного дескриптором iVariantParm и вывести в окно сообщений.

string s;
ts_variant(iVariantParm, "get_value_simple",s);
coutvar << s;


set_value_simple

Объект ts_variant ››

Задать простое значение в объект ts_variant.

Вызов:

ts_variant(int iVariant, "set_value_simple", bool/int/double/string value);

Здесь:

iVariant - дескриптор объекта типа ts_variant;

value - значение, которое надо переписать в объект iVariant.


run_cpp - запуск другой программы

Функция run_cpp позволяет выполнять другие программы прямо из текста текущей программы.

Возможен запуск из файла или прямо из текстовой строки, которую можно формировать во время выполнения текущей программы.


run_from_file

run_cpp - запуск другой программы ››

Выполнение программы из заданного файла.

Форма обращения

double dret = run_cpp("run_from_file",string sFileNameAndPath,int arg1,double arg2,string arg3);

Здесь:

sFileNameAndPath - имя и полный путь к программному файлу, который нужно выполнить.

arg1, arg2 и arg3 - аргументы, с которыми будет выполнена программа (в ней можно их считать функцией get_args)

Результат возвращенный в dret соответствует числу, которое указано в команде return в программном файле, который здесь запускается.

Пример.

Выполнить программу из файла "c:\my_program.cpp" и передать в нее целое число 100.

int myintvar = 100;

double dret = run_cpp("run_from_file","c:\my_program.cpp",myintvar,0,"");


run_from_variable

run_cpp - запуск другой программы ››

Выполнение программы из строковой переменной.

Это удобно в случае, если требуется сформировать алгоритм действий программы по ходу выполнения.

Форма обращения:

double iret = run_cpp("run_from_variable",strint programtext,int arg1,double arg2,string arg3);

Здесь:

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

arg1, arg2 и arg3 - аргументы, с которыми будет выполнена программа (в ней можно их считать функцией get_args)

Пример.

Сформировать текст программы и выполнить ее с параметрами 100, 111.1 и "аргумент текстовый". В окне сообщений показать результат выполнения программы.

string programtext = "int main(){ cout << \"Моя программа \"<<\"\n\"; int iarg1; double darg2; string sarg3; run_cpp(\"get_args\",iarg1, darg2, sarg3);";

programtext += "cout << iarg1 << \" ,\" << darg2 << \" ,\" << sarg3; return -1;}";

int iret = run_cpp("run_from_variable", programtext, 100, 111.1, "аргумент текстовый");

cout << "iret = " << iret << "\n";

Мы сгенерировали программу так, что по завершению она выполняет функцию return -1.

Значит iret будет содержать -1.


Получение аргументов внутри программы

run_cpp - запуск другой программы ››

Если программный файл запущен на выполнение с аргументами, то их можно получить функцией run_cpp с директивой get_args.

Обращение

run_cpp("get_args",int iarg1, double darg2, string sarg3);

Здесь:

iarg1, darg2, sarg3 - это переменные типа целое, вещественное и строка, куда будут записаны значения аргументов, которые были заданы при запуске программы.


Обработка ошибок

Во время выполнения скриптов при обнаружении ошибки выдается сообщение в диалоговом окне и работа программы останавливается. В сообщении указывается место и суть ошибки. Поэтому ее легко понять, найти и устранить.


Коды ошибок

Обработка ошибок ››

В обычном случае при возникновении какой-либо ошибки при выполнении функции возвращается значение меньше 0, а если ошибки нет - то 0.

Таблица кодов ошибок

Код ошибки | Значение | Идентификатор
 | Общий интерпретатор C++ |
0 | Успешное завершение операции |
-1 | Общая ошибка | TSErrCommonError
-1100 | Логическая ошибка | TSErrLogicError
-1222 | Переменная отсутствует или недоступна | TSErrVarNotExist
-1223 | Неверный индекс | TSErrBadIndex
-1224 | Значение параметра недоступно | TSErrVarValueNotAvailable
 | Файловые операции |
-2222 | Не найден исходный файл | TSErrIOSourceNotFound
-2223 | Файл уже существует | TSErrIOTagetExists
-2224 | Устройство переполнено | TSErrIODeviceIsFull
-2225 | Недостаточно прав пользователя | TSErrIOAccessDenied
 | JSON |
0 | Успешно | tsjsonerr_no_err
2000 | Нет данных для загрузки | tojsonerr_empty_json
2001 | Ожидалась строка | tsjsonerr_not_a_string
2002 | Ожидалось двоеточик | tsjsonerr_not_a_colon
2003 | Несоответствие типов данных | tsjsonerr_type_mismatch
2004 | Переменная не существует | tsjsonerr_not_exist


Функции интерфейса LabPP_Automat

При загрузке LabPP_Automat создает список имеющихся в его рабочем каталоге конфигураций и показывает пользователю на выбор в своем стартовом окне. Названием конфигурации является название ее каталога. В каждом каталоге конфигурации есть каталог tsimages ( для хранения картинок) и tsprg (там хранятся программные файлы).

Когда пользователь сделал выбор, то LabPP_Automat загружает выбранную конфигурацию и выполняет программу config.cpp из нее.

В этот момент командами формирования интерфейса LabPP_Automat можно создавать элементы интерфейса (кнопки и т.п.).


create_iconbutton

Функции интерфейса LabPP_Automat ››

Создать кнопку с картинкой.

Вызов:

ac_request("create_iconbutton",string sPictureName,int sx,int sy, int ex, int ey, string sToolTip, string sPrgCppFileName);

Здесь:

sPictureName - имя файла с картинкой для кнопки (из каталога tsimages).

sx,sy,ex,ey - координаты кнопки на рабочей панели LabPP_Automat,

sToolTip - текстовая подсказка для показа в момент, когда пользователь наводит мышь на кнопку,

sPrgCppFileName - имя файла программы (из каталога tsprg), которая будет запускаться по этой кнопке.


create_button

Функции интерфейса LabPP_Automat ››

Создать кнопку с текстовой надписью.

Вызов:

ac_request("create_button",string sButtonText, int sx, int sy, int ex, int ey, string sToolTip, string sPrgCppFileName);

Здесь:

sButtonText - текст в кнопке.

sx,sy,ex,ey - координаты кнопки на рабочей панели LabPP_Automat,

sToolTip - текстовая подсказка для показа в момент, когда пользователь наводит мышь на кнопку,

sPrgCppFileName - имя файла программы (из каталога tsprg), которая будет запускаться по этой кнопке.


set_palette_size_and_message_place

Функции интерфейса LabPP_Automat ››

Установить размеры диалога для рабочей панели LabPP_Automat и размеры окна сообщений в ней.

ac_request("set_palette_size_and_message_place", int x, int y, int ex, int ey, int xx, int yy, int exx, int eyy);

Здесь:

x, y, ex, ey - координаты рабочей панели на экране,

xx, yy, exx, eyy - координаты окна сообщений в рабочей панели.


Диалоги на основе окон

Имеется возможность создания полноценных оконных диалогов.

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


Класс ts_dialog

Диалоги на основе окон ››

Для работы с диалогами имеется внутренний класс ts_dialog. Чтобы создать диалог мы создаем объект сласса ts_dialog инструкцией object с директивой "create".

object("create", "ts_dialog", iDialogDescr);

Удаление диалога из памяти производится командой

object("delete", iDialogDescr);

Немодальные диалоги удалять ненужно, т.к. они работают после завершения функции main() на экране. Они удаляются автоматически с закрытием главного окна. Если вы создаете и запускаете несколько немодальных диалогов одновременно, то один из них надо сделать главным командой "set_as_main_panel".


init_dialog

Диалоги на основе окон ›› Класс ts_dialog ››

Подготовить объект диалога к работе.

Вызов:

int ts_dialog(int iDialogDescr,"init_dialog", string modaltype, int x, int y, int width, int height);

Здесь:

smodaltype - модальный или немодальный диалог. Возможны значения "modaldialog" - модальный, "palette" - немодальный;

x, y, width, height - координаты левого верхнего угла, ширина и высота окна диалога.


set_as_main_panel

Диалоги на основе окон ›› Класс ts_dialog ››

Задает диалог как главную панель.

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

И если пользователь закрывает диалог, отмеченный как главная панель - то все остальные окна закроются вместе с ним.

Вызов:

ts_dialog(int iDialogDescr, "set_as_main_panel");


SetClientWH

Диалоги на основе окон ›› Класс ts_dialog ››

Задает ширину и высоту окна диалога.

Вызов:

ts_dialog(int iDialogDescr, "SetClientWH", int width, int height);

Здесь:

width, height - ширина и высота окна диалога.


SetTitle

Диалоги на основе окон ›› Класс ts_dialog ››

Задает заголовок для окна диалога.

Вызов:

ts_dialog(int iDialogDescr,"SetTitle", string sTitle);

Здесь:

sTitle - заголовок для диалога.


SendCloseRequest

Диалоги на основе окон ›› Класс ts_dialog ››

Закрыть диалог на базе палитры, т.е. немодальный диалог.

Вызов:

ts_dialog("iDialogDescr, "SendCloseRequest");


PostCloseRequest

Диалоги на основе окон ›› Класс ts_dialog ››

Закрыть модальный диалог.

Вызов:

ts_dialog(iDialogDescr,"PostCloseRequest",string okorcancel);

Здесь:

okorcancel - строковое значение "ok" или "cancel" - означает с каким результатом закрыть диалог.

По "ok" функция invoke вернет 1, иначе 0.


eventreaction

Диалоги на основе окон ›› Класс ts_dialog ››

Задает реакцию диалога на события, такие как изменение размера и т.п.

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

И связывать элементы с этим событием. Так, что будет выполняться эта функция.

Для диалогов доступны события:

"Event_PanelCloseRequested" - вызывается перед закрытием окна диалога.

Связывание окна диалога с функцией - рекацией на событие производится командой "eventreaction".
Вызов:

ts_dialog(iDialogDescr, "eventreaction", string event_name);

или

ts_dialog(iDialogDescr, "eventreaction", string event_name, string eventfunctionname );

Здесь:

event_name - имя события. Если не задано имя функции - реакции на событие, то за имя функции принимается имя события.

eventfunctionname - имя функции - реакции на событие.

Если функция возвращает -1 - то панель не закрывается. Если любое другое значение - то панель закрывается.


Invoke

Диалоги на основе окон ›› Класс ts_dialog ››

Запускает диалог на экране.

Оращение:

int ts_dialog(iDialogDescr,"invoke");

Возвращает 1 или 0 если диалог был закрыт с "ok" или "cancel" соответственно.

Это работает только для модальных диалогов. При запуске немодальной панели программа выполняется дальше не ожидая закрытия окна диалога.


set_sDescr

Руководство по LABPP_Automat для ARCHICAD

Диалоги на основе окон ›› Класс ts_dialog ››

Изменить имя панели диалога чтобы различать при выполнении событий панелей диалогов кто из них вызвал событие.

ts_dialog( int iDialogDescr, string snew_sDescr);

Здесь:

iDialogDescr - дескриптор диалога, у которого изменяем;

snew_sDescr - новое имя для распознавания диалога (или состояния диалога) в программе.


Класс ts_dialogcontrol

Диалоги на основе окон ››

При помощи класса ts_dialogcontrol выполняется работа с элементами диалогов, такими как листбоксы, поля для редактирования и т.п.

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

Сначала создается панель диалога.

Затем - элементы управления. При создании элементов управления указывается панель, где они будут размещаться.

Элемент управления может находиться не непосредственно на панели диалога, а на элементе "tabpage" элемента "normaltab".


Button

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Создает текстовую кнопку.

Вызов:

ts_dialogcontrol(int iButtonDescr, "init_control", "button",int x, int y, int w, int h);

Здесь:

x,y,w,h - позиция левого верхнего угла кнопки, ширина и высота в пикселях.


SetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› Button ››

Присвоить текстовое значение элементу управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "SetText", string text);

Здесь:

text - текстовое значение.


GetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› Button ››

Считать текстовое значение из элемента управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetText", string text);

Здесь:

text - текстовое значение, считанное из элемента управления.


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› Button ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


IconButton

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Создает кнопку с картинкой.

Вызов:

ts_dialogcontrol(int iButtonDescr, "init_control", "iconbutton",int x, int y, int w, int h);

Здесь:

x,y,w,h - позиция левого верхнего угла кнопки, ширина и высота в пикселях.


TextEdit

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Создает элемент панель редактирования текстовой строки

Вызов:

ts_dialogcontrol(int iButtonDescr, "init_control", "iconbutton",int x, int y, int w, int h);

Здесь:

x,y,w,h - позиция левого верхнего угла кнопки, ширина и высота в пикселях.


SetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› TextEdit ››

Присвоить текстовое значение элементу управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "SetText", string text);

Здесь:

text - текстовое значение.


GetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› TextEdit ››

Считать текстовое значение из элемента управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetText", string text);

Здесь:

text - текстовое значение, считанное из элемента управления.


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› TextEdit ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


RealEdit

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Создает элемент панель редактирования чисел

Вызов:

ts_dialogcontrol(int iButtonDescr, "init_control", "realedit",int x, int y, int w, int h);

Здесь:

x,y,w,h - позиция левого верхнего угла кнопки, ширина и высота в пикселях.


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› RealEdit ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


CheckBox

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Создает чекбокс.

Вызов:

ts_dialogcontrol(int iButtonDescr, "init_control", "iconbutton",int x, int y, int w, int h);

Здесь:

x,y,w,h - позиция левого верхнего угла кнопки, ширина и высота в пикселях.


SetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› CheckBox ››

Присвоить текстовое значение элементу управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "SetText", string text);

Здесь:

text - текстовое значение.


GetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› CheckBox ››

Считать текстовое значение из элемента управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetText", string text);

Здесь:

text - текстовое значение, считанное из элемента управления.


SetCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› CheckBox ››

Задать значение элементу управления.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetCheck", int onoff);

Здесь:

iDialogcontrolDescr - дескриптор панели диалога.

onoff - 0/1.


GetCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› CheckBox ››

Получить значение из элемента управления.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "GetCheck", int &onoff);

Здесь:

iDialogcontrolDescr - дескриптор элемента CheckBox.

onoff - возвращаемое значение - 0/1.


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› CheckBox ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


LeftText, CenterText, RightText

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Создают статический текст.

Вызов:

ts_dialogcontrol(int iTextDescr, "init_control", "lefttext",int x, int y, int w, int h);

ts_dialogcontrol(int iTextDescr, "init_control", "centertext",int x, int y, int w, int h);

ts_dialogcontrol(int iTextDescr, "init_control", "righttext",int x, int y, int w, int h);

Здесь:

x,y,w,h - позиция левого верхнего угла кнопки, ширина и высота в пикселях.


SetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› LeftText, CenterText, RightText ››

Присвоить текстовое значение элементу управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "SetText", string text);

Здесь:

text - текстовое значение.


GetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› LeftText, CenterText, RightText ››

Считать текстовое значение из элемента управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetText", string text);

Здесь:

text - текстовое значение, считанное из элемента управления.


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› LeftText, CenterText, RightText ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


PopUp

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Создает элемент для выбора из списка.


SelectItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PopUp ››

Выбрать значение из списка в элементе управления как текущее.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr,"SelectItem", int itemindex);

Здесь:

Itemindex = индекс выбранного значения в списке элемента управления.


DisableItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PopUp ››

Сделать недоступной для редактирования и выбора позицию элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DisableItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать недоступной (индекс от 1).


DeleteItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PopUp ››

Сделать недоступной для редактирования и выбора позицию элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DisableItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать недоступной (индекс от 1).


EnableItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PopUp ››

Сделать доступной для редактирования и выбора позицию элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "EnableItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать доступной (индекс от 1).


InsertItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PopUp ››

Вставить новый элемент в указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "InsertItem", int itemindex);

Здесь:

itemindex - позиция, в которую вставить новый элемент.


AppendItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PopUp ››

Добавить позицию в конец списка элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "AppendItem");


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PopUp ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


GetItemIndexByText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PopUp ››

Получить индекс по его тексту. Возвращает индекс от 1-n или 0, если такой текст в списке отсутствует.

Вызов:

int ires = ts_dialogcontrol(int iPopUp,"GetItemIndexByText", string stext, int index);

Здесь:

iPopUp - дескриптор элемента управления;

ires - -1 если текст не найден, или 0;

index - индекс текста в списке элемента управления, или 0, если текст не найден;

stext - искомый текст в списке элемента управления, индекс которого надо получить.


GetItemIndexByText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PopUp ››

Для popup задаем текст и получаем индекс 1-базед (если не нашли - 0)


RadioButton

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Элемент управления - радиокнопки.


IsSelected

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› RadioButton ››

Проверить выбран ли этот элемент радио-кнопки или нет.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr,"IsSelected", int ret);

Здесь:

ret - результат запроса 0/1 - не выбран/выбран.


Select

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› RadioButton ››

Выбрать элемент управления типа радио-кнопки.

ts_dialogcontrol(iDialogcontrolDescr,"Select");


SetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› RadioButton ››

Присвоить текстовое значение элементу управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "SetText", string text);

Здесь:

text - текстовое значение.


GetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› RadioButton ››

Считать текстовое значение из элемента управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetText", string text);

Здесь:

text - текстовое значение, считанное из элемента управления.


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› RadioButton ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


IconRadioButton

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


IsSelected

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› IconRadioButton ››

Проверить выбран ли этот элемент радио-кнопки или нет.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr,"IsSelected", int ret);

Здесь:

ret - результат запроса 0/1 - не выбран/выбран.


Select

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› IconRadioButton ››

Выбрать элемент управления типа радио-кнопки.

ts_dialogcontrol(iDialogcontrolDescr,"Select");


SingleSelListBox

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


RepaintBackgroundItemsByColumnValue

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Перекрасить подложки у строк в табличном диалоговом элементе в соответствии со значением колонки.

Пример.

В элементе листбокс, заданном дескриптором iListBoxElements выкрасить подложки строк полосами по ходу значений в колонке 8. Цвета - белый/светло-серый.

ts_dialogcontrol(iListBoxElements, "RepaintBackgroundItemsByColumnValue", 8, 255, 255, 255, 248, 248, 248);

В результате помещения визуально выделены полосками.


SetItemBackgroundColor

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Установить цвет подложки текста для заданной строки в табличном элементе диалога.

ts_dialogcontrol(int iListBox, "SetItemBackgroundColor", int row, int red, int green, int blue);

Здесь:

iListBox - дескриптор табличного элемента диалога,

row - номер строки,

red, green, blue - значения от 0 до 255 для составляющий цветов красного, зеленого и синего.


SetItemColor

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Установить цвет текста для заданной строки в табличном элементе диалога.

ts_dialogcontrol(int iListBox, "SetItemColor", int row, int red, int green, int blue);

Здесь:

iListBox - дескриптор табличного элемента диалога,

row - номер строки,

red, green, blue - значения от 0 до 255 для составляющий цветов красного, зеленого и синего.


SelectItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Выбрать значение из списка в элементе управления как текущее.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr,"SelectItem", int itemindex);

Здесь:

Itemindex = индекс выбранного значения в списке элемента управления.


GetTabItemText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Получить значение ячейки из таблицы ListBox.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetTabItemText", int item, int tabpos, string restext);

Здесь:

item - строка таблицы (индекс от 1), tabpos - колонка таблицы (индекс от 1), restext - возвращаемое значение текста из этой ячейки.


GetMouseClickedPosXY

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Получить координаты позиции мыши в окне ListBox в момент отработки события Event_ListBoxClicked.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr,"GetMouseClickedPosXY", int &x, int &y);

Здесь:

x,y - координаты мыши, когда был сделан щелчок, вызвавший событие.


GetTabFieldPosition

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Получить позицию колонки от левого края окна элемента управления.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr," GetTabFieldPosition ", int tabpos, int &begx, int &endx);

Здесь:

tabpos - номер колонки (индекс от 1),

begx, endx - начало и конец в пикселях от левого края окна элемента управления (не путать с левым краем самого диалога).


SetTabItemIcon

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать картинку для ячейки в таблице элемента управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "SetTabItemIcon", int item, int tabpos, string path);

Здесь:

item - строка таблицы (индекс от 1), tabpos - колонка таблицы (индекс от 1), path - полный путь к файлу картинки


SetTabItemText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать текст в ячейку элемента управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "SetTabItemText", int item, int tabpos, string text);

Здесь:

item - строка таблицы (индекс от 1), tabpos - колонка таблицы (индекс от 1), text - новое значение текста из этой ячейки.


GetTabItemIconId

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Получить номер картинки из ячейки таблицы элемента управления.

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

Это удобно для создания на месте элементов типа CheckBox.

Командой SetTableItemIconId можно задавать такую картинку. А в функции - обработчике события по клику мыши - изменять картинку с пометкой на пустой квадрат или наоборот.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetTabItemIconId", int item, int tabpos, int iconid);

Здесь:

item - строка таблицы (индекс от 1), tabpos - колонка таблицы (индекс от 1), iconid - номер картинки.


SetTabItemIconId

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать изображение в ячейке таблицы элемента управления по коду.

Вызов:

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetTabItemIconId", int item, int tabpos, int iconid);

Здесь:

item - строка таблицы (индекс от 1), tabpos - колонка таблицы (индекс от 1), iconid - номер картинки.


SetOnTabItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

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

Вызов:

ts_dialogcontrol(iListBoxDescr, "SetOnTabItem", int iConrtolDescr);

Здесь:

iControlDescr - дескриптор элемента управления, который будет использоваться для показа и обработки данных в ячейке.


SetTabFieldCount

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать количество колонок в таблице в элементе управления.

Вызов:

ts_dialogcontrol(iListBoxDescr, "SetOnTabItem", int count);

Здесь:

count - количество колонок.


SetHeaderItemSize

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать высоту строки заголовков в таблице элемента управления.

Вызов:

ts_dialogcontrol(iListBoxDescr, "SetHeaderItemSize", int height);

Здесь:

height - высота строки заголовков в точках.


SetTabFieldProperties

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать параметры колонки для строк данных в таблице элемента управления.

Вызов:

ts_dialogcontrol(iListBox, "SetTabFieldProperties", int col, int startpix, int endpix, int justification, int truncation);

Здесь:

col - колонка таблицы (индекс от 1),

startpix, endpix - начало и конец колонки в точках,

justification - выравнивание текста (влево 0, центр - 256, вправо - 512),

truncation - обрезка текста, если он не поместился на экран (обычно 4096).


SetItemHeight

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать высоту строки в таблице значений.

Вызов:

ts_dialogcontrol(iListBox, "SetItemHeight", int itemheight);

Здесь:

itemheight - высота строки.


SetHeaderItemSizeableFlag

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать параметры изменения размера и управляемости мышью для колонки таблицы

Вызов:

ts_dialogcontrol(iListBox, "SetHeaderItemSizeableFlag", int headerindex, int sizable, int minwidth);

Здесь:

headerindex - колонка (индекс от 1),

sizable - изменяемость 0/1 мышью,

minwidth - минимальная ширина колонки


SetHeadersSizeableFlag

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать параметры изменения размера и управляемости мышью для всех колонок таблицы

Вызов:

ts_dialogcontrol(iListBox, "SetHeaderItemSizeableFlag", int sizable, int minwidth);

Здесь:

sizable - изменяемость 0/1 мышью,

minwidth - минимальная ширина колонки


SetHeaderItemText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать текст заголовка для колонки таблицы.

Вызов:

ts_dialogcontrol(iListBox, "SetHeaderItemText", int headerindex, string text);

Здесь:

headerindex - колонка (индекс от 1),

text - название колонки.


SetHeaderItemSize

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать ширину заголовка для таблицы элемента управления.

Вызов:

ts_dialogcontrol(iListBox, "SetHeaderItemSize", int headerindex, int width);

Здесь:

headerindex - колонка (индекс от 1),

width - ширина заголовка колонки.


InsertItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Вставить новый элемент в указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "InsertItem", int itemindex);

Здесь:

itemindex - позиция, в которую вставить новый элемент.


AppendItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Добавить позицию в конец списка элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "AppendItem");


DisableItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Сделать недоступной для редактирования и выбора позицию элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DisableItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать недоступной (индекс от 1)


EnableItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Сделать доступной для редактирования и выбора позицию элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "EnableItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать доступной (индекс от 1)


DeleteItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Удалить указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DeleteItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать доступной (индекс от 1). Если задан 0, то удаляются все позиции.


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListBox ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


MultiSellListBox

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


SelectItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Выбрать значение из списка в элементе управления как текущее.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr,"SelectItem", int itemindex);

Здесь:

Itemindex = индекс выбранного значения в списке элемента управления.


GetTabItemText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Получить значение ячейки из таблицы ListBox.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetTabItemText", int item, int tabpos, string restext);

Здесь:

item - строка таблицы (индекс от 1), tabpos - колонка таблицы (индекс от 1), restext - возвращаемое значение текста из этой ячейки.


GetMouseClickedPosXY

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Получить координаты позиции мыши в окне ListBox в момент отработки события Event_ListBoxClicked.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr,"GetMouseClickedPosXY", int &x, int &y);

Здесь:

x,y - координаты мыши, когда был сделан щелчок, вызвавший событие.


GetTabFieldPosition

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Получить позицию колонки от левого края окна элемента управления.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr," GetTabFieldPosition ", int tabpos, int &begx, int &endx);

Здесь:

tabpos - номер колонки (индекс от 1),

begx, endx - начало и конец в пикселях от левого края окна элемента управления (не путать с левым краем самого диалога).


SetTabItemIcon

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать картинку для ячейки в таблице элемента управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "SetTabItemIcon", int item, int tabpos, string path);

Здесь:

item - строка таблицы (индекс от 1), tabpos - колонка таблицы (индекс от 1), path - полный путь к файлу картинки


SetTabItemText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать текст в ячейку элемента управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "SetTabItemText", int item, int tabpos, string text);

Здесь:

item - строка таблицы (индекс от 1), tabpos - колонка таблицы (индекс от 1), text - новое значение текста из этой ячейки.


GetTabItemIconId

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Получить номер картинки из ячейки таблицы элемента управления.

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

Это удобно для создания на месте элементов типа CheckBox.

Командой SetTableItemIconId можно задавать такую картинку. А в функции - обработчике события по клику мыши - изменять картинку с пометкой на пустой квадрат или наоборот.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetTabItemIconId", int item, int tabpos, int iconid);

item - строка таблицы (индекс от 1), tabpos - колонка таблицы (индекс от 1), iconid - номер картинки.


SetTabItemIconId

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать изображение в ячейке таблицы элемента управления по коду.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetTabItemIconId", int item, int tabpos, int iconid);

Здесь:

item - строка таблицы (индекс от 1), tabpos - колонка таблицы (индекс от 1), iconid - номер картинки.


SetOnTabItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

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

Вызов:

ts_dialogcontrol(iListBoxDescr, "SetOnTabItem", int iConrtolDescr);

Здесь:

iControlDescr - дескриптор элемента управления, который будет использоваться для показа и обработки данных в ячейке.


SetTabFieldCount

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать количество колонок в таблице в элементе управления.

Вызов:

ts_dialogcontrol(iListBoxDescr, "SetOnTabItem", int count);

Здесь:

count - количество колонок.


SetHeaderItemSize

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать высоту строки заголовков в таблице элемента управления.

Вызов:

ts_dialogcontrol(iListBoxDescr, "SetHeaderItemSize", int height);

Здесь:

height - высота строки заголовков в точках.


SetTabFieldProperties

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать параметры колонки для строк данных в таблице элемента управления.

Вызов:

ts_dialogcontrol(iListBox, "SetTabFieldProperties", int col, int startpix, int endpix, int justification, int truncation);

Здесь:

col - колонка таблицы (индекс от 1),

startpix, endpix - начало и конец колонки в точках,

justification - выравнивание текста (влево 0, центр - 256, вправо - 512),

truncation - обрезка текста, если он не поместился на экран (обычно 4096).


SetItemHeight

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать высоту строки в таблице значений.

Вызов:

ts_dialogcontrol(iListBox, "SetItemHeight", int itemheight);

Здесь:

itemheight - высота строки.


SetHeaderItemSizeableFlag

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать параметры изменения размера и управляемости мышью для колонки таблицы

Вызов:

ts_dialogcontrol(iListBox, "SetHeaderItemSizeableFlag", int headerindex, int sizable, int minwidth);

Здесь:

headerindex - колонка (индекс от 1),

sizable - изменяемость 0/1 мышью,

minwidth - минимальная ширина колонки


SetHeadersSizeableFlag

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать параметры изменения размера и управляемости мышью для всех колонок таблицы

Вызов:

ts_dialogcontrol(iListBox, "SetHeaderItemSizeableFlag", int sizable, int minwidth);

Здесь:

sizable - изменяемость 0/1 мышью,

minwidth - минимальная ширина колонки


SetHeaderItemText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать текст заголовка для колонки таблицы.

Вызов:

ts_dialogcontrol(iListBox, "SetHeaderItemText", int headerindex, string text);

Здесь:

headerindex - колонка (индекс от 1),

text - название колонки.


SetHeaderItemSize

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать ширину заголовка для таблицы элемента управления.

Вызов:

ts_dialogcontrol(iListBox, "SetHeaderItemSize", int headerindex, int width);

Здесь:

headerindex - колонка (индекс от 1),

width - ширина заголовка колонки.


InsertItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Вставить новый элемент в указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "InsertItem", int itemindex);

Здесь:

itemindex - позиция, в которую вставить новый элемент.


AppendItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Добавить позицию в конец списка элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "AppendItem");


DisableItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Сделать недоступной для редактирования и выбора позицию элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DisableItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать недоступной (индекс от 1)


EnableItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Сделать доступной для редактирования и выбора позицию элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "EnableItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать доступной (индекс от 1)


DeleteItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Удалить указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DeleteItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать доступной (индекс от 1). Если задан 0, то удаляются все позиции.


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSellListBox ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


MultiLineEdit

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


SetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiLineEdit ››

Присвоить текстовое значение элементу управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "SetText", string text);

Здесь:

text - текстовое значение.


GetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiLineEdit ››

Считать текстовое значение из элемента управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetText", string text);

Здесь:

text - текстовое значение, считанное из элемента управления.


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiLineEdit ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


IconItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


IconCheckBox

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


SetCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› IconCheckBox ››

Задать значение элементу управления.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetCheck", int onoff);

Здесь:

iDialogcontrolDescr - дескриптор панели диалога.

onoff - 0/1.


GetCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› IconCheckBox ››

Получить значение из элемента управления.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "GetCheck", int &onoff);

Здесь:

iDialogcontrolDescr - дескриптор элемента CheckBox.

onoff - возвращаемое значение - 0/1.


PushCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


SetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushCheck ››

Присвоить текстовое значение элементу управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "SetText", string text);

Здесь:

text - текстовое значение.


GetText

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushCheck ››

Считать текстовое значение из элемента управления.

Вызов:

ts_diaolgcontrol(iDialogcontrolDescr, "GetText", string text);

Здесь:

text - текстовое значение, считанное из элемента управления.


SetCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushCheck ››

Задать значение элементу управления.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetCheck", int onoff);

Здесь:

iDialogcontrolDescr - дескриптор панели диалога.

onoff - 0/1.


GetCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushCheck ››

Получить значение из элемента управления.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "GetCheck", int &onoff);

Здесь:

iDialogcontrolDescr - дескриптор элемента CheckBox.

onoff - возвращаемое значение - 0/1.


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushCheck ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


IconPushCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


SetCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› IconPushCheck ››

Задать значение элементу управления.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetCheck", int onoff);

Здесь:

iDialogcontrolDescr - дескриптор панели диалога.

onoff - 0/1.


GetCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› IconPushCheck ››

Получить значение из элемента управления.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "GetCheck", int &onoff);

Здесь:

iDialogcontrolDescr - дескриптор элемента CheckBox.

onoff - возвращаемое значение - 0/1.


IconPushRadio

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


SingleSelTreeView

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


SelectItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelTreeView ››

Выбрать значение из списка в элементе управления как текущее.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr,"SelectItem", int itemindex);

Здесь:

Itemindex = индекс выбранного значения в списке элемента управления.


TreeViewInsertItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelTreeView ››

Добавить пункт в элемент управления TreeView

Вызов:

ts_dialogcontrol(int iDescr,"TreeViewInsertItem",int parent, int tvitem, int &resitem);

Здесь:

parent - номер родительского пункта,

tvitem - тип вставки в список RootItem (0), BotItem (-65534), TopItem (-65535).

resitem - возвращенный номер вставленного пункта.


DeleteItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelTreeView ››

Удалить указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DeleteItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать доступной (индекс от 1). Если задан 0, то удаляются все позиции.


InsertItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelTreeView ››

Добавить позицию в список элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "InsertItem");


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelTreeView ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


GetTVItemIconId

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelTreeView ››

Получить идентификатор иконки у позиции элемента TreeView.

Вызов:

ts_dialogcontrol(int iTreeViewElement, "GetTVItemIconId", int tvindex, int iwhat, int iconid);

Здесь:

iTreeViewElement - дескриптор элемента TreeView;

tvindex - индекс позиции элемента TreeView;

iwhat - 0/1 - иконка статуса/иконка обычная;

iconid - идентификатор иконки в системе.


SetTVItemIconId

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelTreeView ››

Задать идентификатор иконки у позиции элемента TreeView.

Вызов:

ts_dialogcontrol(int iTreeViewElement, "SetTVItemIconId", int tvindex, int iwhat, int iconid);

Здесь:

iTreeViewElement - дескриптор элемента TreeView;

tvindex - индекс позиции элемента TreeView;

iwhat - 0/1 - иконка статуса/иконка обычная;

iconid - идентификатор иконки в системе.


GetItemCount

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelTreeView ››

Получить количество элементов.

Вызов:

ts_dialogcontrol(int iTreeView, "GetItemCount", int icount);

Здесь:

iTreeView - дескриптор элемента управления TreeView;

icount - результат - количество элементов в TreeView.

Пример.

Задать иконку с ID 32000 (квадратик без "галочки") для всех элементов в элементе TreeView.

int i,icount;

ts_dialogcontrol(iTreeView_DCClassSel, "GetItemCount", icount);

coutvar << icount;

for (i = 1; i <= icount; i++)

{

ts_dialogcontrol(iTreeView_DCClassSel, "SetTVItemIconId", i, 1, 32000);

}


import_classificator

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelTreeView ››

Импортировать классификатор в элемент TreeView.

Вызов:

int err = ts_dialogcontrol(int iTreeView, "import_classificator", string classificator_name, int idoobnul, int iTableClassGuids);

Здесь:

iTreeView - дескриптор элемента TreeView, куда грузим классификатор;

classificator_name - имя загружаемого классификатора;

idoobnul - 0/1 не обнулять/обнулять таблицу и элемент TreeView перед загрузкой;

iTableClassGuids - таблица guid-ов загруженных классификаторов;

Позиция таблицы записывается в поле Value позиции в элементе TreeView.

Ее можно получить из TreeView через функцию "getitemvalue".

Структура таблицы формируется автоматически.

Наименование колонки | Тип | Назначение
itemguid | string | GUID класса. У позиции классификатора это поле пустое.
level | int | Уровень позиции в TreeView (0-корневая позиция, соответствует имени классификатора)

В TreeView одновременно может быть загружено сколько угодно классифиакторов.

Пример.

Загрузить несколько классификаторов в элемент TreeView с дескриптором iTreeView_DCClassSel.

ts_dialogcontrol(iTreeView_DCClassSel, "import_classificator", "Классификация ЛАБПП", 0, iTableClassifGuids);

ts_dialogcontrol(iTreeView_DCClassSel, "import_classificator", "ЛАБПП-ДВЕРИ", 0, iTableClassifGuids);

ts_dialogcontrol(iTreeView_DCClassSel, "import_classificator", "ЛАБПП-ОКНА", 0, iTableClassifGuids);


MultiSelTreeView

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


SelectItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelTreeView ››

Выбрать значение из списка в элементе управления как текущее.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr,"SelectItem", int itemindex);

Здесь:

Itemindex = индекс выбранного значения в списке элемента управления.


TreeViewInsertItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelTreeView ››

Добавить пункт в элемент управления TreeView

Вызов:

ts_dialogcontrol(int iDescr,"TreeViewInsertItem",int parent, int tvitem, int &resitem);

Здесь:

parent - номер родительского пункта,

tvitem - тип вставки в список RootItem (0), BotItem (-65534), TopItem (-65535).

resitem - возвращенный номер вставленного пункта.


DeleteItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelTreeView ››

Удалить указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DeleteItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать доступной (индекс от 1). Если задан 0, то удаляются все позиции.


InsertItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelTreeView ››

Вставить новый элемент в указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "InsertItem", int itemindex);

Здесь:

itemindex - позиция, в которую вставить новый элемент.


AppendItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelTreeView ››

Добавить позицию в конец списка элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "AppendItem");


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelTreeView ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


GetTVItemIconId

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelTreeView ››

Получить идентификатор иконки у позиции элемента TreeView.

Вызов:

ts_dialogcontrol(int iTreeViewElement, "GetTVItemIconId", int tvindex, int iwhat, int iconid);

Здесь:

iTreeViewElement - дескриптор элемента TreeView;

tvindex - индекс позиции элемента TreeView;

iwhat - 0/1 - иконка статуса/иконка обычная;

iconid - идентификатор иконки в системе.


SetTVItemIconId

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelTreeView ››

Задать идентификатор иконки у позиции элемента TreeView.

Вызов:

ts_dialogcontrol(int iTreeViewElement, "SetTVItemIconId", int tvindex, int iwhat, int iconid);

Здесь:

iTreeViewElement - дескриптор элемента TreeView;

tvindex - индекс позиции элемента TreeView;

iwhat - 0/1 - иконка статуса/иконка обычная;

iconid - идентификатор иконки в системе.


GetItemCount

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelTreeView ››


SingleSelListView

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


DeleteItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListView ››

Удалить указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DeleteItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать доступной (индекс от 1). Если задан 0, то удаляются все позиции.


InsertItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListView ››

Вставить новый элемент в указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "InsertItem", int itemindex);

Здесь:

itemindex - позиция, в которую вставить новый элемент.


AppendItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListView ››

Добавить позицию в конец списка элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "AppendItem");


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListView ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


GetItemCount

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› SingleSelListView ››


MultiSelListView

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


DeleteItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelListView ››

Удалить указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DeleteItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать доступной (индекс от 1). Если задан 0, то удаляются все позиции.


InsertItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelListView ››

Вставить новый элемент в указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "InsertItem", int itemindex);

Здесь:

itemindex - позиция, в которую вставить новый элемент.


AppendItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelListView ››

Добавить позицию в конец списка элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "AppendItem");


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelListView ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


GetItemCount

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› MultiSelListView ››


Splitter

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


Attach_controlled_element

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› Splitter ››

Подключить к сплиттеру контролируемый элемент (который будет изменять свою форму или положение в зависимости от перемещения сплиттера).

Вызов:

ts_dialogcontrol(int iSplitter, "attach_element_to_resize", int iControlDescr, int leftanchor, int topanchor, int rightanchor, int bottomanchor);

Здесь:

iControlDescr - дестриптор подключаемого элемента управления,

leftanchor, topanchor, rightanchor, bottomanchor - -1/0/1 - привязки к элементу управления. 1 - будет изменяться в плюс со смещением сплиттера вправо/вниз, 0 - не будет перемещаться никуда, -1 при смещении вправо/вниз - будет изменяться в обратную сторону.


ProgressBar

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Элемент - дорожка процентов выполнения.


SetMin

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› ProgressBar ››

Задать минимальное значение.

Вызов:

ts_dialogcontrol(iProgressBar, "SetMin", int minvalue);

Здесь:

minvalue - минимальное значение, от которого считать процент выполнения.


SetMax

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› ProgressBar ››

Задать максимальное значение.

Вызов:

ts_dialogcontrol(iProgressBar, "SetMax", int maxvalue);

Здесь:

maxvalue - максимальное значение, до которого считать процент выполнения.


SetValue

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› ProgressBar ››


GetMin

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› ProgressBar ››

Считать текущeе значение параметра элемента.

Вызов:

ts_dialogcontrol(iProgressBar, "GetMin", int &value);

Здесь:

value - считанное значение.


GetMax

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› ProgressBar ››

Считать текущeе значение параметра элемента.

Вызов:

ts_dialogcontrol(iProgressBar, "GetMax", int &value);

Здесь:

value - считанное значение.


GetValue

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› ProgressBar ››

Считать текущeе значение параметра элемента.

Вызов:

ts_dialogcontrol(iProgressBar, "GetValue", int &value);

Здесь:

value - считанное значение.


NormalTab

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


SelectItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› NormalTab ››

Выбрать значение из списка в элементе управления как текущее.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr,"SelectItem", int itemindex);

Здесь:

Itemindex = индекс выбранного значения в списке элемента управления.


DisableItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› NormalTab ››

Сделать недоступной для редактирования и выбора позицию элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DisableItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать недоступной (индекс от 1)


EnableItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› NormalTab ››

Сделать доступной для редактирования и выбора позицию элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "EnableItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать доступной (индекс от 1).


DeleteItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› NormalTab ››

Удалить указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "DeleteItem", int itemindex);

Здесь:

itemindex - позиция, которую сделать доступной (индекс от 1). Если задан 0, то удаляются все позиции.


InsertItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› NormalTab ››

Вставить новый элемент в указанную позицию списка.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "InsertItem", int itemindex);

Здесь:

itemindex - позиция, в которую вставить новый элемент.


AppendItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› NormalTab ››

Добавить позицию в конец списка элемента управления.

Вызов:

ts_dialogcontrol(iDialogControlDescr, "AppendItem");


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› NormalTab ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


TabPage

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


SetToolTip

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› TabPage ››

Задать текст, всплывающий текст, который будет показываться при помещении указателя мышки над элементом управления.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr, "SetToolTip", string tooltiptext);

Здесь:

tooltiptext - строка всплывающего текста с пояснением.


GroupBox

Диалоги на основе окон ›› Класс ts_dialogcontrol ››


SetFontSizecodeStyle

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› GroupBox ››

Задать размер и стиль шрифта.

Размер шрифта задается номером - не изменять/большой/маленький/самый маленький -1/0/4/8.

Стиль шрифта тоже задается номером - не изменять/обычный/болд/италик/подчеркнутый -1/0/16/32/48.

Коды стиля могут суммироваться. Италик с подчеркиванием = 32+48.

Вызов:

ts_diaolgcontrol(int iDialogcontrolDescr, "SetFontSizecodeStyle", int iFontSizeCode, int iFontStyleCode);

Здесь:

iDialogcontrolDescr - дескриптор элемента управления у которого надо поменять размер и/или стиль шрифта.

iFontSizeCode - код размера шрифта,

iFontStyleCode - код стиля шрифта.


PushMenuCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Видеоролик

Файл

//---------------------------------------------------------

// PushMenuRadio & PushMenuCheck example

// LABPP 2023

//---------------------------------------------------------

int iMenu1, iMenu11, iIconPushRadio, iMenu2, iIconPushCheck;

int main()

{

int ires;

ac_request("clearmessagewindow");

// Create Dialog

var_by_txt("init", "iDialog_DS", "int", "global", 0);

int x, y, w, h, offset;

object("create", "ts_dialog", iDialog_DS);

x = 0; y = 0; w = 250; h = 160;

ts_dialog(iDialog_DS, "init_dialog", "palette", x, y, w, h);

ts_dialog(iDialog_DS, "eventreaction", "Event_PanelCloseRequested", "Event_PanelCloseRequested_DS");

ts_dialog(iDialog_DS, "set_as_main_panel");

ts_dialog(iDialog_DS, "SetGrowType", 3);

ts_dialog(iDialog_DS, "SetTitle", "PushMenuRadio & PushMenuCheck Test");

x = 10; w = 40; y = 10; h = 40;

object("create", "ts_dialogcontrol", iMenu1);

ts_dialogcontrol(iMenu1, "init_control", "PushMenuRadio", iDialog_DS, x, y, w, h, 1);

ts_dialogcontrol(iMenu1, "SetItemCount", 3);

string iconpath = "c:\\";

ts_dialogcontrol(iMenu1, "SetItemIcon", 1, iconpath + "files\\outlineonleft.png");

ts_dialogcontrol(iMenu1, "settooltip", "Задание линии ячейки:");

ts_dialogcontrol(iMenu1, "SetToolTipItem", 1, "Левый край");

ts_dialogcontrol(iMenu1, "SetItemIcon", 2, iconpath + "files\\outlineontop.png");

ts_dialogcontrol(iMenu1, "SetToolTipItem", 2, "Верхний край");

ts_dialogcontrol(iMenu1, "SetItemIcon", 3, iconpath + "files\\outlineonright.png");

ts_dialogcontrol(iMenu1, "SetToolTipItem", 3, "Правый край");

ts_dialogcontrol(iMenu1, "eventreaction", "Event_PushMenuChanged","Event_PushMenuChanged_DCName_DS");

ts_dialogcontrol(iMenu1, "SetAnchorToPanelResize", 0, 1, 0, 0);

x = 50; w = 40; y = 10; h = 40;

object("create", "ts_dialogcontrol", iMenu11);

ts_dialogcontrol(iMenu11, "init_control", "PushMenuRadio", iDialog_DS, x, y, w, h, 1);

ts_dialogcontrol(iMenu11, "SetItemCount", 3);

ts_dialogcontrol(iMenu11, "settooltip", "Выборка по цвету пола:");

ts_dialogcontrol(iMenu11, "SetItemIcon", 1, iconpath + "files\\floor.png");

ts_dialogcontrol(iMenu11, "SetToolTipItem", 1, "Светлый пол");

ts_dialogcontrol(iMenu11, "SetItemIcon", 2, iconpath + "files\\floors.png");

ts_dialogcontrol(iMenu11, "SetToolTipItem", 2, "Средние тона");

ts_dialogcontrol(iMenu11, "SetItemIcon", 3, iconpath + "files\\floors_group.png");

ts_dialogcontrol(iMenu11, "SetToolTipItem", 3, "Темный пол");

ts_dialogcontrol(iMenu11, "SetAnchorToPanelResize", 0, 1, 0, 0);

x = 90; w = 40; y = 10; h = 40;

object("create", "ts_dialogcontrol", iIconPushRadio);

ts_dialogcontrol(iIconPushRadio, "init_control", "IconPushRadio", iDialog_DS, x, y, w, h, 1);

ts_dialogcontrol(iIconPushRadio, "settooltip", "Задать высоту ячейки");

ts_dialogcontrol(iIconPushRadio, "SetIcon", iconpath + "files\\cell_height.png");

ts_dialogcontrol(iIconPushRadio, "SetAnchorToPanelResize", 0, 1, 0, 0);

x = 140; y = 18; w = 100; h = 24;

var_by_txt("init", "iRadioButton_DCName_DS", "int", "global", 0);

object("create", "ts_dialogcontrol", iRadioButton_DCName_DS);

int igroup = 1;

ts_dialogcontrol(iRadioButton_DCName_DS, "init_control", "RadioButton", iDialog_DS, x, y, w, h, 1);

ts_dialogcontrol(iRadioButton_DCName_DS, "settooltip", "Пропустить выполнение команды");

ts_dialogcontrol(iRadioButton_DCName_DS, "SetText", "Пропустить");

ts_dialogcontrol(iRadioButton_DCName_DS, "Select");

x = 10; w = 40; y = 85; h = 40;

object("create", "ts_dialogcontrol", iMenu2);

ts_dialogcontrol(iMenu2, "init_control", "PushMenuCheck", iDialog_DS, x, y, w, h);

ts_dialogcontrol(iMenu2, "SetItemCount", 4);

ts_dialogcontrol(iMenu2, "settooltip", "Показать отчет в:");

ts_dialogcontrol(iMenu2, "SetItemIcon", 1, iconpath + "files\\edit.png");

ts_dialogcontrol(iMenu2, "SetToolTipItem", 1, "Редактор текста");

ts_dialogcontrol(iMenu2, "SetItemIcon", 2, iconpath + "files\\EditPRGitem.png");

ts_dialogcontrol(iMenu2, "SetToolTipItem", 2, "Редактор программ");

ts_dialogcontrol(iMenu2, "SetItemIcon", 3, iconpath + "files\\пути_excel.png");

ts_dialogcontrol(iMenu2, "SetToolTipItem", 3, "Excel");

ts_dialogcontrol(iMenu2, "SetItemIcon", 4, iconpath + "files\\LABPP_BIM_Master.png");

ts_dialogcontrol(iMenu2, "SetToolTipItem", 4, "BIM Master");

ts_dialogcontrol(iMenu2, "SetAnchorToPanelResize", 0, 1, 0, 0);

ts_dialogcontrol(iMenu2, "eventreaction", "Event_PushMenuChanged", "Event_PushMenuChanged_DCName_DS");

x = 50; w = 40; y = 84; h = 41;

object("create", "ts_dialogcontrol", iIconPushCheck);

ts_dialogcontrol(iIconPushCheck, "init_control", "IconPushCheck", iDialog_DS, x, y, w, h);

ts_dialogcontrol(iIconPushCheck, "settooltip", "Показать отчет в BIM Master");

ts_dialogcontrol(iIconPushCheck, "SetIcon", iconpath + "files\\LABPP_BIM_Master.png");

ts_dialogcontrol(iIconPushCheck, "SetAnchorToPanelResize", 0, 1, 0, 0);

bool bres;

bres = ts_dialog(iDialog_DS, "invoke", bres);

return 0;

}

int Event_PanelCloseRequested_DS(int iDescr, string sDescr)

{

int ires = tsalert(-3, "Message", "Are you sure you want to close the panel?", "", "Ok", "Cancel");

if (ires == 1)

{

return 0; // Allow panel to close;

}

else

{

return -1; // No close panel

}

}

// Events

int Event_PushMenuChanged_DCName_DS(int iDescr, string sDescr)

{

if (sDescr == "iMenu1"){

bool bSelected;

ts_dialogcontrol(iMenu1, "IsSelected", bSelected);

coutvar << bSelected;

bool bSelectionChanged;

ts_dialogcontrol(iMenu1, "GetNamedEventValue","WasSelectionChange", bSelectionChanged);

coutvar << bSelectionChanged;

int iPreviousMenuItem;

ts_dialogcontrol(iMenu1, "GetNamedEventValue","PreviousMenuItem", iPreviousMenuItem);

coutvar << iPreviousMenuItem;

}

if (sDescr == "iMenu2") {

bool bChecked;

ts_dialogcontrol(iMenu2, "GetCheck", bChecked);

coutvar << bChecked;

bool bStateChanged;

ts_dialogcontrol(iMenu2, "GetNamedEventValue", "WasStateChange", bStateChanged);

coutvar << bStateChanged;

int iPreviousMenuItem;

ts_dialogcontrol(iMenu2, "GetNamedEventValue", "PreviousMenuItem", iPreviousMenuItem);

coutvar << iPreviousMenuItem;

}

}


SetItemIcon

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuCheck ››

Задать картинку для заданного пункта меню

Вызов:

ts_dialogcontrol(int iPushMenu, "SetItemIcon", int index, string sIconFilePath);


GetCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuCheck ››

Проверить нажата или отжата кнопка элемента PushMenu

Вызов:

ts_dialogcontrol(int iPushMenuCheck, "GetCheck", bool bChecked);


SetCheck

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuCheck ››

Задать состояние "нажат/отжат" элементу PushMenuCheck.

Вызов:

ts_dialogcontrol(int iPushMenu, "SetCheck", bool bChecked);


SetItemCount

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuCheck ››

Задать количество пунктов меню.

Вызов:

ts_dialogcontrol(int iPushMenu, "SetItemCount", int icount);


SelectItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuCheck ››

Выбрать пункт меню по индексу (индекс - от 1 до n).

Вызов:

ts_dialogcontrol(int iPusMenuCheck, "SelectItem", int index);


GetSelectedItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuCheck ››

Получить индекс текущего выбранного пункта меню.

Вызов:

ts_dialogcontrol(int iPushMenu, "GetSelectedItem", int iSelectedItem);


SetToolTip

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuCheck ››

Задать общую всплывающую подсказку для элемента PushMenu.

Вызов:

ts_dialogcontrol(int iMenu1, "settooltip", string sText);


SetToolTipItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuCheck ››

Задать дополнение к всплывающей подсказке когда выбран пункт меню.

Вызов:

ts_dialogcontrol( int iPushMenu, "SetToolTipItem", int index, string sText);

Здесь:

iPushMenu - дескриптор элемента PushMenu,

index - индекс пункта меню, для которого задается дополнительный всплывающий текст (индекс от 1 до n).

sText - дополнительный текст к всплывающему сообщению.


WasStateChange

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuCheck ››

Узнать было ли изменение состояния меню во время вызова события.

Вызов:

ts_dialogcontrol( int iPushMenu, "GetNamedEventValue", "WasStateChange", bool bStateChanged);


PreviousMenuItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuCheck ››

Какой индекс меню был выбранным до того, как выбран новый пункт меню.

ts_dialogcontrol( int iPushMenu, "GetNamedEventValue", "PreviousMenuItem", int iPreviousMenuItem);


PushMenuRadio

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

См. пример здесь


SetItemIcon

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuRadio ››

Задать картинку для заданного пункта меню

Вызов:

ts_dialogcontrol(int iPushMenu, "SetItemIcon", int index, string sIconFilePath);


Select

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuRadio ››


IsSelected

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuRadio ››


SetItemCount

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuRadio ››

Задать количество пунктов меню.

Вызов:

ts_dialogcontrol(int iPushMenu, "SetItemCount", int icount);


SelectItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuRadio ››

Выбрать пункт меню по индексу (индекс - от 1 до n).

Вызов:

ts_dialogcontrol(int iPusMenu, "SelectItem", int index);


GetSelectedItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuRadio ››

Получить индекс текущего выбранного пункта меню.

Вызов:

ts_dialogcontrol(int iPushMenu, "GetSelectedItem", int iSelectedItem);


SetToolTip

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuRadio ››

Задать общую всплывающую подсказку для элемента PushMenu.

Вызов:

ts_dialogcontrol(int iMenu1, "settooltip", string sText);


SetToolTipItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuRadio ››

Задать дополнение к всплывающей подсказке когда выбран пункт меню.

Вызов:

ts_dialogcontrol( int iPushMenu, "SetToolTipItem", int index, string sText);

Здесь:

iPushMenu - дескриптор элемента PushMenu,

index - индекс пункта меню, для которого задается дополнительный всплывающий текст (индекс от 1 до n).

sText - дополнительный текст к всплывающему сообщению.


PreviousMenuItem

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuRadio ››

Какой индекс меню был выбранным до того, как выбран новый пункт меню.

ts_dialogcontrol( int iPushMenu, "GetNamedEventValue", "PreviousMenuItem", int iPreviousMenuItem);


WasSelectionChange

Диалоги на основе окон ›› Класс ts_dialogcontrol ›› PushMenuRadio ››

Узнать было ли изменение состояния меню во время вызова события.

Вызов:

ts_dialogcontrol( int iPushMenu, "GetNamedEventValue", "WasStateChange", bool bStateChanged);


Eventreaction

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Привязать к элементу управления функцию - обработчик события или задать имя конечной функции для обработки события.

ts_dialogcontrol(int iButtonDescr, "eventreaction", string eventfunctionname [, string eventfunctionname_more]);

Здесь:

eventfunctionname - имя функции, которая обрабатывает событие.

eventfunctionname_more - имя конечной функции, которая будет вызываться при событии eventfunctionname (не обязательно, просто бывает удобно объединить реакцию на различные события в различных элементах в одну функцию).

Пример. Чтобы обработать реакцию на нажатие кнопки создайте функцию:

int iDialogDescr, iButtonZoom;
int main()
{
...// создать окно диалога
int x, y, w, h;
x=1,y=1, w=200; h = 200;
object("create","ts_dialog",iDialogDescr);
ts_dialog(iDialogDescr, "init_dialog","palette",x,y,w,h);
ts_dialog(iDialogDescr, "eventreaction", "Event_PanelCloseRequested");
ts_dialog(iDialogDescr, "SetTitle","Расчет ведомости объемов работ");
bool bres;
// создать элемент управления
x=1; y=1; w=50; h=20;
object("create","ts_dialogcontrol",iButtonZoom,"iButtonZoom");
ts_dialogcontrol(iButtonZoom, "init_control", "button",iDialogDescr, x, y, w, h);
ts_dialogcontrol(iButtonZoom, "eventreaction", "Event_ButtonClicked");
ts_dialogcontrol(iButtonZoom, "settext", "Показать");
...
ts_dialog(iDialogDescr, "invoke",bres);
cout << bres;
}

int Event_ButtonClicked(int iDescr, string sDescr)
{
if(sDescr == "ButtonCancel")
{
ts_dialog(iDialogDescr,"PostCloseRequest","cancel"); // закрыть диалог с результатом отмены
}
else if(sDescr == "ButtonOK")
{
ts_dialog(iDialogDescr,"PostCloseRequest","ok"); // закрыть диалог с результатом "Ok"
}
else if(sDescr == "ButtonCalc")
{
Calc();
}
else if(sDescr == "ButtonZoom")
{
ZoomElementInProject();
}
}

Теперь по нажатию кнопки будет выполняться эта функция.

В момент ее выполнения iDescr - числовое значение дескриптора кнопки, которая вызвала событие, а sDescr - ее имя объекта (не путать с текстом кнопки). Можно различать какая кнопка нажата по конструкции

if(iDescr == iDescrZoom)
{
//
}
Либо
if(sDescr == "iButtonZoom")
{
//
}

Бывает удобно и по числу и по имени. Например можно задать одинаковые имена группе кнопок, выполнять общие действия, а затем различать их по числовому дескриптору.

Ниже дана таблица имен функций - обработчиков событий для каждого типа элементов управления диалогов.

Имя функции - обработчика события | Элементы, к которым можно применять | Примечание
Event_TreeViewContextMenuRequested | MultiselTreeView, SingleSelTreeView | Запрос вызова контекстного меню
Event_TreeViewItemCollapsed |  | Свертывание дерева
Event_TreeViewItemDoubleClicked |  | Двойной щелчок
Event_TreeViewItemExpanded |  | Раскрытие элемента
Event_TreeViewLabelEditFinished |  | Завершение редактирования текста элемента
Event_TreeViewLabelEditStarted |  | Начало редактирования текста элемента
Event_TreeViewSelectionChanged |  | Смена выбранного элемента дерева
Event_TreeViewStateIconClicked |  | Щелчок на иконке состояния
Event_ListViewContextMenuRequested | MultiselListView, SingleselListView | Запрос контекстного меню
Event_ListViewDoubleClicked |  | Двойной щелчок
Event_ListViewItemUpdate |  | Обновление позиции
Event_ListViewSelectionChanged |  | Изменение текущей позиции
Event_RealEditChanged | RealEdit | Изменение числа в поле редактирования
Event_TextEditChanged | TextEdit | Изменение текста в поле редактирования
Event_ItemFocusGained | Все фокусируемые элементы | Элемент получил фокус
Event_ItemFocusLost | Все фокусируемые элементы | Элемент потерял фокус
Event_ImageClicked | IconItem | Щелчок на картинке
Event_ListBoxClicked | MultiselListBox, SingleselListBox | Щелчок мыши
Event_ListBoxDoubleClicked |  | Двойной щелчок
Event_ListBoxSelectionChanged |  | Изменение текущего выбора
Event_PopUpChanged | PopUp | Изменение значения в элементе PopUp
Event_StaticTextClicked | LeftText, CenterText, RightText | Щелчок на тексте
Event_StaticTextDoubleClicked |  | Двойной щелчок
Event_CheckItemChanged | CheckBox, IconCheckBox, IconPushCheck, PushCheck | Смена выбранного элемента
Event_CheckItemDoubleClicked |  | Двойной щелчок
Event_ButtonClicked | Button, IconButton | Нажатие кнопки
Event_NormalTabChanged | NormalTab | Изменение текущего элемента в NormalTab (переход на другую панель)
Event_NormalTabClicked | NormalTab | Щелчек мыши на поле элемента NormalTab
Event_PushMenuChanged | PushMenuCheck PushMenuRadio | Изменение состояния
Event_PushMenuDoubleClicked |  | Двойной щелчек мыши


SetAnchorToPanelResize

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Установить зависимость размеров и положения элемента от размеров панели, на которой он установлен.

Если пользователь будет изменять размеры окна диалога, то элемент может оставаться на месте, сдвигаться влево-вправо, вверх-вниз, расширяться и т.д.

Вызов:

ts_dialogcontrol(iDialogcontrolDescr, "SetAnchorToPanelResize", int leftanchor, int topanchor, int rightanchor, int bottomanchor);

Здесь:

leftanchor, topanchor, rightanchor, bottomanchor - числовые значения 0/1 якорей левого, верхнего, правого и нижнего края, соответственно.

При значении 0 - край остается на месте. При значении 1 - край сдвигается в соответствии с изменением размеров окна.


Hide

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Скрыть элемент управления

Вызов:

ts_dialogcontrol(iDialogcontrolDescr, "Hide");


Show

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Показать скрытый элемент управления

Вызов:

ts_dialogcontrol(iDialogcontrolDescr, "Show");


SetPosition

Диалоги на основе окон ›› Класс ts_dialogcontrol ››

Переместить элемент управления в новую позицию.

ts_dialogcontrol(iDialogcontrolDescr, "SetPosition", int x, int y);

Здесь:

x,y - новые координаты левого верхнего угла перемещаемого элемента управленияю.


Работа со структурами данных в формате JSON

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Класс ts_json

Работа со структурами данных в формате JSON ››


init (clear)

Работа со структурами данных в формате JSON ›› Класс ts_json ››

Очистить содержимое объекта ts_json.

Вызов:

ts_json(int iJSONObjectDescr,"clear");

Здесь:

iJSONObjectDescr - дескриптор объекта JSON, который нужно очистить.


DecodeFromURL

Работа со структурами данных в формате JSON ›› Класс ts_json ››

Загрузить JSON код из файла, расположенного на web сайте.

Вызов:

int ires = ts_json(int iJSONObjectDescr, "DecodeFromURL", string sURL);

Здесь:

iJSONObjectDescr - дескриптор объекта типа JSON,

sURL - адрес файла в Интернет.

Возвращает 0 при успешной загрузке.

Пример.

Загрузить JSON код из файла config.json с сайта www.appcarrier.com

int iJSONConfig; // дескриптор объекта

object("create", "ts_json", iJSONConfig); // создать объект в памяти

int ires = ts_json(iJSONConfig, "DecodeFromURL", "http://www.appcarrier.com/config.json");

if (ires != 0)

{

cout << "JSON Decode from URL error";

}

else

{

cout << "File JSON decoded successfully\n";

}

object("delete", iJSONConfig); // удалить объект


DecodeFromString

Работа со структурами данных в формате JSON ›› Класс ts_json ››

Загрузить JSON код из строковой переменной.

Вызов:

int ires = ts_json(int iJSONObjectDescr, "DecodeFromString", string sJSON);

Здесь:

iJSONObjectDescr - дескриптор объекта типа JSON, в который надо загрузить код,

sJSON - строковая переменная, в которой находится текст JSON.

Возвращает 0 при успешной загрузке.

Пример.

Загрузить JSON код из строки.

int iJSONConfig; // дескриптор для объекта ts_json

object("create", "ts_json", iJSONConfig); // создать объект в памяти

string sJSON = "{ \"My class in JSON code\":{\

\"StringVariable\":\"my string\",\

\"DoubleVariable\" : 1.23\

}}";

int ires = ts_json(iJSONConfig, "DecodeFromString", sJSON);

if (ires != 0)

{

cout << "JSON Decode from URL error";

}

else

{

cout << "File JSON decoded successfully\n";

}

object("delete", iJSONConfig); // удалить объект


EncodeToStr

Работа со структурами данных в формате JSON ›› Класс ts_json ››

Выгрузить JSON код в строковую переменную.

Вызов:

int ires = ts_json(int iJSONObjectDescr, "EncodeToStr", string &sJSON);

Здесь:

iJSONObjectDescr - дескриптор объекта типа JSON, из которого надо вызагрузить код,

sJSON - строковая переменная, в которую надо выгрузить JSON объект.

Возвращает 0 при успешной выгрузки.

Пример.

Выгрузить JSON код в строку.

string sJSON;

int ires = ts_json(iJSONConfig, "EncodeToStr", sJSON);

coutvar << sJSON; // вывести содержимое переменной sJSON в окно сообщений


Класс ts_array

Работа со структурами данных в формате JSON ››


Класс ts_class

Работа со структурами данных в формате JSON ››


Класс ts_num

Работа со структурами данных в формате JSON ››


Класс ts_bool

Работа со структурами данных в формате JSON ››


Класс ts_string

Работа со структурами данных в формате JSON ››


ReadFromURL

Руководство по LABPP_Automat для ARCHICAD

Работа со структурами данных в формате JSON ›› Класс ts_string ››

int iStringDescr;

object("create", "ts_string", iStringDescr);

int iret = ts_string(iStringDescr, "ReadFromURL", "http://www.labpp.ru/TSDownload/KSI/" + sclassifname + ".txt");

object("read_simple_value", iStringDescr);

string sXMLsource = ac_getstrvalue();


TSVariator

Работа со структурами данных в формате JSON ››

Механизм чтобы хранить и получать значения различных свойств из одного текста.

Например в электронной таблице чтобы не плодить множество колонок под каждое свойство можно записать все их в ячейку одной колонки.

При этом количество свойст может быть любое.

Обращение для решения вариатора.

int ires = ts_json(int iJSON, "tsvariator", "apply", int what_answere_if_notexist);

Здесь:

ires - результат команды, если 0 - значит без ошибок и значение искомого свойства задано.

В ином случае - либо ошибка, либо искомого свойства нет в тексте.

what_answere_if_notexist - что вернуть при отсутствии запрашиваемого свойства. Если 0 - то вернуть содержимое переменной запроса. Если 1 - то вернуть значение из свойства "По умолчанию".

Пример записи текста в формате TSVariator:

{ "TSVariator":

[

{"Result":"Нет",

"SourceVarValue" : "По умолчанию",

"Comment" : "По умолчанию, если нет параметра"

},

{

"SourceVarValue": "Ширина профиля",

"Result" : "50",

"Comment" : ""

},

{

"SourceVarValue": "Толщина утеплителя",

"Result" : "50",

"Comment" : ""

},

{

"SourceVarValue": "Огнестойкость",

"Result" : "Нет",

"Comment" : "для отметки огнестойкости пп у элемента"

},

{

"SourceVarValue": "Влагостойкость",

"Result" : "Нет",

"Comment" : "для отметки влагостойкости пп у элемента"

}],

"SourceVarName":"Свойство"

}

В квадратных скобках заключен массив классов переменных.

Каждая переменная имеет имя ("SourceVarValue"), примечание ("Comment") и значение ("Result").

"SourceVarName" - имя внешней переменной в коде скрипта, которая используется для получения данных.

В примере имя этой переменной - "Свойство";

Весь текст можно поместить в одну ячейку электронной таблицы и получать из нее значения различных свойств по их названиям ("Ширина профиля", "Толщина профиля" и т.д.). Если запрашиваемого свойства в тексте нет, то выдается значение из первой записи (в примере это значение - "Нет").

Пример.

Получить значение свойства "Огнестойкость" из текста в примере выше.

string sexample; // переменная в которой находится текст из примера выше

var_extern_set("Свойство", "Огнестойкость"); // записать во внешнюю переменную с именем "Свойство" имя свойства, которое хотим считать из текста.

int iJSON;

object("create", "ts_json", iJSON); // создадим объект типа ts_gson

string sresult;

ts_json(iJSON, "DecodeFromString", sexample);

ires = ts_json(iJSON, "tsvariator", "apply", 1); // если не найдена переменная - вернуть значение по умолчанию sresult = ac_getstrvalue();

сout << "Значение огнестойкости = " << sretuls << "\n";

object("delete",iJSON); // удалить объект


Редактор таблиц LABPP_Table для ARCHICAD

Для создания в проекте таблиц можно использовать удобный GDL элемент LABPP_Table.gsm .

Управление этим элементом удобно осуществлять через редактор LABPP_Table_unicode.cpp ( LABPP_Table_unicode.zip ).

Этот редактор можно модифицировать самостоятельно. Добавлять собственные кнопки и процедуры и т.п.

Основные возможности.

Максимальное число колонок - 100;

Максимальное число строк - 500;

Объединение ячеек - да;

Типов линий для отрисовки ячеек - 2 (перо для тонких линий, перо для толстых линий, без линии);

Регулировка размеров ячеек - да;

Групповое изменение высоты - да;

Групповое изменение ширины - да;

Число стилей в ячейках - 4:

Параметры для настройки стиля - шрифт, размер шрифта, отступ от границ ячейки, наклонный, жирный, коэффициент межстрочного интервала;

Перо для текста - общее для всех стилей;

Использование знаков UNICODE - да (не м2 а м?);

Выравнивание в ячейках - по горизонтали и вертикали (9 вариантов);

Расположение текста по вертикали - да;

Размещение в ячейках эскизов из других элементов - да (настройка масштаба, положения);

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

Запустить программу LabPP_Table_unicode.cpp.

Появится плавающее окно с кнопками управления редактором таблиц.

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

Кнопки слева направо верхний ряд.

Редактирование текста в ячейке.

Щелкнуть на ячейке.

В появившемся окне отредактировать текст. Нажать кнопку записи.

Поворот текста в ячейке.

Щелкнуть на ячейке - текст в ней повернется в другое положение.

Объединение ячеек.

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

Ячейки объединятся.

Разъединение ячеек.

Щелкните на объединенную ячейку.

Ячейки, ее составляющие, разъединятся.

Задать стиль в ячейке.

Нажать одну из кнопок - T, H, S, N - название, заголовок, подзаголовок и обычный текст.

Соответствующий стиль задается в настройках элемента таблицы.

Задать отрисовку линий пером для толстых линий.

Задать отрисовку линий пером для тонких линий.

Выключить отрисовку линий.

Выполняются одинаково - щелкнуть на воображаемый верхний левый угол и на воображаемый нижний правый угол.

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

Задать высоту строки.

Задать ширину колонки.

Выполняются одинаково - щелкнуть на воображаемый верхний левый угол и на воображаемый нижний правый угол.

В окне задайте соответствующее желаемое значение (можно предварительно измерить в проекте).

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

Задать в ячейке отображение эскиза из другого элемента.

В появившемся окне задать параметры отображаемого фрагмента.

Формат:

Имя макроса#Название фрагмента в макросе#Масштаб#Смещение от центра ячейки по горизонтали#Смещение от центра ячейки по вертикали#Текстовое поле для передачи дополнительных параметров

Для использования макроса в тексте 2d скрипта GDL необходимо разместить фрагменты с указанием названия и ответа для указания исходных размеров.

Пример фрагмента для отображения двух штриховок.

При отображении в таблице штриховки так же масштабируются.

За масштаб отвечает переменная TSScaleK.

Таких фрагментов может быть сколько угодно.

!----------------------------------------------------------

IF LABPP_PictureName = "Тип 1" THEN

IF LABPP_Command = "GET SIZES" THEN

! x,y,w,h

EXIT 0.951, -16.940, 3.9937, 0.751

ENDIF

fillAttribute_1 = 214

fillAttribute_2 = 330

lineTypeAttribute_1 = 1

lineTypeAttribute_2 = 0

pen penAttribute_1

fill fillAttribute_1

poly2_b{5} 5, 2, 1, 8, penAttribute_1, penAttribute_2,

2.947696588428, -16.52173742916, TSScaleK, 0, 0, TSScaleK, 0,

1.09620462548, -16.47923742916, 33,

1.09620462548, -16.56423742916, 33,

4.799188551377, -16.56423742916, 33,

4.799188551377, -16.47923742916, 33,

1.09620462548, -16.47923742916, 33

set line_type lineTypeAttribute_1

pen penAttribute_4

poly2_b{5} 7, 1, 0, 3, 1, 0,

0, 0, TSScaleK, 0, 0, TSScaleK, 0,

1.22479041471, -16.51429212963, 1,

1.202131508217, -16.51429212963, 900,

0, 180, 4001,

1.179472601724, -16.51429212963, 1,

1.202131508217, -16.51429212963, 900,

0, 180, 4001,

1.22479041471, -16.51429212963, 1

ENDIF

Масштабирование таблицы.

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


Структура данных объекта LABPP_Table (для программистов)

Редактор таблиц LABPP_Table для ARCHICAD ››

Изменяя значения можно управлять таблицей и заполнять данными из собственных программных модулей

Как это делается можно посмотреть в файле редактора таблиц LABPP_Table_unicode.cpp.

TS_Cells_poscode - коды содержимого в ячейках таблицы.

Массив текстовый 500х100

Код показывает информацию о содержимом ячейки.

Первые 4 символа отвечают за наличие раздела ячейки с каждой из 4-х сторон.

LTRB - означает, что все границы есть.

Если стоит _ на какой-то позиции, значит ячейка объединена по этой стороне.

У смежной ячейки должен такой же символ присутствовать по стороне сопряжений.

Например, если две ячейки с индексами [2][1] и [3][1] (в 1-й колонке в строке 2 и 3) объединены, то у верхней будет:

LTR_ а у нижней L_RB.

Позиция 5 отвечает за направление текста.

Пробел - горизонтально.

'a' - текст првернут на 90 градусов.

Позиция 6 отвечает за стиль текста в ячейке.

't', 'h', 's', 'n' - стиль названия таблицы, заголовка, подзаголовка или обычный текст.

7-я позиция - код формата 0-текст, 1 - целое, 2 - число с 1 знаком, 3 - число с 2 знаками.

8-я позиция - l/m/f/r выравнивание по горизонтали влево/по центру/вправо/по ширине

9-я позиция - t/m/b - выравнивание по вертикали вверх/посредине/вниз

Позиции 10,11,12,13 - тип линий в ячейке - лев/верх/прав/низ -> 0/1/2 - нет/жирная/тонкая

по умолчанию

LTRB n0mm1111

TS_Cells_value - значения в ячейках.

Массив текстовый 500х100

TS_Cells_macro - коды для отрисовки макросов в ячейках таблицы

Массив текстовый 500х100

TS_ColumnsUsedCount - число колонок в таблице.

TS_RowsUsedCount - число строк в таблице.

TS_RowsH - массив высот колонок.

TS_ColumnsW - массив ширин колонок.

TS_ShowSelection - показывать или нет выбор ячеек.

После изменения данных необходимо присвоить переменной TS_DoRecalcAll значение 1.

При этом элемент таблицы пересчитает служебные переменные.

Из следующих служебных переменных можно получить реальную картину элемента LABPP_Table на текущий момент.

TS_RealCells - реальная рассчитанная картина всех ячеек

Массив типа линейная длина N x 17.

Таблица плоская, значения для ячеек идут друг за другом слева направа сверху вниз.

Т.е. первые 17 элементов - первая строка таблицы, вторые 17 элементов - вторая строка таблицы и т.д. по числу задействованных ячеек.

Назначение позиций

1 - SX

2 - SY

3 - EX

4 - EY

5 - I - номер колонки

6 - J - номер строки

7 - стартовая позиция текста

8 - конечная позиция текста

9 - левая граница нет/да

10 - верхняя граница нет/да

11 - правая граница нет/да

12 - нижняя граница нет/да

13 - кол-во позиций вниз совмещено

14 - кол-во позиций вправо совмещено

15 - самый левый нет/да

16 - самый верхний нет/да

17 - selected

TS_RealCellsSelected - массив выбранных ячеек.

Рассчитывается по 17-й позиции из TS_RealCells

Чтобы задать выбранные ячейки - надо установить 17-ую позицию у соответствующих элементов ячеек в поле TS_RealCells.

Имейте в виду, что после перерасчета таблицы информация о выбранных ячейках сбрасывается как в электронных таблицах.


Непереносимые пробелы и дефисы

Редактор таблиц LABPP_Table для ARCHICAD ››

Обычно требуется, чтобы шифр ГОСТ переносился на следующую строку не отдельными фрагментами, а целиком.

Для этого используют непереносимые пробелы и дефисы.

Это такие же знаки, только у них другие коды.

LABPP_Table поддерживает эту технологию.

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

На клавиатуре - удерживая Alt наберите 0160 для ввода непереносимого пробела.

Чтобы получить непереносимый дефис - Alt+8211.

Знак | ? | ? | ? | ? | ? | ? | ? | ? | ? | ?
Число для ввода Alt+ | 8304 | 0185 | 0178 | 0179 | 8308 | 8309 | 8310 | 8311 | 8312 | 8313
Unicode | 2070 | 00B9 | 00B2 | 00B3 | 2074 | 2075 | 2076 | 2077 | 2078 | 2079


Работа с СУБД MySQL

Имеется возможность подключать базы данных MySQL непосредственно из текста программ LABPP.

Скачайте с сайта MySQL следующие файлы:

  1. libmysql.dll
  2. libcrypto-3-x64.dll
  3. libssl-3-x64.dll

и поместите их в каталог ARCHICAD.


connection_init

Работа с СУБД MySQL ››

Инициализация объекта для присоединения к БД MySQL из ARCHICAD
Вызов:
int ires = ts_dbmysql(int iMySQL, "connection_init");
Здесь:
ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения инициализации.
iMySQL - дескриптор объекта подключения.

Пример:

int iMySQL;
object("create", "ts_dbmysql", iMySQL);
int ires;
ires = ts_dbmysql(iMySQL, "connection_init");
if (ires != 0) {
return -1;
}
cout << "init success\n";


connection_open

Работа с СУБД MySQL ››

Открыть коннект с базой данных (присоедититься к БД).

Вызов:

int ires = ts_dbmysql(iMySQL, "connection_open", string server, string user, string password, string basename, int port);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iMySQL - дескриптор объекта подключения;

server - имя или IP сервера, где находится подключаемая база данных;

user - имя пользователя

password - пароль

basename - имя базы данных (в MySQL это называется схемой)

port - порт для подключения (обычно 3306);

Пример:

string server = "31.41.196.220";
string user = "u0490570";
string password = "hP2uH9fdsaY2zpA5eA4";
string basename = "u0490570";
int port = 3306;
ires = ts_dbmysql(iMySQL, "connection_open", server, user, password, basename, port);
if (ires != 0) {
return -1;
}
cout << "connection success\n";


real_query

Работа с СУБД MySQL ››

Выполнить запрос к базе данных.

Запрос может выполняться с использованием символов unicode (например м?).

Результат запроса далее может быть получен, например, в виде таблицы ts_table.

Вызов:

int ires = ts_dbmysql(iMySQL, "real_query", string query);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iMySQL - дескриптор объекта подключения;

query - текст запроса к базе данных на языке SQL (например SELECT * FROM u0490570.my_table);

Пример:

string query = "SELECT * FROM u0490570.my_table"; // запросить все записи из таблицы my_table в базе данных u0490570
int j = 0;
ires = ts_dbmysql(iMySQL, "real_query", query);
if (ires != 0) {
return -1;
}
cout << "query success\n";


store_result

Работа с СУБД MySQL ››

Сохранить результат запроса.

Результат запроса далее может быть получен, например, в виде таблицы ts_table.

Вызов:

int ires = ts_dbmysql(iMySQL, "store_result");

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iMySQL - дескриптор объекта подключения;

Пример:

ires = ts_dbmysql(iMySQL, " ires = ts_dbmysql(iMySQL, "store_result");

if (ires != 0) {

return -1;

}

cout << "store result success\n";");


get_num_fields

Работа с СУБД MySQL ››

Получить количество колонок в результате запроса.

Вызов:

int ires = ts_dbmysql(iMySQL, "get_num_fields");

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iMySQL - дескриптор объекта подключения;

Пример:

ires = ts_dbmysql(iMySQL, "get_num_fields");
cout << "num fields = " << ires << "\n";


get_row_count

Работа с СУБД MySQL ››

Получить количество строк в результате запроса.

Вызов:

int ires = ts_dbmysql(iMySQL, "get_row_count", count);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iMySQL - дескриптор объекта подключения;

count - возвращает количество строк в полученной таблице.

Пример:

int count;

ires = ts_dbmysql(iMySQL, "get_row_count",count);

cout << "row count = " << count << "\n";


export_to_table

Работа с СУБД MySQL ››

Выгрузить результат, полученный по запросу из базы данных, в таблицу ts_table.

Вызов:

int ires = ts_dbmysql(iMySQL, "export_to_table", int iTable);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iMySQL - дескриптор объекта подключения;

iTable - дескриптор объекта таблицы ts_table, в которую требуется выгрузить результат.

Пример:

int iTable;

object("create", "ts_table", iTable);

ts_dbmysql(iMySQL, "export_to_table", iTable);


free_result

Работа с СУБД MySQL ››

Освободить память от полученного результата.

Когда результат запроса к БД больше не нужен или требуется выполнить новый запрос - освобождаем память.

Вызов:

int ires = ts_dbmysql(iMySQL, "free_result");

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iMySQL - дескриптор объекта подключения;

Пример:

// освободить память результата запроса в подключении у объекта iMySQL
ts_dbmysql(iMySQL, "free_result");


connection_close

Работа с СУБД MySQL ››

Закрыть соединение в объекте подключения, заданном дескриптором.

После закрытия соединения объект можно использовать повторно или для подключения к другим БД.

Вызов:

int ires = ts_dbmysql(iMySQL, "connection_close");

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iMySQL - дескриптор объекта подключения;

Пример:

ts_dbmysql(iMySQL, "connection_close");


Пример - получение таблицы c сайта из базы данных MySQL в диалог ARCHICAD

Работа с СУБД MySQL ››

Сформируем диалог, который покажет таблицу из большой таблицы из базы данных MySQL.

Параметры подключения:

Сервер IP - 31.41.196.220 (или можно указать имя сервера)

Имя пользователя - u0490570

Пароль пользователя - hP2uH9fdsaY2zpA5eA4

Имя базы данных (схемы) - u0490570

Номер порта для подключения (обычно) - 3306;

int iListBox_MD, iButton_Ok_MD;

int iTable_MD;

int iDialog_MD;

int main()

{

int iMySQL;

object("create", "ts_dbmysql", iMySQL);

int ires;

ires = ts_dbmysql(iMySQL, "connection_init");

if (ires != 0) {

return -1;

}

cout << "init success\n";

string server = "31.41.196.220";

string user = "u0490570";

string password = "hP2uH9fdsaY2zpA5eA4";

string basename = "u0490570"; // scheme

int port = 3306;

ires = ts_dbmysql(iMySQL, "connection_open", server, user, password, basename, port);

if (ires != 0) {

return -1;

}

cout << "connection success\n";

// Query

// string query = "SELECT * FROM u0490570_nsi.labpp_mat_table WHERE labpp_mat_short_text = \'Материал м? 2\'";

// string query = "SELECT * FROM u0490570_nsi.labpp_mat_table WHERE labpp_mat_short_text LIKE \'%м?%\'";

string query = "SELECT * FROM u0490570.my_table";

int j = 0;

ires = ts_dbmysql(iMySQL, "real_query", query);

if (ires != 0) {

return -1;

}

cout << "query success\n";

ires = ts_dbmysql(iMySQL, "store_result");

if (ires != 0) {

return -1;

}

cout << "store result success\n";

ires = ts_dbmysql(iMySQL, "get_num_fields");

cout << "num fields = " << ires << "\n";

int count;

ires = ts_dbmysql(iMySQL, "get_row_count",count);

cout << "row count = " << count << "\n";

int iTable;

object("create", "ts_table", iTable);

ts_dbmysql(iMySQL, "export_to_table", iTable);

ts_dbmysql(iMySQL, "free_result");

ts_dbmysql(iMySQL, "connection_close");

object("delete", iMySQL);

// Create Dialog

int x, y, w, h, offset;

object("create", "ts_dialog", iDialog_MD);

ts_dialog(iDialog_MD, "init_dialog", "palette", 0, 0, 350, 400);

ts_dialog(iDialog_MD, "set_as_main_panel");

ts_dialog(iDialog_MD, "SetGrowType", 3);

ts_dialog(iDialog_MD, "SetTitle", "Наменования материалов для заказчика");

object("create", "ts_dialogcontrol", iListBox_MD, "iListBox_MD");

ts_dialogcontrol(iListBox_MD, "init_control", "singlesellistbox", iDialog_MD, 5, 5, 340, 350, 48, 20);

ts_dialogcontrol(iListBox_MD, "SetAnchorToPanelResize", 0, 0, 1, 1);

ts_table(iTable, "set_columns_width_when_export", 100);

ts_table(iTable, "mapping_columns_to_export",

"id", "№", "",

"_IDRRef","Идентификатор","",

"_Description","Наименование для заказчика", "",

"_ParentIDRRef","Идентификатор родителя", ""

);

ts_table(iTable, "export_to_dialogcontrol", iListBox_MD, -1, -1);

x = 10;

w = 98;

int delta = 10;

x = x + w + delta;

y = 370;

h = 20;

x = x + w + delta;

object("create", "ts_dialogcontrol", iButton_Ok_MD, "iButton_Ok_MD");

ts_dialogcontrol(iButton_Ok_MD, "init_control", "button", iDialog_MD, x, y, w, h);

ts_dialogcontrol(iButton_Ok_MD, "eventreaction", "Event_ButtonClicked", "Event_ButtonClicked_MD");

ts_dialogcontrol(iButton_Ok_MD, "settext", "Ok");

ts_dialogcontrol(iButton_Ok_MD, "SetAnchorToPanelResize", 1, 1, 0, 0);

bool bres;

ts_dialog(iDialog_MD, "invoke", bres);

//<-

object("delete", iTable);

}

int Event_ButtonClicked_MD(int iDescr, string sDescr)

{

if (sDescr == "iButton_Ok_MD") {

ts_dialog(iDialog_MD, "SendCloseRequest");

}

}


Работа с СУБД PostgreSQL

Имеется возможность подключать базы данных PostgreSQL непосредственно из текста программ LABPP.

Скачайте с сайта PostgreSQL файлы:

  1. libiconv-2.dll
  2. libintl-9.dll
  3. libpq.dll
  4. libwinpthread-1.dll

и поместите их в каталог ARCHICAD.


init

Работа с СУБД PostgreSQL ››

Инициализация объекта для присоединения к БД PostgreSQL из ARCHICAD
Вызов:
int ires = ts_dbpostgresql(int iPostgreSQL, "init");
Здесь:
ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения инициализации.
iPostgreSQL - дескриптор объекта подключения.

Пример:

int iPostgreSQL;
object("create", "ts_dbpostgresql", iPostgreSQL);
int ires;
ires = ts_dbpostgresql(iPostgreSQL, "init");
if (ires != 0) {
return -1;
}
cout << "init success\n";


pqconnectdb

Работа с СУБД PostgreSQL ››

Открыть коннект с базой данных (присоедититься к БД).

Вызов:

int ires = ts_dbpostgresql(iPostgreSQL, "pqconnectdb", string connectstring);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iPostgreSQL - дескриптор объекта подключения;

connectstring - строка подключения к базе данных;

Пример:

ires = ts_dbpostgresql(iPostgreSQL, "pqconnectdb", "user=postgres password=Ts0020010 host=localhost port=5432 dbname=postgres target_session_attrs=read-write");
if (ires != 0) {
return -1;
}
cout << "connection success\n";


pqexec

Работа с СУБД PostgreSQL ››

Выполнить запрос к базе данных.

Запрос может выполняться с использованием символов unicode (например м?).

Результат запроса далее может быть получен, например, в виде таблицы ts_table.

Вызов:

int ires = ts_dbpostgresql(iPostgreSQL, "pqexec", string query);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iPostgreSQL - дескриптор объекта подключения;

query - текст запроса к базе данных на языке SQL;

Пример:

string query = "DECLARE myportal CURSOR FOR select * from pg_type"; // запросить все записи из таблицы pq_type и создать курсор myportal
int j = 0;
ires = ts_dbpostgresql(iPostgreSQL, "pqexec", query);
if (ires != 0) {
return -1;
}
cout << "query success\n";


pqnfields

Работа с СУБД PostgreSQL ››

Получить количество колонок в результате запроса.

Вызов:

int ires = ts_dbpostgressql(iPostgreSQL, "pqnfields");

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iPostgreSQL - дескриптор объекта подключения;

Пример:

ires = ts_dbpostgresql(iPostgreSQL, "pqnfields");
cout << "num fields = " << ires << "\n";


pqntuples - кол-во строк

Работа с СУБД PostgreSQL ››

Получить количество строк в результате запроса.

Вызов:

int ires = ts_dbpostgresql(iPostgreSQL, "pqntuples", count);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iPostgreSQL - дескриптор объекта подключения;

count - возвращает количество строк в полученной таблице.

Пример:

int count;

ires = ts_dbpostgresql(iPostgreSQL, "pqntuples",count);

cout << "row count = " << count << "\n";


export_to_table

Работа с СУБД PostgreSQL ››

Выгрузить результат, полученный по запросу из базы данных, в таблицу ts_table.

Вызов:

Чтобы получить всю таблицу запроса и типы колонок в таблице расставить в соответствии с типами данных в запросе:

int ires = ts_dbpostgresql(iPostgreSQL, "export_to_table", int iTable);

Чтобы получить только требуемые колонки из запроса и задать тип данных принудительно:

int ires = ts_dbpostgresql(iPostgreSQL, "export_to_table", int iTable, int/string colname1, string labppcoltype1, int/string colname2, string labppcoltype2, ...);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iPostgreSQL - дескриптор объекта подключения;

iTable - дескриптор объекта таблицы ts_table, в которую требуется выгрузить результат.

int/string colname - индекс или наименование колонки запроса

Пример:

int iTable;

object("create", "ts_table", iTable);

// вариант 1

ts_dbpostgresql(iPostgreSQL, "export_to_table", iTable);

// вариант 2

ts_dbpostgresql(iPostgreSQL, "export_to_table", iTable, "id","string","count","int",5,"double");


pqclear

Работа с СУБД PostgreSQL ››

Освободить память от полученного результата.

Когда результат запроса к БД больше не нужен или требуется выполнить новый запрос - освобождаем память.

Вызов:

int ires = ts_dbpostgresql(iPostgreSQL, "pqclear");

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения;
iPostgreSQL - дескриптор объекта подключения;

Пример:

// освободить память результата запроса в подключении у объекта iMySQL
ts_dbpostgresql(iPostgreSQL, "clear");


pqfinish

Работа с СУБД PostgreSQL ››

Закрыть соединение в объекте подключения, заданном дескриптором.

После закрытия соединения объект можно использовать повторно или для подключения к другим БД.

Вызов:

int ires = ts_dbpostgresql(iPostgreSQL, "pqfinish");

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iPostgreSQL - дескриптор объекта подключения;

Пример:

ts_dbpostgresql(iPostgreSQL, "pqfinish");


Пример - получение таблицы c сайта из базы данных PostgreSQL в диалог ARCHICAD

Работа с СУБД PostgreSQL ››

Сформируем диалог, который покажет таблицу из большой таблицы из базы данных PostgreSQL.

Параметры подключения:

Сервер - localhost

Имя пользователя - labpp_user_ivanov

Пароль пользователя - pspsps

Имя базы данных (схемы) - LABPP_ERM

Номер порта для подключения (обычно) - 5432;

int iListBox_MD, iButton_Ok_MD;

int iTable_MD;

int iDialog_MD;

int main()
{
int iPostgreSQL;
object("create", "ts_dbpostgresql", iPostgreSQL);
int ires;
ires = ts_dbpostgresql(iPostgreSQL, "init");
if (ires != 0) {
return -1;
}
cout << "init success\n";

ires = ts_dbpostgresql(iPostgreSQL, "pqconnectdb", "user=labpp_user_ivanov password=pspsps host=localhost port=5432 dbname=LABPP_ERM target_session_attrs=read-write");
if (ires != 0) {
return -1;
}
cout << "connection success\n";

ires = ts_dbpostgresql(iPostgreSQL, "pqexec", "BEGIN");
if (ires != 0) {
return -1;
}
cout << "begin transaction success\n";

ts_dbpostgresql(iPostgreSQL, "pqclear");

ires = ts_dbpostgresql(iPostgreSQL, "pqexec", "DECLARE myportal CURSOR FOR select * from pg_type");
if (ires != 0) {
return -1;
}
cout << "creating cursor success\n";
ts_dbpostgresql(iPostgreSQL, "pqclear");

ires = ts_dbpostgresql(iPostgreSQL, "pqexec", "FETCH ALL in myportal");
if (ires != 0) {
return -1;
}
cout << "fitch all success\n";

int nfields = ts_dbpostgresql(iPostgreSQL, "pqnfields");
coutvar << nfields;

int ntuples = ts_dbpostgresql(iPostgreSQL, "pqntuples");
coutvar << ntuples;
// Считываем в таблицу
int iTable;
object("create", "ts_table", iTable);
ts_dbpostgresql(iPostgreSQL, "export_to_table", iTable);
string sstr;
ts_table(iTable, "print_to_str", sstr);
coutvar << sstr;
//
ts_dbpostgresql(iPostgreSQL, "pqclear");

ires = ts_dbpostgresql(iPostgreSQL, "pqexec", "CLOSE myportal");
if (ires != 0) {
return -1;
}
cout << "close portal success\n";

ts_dbpostgresql(iPostgreSQL, "pqclear");

ires = ts_dbpostgresql(iPostgreSQL, "pqexec", "END");
if (ires != 0) {
return -1;
}
cout << "end transaction success\n";

ts_dbpostgresql(iPostgreSQL, "pqclear");

// Create Dialog
int x, y, w, h, offset;

object("create", "ts_dialog", iDialog_MD);
ts_dialog(iDialog_MD, "init_dialog", "palette", 0, 0, 350, 400);
ts_dialog(iDialog_MD, "set_as_main_panel");
ts_dialog(iDialog_MD, "SetGrowType", 3);

ts_dialog(iDialog_MD, "SetTitle", "Наменования материалов для заказчика");

object("create", "ts_dialogcontrol", iListBox_MD, "iListBox_MD");

ts_dialogcontrol(iListBox_MD, "init_control", "singlesellistbox", iDialog_MD, 5, 5, 340, 350, 48, 20);
ts_dialogcontrol(iListBox_MD, "SetAnchorToPanelResize", 0, 0, 1, 1);

ts_table(iTable, "set_columns_width_when_export", 100);

ts_table(iTable, "export_to_dialogcontrol", iListBox_MD, -1, -1);

x = 10;
w = 98;
int delta = 10;
x = x + w + delta;
y = 370;
h = 20;

x = x + w + delta;
object("create", "ts_dialogcontrol", iButton_Ok_MD, "iButton_Ok_MD");
ts_dialogcontrol(iButton_Ok_MD, "init_control", "button", iDialog_MD, x, y, w, h);
ts_dialogcontrol(iButton_Ok_MD, "eventreaction", "Event_ButtonClicked", "Event_ButtonClicked_MD");
ts_dialogcontrol(iButton_Ok_MD, "settext", "Ok");
ts_dialogcontrol(iButton_Ok_MD, "SetAnchorToPanelResize", 1, 1, 0, 0);

bool bres;
ts_dialog(iDialog_MD, "invoke", bres);

//<-
object("delete", iTable);
object("delete", iPostgreSQL);
}

int Event_ButtonClicked_MD(int iDescr, string sDescr)
{
if (sDescr == "iButton_Ok_MD") {
ts_dialog(iDialog_MD, "SendCloseRequest");
}
}


Работа с СУБД SQLite

Имеется возможность подключать базы данных SQLite непосредственно из текста программ LABPP.

Скачайте с сайта SQLite файл sqlite3.dll и поместите его в каталог ARCHICAD.


init

Работа с СУБД SQLite ››

Инициализация объекта для присоединения к БД SQLite из ARCHICAD
Вызов:
int ires = ts_dbsqlite(int iSQLite, "init");
Здесь:
ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения инициализации.
iSQLite - дескриптор объекта подключения.

Пример:

int iSQLite;
object("create", "ts_dbsqlite", iSQLite);
int ires;
ires = ts_dbsqlite(iSQLite, "init");
if (ires != 0) {
return -1;
}
cout << "init success\n";


open_db

Работа с СУБД SQLite ››

Открыть коннект с базой данных (присоедититься к БД).

Вызов:

int ires = ts_dbsqlite(iSQLite, "open_db", string connectstring);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iSQLite - дескриптор объекта подключения;

connectstring - строка подключения к базе данных;

Пример:

ires = ts_dbsqlite(iSQLite, "open_db", ""E:/Work/ЛПП2402-SQLite/q.db"");
if (ires != 0) {
return -1;
}
cout << "connection success\n";


prepare_v2_query - запрос к базе данных

Работа с СУБД SQLite ››

Выполнить запрос к базе данных.

Запрос может выполняться с использованием символов unicode (например м?).

Результат запроса далее может быть получен, например, в виде таблицы ts_table.

Вызов:

int ires = ts_dbqlite(iSQLite, "", string query);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iSQLite - дескриптор объекта подключения;

query - текст запроса к базе данных на языке SQL;

Пример:

string query = string query = "select * from my_first where (id <= 10000)OR(id >= 90000)";
int j = 0;
ires = ts_dbsqlite(iSQLite, "prepare_v2_query", query);
if (ires != 0) {
return -1;
}
cout << "query success\n";


column_count

Работа с СУБД SQLite ››

Получить количество колонок в результате запроса.

Вызов:

int ires = ts_dbsqlite(iSQLite, "column_count");

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iSQLite - дескриптор объекта подключения;

Пример:

ires = ts_dbsqlite(iSQLite, "column_count");
cout << "num fields = " << ires << "\n";


row_count

Работа с СУБД SQLite ››

Получить количество строк в результате запроса.

Вызов:

int ires = ts_dbsqlite(iSQLite, "row_count", count);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iSQLite - дескриптор объекта подключения;

count - возвращает количество строк в полученной таблице.

Пример:

int count;
ires = ts_dbsqlite(iSQLite, "row_count",count);
cout << "row count = " << count << "\n";


export_to_table

Работа с СУБД SQLite ››

Выгрузить результат, полученный по запросу из базы данных, в таблицу ts_table.

Вызов:

Чтобы получить всю таблицу запроса и типы колонок в таблице расставить в соответствии с типами данных в запросе:

int ires = ts_dbsqlite(iSQLite, "export_to_table", int iTable);

Чтобы получить только требуемые колонки из запроса и задать тип данных принудительно:

int ires = ts_dbsqlite(iSQLite, "export_to_table", int iTable, int/string colname1, string labppcoltype1, int/string colname2, string labppcoltype2, ...);

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iSQLite - дескриптор объекта подключения;

iTable - дескриптор объекта таблицы ts_table, в которую требуется выгрузить результат.

int/string colname - индекс или наименование колонки запроса

Пример:

int iTable;

object("create", "ts_table", iTable);

// вариант 1

ts_dbsqlite(iSQLite, "export_to_table", iTable);

// вариант 2

ts_dbsqlite(iSQLite, "export_to_table", iTable, "id","string","count","int",5,"double");


finalize_stmt

Работа с СУБД SQLite ››

Освободить память от полученного результата.

Когда результат запроса к БД больше не нужен или требуется выполнить новый запрос - освобождаем память.

Вызов:

int ires = ts_dbsqlite(iSQLite, "finalize_stmt");

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения;
iSQLite - дескриптор объекта подключения;

Пример:

// освободить память результата запроса в подключении у объекта iSQLite
ts_dbsqlite(iSQLite, "finalize_stmt");


close_db

Работа с СУБД SQLite ››

Закрыть соединение в объекте подключения, заданном дескриптором.

После закрытия соединения объект можно использовать повторно или для подключения к другим БД.

Вызов:

int ires = ts_dbsqlite(iSQLite, "close_db");

Здесь:

ires = возвращаемое значение -1/0 - в случае ошибки/успешного выполнения операции;
iSQLite - дескриптор объекта подключения;

Пример:

ts_dbsqlite(iPostgreSQL, "close_db");


Пример - получение таблицы c сайта из базы данных PostgreSQL в диалог ARCHICAD

Работа с СУБД SQLite ››

Сформируем диалог, который покажет таблицу из большой таблицы из базы данных SQLite.

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

int iListBox_MD, iButton_Ok_MD;
int iTable_MD;
int iDialog_MD;

int main()
{
int iSQLite;
object("create", "ts_dbsqlite", iSQLite);
int ires;
ires = ts_dbsqlite(iSQLite, "init");
if (ires != 0) {
return -1;
}
cout << "init success\n";
ires = ts_dbsqlite(iSQLite, "open_db", "E:/Work/ЛПП2402-SQLite/q.db");
if (ires != 0) {
return -1;
}
cout << "connection success\n";

string query = "select * from my_first where (id <= 10000)OR(id >= 90000)";

int j = 0;

ires = ts_dbsqlite(iSQLite, "prepare_v2_query", query);
if (ires != 0) {
return -1;
}
cout << "query success\n";

ires = ts_dbsqlite(iSQLite, "column_count");
cout << "num fields = " << ires << "\n";

int iTable;
object("create", "ts_table", iTable);

ts_dbsqlite(iSQLite, "export_to_table", iTable, 0,"string",1,"string", 2, "string");
string sstr;
ts_table(iTable, "print_to_str", sstr);
coutvar << sstr;

ts_dbsqlite(iSQLite, "finalize_stmt");
ts_dbsqlite(iSQLite, "close_db");

// Create Dialog
int x, y, w, h, offset;

object("create", "ts_dialog", iDialog_MD);
ts_dialog(iDialog_MD, "init_dialog", "palette", 0, 0, 350, 400);
ts_dialog(iDialog_MD, "set_as_main_panel");
ts_dialog(iDialog_MD, "SetGrowType", 3);

ts_dialog(iDialog_MD, "SetTitle", "Наменования материалов для заказчика");

object("create", "ts_dialogcontrol", iListBox_MD, "iListBox_MD");

ts_dialogcontrol(iListBox_MD, "init_control", "singlesellistbox", iDialog_MD, 5, 5, 340, 350, 48, 20);
ts_dialogcontrol(iListBox_MD, "SetAnchorToPanelResize", 0, 0, 1, 1);

ts_table(iTable, "set_columns_width_when_export", 100);

ts_table(iTable, "export_to_dialogcontrol", iListBox_MD, -1, -1);

x = 10;
w = 98;
int delta = 10;
x = x + w + delta;
y = 370;
h = 20;

x = x + w + delta;
object("create", "ts_dialogcontrol", iButton_Ok_MD, "iButton_Ok_MD");
ts_dialogcontrol(iButton_Ok_MD, "init_control", "button", iDialog_MD, x, y, w, h);
ts_dialogcontrol(iButton_Ok_MD, "eventreaction", "Event_ButtonClicked", "Event_ButtonClicked_MD");
ts_dialogcontrol(iButton_Ok_MD, "settext", "Ok");
ts_dialogcontrol(iButton_Ok_MD, "SetAnchorToPanelResize", 1, 1, 0, 0);

bool bres;
ts_dialog(iDialog_MD, "invoke", bres);

//<-
object("delete", iTable);
object("delete", iSQLite);
}

int Event_ButtonClicked_MD(int iDescr, string sDescr)
{
if (sDescr == "iButton_Ok_MD") {
ts_dialog(iDialog_MD, "SendCloseRequest");
}
}


Искусственный интеллект

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen

Искусственный интеллект ››

В LABPP имеется встроенный механизм на основе многослойного перцептрона Розенблатта с обратным распределением ошибки.

Это один из самых удачных вариантов инструмента искусственного интеллекта.

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

Может обучаться, загружать и выгружать результаты обучения, выполнять тестирование задач по одной или списком.

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


init

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ››

Инициализация перцептрона.

Вызов:

int ires = ts_aipercrozen(int iPercRozen, "init", int in1,int in2,int inn,int out);

Здесь:

ires = -1 или 0, если нет ошибки.

iPercRozen - дескриптор объекта перцептрона.

int in1 .... out - числовые характеристики слоев перцептрона.

Пример.

Инициировать перцептрон 500:2 со слоями нейронов:

Индекс слоя | Входные нейроны | Выходные нейроны
0 | 500 | 200
1 | 200 | 50
2 | 50 | 5
3 | 5 | 2

int iPercRozen;
object("create","ts_percrozen",iPercRozen);
int ires = ts_aipercrozen(int iPercRozen, "init", 500, 200, 50, 5, 2);


task_add_to_list

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ››

Добавить задачу для решения или обучения в список задач.

Объект перцептрона имеет внутренний список задач.

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

Перед обучением мы создаем наборы входных значений с соответствующим набором желаемых значений на выходе.

Вызов:

int ires = ts_aipercrozen(int iPercRozen, "task_add_to_list", string taskname, int iTableIN, int iTableOUT);

Здесь:

ires - отрицательное значение или 0, в случае успешного выполнения;

taskname - имя задачи;

iTableIN - плоская таблица в одну колонку с набором числовых входных параметров типа double;

iTableOUT - плоская таблица в одну колонку с набором числовых желаемых выходных параметров для обучения.

Пример.

Задать две задачи для обучения перцептрона на 200 входных и 2 выходных нейрона. Провести обучение с обратным распределением ошибки и вывести результаты в окно сообщений.

int iTable11;

object("create", "ts_table", iTable11);

ts_table(iTable11, "add_column", 0, "double", "Вход");

int i, icount;

icount = 200;

for (i = 0; i < icount; i++)

{

ts_table(iTable11, "add_row", 0, i+1);

}

int iTable12;

object("create", "ts_table", iTable12);

ts_table(iTable12, "add_column", 0, "double", "Выход для обучения");

ts_table(iTable12, "add_column", 1, "double", "Выход реальный");

ts_table(iTable12, "add_row", 0, 0.77, 1,0);

ts_table(iTable12, "add_row", 0, 0.88, 1,0);

ts_aipercrozen(iPercRozen, "task_add_to_list", "Задача 1", iTable11, iTable12);

int iTable1;

object("create", "ts_table", iTable21);

ts_table(iTable21, "add_column", 0, "double", "Вход");

icount = 200;

for (i = 0; i < icount; i++)

{

ts_table(iTable21, "add_row", 0, 100 - i);

}

int iTable22;

object("create", "ts_table", iTable22);

ts_table(iTable22, "add_column", 0, "double", "Выход для обучения");

ts_table(iTable22, "add_column", 1, "double", "Выход реальный");

ts_table(iTable22, "add_row", 0, 0.55, 1, 0);

ts_table(iTable22, "add_row", 0, 0.77, 1, 0);

ts_aipercrozen(iPercRozen, "task_add_to_list", "Задача 2", iTable21, iTable22);

ts_aipercrozen(iPercRozen, "learn_task_list", 200000);

ts_aipercrozen(iPercRozen, "run_task_list");

ts_aipercrozen(iPercRozen, "get_task_result_to_table", 0, iTable12,false,1);

string str;

ts_table(iTable12, "print_to_str", str);

coutvar << str;

ts_aipercrozen(iPercRozen, "get_task_result_to_table", 1, iTable22,false,1);

ts_table(iTable22, "print_to_str", str);

coutvar << str;


learn_task_list

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ››

Выполнить обучение перцептрона на заранее заданном списке задач c эталонными желаемыми выходными значениями.

Вызов:

int ires = ts_aipercrozen(int iPercRozen, "learn_task_list", int learncount);

Здесь:

ires - отрицательное значение или 0, при успешном выполнении обучения;

iPercRozen - дескриптор объекта перцептрона;

learncount - число итераций обучения с обратным распределением ошибки.


run_task_list

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ››

Получить результаты для заранее заданного списка задач.

Вызов:

int ires = ts_aipercrozen(iPercRozen, "run_task_list");

Здесь:

ires - отрицательное значение или 0 при успешном выполении.


get_task_result_to_table

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ››

Вывести результат выполнения задачи в таблицу.

Вызов:

int ires = ts_aipercrozen(int iPercRozen, "get_task_result_to_table", int iTaskIndex, int iTableOUT, bool bDoClearTable, int iColumnIndex);

Здесь:

ires - минус или 0 при успешном выполнении;

iPercRozen - дескриптор объекта перцептрона;

iTaskIndex - индекс задачи в списке заранее подготовленных задач;

iTableOUT - дескриптор выходной таблицы;

bDoClearTable - если истина, то таблица перед заполнением результатами полностью очищается;

В ином случае данные типа double дополняются в колонку с индексом iColumnIndex.

Число строк должно соответствовать числу выходных нейронов.

iColumnIndex - индекс колонки таблицы, куда выводить результат если не задана очистка таблицы.


task_list_clear

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ››

Очистить список задач у заданного объекта перцептрона.

Вызов:

ts_aipercrozen(int iPercRozen, "task_list_clear");

Здесь:

iPercRozen - дескриптор объекта перцептрона.


store_matrices и restore_matrices

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ››

Запомнить матрицы весов во внутреннем буфере перцептрона. Восстановить матрицы весов из внутреннего буфера перцептрона.

При обучении перцептрон настраивает весовые коэффициенты. Так можно временно сохранить их не тронутыми при следующих итерациях обучения.

Вызов:

ts_aipercrozen(iPercRozen, "store_matrices");
ts_aipercrozen(iPercRozen, "restore_matrices");


clear

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ››

Освободить память.

Операция выполняется автоматически перед новым вызовом init или при удалении объекта.

Вызов:

ts_aipercrozen(iPercRozen, "clear");


ts_aipercrozen_matrices

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ››

Объект для хранения и операций с матрицами весовых коэффициентов перцептрона Розенблатта.


init

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ›› ts_aipercrozen_matrices ››

Инициализация объекта матриц перцептрона.

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

Вызов:

int ires = ts_aipercrozen_matrices(int iPercRozenMatrices, "init", int in1,int in2,int inn,int out);

Здесь:

ires = -1 или 0, если нет ошибки.

iPercRozenMatrices - дескриптор объекта матриц перцептрона.

int in1 .... out - числовые характеристики слоев перцептрона.


get_from_percrozen

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ›› ts_aipercrozen_matrices ››

Получить матрицы из существующего перцептрона.

Вызов:

int ires = ts_aipercrozen_matrices(int iPercRozenMatrices, "get_from_percrozen", int iPercRozen);

Здесь:

ires = -1 или 0, если нет ошибки;

iPercRozenMatrices - дескриптор объекта матриц перцептрона;

iPercRozen - дескриптор существующего перцептрона.

Пример:

int iPercRozenMatrices;
object("create", "ts_aipercrozen_matrices", iPercRozenMatrices);
ts_aipercrozen_matrices(iPercRozenMatrices, "get_from_percrozen", iPercRozen);


set_to_percrozen

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ›› ts_aipercrozen_matrices ››

Записать матрицы весовых коэффициентов в существующий перцептрон.

Вызов:

int ires = ts_aipercrozen_matrices(int iPercRozenMatrices, "set_to_percrozen", int iPercRozen);

Здесь:

ires = -1 или 0, если нет ошибки;

iPercRozenMatrices - дескриптор объекта матриц перцептрона;

iPercRozen - дескриптор существующего перцептрона.

Пример:

Получить матрицы из базы данных и записать в перцептрон.

int iPercRozenMatrices;
object("create", "ts_aipercrozen_matrices", iPercRozenMatrices);

ts_aipercrozen_matrices(iPercRozenMatrices, "load_from_PostgreSQL", iPercRozen, iDBPostgreSQL, sTableName, percGUID);
ts_aipercrozen_matrices(iPercRozenMatrices, "set_to_percrozen", iPercRozen);

ts_aipercrozen_matrices(iPercRozenMatrices, "set_to_percrozen", iPercRozen);


export_to_table

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ›› ts_aipercrozen_matrices ››

Передать матрицы весовых коэффициентов в таблицу ts_table.

Вызов:

int ires = ts_aipercrozen_matrices(int iPercRozenMatrices, "export_to_table", int iTable);

Здесь:

ires = -1 или 0, если нет ошибки;

iPercRozenMatrices - дескриптор объекта матриц перцептрона;

iTable - дескриптор таблицы.

Структура таблицы при выполнении операции формируется автоматически.

Номер слоя | Число входных нейронов | Число выходных нейронов | Весовой коэффициент W1 | Веловой коэффициент W... | Весовой коэффициент Wn
0 | 100 | 30 | 1.2 | ... | ...
0 | 100 | 30 | ... | ... | ...
... | ... | ... | ... | ... | ...
1 | 30 | 10 | 0.000123 | ... | ...

Пример:

int iTableMatrices;
object("create", "ts_table", iTableMatrices);
ts_aipercrozen_matrices(iPercRozenMatrices, "export_to_table", iTableMatrices);


import_from_table

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ›› ts_aipercrozen_matrices ››

Получить матрицы весовых коэффициентов из таблицы ts_table.

Обычно используется для загрузки/выгрузки опыта ИИ в базы данных, текстовые файлы, JSON конструкции и т.п.

Вызов:

int ires = ts_aipercrozen_matrices(int iPercRozenMatrices, "import_from_table", int iTable);

Здесь:

ires = -1 или 0, если нет ошибки;

iPercRozenMatrices - дескриптор объекта матриц перцептрона;

iTable - дескриптор таблицы.

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

При обнаружении несоответствия структуры данных программа выдает ошибку.

Номер слоя | Число входных нейронов | Число выходных нейронов | Весовой коэффициент W1 | Веловой коэффициент W... | Весовой коэффициент Wn
0 | 100 | 30 | 1.2 | ... | ...
0 | 100 | 30 | ... | ... | ...
... | ... | ... | ... | ... | ...
1 | 30 | 10 | 0.000123 | ... | ...

Пример:

ts_aipercrozen_matrices(iPercRozenMatrices, "import_from_table", iTableMatrices);


clear

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ›› ts_aipercrozen_matrices ››

Освободить память.

Операция выполняется автоматически перед новым вызовом init или при удалении объекта.

Вызов:

ts_aipercrozen_matrices(iPercRozen, "clear");


Пример

Искусственный интеллект ›› Нейросеть на основе перцептрона Розенблатта - ts_aipercrozen ››

int main()

{

int iPercRozen;

object("create", "ts_aipercrozen", iPercRozen);

ts_aipercrozen(iPercRozen, "init", 200,100,10,5,2);

int iTable11;

object("create", "ts_table", iTable11);

ts_table(iTable11, "add_column", 0, "double", "Вход");

int i, icount;

icount = 200;

for (i = 0; i < icount; i++)

{

ts_table(iTable11, "add_row", 0, i+1);

}

int iTable12;

object("create", "ts_table", iTable12);

ts_table(iTable12, "add_column", 0, "double", "Выход для обучения");

ts_table(iTable12, "add_column", 1, "double", "Выход реальный");

ts_table(iTable12, "add_row", 0, 0.77, 1,0);

ts_table(iTable12, "add_row", 0, 0.88, 1,0);

ts_aipercrozen(iPercRozen, "task_add_to_list", "Задача 1", iTable11, iTable12);

int iTable21;

object("create", "ts_table", iTable21);

ts_table(iTable21, "add_column", 0, "double", "Вход");

icount = 200;

for (i = 0; i < icount; i++)

{

ts_table(iTable21, "add_row", 0, 200 - i);

}

int iTable22;

object("create", "ts_table", iTable22);

ts_table(iTable22, "add_column", 0, "double", "Выход для обучения");

ts_table(iTable22, "add_column", 1, "double", "Выход реальный");

ts_table(iTable22, "add_row", 0, 0.88, 1, 0);

ts_table(iTable22, "add_row", 0, 0.77, 1, 0);

ts_aipercrozen(iPercRozen, "task_add_to_list", "Задача 2", iTable21, iTable22);

ts_aipercrozen(iPercRozen, "learn_task_list", 200000);

ts_aipercrozen(iPercRozen, "run_task_list");

ts_aipercrozen(iPercRozen, "get_task_result_to_table", 0, iTable12,false,1);

string str;

ts_table(iTable12, "print_to_str", str);

coutvar << str;

ts_aipercrozen(iPercRozen, "get_task_result_to_table", 1, iTable22,false,1);

ts_table(iTable22, "print_to_str", str);

coutvar << str;

object("delete", iTable11);

object("delete", iTable12);

object("delete", iTable21);

object("delete", iTable22);

object("delete", iPercRozen);

}


BIM Master

BIM Master - это удобный многооконный многофункциональный инструмент, который позволяет получать, анализировать и изменять данные в элементах.

Можно открывать несколько окон для сравнения информации.

Окно может хранить и отображать информацию из одного и того же или из разных элементов для разных значений параметров.

BIM Master используется в качестве отладчика в программах LABPP_Automat.

В тексте программы можно указывать директиву breakpoint() для получения слепка данных на момент выполнения этой команды в программе.

Отладчик с фунциями браузера позволяет просматривать и изменять информацию у элементов.

Вы можете, например, увидеть значения параметров (в том числе заданных формулами), значения параметров GDL элементов, IFC свойства и т.д.

Отладчик с функциями браузера данных элементов вызывается сочетанием клавиш

Ctrl+Shift+F9

Для просмотра данных об элементе выберите его в окне и нажмите кнопку

Окно считает данные из элемента.

Обратите внимание, чтобы был выделен только один элемент.

Если было выделено несколько элементов, то данные будут показаны из первого элемента в группе.

Окно запоминает элемент.

Подсветить считанный элемент можно узкой кнопкой в левом нижнем углу.

Второй слева кнопкой можно повторно считать данные из того же элемента.

Чтобы показать данные сразу нескольких элементов можно вызвать сколько угодно отладчика.

Второе и последующие окна открываются если в остальных окнах кнопка [image] находится в положении [image] .

Тогда нажатие сочетания Ctrl+Shift+F9 вызовет еще одно окно и т.д.


breakpoint

BIM Master ››

Открыть BIM Master'а из программы в качестве отладчика.

Вызов:

breakpoint(int icondition);

или

breakpoint(int icondition, bool/int/double/string condition2);

Здесь:

icondition - любое целое число. Окно BIM Master будет вызываться если в нем указано это же число в поле


programcodegen

BIM Master ››


get_bimmaster_cur_selected_parameter_info

BIM Master ›› programcodegen ››

Получить из панели BIM Master информацию о выбранном параметре.

Вызов:

programcodegen("get_bimmaster_cur_selected_parameter_info", string genesis, string v_type, string varname, string svalue, string sdescription, string sgroup);

Здесь:

genesis - генезис переменной (что это - пользовательский параметр, GDL параметр и т.п.)

v_type - тип переменной

"string" | Строка
"real" | Число
"integer" | Целое число
"boolean" | Логическая переменная

varname - наименование переменной

svalue - значение переменной

sdescription - описание переменной

sgroup - группа переменной


get_bimmaster_cur_element_guidastext

BIM Master ›› programcodegen ››

Вызвать BIM Master для элемента с заданным текстовым GUID.

Вызов:

programcodegen("get_bimmaster_cur_element_guidastext", string sGUIDAsText);

Здесь:

sGUIDAsText - GUID, заданный текстом, элемента, данные которого необходимо отразить в панели BIM Master.


show_bimmaster_as_codegen

BIM Master ›› programcodegen ››

Вызвать BIM Master в качестве генератора программного кода.

Вызов:

programcodegen("show_bimmaster_as_codegen");


show_bimmaster

BIM Master ›› programcodegen ››

Вызывает панель BIM Master в обычном режиме для инспектирования данных.

Вызов:

programcodegen("show_bimmaster");


Уроки

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Вычислить середину высоты элемента Морф относительно 0 проекта и записать в поле LabPP_Calc

Уроки ››

Скачать файл можно здесь .

// Урок 1

// Для начала - в проекте АРХИКАД создать элемент типа Морф.

// задать ему классификатор "Лестница" по классификации "Классификация ARCHICAD"

// выбрать его

// открыть LabPP_Calc

// открыть в нем правой нижней маленькой кнопкой окно сообщений

// второй справа нижней маленькой кнопкой запустить этот программный модуль средствами LabPP_Calc

// Результат - в расчетное поле "a" калькулятора запишется высота середины элемента Морф а в комментарий - его ID

// Задание 1

// Сделать так, чтобы значение записывалось во второе поле

// Задание 2

// Создать в классификаторе "Классификация ARCHICAD" класс "Отделка стен".

// Присвоить этот класс элементу Морф

// Сделать так, чтобы в поле LabPP_Calc записывалась середина высоты этого элемента.

// Подсказка: при выборке элементов из проекта - слово "Лестница" надо на что-то заменить

// Задание 3

// Результат перед записью в поле увеличить на 10% (умножить на 1.1)

int main()

{

// загрузить из проекта в список 1 все элементы, у которых присвоено любое значение классификатора ARCHICAD

ac_request_special("add_elements_list_from_selection", 1, "MorphType", 2,

"", "Cls", "Классификация ARCHICAD", "=", "Лестница", "");

// запросить количество собранных элементов

ac_request("get_loaded_elements_list_count", 1);

int icount = ac_getnumvalue(); // получить количество в переменную

coutvar << icount; // вывести в окно сообщений

if (icount == 0)

{

cout << "В списке нет элементов";

return -1;

}

// объявляем необходимые переменные для работы

double dLevel, dHeight, elemlevel, elemprojectlevel;

string sElemTypeName, sID;

int ielemstoryindex;

int i;

int ires;

// выполнить цикл icount раз

// в нашем случае нам нужен один элемент, поэтому отработаем цикл только 1 раз на элементе с индексом 0

icount = 1;

for (i = 0; i < icount; i++)

{

ires = ac_request("set_current_element_from_list", 1, i); // сделать текущим i-вый элемент из списка 1

ires = ac_request("get_element_value", "Level"); // запрашиваем значение свойства Level (для Морф - высота над уровнем его этажа)

dLevel = ac_getnumvalue(); // получаем его в переменную

coutvar << dLevel; // выводим в окно сообщений

ires = ac_request("get_quantity_value", "max_height"); // запрашиваем максимальный размер Морф по вертикали

dHeight = ac_getnumvalue(); // получаем его в переменную

coutvar << dHeight; // выводим в окно сообщений

elemlevel = dLevel + dHeight / 2; // рассчитываем уровень центра Морф по высоте относительно этажа

ac_request("get_element_value", "StoryIndex"); // запрашиваем индекс этажа

ielemstoryindex = ac_getnumvalue(); // получаем индекс этажа в переменную

// получаем высоту центра Морф относительно 0 проекта в переменную elemprojectlevel

ac_request("get_levelfromprojectnull_by_floorindexandlevel", ielemstoryindex, elemlevel, elemprojectlevel);

coutvar << elemprojectlevel; // выводим в окно сообщений

ires = ac_request("get_element_value", "ID"); // запросить ID элемента

sID = ac_getstrvalue(); // получить его в переменную

coutvar << sID; // вывести ID в окно сообщений

}

string svalue = ecvt(elemprojectlevel);

string scomment = "Высота элемента с ID=" + sID + "от 0 проекта";

ac_request("interface", "calc_field", "set", "a", 1, svalue, scomment);

// "a" - здесь имя ячейки у LabPP_Calc куда записать значение. Всего ячеек - a,b,c и main

}


Заполнить таблицу с расчетом плитки по элементам Штриховка и записать общую площадь в поле LabPP_Calc

Уроки ››

Скачать файл можно здесь .

// Урок 2

// Для начала - в проекте АРХИКАД в любом окне разложить штриховки 600х600. Задать им типы штриховок произвольно.

// Поставить там же GDL элемент LABPP_Table.gsm.

// Выделить одновременно все штриховки и элемент таблицы.

// открыть LabPP_Calc

// открыть в нем правой нижней маленькой кнопкой окно сообщений

// второй справа нижней маленькой кнопкой запустить этот программный модуль средствами LabPP_Calc

// Результат - в таблицу запишется список штриховок с названием типа и количеством

// Задание 1

// Переименовать колонку "Название штриховки" в "Тип плитки"

// Задание 2

// Поменять местами колонки.

// Задание 3

// Упорядочить строки по колонке с названием штриховки (см. команду "Sort")

int main()

{

// загрузить из проекта в список 1 все выбранные элементы штриховок

ac_request_special("add_elements_list_from_selection", 1, "HatchType", 2);

// зарузить из проекта в список 2 все выбранные элементы таблиц

ac_request_special("add_elements_list_from_selection", 2, "ObjectType", 2,

"", "EP", "ObjectName", "=", "LABPP_Table", "");

// запросить количество собранных элементов штриховок

ac_request("get_loaded_elements_list_count", 1);

int icount = ac_getnumvalue(); // получить количество в переменную

coutvar << icount; // вывести в окно сообщений

if (icount == 0)

{

cout << "В списке нет элементов штриховок";

return -1;

}

// запросить количество собранных элементов штриховок

ac_request("get_loaded_elements_list_count", 2);

int icountTables = ac_getnumvalue(); // получить количество в переменную

coutvar << icountTables; // вывести в окно сообщений

if (icountTables == 0)

{

cout << "В списке нет элемента таблицы";

return -1;

}

int iTable;

object("create", "ts_table", iTable); // создать таблицу

// Создаем колонки таблицы

ts_table(iTable, "add_column", 0, "string", "Название штриховки");

ts_table(iTable, "add_column", 1, "double", "Площадь");

ts_table(iTable, "add_column", 2, "int", "Кол-во");

ts_table(iTable, "set_first_key", 0); // по этой колонке будет отслеживаться одинаковость строк при суммировании показатей

// объявляем необходимые переменные для работы

double dSquare, dAllSquare=0;

string sFillName;

int i;

int ires;

// выполнить цикл icount раз чтобы заполнить таблицу.

// обратите внимание, что одинаковые строки в таблице суммируются автоматически ("add_row_sum")

for (i = 0; i < icount; i++)

{

ires = ac_request("set_current_element_from_list", 1, i); // сделать текущим i-вый элемент из списка 1

ires = ac_request("get_element_value", "fillName"); // запрашиваем название типа штриховки у элемента штриховки

sFillName = ac_getstrvalue(); // получаем его в переменную

ires = ac_request("get_quantity_value", "Surface"); // запрашиваем площадь элемента штриховки

dSquare = ac_getnumvalue(); // получаем его в переменную

dAllSquare += dSquare; // суммируем общую площадь

// Добавляем строку в таблицу, если уже есть - то суммируем

ts_table(iTable, "add_row_sum", 0, sFillName, 1, dSquare, 2, 1);

}

// вывести содержимое таблицы в окно сообщений

string str;

ts_table(iTable, "print_to_str", str);

coutvar << str;

// вывести содержимое таблицы в элемент LABPP_Table.gsm

ac_request("set_current_element_from_list", 2, 0); // сделать текущим 0-ой элемент из списка 2

bool withheader = true; // выводить с заголовками колонок

int startcolindex = 1; // стартовая колонка в LABPP_Talbe будет 1

int startObjectrow = 1; // стартовая строка в LABPP_Table будет 1 (т.е. с левого верхнего угла)

int starttablerow = 0; // из таблицы iTable начинать с первой строки (индекс первой строки 0)

int maxcolumns; // сколько колонок задействовано

int maxrows; // сколько строк получилось задействовано

// получить число колонок и строк

ts_table(iTable, "get_columns_count", maxcolumns);

ts_table(iTable, "get_rows_count", maxrows);

ts_table(iTable, "export_to_LABPP_Table", withheader, startcolindex, startObjectrow, starttablerow, maxrows);

// Задать в объекте количество использованных строк

ac_request("set_object_property_value", "TS_RowsUsedCount", maxrows + 1);

// Задать в объекте количество использованных колонок

ac_request("set_object_property_value", "TS_ColumnsUsedCount", maxcolumns);

// Дать команду GDL объекту таблицы LABPP_Table выполнить внутренний перерасчет

ac_request("set_object_property_value", "TS_DoRecalcAll", 1);

// Удалить из памяти таблицу

object("delete", iTable);

// Записываем общую площадь в поле "a" калькулятора с комментарием

string svalue = ecvt(dAllSquare); // переводим общую площадь в текст

string scomment = "Общая площадь шриховок";

ac_request("interface", "calc_field", "set", "a", 1, svalue, scomment);

// "a" - здесь имя ячейки у LabPP_Calc куда записать значение. Всего ячеек - a,b,c и main

}


FAQ (часто задаваемые вопросы)

Copyright © 2009-2024 by Jurii Tsepov LABPP. All Rights Reserved.


Как посмотреть значения параметров, заданных формулами

Руководство по LABPP_Automat для ARCHICAD

FAQ (часто задаваемые вопросы) ››

Для просмотра результатов пользовательских параметров элементов, заданных формулами используйте LabPP Debugger .