Changing Creo Parameter with J-link

Hello again,
I will stay another topic in front of you today and explain changing parameter in PTC Creo with using j-link.
J-link give more flexibility to customize design but it’s limited version of J-toolkit. You can find lots of document to explain what is differences between J-link and J-toolkit. Due to the lack of toolkit license, I keep working on going projects with J-link.

Let start;

Before starting to explain, I have to warn readers for using swing library. I had tried many times working with swing library and j-link together. At the beginning time. everything is working out all right however after clicking buttons or whatever, the GUI hags. In order to avoid this situation, I will use JDialog frames.


public class JLHW_Btn1_CmdListener extends DefaultUICommandActionListener {

// Handler for button push
//
@Override
public void OnCommand () {
try {
//Btn1_callback();
session.SetConfigOption("regen_failure_handling", "resolve_mode");
JDialog f = new JDialog();
JButton jb = new JButton("Değiştir");
JLabel jl1=new JLabel("İç Çap:");
JLabel jl2=new JLabel("Dış Çap:");
jtIc=new JTextField(String.valueOf(getDiameter(DiameterType.INNER)));
jtDis=new JTextField(String.valueOf(getDiameter(DiameterType.OUTER)));
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
changeDiameter(Integer.valueOf(jtDis.getText()), DiameterType.OUTER);
changeDiameter(Integer.valueOf(jtIc.getText()), DiameterType.INNER);
} catch (Exception ex) {
try {
DisplayMessage(ex.getMessage());
} catch (Exception ex1) {
Logger.getLogger(jlinkhelloworld.class.getName()).log(Level.SEVERE, null, ex1);
}
}

}
});
f.setAlwaysOnTop(true);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.setLayout(new FlowLayout(FlowLayout.LEFT));
f.add(jl1);
f.add(jtIc);
f.add(jl2);
f.add(jtDis);
f.add(jb);
f.pack();
f.setModal(true);
f.setVisible(true);
}
catch (Exception e) {
writeLog("Exception thrown by Btn1_callback method: " + e.toString());
}
}

In order to enable to regenerate the model, we have to set “regen_failure_handling” mode to “resolve_mode”. Please look at the line 9 above codes. Otherwise program will throw exception. As my experience, previously, unfortunately I couldn’t find any solutions for these exceptions.

Above picture also shows how program looks like. When the button is pressed. code calls following codes;


public void changeDiameter(int cap,DiameterType diameterType) {
Parameter param=null;
try {
model = App.session.GetCurrentModel();
switch(diameterType){
case OUTER:
{
param=this.model.GetParam("DISCAP");
ParamValue paramVal= pfcModelItem.CreateIntParamValue(cap);
param.SetValue(paramVal);
}
case INNER:
{
param=this.model.GetParam("ICCAP");
ParamValue paramVal= pfcModelItem.CreateIntParamValue(cap);
param.SetValue(paramVal);
}
}
} catch (jxthrowable ex) {
ex.printStackTrace();
}
finally{
try {

((Solid) model).Regenerate(null);
model.Display();
} catch (jxthrowable ex) {
try {
DisplayMessage(ex.getMessage());
} catch (Exception ex1) {
Logger.getLogger(jlinkhelloworld.class.getName()).log(Level.SEVERE, null, ex1);
}
}
}
}

there are two different parameters to controlling diameter of outer and inner of ring. Outer diameter is controlled by “DISCAP” and inner diameter is called “ICCAP” in parameter table.

However, before the Jdialog comes to screen, these parameters are read by following code in advance. User can see easily what the parameters values are, on Jdialog form.


public int getDiameter(DiameterType diameterType) throws Exception {
model = App.session.GetCurrentModel();
switch (diameterType) {
case OUTER:
{
Parameter param=model.GetParam("DISCAP");
ParamValue paramVal=param.GetValue();
model=null;
return paramVal.GetIntValue();
}
case INNER:
{
Parameter param=model.GetParam("ICCAP");
ParamValue paramVal=param.GetValue();
model=null;
return paramVal.GetIntValue();
}
default:
return 0;
}

}

