cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 

Community Tip - Learn all about PTC Community Badges. Engage with PTC and see how many you can earn! X

Developing code in Workflow Template Administrator

pvieira
3-Newcomer

Developing code in Workflow Template Administrator

I . . I'm a windchill starter user and i have skills in JAVA , now i'm trying to construct a Expression in Workflow Template Administrator and i need to get the PDF (Representation File) from a EPM Document received in a Promotion Request and copy that to a specific folder ...

I get this piece of code from internet but i get errors showed in bottom...

try{

QueryResult theQueryResult = MaturityHelper.service.getPromotionTargets(thePromotionNotice);

Versioned theVersioned = null ;

if (theQueryResult != null){

while(theQueryResult.hasMoreElements()){

theVersioned = (Versioned)theQueryResult.nextElement();

if (theVersioned instanceof EPMDocument) { ... }

}

}

catch(...){}

//primaryBusinessObject

QueryResult theQueryResult;

wt.maturity.PromotionNotice pn = (wt.maturity.PromotionNotice)primaryBusinessObject;

try{

theQueryResult = MaturityHelper.service.getPromotionTargets(pn);

Versioned theVersioned = null ;

if (theQueryResult != null){

while(theQueryResult.hasMoreElements()){

theVersioned = (Versioned)theQueryResult.nextElement();

if (theVersioned instanceof EPMDocument) {

System.out.println("IS A EPM DOCUMENT");

//É Preciso procurar o PDF AGORA.....

System.out.println("NOW GET THE PDF DOCUMENT");

// . . .

}else{

System.out.println("THIS IS NOT AN EPM");

}

}

}

}catch(Exception e){

System.out.println("ERROR EXPORTING PDF: " + e.getMessage());

errorMsg = "ERROR EXPORTING PDF Promotion Request: " + e.getMessage();

}

Five errors reported in check Syntax..

1) WfExpression45853891.java:36: cannot find symbol

symbol : class QueryResult

location: class wt.workflow.expr.WfExpression45853891

QueryResult theQueryResult;

^

2) WfExpression45853891.java:39: package MaturityHelper does not exist

theQueryResult = MaturityHelper.service.getPromotionTargets(pn);

^

3) WfExpression45853891.java:40: cannot find symbol

symbol : class Versioned

location: class wt.workflow.expr.WfExpression45853891

Versioned theVersioned = null ;

^

4) WfExpression45853891.java:43: cannot find symbol

symbol : class Versioned

location: class wt.workflow.expr.WfExpression45853891

theVersioned = (Versioned)theQueryResult.nextElement();

^

5) WfExpression45853891.java:44: cannot find symbol

symbol : class EPMDocument

location: class wt.workflow.expr.WfExpression45853891

if (theVersioned instanceof EPMDocument) {

I need help here because and dont know all structure of Windchill API classes

ACCEPTED SOLUTION

Accepted Solutions
ybagul
12-Amethyst
(To:pvieira)

Windchill needs FQN in expression robots for workflow templates. Use following to resolve your errors.

1) wt.fc.QueryResult

2) wt.maturity.MaturityHelper

3) wt.vc.Versioned

4) wt.vc.Versioned

5) wt.epm.EPMDocument

For Windchill JavaDoc, use following link on your 9.1 Windchill server (dont know for 10)

https://myserver.mycompany.com/Windchill/wt/clients/library/api/index.html

View solution in original post

9 REPLIES 9
ybagul
12-Amethyst
(To:pvieira)

Windchill needs FQN in expression robots for workflow templates. Use following to resolve your errors.

1) wt.fc.QueryResult

2) wt.maturity.MaturityHelper

3) wt.vc.Versioned

4) wt.vc.Versioned

5) wt.epm.EPMDocument

For Windchill JavaDoc, use following link on your 9.1 Windchill server (dont know for 10)

https://myserver.mycompany.com/Windchill/wt/clients/library/api/index.html

pvieira
3-Newcomer
(To:ybagul)

Thank you Yogesh Bagul ! it's solved ..

But now i'm with dificult .. i need to know if the object in PBO is a DRW (Creo Drawing)

i have this:

if (theVersioned instanceof wt.epm.EPMDocument) {

System.out.println("IS A EPM DOCUMENT");

myDoc = (wt.epm.EPMDocument)theVersioned;

System.out.println("TYPE OF DOC: " + myDoc.getDocType());
}

But i get CADDRAWING , so i can compare this with

if(myDoc.getDocType().toString().equals("CADDRAWING") ){

..

}

Or exist other way to do this ?

Other question is how can i get the representations of CADDRAWING ?

Because i want the list of Representations, verify if exist any representation in PDF format and after that copy the file to a share in other server. .

Regards !

ybagul
12-Amethyst
(To:pvieira)

I guess your validation for CADDRAWING is good enough. To get representations from EPMDocument, look at wt.content.ApplicationData class. You can check and then stream representation file to file share.

KD
12-Amethyst
12-Amethyst
(To:ybagul)

In windchill 10 the java doc is available in <WT_HOME>\codebase\wt\clients\library\api\Index.html

pvieira
3-Newcomer
(To:KD)

I Already found that, but i'm having problems understanding the logic of programming here..

Yogesh, i'm using this way:

wt.fc.QueryResult theQueryResult;

wt.maturity.PromotionNotice pn = (wt.maturity.PromotionNotice)primaryBusinessObject;

wt.content._ContentHolder cHolder;

