Pull to refresh

Начало работы с J-Link API для Creo Parametric

Здравствуйте! Предлагаю Вашему вниманию мой перевод статьи за авторством Бартоша Добржелецкого.


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 включен, как показано на изображении ниже.


j-link instalation
Рисунок 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 приложения, которую я составил для улучшения своего понимания данного вопроса.

Спасибо за внимание!



Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.