一、Windchill自带的客制化:站点->实用程序->首选项管理器->展开"用户自定义"->将"用户自定义"选项卡的"否"改为"是"->重新打开浏览器->会出现"自定义"图标
二、增加主菜单和一级子菜单
1 、复制 navigation-actionModels.xml中的main navigation段代码到custom-actionModels.xml文件中
Main navigation (tabs)
Sub tabs under the product main tab
2、修改properties文件action.properties和action_zh_CN.properties
在action.properties文件里增加如下代码:
navigation.test.description=test
test.subtest1.description=subtest1
test.subtest2.description=subtest2
在action_zh_CN.properties里增加如下代码:
navigation.test.description=\测\试 (\测\试----测试)
test.subtest1.description=\子\测\试1 (\子\测\试1----子测试1)
test.subtest2.description=\子\测\试2 (\子\测\试2----子测试2)
3、在custom-actions.xml文件中增加如下代码:
4、在netmarkets下的jsp文件夹下新建文件夹test
并在test下新建jsp文件subtest1.jsp和subtest2.jsp
注意:这里的文件名和文件夹名都不能错
5、重启服务器
四、显示所有产品列表
1、修改subtest1.jsp
<%@ taglib uri="http://www.ptc.com/windchill/taglib/components" prefix="jca"%>
<%@ taglib uri="http://www.ptc.com/windchill/taglib/fmt" prefix="fmt" %>
<%@ page import="ext.corilead.testdemo.GetProductList"%>
<%@ include file="/netmarkets/jsp/util/begin.jspf"%>
<%@ include file="/netmarkets/jsp/util/end.jspf"%>
2、java文件
package ext.corilead.testdemo;
import java.util.HashMap;
import java.util.Vector;
import wt.fc.QueryResult;
import wt.method.RemoteAccess;
import wt.pdmlink.PDMLinkProduct;
import wt.pds.StatementSpec;
import wt.query.QuerySpec;
import wt.query.SearchCondition;
public class GetProductList implements RemoteAccess {
private GetProductList(){}
public static GetProductList newGetProductList(){
return new GetProductList();
}
public static Vector getAllProduct(){
Vector v=new Vector();
QuerySpec qs=null;
QueryResult qr=null;
try{
qs=new QuerySpec(PDMLinkProduct.class);
if(qs instanceof StatementSpec){
qr = wt.fc.PersistenceHelper.manager.find((StatementSpec)qs);//查询所有产品列表
while(qr.hasMoreElements()){
Object object = qr.nextElement();
if(object instanceof PDMLinkProduct){
HashMap map=new HashMap();
PDMLinkProduct pro=(PDMLinkProduct)object;
String name=pro.getName();
String creator=pro.getCreator().getName();
String container=pro.getContainerName();
map.put("name", name);
map.put("creator", creator);
map.put("container", container);
map.put("pro", pro);
v.add(map);
}
}
}
}catch(Exception e){
e.printStackTrace();
}
HashMap map=new HashMap();
return v;
}
}
3、将生成的class文件拷贝到codebase对应的目录下,重启服务器
五、添加超链接
1、修改jsp文件
2、java文件
package ext.corilead.dataUtilities;
import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import wt.fc.ReferenceFactory;
import wt.inf.container.WTContainer;
import wt.method.RemoteAccess;
import wt.pdmlink.PDMLinkProduct;
import wt.pom.PersistenceException;
import wt.util.WTException;
import wt.util.WTProperties;
import com.ptc.core.components.descriptor.ModelContext;
import com.ptc.core.components.factory.AbstractDataUtility;
import com.ptc.core.components.rendering.guicomponents.UrlDisplayComponent;
public class SearchDetail extends AbstractDataUtility implements RemoteAccess,Serializable {
public Object getDataValue(String col_id, Object obj, ModelContext modelcontext) throws WTException {
UrlDisplayComponent goPartNumberButton = new UrlDisplayComponent();
if(obj instanceof HashMap){
HashMap map=(HashMap)obj;
String container=(String)map.get("container");
WTContainer org=((PDMLinkProduct)map.get("pro")).getContainer();
if (org != null) {
String url2 = getURLByWTContainer(org);
goPartNumberButton.setLink(url2);
goPartNumberButton.setLabelForTheLink(container);
goPartNumberButton.setTarget("_blank");
}
}
return goPartNumberButton;
}
//构造url地址
public static String getURLByWTContainer(WTContainer org) throws PersistenceException, WTException {
String url = "";
ReferenceFactory referenceFactory = new ReferenceFactory();
if (org != null) {
String ufid = referenceFactory.getReferenceString(org);
try {
WTProperties properties = WTProperties.getLocalProperties();
String urlbase = properties.getProperty("java.rmi.server.hostname");
String webport = properties.getProperty("wt.webserver.port");
url = "http://" + urlbase + ":" + webport + "/Windchill/app/#ptc1/comp/wt.inf.container.OrgContainer.infoPage?oid=" + ufid + "&u8=1";
System.out.println("url==========="+url);
} catch (IOException e) {
e.printStackTrace();
}
}
return url;
}
}
3、在site.conf文件里注册 overridable="true" targetFile="codebase/com/ptc/core/components/components.dataUtilities.properties" value="ext.corilead.dataUtilities.SearchDetail/singleton" /> 4、在windchill shell下执行命令xconfmanager –p 5、重启服务器 六、控制主菜单的可见性 1、java文件 package ext.corilead.validator; import java.util.Locale; import wt.org.WTPrincipal; import wt.session.SessionHelper; import wt.util.WTException; import com.ptc.core.ui.validation.DefaultUIComponentValidator; import com.ptc.core.ui.validation.UIValidationCriteria; import com.ptc.core.ui.validation.UIValidationKey; import com.ptc.core.ui.validation.UIValidationResult; import com.ptc.core.ui.validation.UIValidationResultSet; import com.ptc.core.ui.validation.UIValidationStatus; public class NavigationValidator extends DefaultUIComponentValidator { public UIValidationResultSet performFullPreValidation( UIValidationKey paramUIValidationKey, UIValidationCriteria paramUIValidationCriteria, Locale paramLocale) throws WTException { // TODO Auto-generated method stub UIValidationResultSet resultSet =new UIValidationResultSet(); try{ WTPrincipal wtp= SessionHelper.manager.getPrincipal();//u-3 ? //if(wtp.getName().equals("Administrator")){ System.out.println("用户名= "+wtp.getName()); if(wtp.getName().trim().equals("Administrator")){ System.out.println("======this is wcadmin========"); resultSet.addResult(new UIValidationResult(paramUIValidationKey,UIValidationStatus.ENABLED)); }else{ System.out.println("=======this is not wcadmin========="); resultSet.addResult(new UIValidationResult(paramUIValidationKey,UIValidationStatus.HIDDEN)); } }catch(WTException e){ } return resultSet; } } 2、在site.xconf文件里增加如下代码: targetFile="codebase/service.properties" value="ext.corilead.validator.NavigationValidator"/> 3、在windchill下执行命令xconfmanager –p 4、重启服务器 七、客制化部件操作下拉菜单 1、简单菜单 (1)在PartClient-actionmodels.xml文件中做如下修改 (2)在PartClient-actions.xml中添加如下配置 注:action name要和在PartClient-actionmodels.xml里的action name保持一致 (3)在partResource.java中添加下列内容: @RBEntry("search BOM") @RBComment("show BOM") public static final String PRIVATE_CONSTANT_357 = "part.searchBom.description"; (4)在partResource_zh_CN.java中添加下列内容 @RBEntry("查找BOM") @RBComment("show BOM") public static final String PRIVATE_CONSTANT_357 = "part.searchBom.description"; (5)编译partResource.java 在shell中执行如下命令javac +空格+partResource.java全路径 (6)编译文件partResource_zh_CN.java 在shell下执行命令native2ascii -encoding utf-8 +空格+partResource_zh_CN.java+空格+转码后的文件存放路径回车,javac +空格+转码后的partResource_zh_CN.java文件的全路径 (7)将生成的class文件拷贝到codebase对应的相同目录下,重启服务器 2、三级子菜单 (1)在PartClient-actionmodels.xml文件中做如下修改 (2)PartClient-actions.xml文件 (3)partResource.java文件 public final class partResource extends WTListResourceBundle { ...... @RBEntry("third Level") @RBComment("show third Level") public static final String PRIVATE_CONSTANT_358 = "part.thirdlevel.description"; @RBEntry("Second Level") public static final String PRIVATE_CONSTANT_359 = "object.second level menu.description"; } (4) partResource_zh_CN.java文件 public final class partResource_zh_CN extends WTListResourceBundle { ...... @RBEntry("三级菜单") @RBComment("show third Level") public static final String PRIVATE_CONSTANT_358 = "part.thirdlevel.description"; @RBEntry("二级菜单") public static final String PRIVATE_CONSTANT_359 = "object.second level menu.description"; } (5)编译方法同上 重启服务器下载本文