1、AgendaWindchill开发内容集合开发目录介绍开发环境搭建Windchill 模型环境搭建Windchill类的介绍Windchill各个业务对象的模型介绍Windchill常用开发类和方法介绍开发规范JAVA开发规范,请遵守sun标准Windchill开发规范由于将来系统生产环境是Cluster架构,所以在编写代码时,要尽量避免使用Static的Class变量,测试环境配置多个Method Server,以防止编写的代码在Cluster环境中运行出现问题。系统运行的错误信息,要显示在UI界面上,以便用户和系统管理员了解,同时需要在系统log中记录。Debug语句要有开关控制,避免直接
2、使用System.out.println()打印,导致将来的生产环境产生大量日志。每个客制点之间,设定一个Debug开关,方便自身模块的调试。Debug的开关,缺省值设置为false。客制点之间的输入和输出部分,需要输出Debug信息,方便客制点之间的调试。工作流中的表达式,具体实现,都写在WfUtil中,只在工作流中调用WfUtil中的方法。WfUtil中的方法注释中,需要说明该段代码,将在那些workflow中被调用。系统OOTB配置部分通过XML配置文件交付。方便新系统可以直接通过LoadFileSet导入配置。系统内部值,例如IBA,全部由英文字母和数字组成,不能包含特殊字符。禁止反编
3、译系统OOTB的Class文件,然后在此基础上修改做客制,导致系统无法升级。需要对出厂文件(HTML template等)修改时,需要保存原出厂文件的备份在wtSafeAreaptcOrig目录下,修改后的文件另存到wtSafeAreasiteMod目录需要增加的properties属性不要放置在wt.properties中(service的注册除外),其他都放置在codebasecomitbgext.properties。客制的新增Class文件放置在codebasecomitbg对应的目录下。不要放在系统原有的包中。(除非使用了系统原有的Protected Method,这种用法要尽量避免
4、).设计规范设计规范之建模仅对持久化对象建模 只有数据需要保存到数据库中的持久化业务对象才允许进行建模。其余的操作类(例如:Processor、Delegate、Helper类等)不被允许进行建模。模型命名规则对象的名称、属性名称、方法名称应该满足命名规则,同Java编码规范的类命名、变量命名和方法命名。例如:类名 TRApplyDoc 属性名trPhase 方法名getFormData 说明:历史的模型如果要更改将要做数据迁移。因此只要求对新建立的模型,历史模型不做要求。设计规范字段扩展 对于对象的属性,一般情况下采用默认长度。建模时要求考虑属性长度是否符合要求,如果需要加大长度,在模型中设
5、置相应的值即可。选择父类 对于建模,尽量继承底层的Windchill类,例如:ManagedItem等,继承上层的具有实际业务含义的Windchill类(例如:WTPart、WTDocument)时,在业务上符合“是一个(As-is)”的含义,例如:EleadPart是一个WTPart不预留属性 对象建模,不预留属性。对于已有对象的预留属性,因属性名称业务含义,也不允许使用。历史模型已预留的属性不做要求。例如:不再使用以前建模留下的reserv1、reserv2等预留属性设计规范关联关系 两个对象关联时,需要使用模型的关联关系。尽量不要采用建模为两个独立对象,在一个对象的属性中记录另一个对象的
6、某个标志属性的方式。例如:错误的建模方法:CBBCounter类有一个属性cbbNumber,记录CBB的编码。正确的建模方法:引入一个Link对象,记录CBBCounter类和WTPartMaster类的关系。布局 类图中尽量保证各部分分布均匀,连线尽量不要交叉,整个类图能够显示在一个屏幕范围之内(标准1024*768分辨率),对于引用的其他包的类、接口,可以将其属性、方法隐藏起来。避免占用过大的显示空间。建模搭建环境进入到Windchill+Information+Modeler-091_F000lRational_Rose_for_Windowssetup.exe安装安装完成之后,loa
7、d注册文件进入到WT_HOMEroseAddIn,将VirtualPathMap.AddIn.reg和Windchill.AddIn.reg文件中的路径修订为个人本机环境的路径并注册 建模搭建环境启动rose,点击“Edit Path Map”查看注册信息 Rose模型介绍打开Rose模型,点击FileOpen选择srcwtWTdesigner.mdlRose模型使用点击【是】,系统会加载其中Logical View是系统核心 逻辑显示,其中3rd是Windchilll 中使用了哪些Java技术模块、ext 是系统客制化扩展模型目录、wnc是Windchill核心业务逻辑组成点击Save AS
8、,重新命名为HelloWorld.mdl文件,弹出框选择No,环境搭建好后,即可创建模型扩展模型模型扩展(续)针对上面的图示,自定义个模型EleadDocs,继承WTDocument,该模型自定义方法getEleadDocName()和属性eleadDocType,且将其属性设置constrain=false,点击保存(遇到提示,点击No)选择菜单Units.Control docs,保存为docs.cat模型扩展(续)生成系统文件,选中docs包模型扩展(续)生成系统文件.mData和EleadDocs.java文件在src目录下自动生成包路径和文件 docs.mData和EleadDocs
9、.java模型扩展(续)系统会自动生成SQL【WT_HOME】dbsql3exteleaddocs生成.ser文件【WT_HOME】codebaseexteleaddocs执行SQL语句进入到 Oracle SQL*Plus路径,执行命令:操作完成之后,即可使用EleadDocs对象了!模型扩展(续)模型扩展(续)完整的例子说明在windchill/src/目录下建立一个helloWorld目录,在windchill/codebase/目录下也建立一个helloWorld目录打开rose软件,依次打开fileopen定位到windchill/src/wt/WTdesigner.mdl,打开出现
10、这个对话框,选择是,然后就耐心等待系统加载完这个文件。当完全加载完以后把这个文件保存到上面建立的windchill/src/helloWorld目录下,名称为helloWorld模型扩展(续)打开helloWorld.Mdl,打开后如下图你可以发现你打开的时候是没有wt,java,helloWorld这3个package的,因为这3个package中wt和java是从左边的方框中拖过来的,而helloWorld这个是我自己建立的,然后把helloWorld和wt,java这2个package建立关系如上图。然后双击helloWorld这个package在这个package中开始创建类。模型扩展
11、(续)打开helloWorld这个package后会出现下图模型扩展(续)l你打开的时候是什么都没有的,这里面person,personLink这2个类是自己建立的,可以从中间的那个条中选择到的,然后对这2个类进行编辑,选中person这个类,点右键,会出现l点击第一个,然后就会出现模型扩展(续)模型扩展(续)选择attributes这个标签模型扩展(续)然后在空白的地方点右键就会出现一个快捷菜单,在这个菜单中可以创建一个变量,然后双击变量会出现模型扩展(续)在这个里面会对这个变量的类型进行设置,然后点windchill标签找到constrain这项,设置value为false,每个变量都需要
12、这样进行设置,然后让这个类继承wt.fc.Item这个抽象类,这样就表明person这个类现在是持久的。同理把person这个类和wtpart这个类建立关联,关联的类为PersonLink然后让personLink继承ObjectToObjectLink这个类,然后把这个helloWorld.mdl保存一下,然后依次打开fileunitscontrol,然后再依次打开,toolswindchillsystem generation模型扩展(续)选中前3项点OK,然后这个时候你就可以在windchill/src/helloWorld这个目录下看到有Person.java和PersonLink.j
13、ava这2个java文件,并且在windchill/db/sql3/helloWorld这个目录下面也会产生几个sql文件,把这几个sql文件导入到数据库中建立相关的表,要注意建立的先后顺序:只用操作以create开头的3个sql文件模型扩展(续)修改Person.java加入下面的代码protectedprotected voidvoid initialize()throwsthrows WTExceptionDate today=newnew Date();supersuper.initialize();System.out.println(Person-initialize execut
14、ing!);String s=String.valueOf(today.toLocaleString();setId(s);然后把person.java和personLink.java这两个文件放到windchill/codebase/helloWorld/目录下进行编译。模型扩展(续)写测试代码public class HelloWorldTest public static void main(String args)String userName=args0;String password=args1;RemoteMethodServer methodserver=RemoteMetho
15、dServer.getDefault();methodserver.setUserName(userName);methodserver.setPassword(password);HelloWorldTest test=new HelloWorldTest();test.test();模型扩展(续)测试代码public void test()tryPerson p=Person.newPerson();p.setName(111);p.setTitle(222);p.setAge(1111);p=(Person)PersistenceHelper.manager.save(p);WTPart
16、 part=getPartByNumber(D3_0000000064);if(part=null)Debug.P(part is null);return;PersonLink link=PersonLink.newPersonLink(part,p);link=(PersonLink)PersistenceHelper.manager.save(link);if(link=null)Debug.P(link is null);return;WTPart part1=link.getUse();Person p1=link.getUsed();if(part1=null)Debug.P(pa
17、rt1 is null);elseDebug.P(part1 is+part1.getNumber();if(p1=null)Debug.P(p1 is null);elseDebug.P(p1 is+p1.getName();catch(Exception e)e.printStackTrace();模型扩展(续)public static WTPart getPartByNumber(String number)WTPart part=null;try QuerySpec qs=new QuerySpec(WTPart.class);SearchCondition sc=new Searc
18、hCondition(WTPart.class,WTPart.NUMBER,=,number);qs.appendWhere(sc);QueryResult qr1=PersistenceHelper.manager.find(qs);while(qr1.hasMoreElements()part=(WTPart)qr1.nextElement();catch(Exception e)e.printStackTrace();return part;模型扩展(续)把这个测试类在windchill shell 中运行,运行结果为下图然后我们现在看下数据库中的情况模型扩展(续)在person和per
19、sonlink这两张表中都有了数据,测试结果正确注意事项在进行建模之前要对一些参数进行设置,也就是把rose的操作目录指向windchill的目录开发目录介绍WT_HOMEWT_HOMEwtCustowtCustomm wtSafeAreawtSafeAreasrcsrc db db siteModsiteModptcCurrentptcCurrentptcOrigptcOrigsql sql comcomitbgitbgitbgtasks tasks comcomitbgcomcomtemplatemplatestesloadfiloadfileslesloadXMLFiloadXMLFil
20、eslescocommitbgcomcomitbgcodebascodebase e comcom itbgcom com itbgjspjspnetmarkets comitbg1 1、wtCustom wtCustom 放入修改系统的放入修改系统的rbInforbInfo文件文件2 2、wtSateArea wtSateArea 下的下的siteModsiteMod文件中放入修改后的系统文件,比如文件中放入修改后的系统文件,比如.jspf.jspf文件、文件、htmlhtml、xmlxml;ptcCurrentptcCurrent文件放系统当前版本的文件;文件放系统当前版本的文件;ptcO
21、rigptcOrig放系统最原始的文件放系统最原始的文件 ant-f bin/swmaint.xml installSiteChangesant-f bin/swmaint.xml installSiteChanges3 3、codebasecodebase是运行时目录,放编译后的是运行时目录,放编译后的.class.class文件、放文件、放WEBWEB相关文件、放模板文件相关文件、放模板文件(.html)(.html)4 4、srcsrc目录放客制化的源文件,放国际化目录放客制化的源文件,放国际化.rbInfo.rbInfo文件。文件。5 5、taskstasks目录放系统服务文件目录放系
22、统服务文件.xml.xml文件,文件,InfoInfo*EngineEngine配置文件配置文件6 6、loadFilesloadFiles目录,放置需要导入到系统的工作流、生命周期等目录,放置需要导入到系统的工作流、生命周期等 7 7、loadXMLFilesloadXMLFiles目录,放置配置系统的信息的目录,放置配置系统的信息的.xml.xml文件文件8 8、DBDB目录,放置建立模型后生成的目录,放置建立模型后生成的SQLSQL语句语句Windchill类的介绍1.如何在系统中查找对象对应的类2.如何通过类在数据库中查找相关的表 如何在系统中查找对象对应的类打开类型管理器,选择部件,
23、这个部件就对应了系统中的一个对象,页面的右部就会显示这个类的具体信息,在名称这栏中的wt.part.WTPart就是系统中部件对应的类,wt.part是包名,WTPart就是类的名称,这个时候就可以在Eclipse中查看这个类有那些相关的函数,同时也可以到wt.part这个包中查看其它的一些类,这些类也都是和WTPart有关。如何通过在系统中查找对象对应的类系统中的业务对象在Rose模型中都可以看到相应的方法系统类的设计系统中的服务类设计为xxHelper.java文件和xxService.java是组合关系,系统中的所有业务对象对应的方法在对应的service中,通过xxHelper.ser
24、ivce.方法 部件操作:WTPartHelper.service.方法文档操作:WTDocumentHelper.service.方法EC操作:ChangeHelper2.service.方法文件夹的操作:FolderHelper.service.方法生命周期的操作:LifeCycleHelper.manager.方法推进流程对象的操作:MaturityHelper.service.方法通知机制对象的操作:NotificationHelper.service.方法位号的操作:OccurrenceHelper.service.方法参与者的操作:OrganizationServicesHelpe
25、r.manager.方法版本的操作:VersionControlHelper.service.方法如何通过类在数据库中查找相关的表在类型管理器中定义的那些对象在数据库中都有相对应的表存在,表的名称也就是类的名称。例如:部件对象的类名称是WTPart,则数据库中就对应了一张名为WTPart的表。WINDCHILL的数据库中的一张表其实对应的就是系统中的一个类名,所以有很多开发可以以数据库的表为入手点,如果你知道系统中的某个信息是存储在数据库中的具体表中的时候,就可以根据表的名称去系统中查找相关的类,来获取你需要的数据 如何通过类在数据库中查找相关的表上面就是数据库中WTPart的表,这里面的数据
26、在WTPart这个类中就可以获取,例如你如果想要获取一个部件的生命周期状态,数据库中对应的字段是STATESTATE这个字段,那么你就可以在在代码中通过part.getLifeCycleState().getDisplay()这个函数来获取,所以在学习WINDCHILL系统的开发的时候一定不能忽略数据库的作用。Windchill各个包的介绍PackageFunctionalityaccess Functionality for access control;used to define access policies and object ownership(that is,define ru
27、les for what users or groups have access to what information).admin Functionality to create administrative domains and policies.change2Functionality to manipulate change items(change issue,request,investigation,proposal,order,and change activity).container.batch Functionality for a client applicatio
28、n to gather a group of create,modify,and delete assertions,and submit them to a service method for processing in one transaction.content Functionality for handling content data(attaching files and URLs to content holders,such as documents and change objects)and associating business information metad
29、ata(such as the author)with content.docFunctionality for document management.effectivity Functionality to assert that a PDM object is effective under certain conditions.Windchill各个包的介绍Windchill各个包的介绍Windchill各个包的介绍Windchill中的Model简介DocumentDocument CustomizersCustomizersWindchillWindchill中的中的ModelMo
30、del简简介介Windchill DocumentWindchill Document客制方法介客制方法介绍绍WindchillWindchill中中UIUI介介绍绍Windchill各个业务对象的模型介绍Windchill Document客制方法介绍文文档属性档属性在在Windchill documentWindchill document中中WTDocumentMasterWTDocumentMaster和和WTDocumentWTDocument是两个主要是两个主要对对象象:在WTDocumentMaster中对于文件中所有的版本版序有相同的值。如果文件已建立很多版本版序,当maste
31、r改变时将影响所有的版本版序。在 WTDocument每一个版序有不同的值对应,因此WTDocument的改变只影响一种版序。如果想如果想规规定一个从一个版序到另一个版序定一个从一个版序到另一个版序变变化的属性,化的属性,则则需要需要扩扩展展 WTDocumentWTDocument。Windchill Document客制方法介绍类型类型枚举类型(值列表)领域,在windchill中让用户能够进行分类管理的文件。类型的值被定义在 wt.doc.DocumentTypeRB中。如果有一个要求不显示doctype属性,只需要把类型管理中设置类型的实例化中的勾去掉即可,不可删除。Windchill
32、 Document客制方法介绍DepartmentDepartment在Windchill中允许用户选择区域,负责文件的管理枚举类型值都被定义在 wt.doc.DepartmentListRB中。Windchill Document客制方法介绍文文件与件与文文件之件之间间的关系的关系:文文件件结结构构 :一个一个文文件可以使用很多其它子件可以使用很多其它子文文件,其下件,其下层层子子文文件也可以被其它件也可以被其它文文件使用。件使用。(使用与被使用的关系使用与被使用的关系)文文件参考件参考 :一个一个文文件涉及的信息存在于其他件涉及的信息存在于其他文文件中。件中。(参考参考与被参考的关系与被参
33、考的关系)Windchill Document客制方法介绍文文件件结结构构Windchill Document客制方法介绍文文件參考件參考Windchill Document客制方法介绍l创创建建文文件以及件以及文文件的主件的主文文档、档、删删除除文文件件l添加添加文文件的附件、件的附件、删删除附件除附件l文文件的出件的出库库、入、入库库以及修改主以及修改主文文档档l文文件下件下载载l文文件与件与文文件之件之间创间创建关建关联联(文文件参考、件参考、文文件件结结构构)Windchill Document客制方法介绍三种三种创创建建文文件的构造方法:件的构造方法:lnewWTDocumentne
34、wWTDocument();lnewWTDocumentnewWTDocument(WTDocumentMastermaster);lnewWTDocumentnewWTDocument(Stringnumber,Stringname,DocumentTypetype)Windchill Document客制方法介绍創建文件實例WTDocument newDoc=null;newDoc=WTDocument.newWTDocument();newDoc.setName(创建主文档22);/文件的名称必设项newDoc.setNumber(888822);/文件编号必设项newDoc.setDe
35、partment(DepartmentList.toDepartmentList(ENG);/设置departmentlist即文件所属的部门,必设项DocumentType doctype=DocumentType.toDocumentType($Document);/必设项,文件类型为一般文件newDoc.setDocType(doctype);setType(newDoc,wt.doc.WTDocument|com.elead.Drawing);newDoc=(WTDocument)PersistenceHelper.manager.save(newDoc);/保存文件Windchill
36、 Document客制方法介绍以上只是以上只是对对文文件的基件的基本本信息信息进进行了行了设设置也就相当在置也就相当在创创建建文文件的模板中只件的模板中只是是填写了基填写了基本本信息信息没有没有上上传传文文档档时时生成的不含主生成的不含主文文档的档的文文件。以下是件。以下是创创建主建主文文档:档:ContentHolder contentHolder=ContentHelper.service.getContents(newDoc);/获得文件的ContentHolderApplicationData appdata=ApplicationData.newApplicationData(con
37、tentHolder);appdata.setRole(ContentRoleType.PRIMARY);通过ApplicationData 去设置主文档的名称、大小、以及文件上传路径等.ContentServerHelper.service.updateContent(contentHolder,appdata,fileStream);/主文档创建成功参数fileStream是要上传的文件输入流。Windchill Document客制方法介绍删除文件只只删删除主除主文文档档ContentHolder contentHolder=ContentHelper.service.getConten
38、ts(newDoc);ContentItem contentitem=ContentHelper.getPrimary(FormatContentHolder)contentHolder);ContentServerHelper.service.deleteContent(contentHolder,contentitem);删删除除文文件和主件和主文文档都档都删删除除PersistenceHelper.manager.delete(doc);Windchill Document客制方法介绍添加附件文文件添加附件和件添加附件和文文件添加主件添加主文文档方法档方法类类似,唯一不似,唯一不同的就是
39、同的就是ContentRoleTypeContentRoleType类型类型。主主文文档的档的类型类型是是ContentRoleType.PRIMARYContentRoleType.PRIMARY附件的附件的类型类型是是ContentRoleType.SECONDARYContentRoleType.SECONDARYWindchill Document客制方法介绍刪除附件ContentHolder contentHolder=ContentHelper.service.getContents(doc);Vector vData=ContentHelper.getApplicationDat
40、a(contentHolder);if(vData!=null&vData.size()0)for(int i=0;i 0&strFilename.equals(appData.getFileName()ContentServerHelper.service.deleteContent(contentHolder,appData);Windchill Document客制方法介绍文件出库入库为为什么要什么要对对文文件出件出库库入入库库?什么什么情情况下况下对对文文件件进进行出行出库库入入库库?对对文文件的出件的出库库主要的主要的目目的之一是的之一是为为了防止一个了防止一个文文件同件同时时两个人
41、修改,两个人修改,由此可以看出只要是由此可以看出只要是和和文文件更新相关的操作件更新相关的操作都要都要对对文文件件进进行出行出库库,然,然后后对对出出库库后的副后的副本本进进行更新操作,最后入行更新操作,最后入库库。Windchill Document客制方法介绍文件出库文文件件出出库库时时,Windchil,Windchil会自会自动动将一个工作复将一个工作复本本放入資料夾放入資料夾中的中的Checked OutChecked Out文文件件夹夹中中。首先得到文件夹中的checkout文件夹:Folder myFolder=WorkInProgressHelper.service.getCh
42、eckoutFolder();然后对文件出库放入checkout文件夹中:CheckoutLink checkout_link=WorkInProgressHelper.service.checkout(doc,myFolder,“”);最后得到工作复本:doc=(WTDocument)checkout_link.getWorkingCopy();Windchill Document客制方法介绍出库实例if(!wt.vc.wip.WorkInProgressHelper.isCheckedOut(Workable)doc)/判断文件是不是出库状态if(!FolderHelper.inPerso
43、nalCabinet(CabinetBased)doc)&!WorkInProgressHelper.isWorkingCopy(Workable)doc)Folder myFolder=WorkInProgressHelper.service.getCheckoutFolder();CheckoutLink checkout_link=WorkInProgressHelper.service.checkout(doc,myFolder,);doc=(WTDocument)checkout_link.getWorkingCopy();Windchill Document客制方法介绍文件的入库对
44、对文文件复件复本本进进行入行入库库:updateDoc=(WTDocument)WorkInProgressHelper.service.checkin(updateDoc,comment);参数updateDoc出库的副本文件;comment入库时的版序注解Windchill Document客制方法介绍入庫實例WTDocument updateDoc=null;if(wt.vc.wip.WorkInProgressHelper.isCheckedOut(Workable)doc)if(WorkInProgressHelper.isWorkingCopy(doc)updateDoc=doc;
45、elseupdateDoc=(WTDocument)WorkInProgressHelper.service.workingCopyOf(doc);updateDoc=(WTDocument)WorkInProgressHelper.service.checkin(updateDoc,comment);PersistenceHelper.manager.refresh(updateDoc);elseupdateDoc=(WTDocument)WorkInProgressHelper.service.checkin(updateDoc,comment);Windchill Document客制方
46、法介绍修改主文檔主主文文档的修改是主档的修改是主文文档的档的删删除和除和创创建建组组合,在修改主合,在修改主文文档档时时应该应该找到原来的主找到原来的主文文档档删删除除之后再之后再创创建新的主建新的主文文档。档。具体具体实实例例见见前面的主前面的主文文档档创创建和建和删删除方法。除方法。Windchill Document客制方法介绍文件下载首先得到要下载文件的最新版本(Iterated iter=null;boolean flag=false;LatestConfigSpec latestconfigspec=new LatestConfigSpec();QueryResult queryr
47、esult=ConfigHelper.service.filteredIterationsOf(master,latestconfigspec);while(queryresult.hasMoreElements()&(!flag)iter=(Iterated)(queryresult.nextElement();flag=iter.isLatestIteration();)Windchill Document客制方法介绍然后取得文件的主文档或附件下载ContentHolder contentholder=ContentHelper.service.getContents(downDOC);C
48、ontentItem contentitem=ContentHelper.getPrimary(FormatContentHolder)contentholder);/得到主文档ApplicationData applicationdata=(ApplicationData)contentitem;ContentServerHelper.service.writeContentStream(applicationdata,sourcePath);参数Applicationdata是下载的文件,参数sourcePath为下载文件要存放的路径和文件名。Windchill Document客制方法介
49、绍文件的关联-文件结构文件与文件的使用关系创建(删除类似):首先 判断有没有关联,得到文件之间关联是通过:PersistenceHelper.manager.find();查找得到;然后创建uselink关联:WTDocumentUsageLink usageLink=WTDocumentUsageLink.newWTDocumentUsageLink(WTDocument,WTDocumentMaster);PersistenceServerHelper.manager.insert(usageLink);/关联创建成功Windchill Document客制方法介绍文件的关联-文件参考文件
50、与文件之间参考关系的创建(删除类似):首先查看是不是两者之间已有此关系:WTDocumentHelper.service.getDependsOnWTDocuments(WTDocument);其次创建DependencyLink关联:WTDocumentDependencyLink.newWTDocumentDependencyLink(WTDocument,WTDocument);最后把创建的关联插入数据库:PersistenceServerHelper.manager.insert(WTDocumentDependencyLink);Windchill Document客制方法介绍/*获