Начиная с версии 2.1, можно управлять работой LabelMover из других программ. Где это можно использовать? Перечислим некоторые возможные применения:
Исследование вариантов проектирования
С помощью программного интерфейса LabelMover вы можете задать сколь угодно сложную последовательность изменений задачи ELCUT, решить полученные задачи и получить результаты для сравнения в удобной табличной или графической форме.
Пожалуйста, обратите внимание: по техническим причинам программный интерфейс реализован только в режиме оптимизации. То есть, для того, чтобы использовать его, вы должны перейти в LabelMover в режим оптимизации или открыть сохраненный файл оптимизации (.qva). Но при этом вы можете сгенерировать произвольную последовательность задач, это не обязательно должен быть поиск максимума или минимума. Т.е. вы можете использовать программный интерфейс не только для оптимизации, но для любых исследований зависимости результатов от параметров.
Использование конечно-элементной модели, как "черного ящика" для разработки алгоритмов оптимизации, управления или моделирования
По сравнению с программным интерфейсом ActiveField, который обеспечивает очень гибкие, но относительно низкоуровневые возможности для управления ELCUT, программный интерфейс LabelMover обеспечивает возможность работы с задачами и моделями на болеё абстрактном уровне.
Для задачи определяются несколько параметров. Задавая значения для этих параметров, вы тем самым описываете новую задачу. Такой простой интерфейс удобно использовать для описания собственных алгоритмов оптимизации, для совместного использования с существующими программами оптимизации (например, MATLAB, Excel и т.д.), для интеграции конечно-элементных моделей ELCUT с системами моделирования и для многих других приложений.
При этом никакого знания особенностей работы с объектами ELCUT не требуется, достаточно использования нескольких простых функций программного интерфейса LabelMover.
LabelMover поддерживает два вида программного интерфейса: COM интерфейс и интерфейс командной строки.
SetVariation(index as Integer, value as Double)
Задать значение параметра.
Вы должны указать номер параметра. Параметры нумеруются, начиная с 0, в том порядке, в котором они перечислены на странице Параметры в LabelMover.
Замечание: Если параметр в LabelMover описан, как Переместить в любом направлении, то в программном интерфейсе ему соответствуют два числа: одно для смещения по X и другое - для смещения по Y. При этом нумерация последующих параметров соответственно смещается. Если параметр описан, как Переместить в фиксированном направлении, то программист задает только один параметр - смещение по X. (Если перемещение в фиксированном направлении происходит строго по оси Y, то программист задает смещение по Y).
Solve()
Сгенерировать и решить задачу. LabelMover генерирует задачу со всеми изменениями, заданными с помощью SetVariation, решает её и добавляет результат в таблицу результатов.
(Таким образом, перед тем как вызывать Solve, надо с помощью SetVariation задать все необходимые изменения).
GetResult(index as Integer) as Double
Получить рассчитанное значение.
Вы должны указать номер значения. Параметры нумеруются, начиная с 0, в том порядке, в котором они перечислены на странице Значения в LabelMover.
Функция возвращает значение для последней решенной задачи. (Таким образом, перед вызовом GetResult() вы должны хотя бы раз вызвать Solve()).
ClearResults()
Удалить все результаты из таблицы результатов. Как правило, эту функцию имеёт смысл вызывать в начале программы.
Типичная последовательность вызовов при использовании COM интерфейса LabelMover такая:
Вызываем ClearResults()
Генерируем и решаем последовательность задач. Для каждой задачи:
Задаем значение для каждого параметра с помощью SetVariation()
Вызываем Solve()
Если нам требуются значения некоторых вычисленных величин для дальнейших вычислений (например, для вычисления очередных значений параметров), то вызываем GetResult. (Если требуется только показать вычисленные значения в таблице результатов, вызывать GetResult не надо. Результаты добавляются в таблицу результатов автоматически).
Приведем очень простой пример. Пусть у нас есть задача ELCUT и мы задали для неё с помощью LabelMover несколько параметров и несколько результатов.
Пусть мы хотим задать для одного из параметров значения 0.0, 0.1, 0.2... 0.9 а для другого параметра - значения 0.0, 0.01, 0.02... 0.09 во всех возможных сочетаниях, и построить таблицу всех возможных вариантов. (То есть, мы хотим изучить 100 вариантов задачи).
Вот как это можно сделать с использованием Visual Basic 2005:
Sub Main()
Dim qlm As QLM.SimpleInterface
qlm = CreateObject("QLM.SimpleInterface")
qlm.ClearResults()
Dim i, j As Integer
For i = 0 To 10
For j = 0 To 10
qlm.SetVariation(0, i * 0.1)
qlm.SetVariation(1, j * 0.01)
qlm.Solve()
Next
Next
End Sub
Замечание: В этой программе предполагается, что LabelMover уже запущен, что он находится режиме оптимизации, и что заданы по крайней мере два параметра.
Кроме COM интерфейса, в качестве альтернативы, LabelMover предлагает интерфейс командной строки. Его можно использовать вместе с теми языками и системами программирования, которые не поддерживают работу с COM. (Но и для тех языков, которые поддерживают COM, во многих случаях может быть удобнеё использовать этот интерфейс).
Все что вам надо уметь - это запускать из вашей программы внешнюю программу (EXE файл) и передавать программе командную строку в качестве параметра.
В состав LabelMover входит программа QLMCall.exe. Её назначение - обеспечивать интерфейс между LabelMover и внешними программами. Для управления LabelMover вы просто должны вызвать из вашей программы QLMCall.exe и передать с помощью командной строки необходимые параметры.
QLMCall параметр0 параметр1 ... параметрN [ ><выходной_файл> ]
Создать новую задачу с указанными параметрами, решитьеё и добавить результаты в таблицу результатов.
Результаты также выводятся в указанный выходной файл, в виде последовательности чисел, разделенных пробелами. Если параметр ><выходной_файл> не задан, результаты будут выводиться на экран.
Замечание: Если параметр в LabelMover описан, как Переместить в любом направлении, то в командной строке надо задать два числа: смещение по X и смещение по Y. Если параметр описан, как Переместить в фиксированном направлении, то надо задать смещение по X, за исключением случая, когда задано перемещение строго вдоль оси Y. В этом случае надо задать смещение по Y.
QLMCall ClearResults
Удалить все результаты из таблицы результатов.
Перепишем простой пример, приведенный выше для COM интерфейса, с использованием интерфейса командной строки:
Sub Main()
Dim i, j As Integer
Dim commandLine As String
Shell("QLMCall ClearResults", , True)
For i = 0 To 10
For j = 0 To 10
commandLine = "QLMCall " + _
Str(i * 0.1) + " " + Str(j * 0.01)
Shell(commandLine, , True)
Next
Next
End Sub
Для того, чтобы функция Shell работала правильно, необходимо задать папку, в которой будет расположена программа QLMCаll.exe. Это можно сделать несколькими способами:
Вы можете добавить имя папки, содержащей файл QLMCаll.exe, к глобальной переменной окружения Path.
(После установки QLMCаll.exe находится в подпапке "Tools\Label Mover" папки, в которой установлен ELCUT. Например, если ELCUT был установлен на диск C:, то, скореё всего, QLMCall.exe находится в папке "C:\Program Files\TOR Coop\ELCUT 5.6\Tools\Label Mover".)
Как вариант, вы можете просто скопировать QLMCаll.exe в вашу текущую папку. (Размер файла около 30K, поэтому вы можете без проблем создать несколько копий файла).
Еще один вариант, вы можете указать полный путь к файлу прямо в командной строке. Например, в нашем примере мы могли бы написать:
commandLine = """C:\Program Files\TOR Coop\" + _
"ELCUT 5.6\Tools\Label Mover QLMCall"" " + _
Str(i
* 0.1) + " " + Str(j * 0.01)
(Обратите внимание: если имя файла содержит пробелы, то все имя необходимо заключить в двойные кавычки).