admin管理员组

文章数量:1531999

2024年7月18日发(作者:)

Windchill面试资料

1、 UI部分:

1.1、 navigation(菜单)

一级菜单:

:

:

二级菜单:

:

:

三级菜单(,

,

):

:

下拉菜单:

:

1.2、 button(按钮)

创建按钮是一个十分简单的过程,例如要在如图所示的部分创建一个按钮:

第一步:在导航中输入&jcaDebug=1

第二步:查看debug之后发现此工具栏的Action Model Name=product list

第四步:点击“定制”、“工具”后出现:

第五步:在product list点击“搜索”后出现:

第六步:点击“”后出现:

第七步:查看

复制

然后添加

第八步:在中添加

resourceBundle="tResourceClient">

class="ProductFormProcessor"

method="execute" windowType="popup"/>

class="ntainerFormProcessor"

method="execute" windowType="popup"/>

preloadWizardPage="true" required="true">

class="ProductFormProcessor"

method="execute" windowType="popup"/>

</p><p style="text-indent: 2em;font-size:18px;"> 创建产品 </p><p style="text-indent: 2em;font-size:18px;">

创建产品

创建产品

netmarkets/images/arrow_

第九步:reload xml:java onServiceHelper

1.3、 页面客制化Tree

① 写两个方法:public List getRootNodes() throws WTException和

public Map getNodes(List list) throws WTException

getRootNodes()方法如下

public List getRootNodes() throws WTException {

NmCommandBean nmcommandbean

getModelContext().getNmCommandBean();

if (nmcommandbean == null) {

return null;

}

//获取上下文的一个对象

NmOid nmoid = maryOid();

=

}

WTPart wtpart;

if (nmoid == null) {

}

if (wtpart == null) {

}

return null;

configSpec = figSpecFor(wtpart);

//返回一个一个指定的wtpart的list