I have already uploaded all this algorithm files in my GitHub account. You can find download following link.

https://github.com/FrostTiger/changingCreoParameter

But for using this codes you must adjust some following details:

  • C:\Users\[User folder]\Documents\NetBeansProjects\jlinkhelloworld – folder address must be the same.
  • must be checked config.pro, protk.dat and run.bat files. File paths of content of these files must be checked according to user computer.

Regards,
Gökhan

http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/google_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/myspace_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/facebook_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/yahoobuzz_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/twitter_48.png

PTC Creo ile ilk J-link Bağlantısının Kurulması “HelloWorld” Part-2

creo-homepage-banner[1]

Creo bilgi ekranında “jlinkhelloworld.java” dosyasında “hello world” yazdıran ilk program kodumuz aşağıdaki gibidir.


// jlinkhelloworld.java
// imports required
import com.ptc.cipjava.*;
import com.ptc.pfc.pfcCommand.*;
import com.ptc.pfc.pfcGlobal.*;
import com.ptc.pfc.pfcModel.*;
import com.ptc.pfc.pfcSession.*;
import com.ptc.wfc.wfcModel.*;
import com.ptc.wfc.wfcGeometry.*;
import com.ptc.wfc.wfcSolid.*;
import com.ptc.wfc.wfcPart.*;
import java.io.*;

public class jlinkhelloworld {

static jlinkhelloworld App = null;
String programName = null;
Session session = null;
FileWriter log = null;
String msgFile = "msg_jlinkhelloworld.txt";
String newline = null;

// constructor
//
public jlinkhelloworld () {
programName = this.getClass().getName();
try {
log = new FileWriter(programName + ".log");
newline = System.getProperty("line.separator");
}
catch (Exception e) {
// couldn't create log file, ignore
}
}

// Display message in Pro/Engineer
//
public void DisplayMessage ( String mesg ) throws Exception {
stringseq seq = stringseq.create();
seq.set(0, mesg);
session.UIDisplayMessage(msgFile, "JLHW %s", seq);
seq.clear();
writeLog(mesg);
}

// Write text to log file
//
public void writeLog ( String mesg ) {
try {
if (log == null) { return; }
log.write(mesg + newline);
log.flush();
}
catch (Exception e) {
// ignore
}
}

// Close log file
//
public void closeLog () {
try {
if (log == null) { return; }
log.close();
}
catch (Exception e) {
// ignore
}
}

// Called by Pro/Engineer when starting the application
//
public static void startApp () {
try {
App = new jlinkhelloworld();
App.startupApplication();
}
catch (Exception e) {
App.writeLog("Problem running startupApplication method" + e.toString());
return;
}
}

// Called by Pro/Engineer when stopping the application
//
public static void stopApp () {
try {
App.shutdownApplication();
}
catch (Exception e) {
App.writeLog("Problem running shutdownApplication method" + e.toString());
return;
}
}

// Perform some steps when shutting down the application
//
public void shutdownApplication () throws Exception {
writeLog("Application '" + programName + "' stopped");
closeLog();
}

// Perform some steps when starting the application
//
public void startupApplication () throws Exception {

try {
writeLog("Application '" + programName + "' started.");
session = pfcGlobal.GetProESession();
}
catch (jxthrowable x) {
writeLog("ERROR: Problem getting session object.");
return;
}

UICommand btn1_cmd = null;

try {
// Define a UI command
String iconFile = session.GetMessageContents(
msgFile, "JLHW Btn1 icon", null);
btn1_cmd = session.UICreateCommand(
"JLHW Btn1 Cmd", new JLHW_Btn1_CmdListener()
);
btn1_cmd.SetIcon(iconFile);
btn1_cmd.Designate(msgFile,"JLHW Btn1 Label",null,null);
}
catch (jxthrowable x) {
writeLog("ERROR: Problem creating uicmd.");
return;
}
/* Tools menusunu aktive ediyor.
try {
// Add UI command to 'Tools' menu
session.UIAddButton(
btn1_cmd, "Utilities", null,
"JLHW Btn1 Label", "JLHW Btn1 Help",
"msg_jlinkhelloworld.txt"
);
}
catch (jxthrowable x) {
writeLog("ERROR: Problem creating menu: " + x.toString());
return;
}
*/
DisplayMessage(programName + " application started.");

}

// Callback for the 'Tools' menu button
//
public void Btn1_callback ( ) throws Exception {

String mesg = null;
Model model = session.GetCurrentModel();

if (model == null) {
mesg = "Hello! Goekhan SCHAMAN";
}
else {
mesg = "Hello! The model is: " + model.GetFileName();
}

DisplayMessage(mesg);

}

// Inner class for UI Command Listener
//
public class JLHW_Btn1_CmdListener extends DefaultUICommandActionListener {

// Handler for button push
//
public void OnCommand () {
try {
Btn1_callback();
}
catch (Exception e) {
writeLog("Exception thrown by Btn1_callback method: " + e.toString());
}
}

}
}

