Сценарий
DM не поддерживает загрузку пакетов по требованию, но есть два различных способа достижения желаемого:
Использование пакетов библиотеки
Когда вы "устанавливаете" msgstr "скрипт, вы можете установить его как команду меню или как библиотеку. Это верно как для установки скриптов с помощью команды меню (которые хранятся в файле глобальных настроек), так и с помощью команды скриптов (которая может использоваться для создания файлов .gtk, которые затем можно добавлять / удалять из папки плагинов по мере необходимости. ).
Опция "menu" установит скрипт так, что он вызывается один раз через пункт меню, но не останется в памяти в противном случае.
Опция "library" выполнит сценарий один раз при запуске и держать сам сценарий в области видимости. Таким образом, вы можете определить методы (или классы) в файле библиотеки и сделать его общедоступным. И вы можете поместить некоторый исполняемый код в библиотеку, если вам нужно какое-то действие при запуске.
Использование библиотек сценариев в качестве плагинов .gtk, возможно, является рекомендуемым способом достижения того, чего вы хотите. Однако они всегда загружаются.
Совет: если вы создаете библиотеки, убедитесь, что вы используете очень уникальные имена классов и методов, чтобы избежать конфликтов. Я бы порекомендовал предварительно исправить все имена классов / методов с некоторым именем библиотеки, то есть использовать MyLib_MyClass
вместо MyClass
и т. П.
Уточнение: Сценарии, добавленные в виде библиотечных пакетов, постоянно добавляются в программное обеспечение, то есть эти пакеты создаются один раз и затем помещаются в папку плагинов. Они всегда будут загружаться при запуске DM и будут доступны. Метод пакета Library не подходит для временной «загрузки» внешних скриптов. Такой «импорт по требованию» не поддерживается сценариями DM.
Команды сценария для создания пакетов - это служебные команды, помогающие создавать пакеты простым и управляемым способом. Как правило, можно создать сценарий «Создать пакет XY» с несколькими такими командами, добавив все сценарии из расположения в пакет. Сценарий будет вызван один раз для создания файла пакета (впоследствии он уже находится в папке плагинов.) Только когда изменяются включенные сценарии и, следовательно, требуется обновить пакет, сценарий create-package вызывается снова. Обратите внимание, что в этом случае сначала необходимо удалить файл пакета из папки плагинов и запустить DigitalMicrograph без его загрузки, чтобы создать пакет new . В противном случае скрипт добавит к пакету, что было бы невозможно, если бы в пакете уже существовали методы с таким же именем.
Справочная документация F1 содержит пример скрипта:
Типичные примеры использования GMS 3.4.0 :
Скрипт хранится по адресу: C:\Tmp\testLib.s
void TestCall()
{
Result("\nTest")
}
Скрипт хранится по адресу: C:\Tmp\menuAction.s
Result("\nPerforming an action here.")
Единовременный скрипт запуска для установки пакета:
// General package parameters
// *********************************************
string pkNa = "myPkg" // Filename of plugin
number pkLe = 3 // level 3 (.gtk) only needed for load order
string pkLo = "user_plugin" // plugin location
string scriptRoot = "C:\\Temp\\"
// List of Scripts to be installed as menu items
// *********************************************
// Each entry needs a (unique) command-name, a menu-name and an optional sub-menu name.
// The "isLibary" flag is set to 0
// It is possible to add the same script multiple times. The script will be executed when the menu item
// is chosen. Methods and Classes of the script are not available otherwise
// A separator can be added by installing and empty script with a (unique) command name starting with "-"
AddScriptFileToPackage( scriptRoot + "menuAction.s", pkNa, pkLe, pkLo, "Call 1", "MyMenu", "MySubMenu", 0 )
AddScriptFileToPackage( scriptRoot + "menuAction.s", pkNa, pkLe, pkLo, "Call 2", "MyMenu", "", 0 )
AddScriptToPackage( "", pkNa, pkLe, pkLo, "-sep1", "MyMenu", "", 0 )
AddScriptFileToPackage( scriptRoot + "menuAction.s", pkNa, pkLe, pkLo, "Call 3", "MyMenu", "", 0 )
// List of Scripts to be installed as library
// *********************************************
// Each entry needs a (unique) command-name. Menu-name and sub-menu name are "".
// The "isLibary" flag is set to 1
// The script will be executed once on startup (if there is executable code). It is also executed once
// here during the install.
// Methods and Classes of the script are permanently available and need unique names.
// Adding a script to the package as libary can be used to create on-load-version info output.
AddScriptFileToPackage( scriptRoot + "testLib.s", pkNa, pkLe, pkLo, "library-1", "", "", 1 )
AddScriptToPackage( "Result(\"Script packages myPkg loaded.\\n\")", pkNa, pkLe, pkLo, "myPkg-versionInfo", "", "", 1 )
После запуска сценария установки там будет:
- Подобное меню:
- Вывод в окно результатов, например:
- Файл пакета в папке
C:\Users\USERNAME\AppData\Local\Gatan\Plugins\myPkg.gtk
- Команда сценария
TestCall()
обычно доступна во всех сценариях.
Пакет будет загружаться каждый раз, когда DM запускается, пока файл .gtk остается в папке плагинов.
Вызов кода скрипта из скриптов
Язык сценариев supp Запускает две команды для вызова скрипта из скрипта:
Использование команды для выполнения скриптов из dis c может делать то, что вы хотите, но поддержание полезной «библиотеки» таким образом может быть утомительным. Это также не позволяет вам устанавливать классы.
Пример вызова скрипта из скрипта:
// Direct example
void Demo()
{
ClearResults()
Result( "I am a test call.\n")
number n = 5
Result( "I am working on the number: " + n )
}
Demo()
//Having the script as a string
number otherNumber = 11 // To show how you can modify a script call as an example
string scriptStr
scriptStr += "void Demo()\n{" + "\n"
scriptStr += "ClearResults()" + "\n"
scriptStr += "Result( \"I am a test call.\\n\")" + "\n"
scriptStr += "number n = " + otherNumber + "\n"
scriptStr += "Result( \"I am working on the number: \" + n )"+ "\n"
scriptStr += "}\n"
scriptStr += "Demo()\n"
If ( TwoButtonDialog("Script-call","Show it", "Run it") )
{
ClearResults()
Result( scriptStr )
}
else
ExecuteScriptString( scriptStr )