return tonList(wtpart);

} else {

wtpart = getGolfCart();

//确定这个对象nmoid是否是这个类(WTPart)提供的实例

if (!()) {

}

//获得指向的对象

wtpart = (WTPart) ();

// The following 2 lines are one line

throw new ClassCastException((new StringBuilder()).append(

"Expected part, but was:

} else {

").append(nmoid).toString());

getNodes()方法如下

public Map getNodes(List list) throws WTException {

if (configSpec == null) {

}

HashMap hashmap = new HashMap();

Persistable p[][][] = sWTParts(

new WTArrayList(list), configSpec);

ListIterator listiterator = erator();

do {

if (!t()) {

}

WTPart wtpart = (WTPart) ();

table p1[][] = p[usIndex()];

if (p1 != null) {

ArrayList arraylist = new ArrayList();

(wtpart, arraylist);

table p2[][] = p1;

int i = ;

break;

configSpec = getDefaultConfigSpec();

}

}

int j = 0;

while (j < i) {

}

table p3[] = p2[j];

(p3[1]);

j++;

} while (true);

return hashmap;

上面两个方法大概是讲获得上下文对象的节点和子节点,具体意思还没弄懂,懂的麻烦告诉

一下。

② 增加自定义.xconf文件存储配置信息,如下

serviceClass="TreeHandler"

selector="customTreeHandler"

cardinality="duplicate"/>

其中serviceClass属性是指写步骤①中两个方法的类,selector属性是指在页面引入Tree的

时候treeHandler的属性值,这个值一定要跟selector属

性值一样

③ 将.xconf文件注册完成后写一个jsp页面,下面主要给出引入Tree的代码

id="" label=" ${treeName}">

treeHandler="customTreeHandler"/>

其中label属性是显示在tree左上角的名称,需要做国际化;describeColumn是指Tree下面的

属性,有多少个describeColumn就有多少个属性。

④ 在Tree上面添加一些页面上的属性

中添加menubarName属性,就是在Tree上添加下拉菜单,属性值

就是在文件中配置的model属性中name的属性值;

下面添加

value="true"/>标签就是在Tree上面添加全选菜单;

下面添加

value="customToolbar"/>标签就是在Tree上面添加工具栏,其中的value属性值就是在

文件中配置的model属性中name的属性值。

1.4、 客制化view

做View是建立在已经做好的Tree或Table上的,针对上面做的Tree做View就是在Tree的页

面上添加一些其它的属性,如

中添加属性

configurable="true"属性就会有视图,要做自己的

视图的话还要写自己的方法;添加helpContext="xx"属性就是一个帮助按钮,针对Tree

或Table里面的内容不同可以更换XX的值;添加singleSelect="true"属性就会有单选

框,当然是建立在已经有全选菜单的情况下,如果没有添加全选菜单添加该属性也没有效

果;添加pageLimit="10"属性就是分页,Tree或Table中的内容过多时就可以分页显示,

属性值是多少就标示一页显示多少条内容;添加showPagingLinks ="true"属性就是给链

接,例如Tree下面是一个文件夹,加了该标签之后就可以点击该文件夹进入文件夹内的

详细内容。

附上自己写View的代码

public class ConfigTable extends AbstractConfigurableTable {

(leColumnDefinition(/*name*/

TableViewDescriptor tvd=

,/*lockable*/false));

leViewDescriptor(/*name*/"Sapmple

View",tableId,/*system*/true,/*global*/true,columns,

/*constraints*/null,/*match*/true,/*descriptption*/"Sample View");

public String getOOTBActiveViewName(){

}

return null ;

}

(tvd);

return result;

public List getSpecialTableColumnsAttrDefinition(Locale locale)

{

}

public List getOOTBTableViews(String tableId,Locale locale) throws

List result=new ArrayList();

Vector columns=new Vector();

List result=new ArrayList();

(new

(new

return result;

TextAttribute(/*id*/"foo",/*label*/"Foo",locale));

TextAttribute(/*id*/"bar",/*label*/"Bar",locale));

WTException{

}

public String getLabel(Locale locael){

}

public Class[] getClassTypes() {

}

public String getDefaultSortColumn() {

}

return ;

return new Class[]{};

return "Custmom config table " ;

这段代码首先是获得试图下拉菜单中属性,然后添加两个自己的视图属性,再获取Table View,

设置添加视图选项所需的属性(如Name、Number等),再设置Table View的名称描述并添加

到Table View。下面的四个方法分别是获取TableView的名称,在TableView上显示的第一名称

是默认的,返回null就使用默认名称;获取用户可见的表的名称;获取表中的对象的类型;

获取默认情况下排序列的ID。

1.5、 创建表格

第一步:建立jsp 页面。存放在jsp/lenovo目录下,引入标签。

第二步:设置表格的属性。

menubarName="customMenubar" id="table" configurable="true">

属性包括,设置菜单栏,和工具条,分页,是否全部可选 ,建立视图,表格名称的国际化等。

第三步:描述表格的列名称

jca:describeColumn id="name"/>

有两列,列名分别是名字和编号。

第四步:获得表的模型

treeHandler="customTreeHandler"/> 属性descriptor的值要等于表格属性的变量var的值。

第五步:生成表,调用类的方法获得数据。

helpContext="reportQueriesInfoAuditRptRef_help" showCount="true"/>

第六步:怎么去获得服务器的数据,根据的对象的名称,编号等属性可以获得数据。

QuerySpec qs;

QueryResult qr = null;

WTPart doc = null;

try {

qs = new QuerySpec();

SearchCondition sc = new SearchCondition(,

docName, false);

SearchCondition(sc);

qr = (qs);

tackTrace();

} catch (QueryException e) {

1.6、 客制化Wizard

创建Wiard需要用用到的元素

①、A main wizard page – 定义wizard的所有的子步骤。

Wizard ">

information" />

staff" />

向导两步,第一个是选择创建对象的类型,第二个是创建对象的属性

②、One or more wizard step pages – 包含Wizard的所有子页面。

③、

---

定义

wizard

和所有子步骤

action

name="setFirstWizStep1">

windowType="wizard_step"/>

windowType="wizard_step"/>

④、

wizard action

添加到已有的或新加的

action

models

中。

⑤ A form processor controller—当wizard提交之后进行后台逻辑处理。系统自带的有三个

– 系统有OOTB的三个Process

• ObjectFormProcessor 创建对象

• tEditFormProcessor 编辑对象

• rkableFormProcessor 编辑工作对象

如果有特殊的逻辑需要处理,需要定制自己的Process。

定制的Process需要继承类DefaultObjectFormProcessor。

常见的JCA标签

描述表格的属性

描述表格的属性。

描述列的属性。

获得模型

生成表格

生成树。

向导的下一步。

绑定在某个按钮上。

容器的特征。

例如:怎么在jsp显示属性结构:

menubarName="customMenubar"

label=" ${treeName}" configurable="true" id="tableId" >

treeHandler="customTreeHandler"/>

helpContext="reportQueriesInfoAuditRptRef_help" showCount="true"/>。

1.7、 panel

<%@ taglib prefix="jca" uri="/windchill/taglib/components" %>

<%@page import="tionConstants" %>

//定位菜单项

<%@ taglib uri="/windchill/taglib/components" prefix="jca"%>

<%@ taglib prefix="wc" uri="/windchill/taglib/core" %>

<%@ include file="/netmarkets/jsp/util/" %>

rightPane=""

onDblClick="hideOrShowLeftPane" //折叠左侧窗格

collapseImg="netmarkets/images/collapse_" //折叠左侧窗格图标

expandImg="netmarkets/images/expand_" /> //展开左侧窗格图标

<%@ include file="/netmarkets/jsp/util/" %>

LeftPanel:

<%@ taglib uri="/windchill/taglib/components" prefix="jca"%>

<%@ taglib prefix="fmt" uri="/windchill/taglib/fmt" %>

<%@ include file="/netmarkets/jsp/util/"%>

<%@ include file="/netmarkets/jsp/util/"%>

RightPanel:

<%@ include file="/netmarkets/jsp/util/"%>

<%@ taglib prefix="fmt" uri="/windchill/taglib/fmt" %>

<%@ taglib uri="/windchill/taglib/components" prefix="jca" %>

<%@ include file="/netmarkets/jsp/util/"%>

Example:

主页面:左边是树结构,右边是表结构

<%@ taglib prefix="jca" uri="/windchill/taglib/components" %>

<%@page import="tionConstants" %>

<%@ taglib uri="/windchill/taglib/components" prefix="jca"%>

<%@ taglib prefix="wc" uri="/windchill/taglib/core" %>

<%@ include file="/netmarkets/jsp/util/" %>

rightPane="/netmarkets/jsp/com/china/fru_"

onDblClick="hideOrShowLeftPane"

collapseImg="netmarkets/images/collapse_"

expandImg="netmarkets/images/expand_" />

<%@ include file="/netmarkets/jsp/util/" %>

LeftPanel:fru_

<%@ taglib uri="/windchill/taglib/components" prefix="jca"%>

<%@ taglib prefix="fmt" uri="/windchill/taglib/fmt" %>

<%@ include file="/netmarkets/jsp/util/"%>

var="CustEx_tree_descriptor7"

type=""

label="${tree}"

menubarName="customMenubar"

configurable="true">

<%-->Get a component model for our tree<--%>

descriptor ="${CustEx_tree_descriptor7}"

action ="carambola-Tree7"/>

<%-->Render the NmHTMLTableTree <--%>

helpContext="TABLE_508_HELP_PAGE" showPagingLinks ="true"/>

<%@ include file="/netmarkets/jsp/util/"%>

pageLimit="20"

RightPanel:fru_

<%@ include file="/netmarkets/jsp/util/"%>

<%@ taglib prefix="fmt" uri="/windchill/taglib/fmt" %>

<%@ taglib uri="/windchill/taglib/components" prefix="jca" %>

serviceName="rk" methodName="getWTDocument">

<%@ include file="/netmarkets/jsp/util/"%>

效果图:

2、 workflow

2.1、工作流中的常用元素

:已分配活动。它表示被动的完成某一活动,例如拟制。

:专用活动。它表示可以给自己完成活动的同时还能给其他人指配一些活动。

:与连接器:它表示连接到它上面的两个或多个操作都满足条件时才会进行下一步操作,

里面可以写代码。

:或连接器。它表示连接到它上面的一个或多个操作只要满足条件都会进行下一步操作,

里面可以写代码。

:条件路由器。它表示在此处进行判断下一步的操作是什么,一般在此处都有代码判断前

一操作到此处之后下一步的操作是什么,例如通过或者驳回。

:阈值连接器。它表示当用户指定数量的操作满足条件后,它才会进行下一步操作。

:结束。它没有属性。

:接地。它没有属性。

:以电子邮件方式通知。它表示操作到这一步会使用系统的邮件系统发送邮件。

:方法自动机。它表示可以实现工作流关联对象的检入,检出,更改状态等操作(系统自动

执行,不写代码)

:定时器。它表示前一操作到达此处之后会停留多久或父进程执行多久以后才会进行下一

步的操作。

:启动应用程序。

:执行表达式。它表示在此处写代码执行某些业务操作。

:同步。就是只有满足条件的时候才会完成任务,否则会一直在停在同步那里(写代码)

:URL自动机。

还有一个块和进程元素,以为不常见就不在此说明了。

2.2、工作流进程中颜色代表的意思

● 白色:还没有通过

● 绿色:正在进行

● 灰色:已经运行过了

● 蓝色:暂停

● 红褐色:出错

● 黄色:流程中止

3、 怎么创建一个文档

①. .产品—文件夹—文件内容下面的“文件”单击下拉框—新建—选择“文档”。

②选择一个类型(这些类型是在类型和属性管理器里的文档里创建。)

③ 设置属性里面选择“无内容”

④设置附件,单击完成。

⑤创建完成之后,在工作总览里面可以看到。你创建的文档流程。点击进去,用不同“用户”

对其流程进行执行。

4、 API的用法

:

字段:

CONTRACT_NUMBER: 标签的属性;属性具体到Windchill A和D模块 Supported API: true

NAME: 标签的属性;部分的名称 - 名称的一部分,通常参照,如“piston”。

NUMBER: 属性的标签的数量属性,代表了这部分和其所有版本的数量。

PART_TYPE: 标签的属性。

方法:

getName():获取属性的值:名称。Return:String.

getPartType():获取关联发挥作用的对象:零件类型。

getSource():关联发挥的角色获取的对象:源。

newWTPart():构建一个新的WTPart(其WTPartMaster)。

setNumber(String a_Number):设置的属性值:NUMBER。

Master:

字段:

DEFAULT_UNIT: 标签的属性;默认分配的部分,当它在结构的测量单位。

EFF_PROPAGATION_STOP: 标签的属性;表示,如果有效性传播通过这部分应停止或继续。

END_ITEM:表示,如果部分应作为最终产品的处理属性的标签;

NAME: 标签的属性;部分的名称 - 名称的一部分,通常参照,如“piston”。

NUMBER: 属性的标签的数量属性,代表了这部分和其所有版本的数量。

方法:

getIdentity():返回的形式对部分主编号和名称“ - ”。

getDefaultTraceCode():获取关联,发挥作用的对象:DEFAULT_TRACE_CODE。

getIdentificationObject():构造并返回一个标识对象。

getOrganization():获取的属性值:组织。

ment:

字段:

DEPARTMENT:标签的属性。

DESCRIPTION:标签的属性;一些文字描述的文件或指出重要信息应保存有关文件。

DOC_TYPE:标签的属性。

NAME:标签的属性。

NUMBER:标签的属性。

TITLE:文件的正式名称标签的属性。

方法:

getDepartment():取得关联发挥作用的对象:部门。

getDescription():获取的属性值:描述。

getDocType():取得关联发挥作用的对象:DOC_TYPE。

getName():获取属性的值:名称。

getNumber():获取的属性值:NUMBER。

newWTDocument():供内部使用。

ument:

AUTHORING_APPLICATION: 标签的属性;表示,命名的应用程序编写的对象。

DEFAULT_UNIT: 标签的属性;措施的文件的默认单位。

INSTANCE: 标签属性;真如果EPMDocument是属性表格实例。

NAME:标签的属性;该文件的名称。

NUMBER:属性的标签的数量属性表示该文件和其所有版本的数量。

方法:

getAuthoringApplication():获取属性的值:AUTHORING_APPLICATION。

getCADName():获取属性的值:CADNAME。

getDefaultUnit():获取属性的值:DEFAULT_UNIT。

getDescription():获取的属性值:描述。

getDocSubType():获取属性的值:DOC_SUB_TYPE。

5、 一些常用的方法:

5.1、部件类

从BOM获取的信息条数

初始化类

由被使用量和使用量计算子part使用量

计算被使用量

获取父部件

获取包含产品结构信息的ArrayList对象

获取相关文档信息

获取part信息

判断子part和当前part是否同一个容器

判断子part和相关文档是否同一个容器

判断arrayList中的map元素是否已包含了当前part/文档信息

根据子part的类型,将子part的信息加入相应的list中

判断part是否为零件

判断part是否为小部件

判断part是否为部件

判断part是否为分组件

判断part是否为组件

判断part是否为机械件

判断part是否为外购件

计算某字符串在另一字符串中的出现次数

5.2、 geRequest2(为一抽象方法)

5.2.1、 根据变更名称或编号获取 ECR

5.2.2、 根据产品名称来查询ECR

5.2.2、 创建一个ECR

5.2.3、 获取所有的不是"完成"状态的ECN(通过状态获取ECN)

5.2.4、

通过一组生命周期状态查询ECR。生命周期 ArrayList 中存储字符串的生命周期状

5.2.5、 添加ECR 团队中的一些成员到 ECR 的“rolename”的角色中

5.2.6、此方法用于从给定的 ECR 获取相关 ECN

onlyName表示只返回姓名

5.3、

geIssue

根据变更名称或编号获取 WTChangeIssue

6. 通过变更请求查询变更通告

7. 通过产品模板来生成产品

参数为

产品名称,产品描述,产品模板

public static boolean createProductByTemplate(String productName,

String description, String defaultWTContainerTemplateName)

throws WTException {

boolean flag = false;

if (("") || productName == null

|| ("")

|| defaultWTContainerTemplateName == null) {

throw new WTException(CLASSNAME

+ ".createProductByTemplate() 传入参数有误!");

}

WTUser currentUser = null;

try {

currentUser = (WTUser) ncipal();

essEnforced(false);

ncipal(PRODUCTCREATER);

PDMLinkProduct pdmlinkproduct = null;

pdmlinkproduct = LinkProduct();

e(productName);

cription(description == null ? "NONE"

: description);

DefaultWTContainerTemplate defaultwtcontainertemplate = null;

defaultwtcontainertemplate =

getDefaultWTContainerTemplate(defaultWTContainerTemplateName);

if (defaultwtcontainertemplate == null) {

throw new WTException(CLASSNAME

+ ".createProductByTemplate() 未找到名称为"

+ defaultWTContainerTemplateName + "的产品模板,请先手工

创建该产品模板!");

}

tainerTemplate(defaultwtcontainertemplate);

nization wtorganization =

anizationByName("huawei");

WTContainerRef wtcontainerref = e

.getOrgContainerRef(wtorganization);

tainerReference(wtcontainerref);

pdmlinkproduct = (PDMLinkProduct) e

.create(pdmlinkproduct);

pdmlinkproduct = (PDMLinkProduct) r

.save(pdmlinkproduct);

// if (!addPrincipalToProduct(pdmlinkproduct)) {

// n("将角色添加到产品团队中失败:产品="

// + e());

// }

n(tainerTeamManagedInfo().getState()

);

flag = true;

} catch (WTPropertyVetoException e) {

tackTrace();

} finally {

essEnforced(true);

if (currentUser != null) {

ncipal(e());

}

}

return flag;

}

8. 通过容器名得到容器

public static WTContainer getContainer(String containerName) {

int[] index = { 0 };

try {

QuerySpec qs = new QuerySpec();

SearchCondition sc = new SearchCondition(,

, "=", containerName);

Where(sc, index);

QueryResult qr = ((StatementSpec)

qs);

while (eElements()) {

WTContainer container = (WTContainer) ement();

return container;

}

} catch (QueryException e) {

tackTrace();

} catch (WTException e) {

tackTrace();

}

return null;

}

本文标签: 属性表示获取对象