İlk kodlamada constructor yaratıyoruz. Kodu incelerseniz göreceksinizki log kaydı tutan bir txt file yaratıyor. Önemli bir detay değildir.



public jlinkhelloworld () {
programName = this.getClass().getName();
try {
log = new FileWriter(programName + ".log");
newline = System.getProperty("line.separator");
}
catch (Exception e) {
// couldn't create log file, ignore
}
}


“protk.dat” dosyasında hatırlarsanız. Start metodunu belirtmemiz gerekiyordu “java_app_start”. İşte bu metodun ismini “protk.dat dosyasının içine yazmamız gerekiyor. Böylece Creo kendisi ile ilgili kodun nerede başladığını biliyor. Kodu incelerseniz göreceksiniz ki, consructor metodundan yeni bir nesne yaratılıp yeni bir metoda yönlendiriliyor.



// Called by Pro/Engineer when starting the application
//
public static void startApp () {
try {
App = new jlinkhelloworld();
App.startupApplication();
}
catch (Exception e) {
App.writeLog("Problem running startupApplication method" + e.toString());
return;
}
}


Bu kısmı incelerseniz göreceksinizki mevcut Creo da açılan session’un ve butonun yaratılması sağlanıyor.



public void startupApplication () throws Exception {

try {
writeLog("Application '" + programName + "' started.");
session = pfcGlobal.GetProESession();
}
catch (jxthrowable x) {
writeLog("ERROR: Problem getting session object.");
return;
}

UICommand btn1_cmd = null;

try {
// Define a UI command
String iconFile = session.GetMessageContents(
msgFile, "JLHW Btn1 icon", null);
btn1_cmd = session.UICreateCommand(
"JLHW Btn1 Cmd", new JLHW_Btn1_CmdListener()
);
btn1_cmd.SetIcon(iconFile);
btn1_cmd.Designate(msgFile,"JLHW Btn1 Label",null,null);
}
catch (jxthrowable x) {
writeLog("ERROR: Problem creating uicmd.");
return;
}
/* Tools menusunu aktive ediyor.
try {
// Add UI command to 'Tools' menu
session.UIAddButton(
btn1_cmd, "Utilities", null,
"JLHW Btn1 Label", "JLHW Btn1 Help",
"msg_jlinkhelloworld.txt"
);
}
catch (jxthrowable x) {
writeLog("ERROR: Problem creating menu: " + x.toString());
return;
}
*/
DisplayMessage(programName + " application started.");

}


Butona basıldığında  çalışacak asıl kısım burası aslında diğer tüm yerleri şablon olarak kullanıp yazacağınız programda sadece buraya eklemeler yaparak yeni programlar geliştirebilirsiniz.



public void Btn1_callback ( ) throws Exception {

String mesg = null;
Model model = session.GetCurrentModel();

if (model == null) {
mesg = "Hello! Goekhan SCHAMAN";
}
else {
mesg = "Hello! The model is: " + model.GetFileName();
}

DisplayMessage(mesg);

}


“protk.dat” isimli dosyanın içeriği aşağıdaki gibidir.