try{

theQueryResult = wt.maturity.MaturityHelper.service.getPromotionTargets(pn);

wt.vc.Versioned theVersioned = null ;

wt.epm.EPMDocument myDoc;

if (theQueryResult != null){

while(theQueryResult.hasMoreElements()){

theVersioned = (wt.vc.Versioned)theQueryResult.nextElement();

if (theVersioned instanceof wt.epm.EPMDocument) {

System.out.println("IS A EPM DOCUMENT");

myDoc = (wt.epm.EPMDocument)theVersioned;

if(myDoc.getDocType().toString().equals("CADDRAWING")){

System.out.println("===== DRAWING ===== ");

System.out.println("NOW GET THE PDF DOCUMENT");

cHolder =(wt.content.ContentHolder)primaryBusinessObject;

System.out.println( "downloadPrimary: name = " + myDoc.getName() );

System.out.println( "downloadPrimary: number = " + myDoc.getNumber() );

System.out.println("theContent to appData");

wt.content.ApplicationData appData = wt.content.ApplicationData.newApplicationData((wt.content.ContentHolder)cHolder);

System.out.println( "primary file name = " + appData.getFileName());

}

}else{

System.out.println("THIS IS NOT A EPM");

}

}

}

result="Approved";

} catch (wt.maturity.MaturityException me){

errorMsg=me.getMessage();

result="Rejected";

}

And, what I get is : "primary file name = null"

what is wrong ?

pvieira
3-Newcomer
(To:pvieira)

Already Solved my Problem! Thanks to all of you!

This is my final code, it's lot of parts from another sites and forums but it worked for me..

that's it:

wt.fc.QueryResult theQueryResult;

wt.maturity.PromotionNotice pn = (wt.maturity.PromotionNotice)primaryBusinessObject;

wt.content._ContentHolder cHolder;

try{

theQueryResult = wt.maturity.MaturityHelper.service.getPromotionTargets(pn);

wt.vc.Versioned theVersioned = null ;

wt.epm.EPMDocument myDoc;

if (theQueryResult != null){

int queCnt = 0;

while(theQueryResult.hasMoreElements()){

theVersioned = (wt.vc.Versioned)theQueryResult.nextElement();

if (theVersioned instanceof wt.epm.EPMDocument) {

System.out.println("IS A EPM DOCUMENT");

myDoc = (wt.epm.EPMDocument)theVersioned;

if(myDoc.getDocType().toString().equals("CADDRAWING")){

//GET THE PDF:

wt.lifecycle.LifeCycleManaged LMObject = (wt.lifecycle.LifeCycleManaged)myDoc;

String StStg = (String)LMObject.getLifeCycleState().toString();

if (StStg.compareTo("RELEASED") == 0) {

System.out.println( "\nEPMDoc - Number: " + myDoc.getNumber() + " - Name: " + myDoc.getName()+ " - CadName: " + myDoc.getCADName() );

System.out.println( "EPMDocument " + myDoc.getNumber() + " -Version: " + myDoc.getVersionIdentifier().getValue() + " - Iteration:"+myDoc.getIterationIdentifier().getValue());

System.out.println( "Life Cycle State: "+StStg);

try {

wt.representation.Representation defaultRep=wt.representation.RepresentationHelper.service.getDefaultRepresentation(myDoc);

wt.content.ContentHolder holder=wt.content.ContentHelper.service.getContents(defaultRep);

Vector contents=wt.content.ContentHelper.getContentListAll(holder);

wt.content.ApplicationData data=null;

for (int i=0;i<contents.size();i++)

{

if (contents.get(i) instanceof wt.content.ApplicationData)

{

data=(wt.content.ApplicationData)contents.get(i);

System.out.println("Avaliando o " + data.getFileName());

if (data!=null && data.getFileName().endsWith("pdf"))

{

System.out.println("Vou copiar este: " + data.getFileName() + " pois ele é PDF");

String path = "D:"+"\\pdf\\"+data.getFileName();

System.out.println("Vai copiar o : " + data.getFileName() + " para " + path);

wt.content.ContentServerHelper.service.writeContentStream(data, path);

System.out.println("Copiado : " + data.getFileName() + " para " + path);

break;

}

}

}

}catch(Exception exception){

errorMsg = "NOVO ERRO " + exception.getMessage();

}

queCnt++;

}

}

}else{

System.out.println("THIS IS NOT A EPM");

}

}

}

result="Approved";

} catch (wt.maturity.MaturityException me){

errorMsg=me.getMessage();

result="Rejected";

}

I didn't follow it that closely, but I have a couple thoughts.

Checking QueryResult == null doesn't hurt and is certainly cautious, I just can't think of any instance that will return a null QueryResult, just an empty one.

Windchill's Content stuff can be a little confusing at first. Your Representation IS the ContentHolder, so I would say defaultRep = (Representation)ContentHelper.service.getContents(defaultRep).

Most importantly, I wouldn't put this stuff directly in an expression robot/transition. Place it inside of another class and make a single call to that from your wf expression. Doing so will allow you to easily change the contents of the method if you ever need to. Off the top of my head, you may want to change logging statements and the File path, or you may come up with another solution for handling exceptions. Your wf expression can hold a try catch and route, but the other stuff should be external.

So Matthew, how can i create a package or classe mine ? like ext.pv.extraction ?

And how can i put the path to a line in my.xconf ?

Regards, and thank you for you help..

PV

Just create your class in some package under <wc.home>/codebase. I put my wf related stuff all under something like ext.wfexpr.*. The "wfexpr" is my indicator that the class is used in a workflow and I can't refactor signatures. That's my way of doing it anyways. As far as I know, xconfs are only for deploying properties, so you don't need to enter anything in an xconf. We're on 9.1, so maybe things have changed? BTW, the signatures for methods I use in wfexpressions usually look like "WTObject method(WTObject primaryBusinessObject, ObjectReference self)" That generally takes casting and any additional work outside of the expression and puts it in my class, giving the class a lot of flexibility. "self" will either be the executing activity or expression.

Announcements


Top Tags