J-Link — это программный интерфейс (API) для CAD-системы PTC Creo Parametric. Он предоставляет лишь часть функциональности, доступной в более сложном Creo/TOOLKIT, основанном на C. Тем не менее, доступных вызовов достаточно для автоматизации многих задач, возникающих при работе в CAD-системах.
Тот факт, что J-Link API основан на Java, даёт разработчику возможность применять большую коллекцию библиотек и фреймворков. Код, разработанный с использованием J-Link, в большинстве случаев, легче поддерживать по сравнению с кодом в Creo/TOOLKIT. Дополнительным преимуществом J-Link API является то, что он не требует отдельной лицензии.
Если Ваше приложение может достигнуть большинства своей функциональности применяя J-Link API, то Вы должны рассмотреть его применение, используя Creo/TOOLKIT только для реализации недостающих опций.
В данной обучающей статье мы разработаем простое приложение, регистрирующую команду, которая может быть добавлена на ленту инструментов Creo (далее просто ленту). Единственная задача этой команды — запуск стороннего приложения. Хотя это может выглядеть искусственно, подобная функциональность очень полезна во многих случаях разработки продукта. К примеру, сторонним приложением может стать таблица Excel, содержащая в себе имена стандартных деталей, которые могут быть переданы в сессию Creo. После чего модели этих стандартных деталей могут быть получены из PDM-системы.
Мы постараемся сделать наше решение обобщенным, чтобы была возможность менять его поведение без необходимости перекомпиляции кода, а также без усложнения процедуры развёртки.
Прежде, чем мы начнём
Чтобы пройти этот туториал, нам нужен доступ к установленной лицензионной копии Creo Parametric. Вам необходимо убедиться, что J-Link API установлен — он не включён по умолчанию, так что, возможно, Вам потребуется переустановить его. В процессе установки убедитесь, что API Toolkits включен, как показано на изображении ниже.
Рисунок 1 — Включите J-Link API в процессе установки.
Также нам потребуется набор разработки Java (JDK), который содержит в себе и компилятор Java и среду выполнения Java-программ. Скачать его можно отсюда.
Файлы проекта и компиляция
Скачайте архив GitHub проекта: jlink-first-master.zip и распакуйте его. Мы будем предполагать, что проект расположен в папке
C:\jlink-first-master
Запустите cmd командную строку windows и установите переменную среды %CREO_HOME%
к месту установки Creo (Ваш путь может отличаться).
C:\>set CREO_HOME="C:\Program Files\PTC\Creo 2.0\Common Files\M100"
Теперь убедитесь, что документация J-Link и его библиотеки доступны:
C:\>dir %CREO_HOME%\jlink\jlinkdoc\index.html
C:\>dir %CREO_HOME%\text\java\pfc.jar
Установите переменную %JAVA_HOME%
в директорию установки JDK (Ваш путь может отличаться):
C:\>set JAVA_HOME=D:\dev-tools\jdk1.7.0_45_amd64
И, наконец, скомпилируйте код, не забыв включить J-Link библиотеки в путь к классам:
C:\>cd jlink-first-master
C:\jlink-first-master>%JAVA_HOME%\bin\javac -cp %CREO_HOME%\text\java\pfc.jar src\jlink\Launcher.java -d dist
Обзор кода
Прежде чем начать описывать код, позвольте мне обратить Ваше внимание на важность чтения документации к API. Статьи, подобные этой, позволят Вам быстро начать, но если Вы хотите, чтобы код, написанный Вами, был ясным, Вам необходимо понимать все допущения и побочные эффекты API-запросов, которые Вы вызываете. Всё это Вы сможете найти только после прочтения документации. Когда, в разрабатываемом Вами приложении, Вы сталкиваетесь с неожиданным поведением, Вы должны быть уверены в правильности использования API, прежде чем начать отладку. Без этого Вы неминуемо окажетесь в аду программного обеспечения.
Говоря так, всё же не стоит слепо доверять документации. Вы должны относиться к ней как, в целом, к корректному источнику, но будут моменты, когда Вы просто не будете наблюдать описанного поведения. В большинстве случаев, тем не менее, дефект будет в Вашем коде, даже если будет искушение думать, что это не так. Я намеренно не буду детально описывать API-вызовы, чтобы заставить Вас искать ответы на соответствующие вопросы в документации.
Наше J-Link приложение умещается в одном исходном файле, реализующем два класса.
C:/jlink-first-master/src/jlink/Launcher.java
package jlink;
import java.io.IOException;
import com.ptc.cipjava.jxthrowable;
import com.ptc.pfc.pfcCommand.DefaultUICommandActionListener;
import com.ptc.pfc.pfcCommand.UICommand;
import com.ptc.pfc.pfcGlobal.pfcGlobal;
import com.ptc.pfc.pfcSession.Session;
public class Launcher {
public static String MSG_FILE = "messages.txt";
public static void start() throws jxthrowable {
Session currentSession = pfcGlobal.GetProESession();
String commandString = currentSession.GetMessageContents(
MSG_FILE, "-L.launcher.cmd", null);
String iconFile = currentSession.GetMessageContents(
MSG_FILE, "-L.launcher.ico", null);
UICommand cmd = currentSession.UICreateCommand("launcher",
new MenuButtonListener(commandString, currentSession));
cmd.SetIcon(iconFile);
cmd.Designate(MSG_FILE, "-L.launcher.label", null, null);
}
public static void stop() { /* EMPTY */ }
}
class MenuButtonListener extends DefaultUICommandActionListener {
private String commandString;
private Session currentSession;
public MenuButtonListener(String cmd, Session session) {
commandString = cmd;
currentSession = session;
}
public void OnCommand() throws jxthrowable {
try {
ProcessBuilder pb = new ProcessBuilder(commandString);
pb.start();
} catch (IOException e) {
currentSession.UIShowMessageDialog(
"Could not start " + commandString, null);
}
}
}
Класс Launcher
определяет два метода start()
и stop()
, которые используются Creo для управления жизненным циклом приложения. Поведение нашего приложения полностью реализовано в методе start()
— зачищающий код не требуется. Конечно же, в настоящем приложении, Вы захотите разделить Ваш код на несколько классов.
Статическая константа MSG_FILE
определяет имя файла сообщения — ресурсного файла, требуемого для каждого приложения взаимодействующего с Creo UI. Файлы сообщений также могут использоваться для локализации.
Строка 15 получает объект текущей сессии Creo. Строки 17-20 получают две конфигурационные строки — одна содержит полный путь к внешней команде, другая содержит имя иконки. Использование файла сообщений для хранения конфигураций обычно не применяется, но, в данном случае, это упрощает код и развёртывание приложения, а также является полезным паттерном.
В строке 22 мы создаём новую Creo команду. Поскольку в наших планах отобразить её в виде кнопки меню, мы соединяем её с объектом класса MenuButtonListener
. Нажатие на кнопку вызовет код, реализованный в классе слушателя. В строке 24 устанавливается команда иконки и в строке 25 назначается команда, дающая ей подпись, установленную в файле сообщения.
Класс MenuButtonListener
расширяет один из слушателей J-Link и реализует метод onCommand()
, который выполняется, когда команда вызывается пользователем. Код создаёт новый процесс, определённый посредством commandString
. Если создание закончится неудачей, то приложение выведет пользователю сообщение о проблеме.
Ресурсные и конфигурационные файлы
Файл сообщений — главный ресурс, используемый нашим приложением. Он определяет набор пар ключ-значение и автоматически загружается в сессию Creo. Общий формат содержимого файла выглядит следующим образом:
KEY
VALUE
#
#
Для нашего приложения файл сообщений определяет одну подпись для пользовательского интерфейса и две конфигурационные записи:
C:/jlink-first-master/dist/text/usascii/messages.txt
-L.launcher.label
Calculator
#
#
-L.launcher.cmd
C:\Windows\system32\calc.exe
#
#
-L.launcher.ico
calculator.png
#
#
Иконки хранятся в папке:
C:\jlink-first-master\dist\text\usascii\resource
Допускается использование двух типоразмеров иконок: 16 х 16 и 32 х 32 пикселей. Большая иконка должна иметь постфикс “_large”
в своём имени. При установке команды следует использовать имя маленькой иконки.
Также нам необходимо дать Creo знать какую версию JRE использовать для J-Link приложений (должна совпадать с ранее определённой %JAVA_HOME%
). В файле:
C:/jlink-first-master/dist/config.pro
Нужно прописать опцию:
jlink_java_command d:\dev-tools\jdk1.7.0_45_amd64\bin\java.exe
И наконец, нам нужно создать регистрационный файл, который зарегистрирует наше приложение в Creo.
C:/jlink-first-master/dist/protk.dat
NAME Launcher
STARTUP JAVA
JAVA_APP_CLASS jlink.Launcher
JAVA_APP_START start
JAVA_APP_STOP stop
JAVA_APP_CLASSPATH c:\jlink-first-master\dist
TEXT_DIR c:\jlink-first-master\dist
ALLOW_STOP TRUE
DELAY_START FALSE
END
Регистрационный файл указывает стартовый start()
и конечный stop()
методы применяемого приложения. JAVA_APP_CLASSPATH
определяет расположение скомпилированного файла класса (также может указывать на JAR архив). Запись TEXT_DIR
указывает родительскую директорию папки text
, которая содержит ресурсы приложения. Обратитесь к документации за объяснением оставшихся записей.
Добавление команды на ленту Creo
Теперь мы готовы тестировать наше приложение. Конфигурационные файлы Creo config.pro
и protk.dat
будут прочитаны последними (и перезапишут любую глобальную конфигурацию), если они доступны в рабочей директории сессии Creo. Давайте запустим Creo из такой директории:
cd C:\jlink-first-master\dist
C:\jlink-first-master\dist> %CREO_HOME%\..\..\Parametric\bin\parametric.bat
Мы готовы добавить нашу команду на ленту и посмотреть работает ли она. Последовательность действий в большинстве своём основана на взаимодействии с пользовательским интерфейсом, поэтому следуйте инструкции в следующем видео:
Помните, что грамотная обработка ошибок и передача соответствующей информации пользователю будут влиять на понимание Вашего приложения. Никогда не пренебрегайте пользовательским опытом.
Чтобы быть уверенным в том, что при следующем запуске сессии Creo Ваше приложение не исчезнет из ленты, нужно сохранить файл ленты, выбрав пункт меню Save the Auxiliary Application User Interface. Он будет сохранён тут:
C:\jlink-first-master\dist\text\toolkitribbonui.rbn
Следующие шаги
Эта статья описывает синхронное J-Link приложение. Это всё, что Вам нужно, чтобы начать. Теперь Вам нужно потратить некоторое время на чтение документации к API и тщательно обдумывать то, что Вы хотите получить в результате прежде, чем переходить к разработке кода.
Используя J-Link возможно создать приложение, способное запускать (или связываться) сессию Creo и управлять ей извне. Это так называемое асинхронное приложение, которое даёт возможность управлять командами Creo в пакетном режиме. Пакетный режим особенно полезен когда Вы хотите реализовать автоматические операции, генерирующие множество конструкций с помощью автоматизированной регенерации геометрии.
Наслаждайтесь!
Послесловие от переводчика
Прошу обратить внимание на то, что статья была написана до выхода Creo 3.0, в котором реализована возможность использовать в Creo/TOOLKIT не только язык С, но и Java. Однако в этом случае необходима отдельная лицензия.
Также предлагаю Вам схему файловой структуры J-Link приложения, которую я составил для улучшения своего понимания данного вопроса.
Спасибо за внимание!