name jlinkhelloworldapp
startup java
java_app_class jlinkhelloworld
java_app_start startApp
java_app_stop stopApp
allow_stop true
delay_start false
text_dir C:/apps/JLinkHelloWorld/text
java_app_classpath C:/apps/JLinkHelloWorld
end


notepad++ programı yardımıyla java kodunu hem çalıştırmak hemde derlemek için F6 tuşuna basın (tabiki bununla ilgili notepad++ programının kurulması ve çalıştırılması ile ilgili yazıma buradan ulaşabilirsiniz) ve çıkan ekrana aşağıdaki MS-DOS komutlarını yapıştırın.

capture

eğer bir önceki registry file oluşturulması ile ilgili yazımda bahsedilen, dosyaları c:\apps klasörüne kopyalayıp ve dosyaların  isimlerini değiştirmediyseniz bu ekranda herhangi bir şey değiştirmenize gerek yoktur. Aşağıda yolunu kontrol etminiz gerekenleri yazacağım, eğer belirttiğim yollar sizin bilgisayarınızınkinden farklı ise lütfen düzeltin. Java versiyonu farklı olabileceğinden javanın yüklediği yeri kesinlikle kontrol edin ve yolları 8 harf kuralına göre yazmanız gerekecektir.

Kontrol etmeniz gerekenler;

  • javanın Program files’daki yeri
  • Creo’nun Common Files klasörün yeri


CD\
set CLASSPATH=C:\Progra~1\PTC\Creo 3.0\F000\Common~1\text\java\otk.jar
set CREO_HOME=C:\Progra~1\PTC\Creo 3.0\F000\Common~1
cd $(CREO_HOME)\text\java\
set JAVA_HOME=C:\Progra~1\Java\jdk1.8.0_92
$(JAVA_HOME)\bin\javac -cp otk.jar;pfcasync.jar c:\apps\JLinkHelloWorld\jlinkhelloworld.java
cd c:\apps\JLinkHelloWorld\
$(JAVA_HOME)\bin\jar cvf0 jlinkhelloworld.jar jlinkhelloworld.class
$(CREO_HOME)\..\Parametric\bin\parametric.bat


En sondaki MS-DOS komutu Creo’nun Parametric versiyonunu çalıştıracaktır. ve yazdığınız config.pro ve protk.dat dosyalarını okuyarak ek yazılımı otomatik olarak başlatacaktır.

3

yazdığınız yazılımın simgesi ve verdiğiniz isim Creo’nun üst menüsünde görünecektir. simgeyi tıkladığınızda ise4

istediğiniz bilgi, bilgi ekranında gözükecektir. Anlaşılmamış yerler olabilir, bana ulaşırsanız tekrar bilgi vermeye çalışırım.

İyi çalışmalar

Gökhan ŞAMAN

http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/google_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/myspace_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/facebook_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/yahoobuzz_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/twitter_48.png

Creo yazılım VB API (Application Programming Interface)’lerin Windows’a tanıtılması

creo-homepage-banner[1]

Yazılımlarla 3 boyutlu çizim programlarınızı daha da güçlendirmek istiyorsanız, bununla ilgili üreticinin üretmiş olduğu API’leri kurulum esnasında seçmeniz gerekiyor. Bugünkü yazımda eski adıyla Pro-Engineer olarak bilinen şimdiki yenilene arayüzü ile Creo da bu işlemlerin nasıl olduğunu sizlere aktaracağım.

Okumaya devam et

http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/google_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/myspace_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/facebook_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/yahoobuzz_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/twitter_48.png

Using Creo Application Programming Interface


The Very long time passed when I wrote something about programming on my blog. At that period, I encountered many things in my life for example I found a new job and have chanced living location for a short time. I have begun to learn Creo because of my job On the other hand as time goes by I’m interesting in new Creo VB toolkit programming and when I have free time generally I have spare time on improving this skills which is regarding how I use it, connect between other products.

Now, I would you like to show you that How Integrated development Environment (IDE) can be recognized to Creo Application Programming Interface (API);

Okumaya devam et

http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/google_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/myspace_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/facebook_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/yahoobuzz_48.png http://www.gokhansaman.com/wp-content/plugins/sociofluid/images/twitter_48.png