CATIAV6开发_新建窗口打开模型

应朋友邀请,现从项目需求中挖出一部分达索V6平台CAA开发的内容为大家做一个展示分享,大致实现目的为根据一些属性值查询出数据库中的Product模型,并将其打开展示在界面上,其中,查询和打开我都做好了,展示那一块遇到一些问题,我不确定在V6平台是否支持新建窗口打开这样的开发方案,在此分享出来也是想跟大家交流一下。下面,我们步入正题。打开软件后,我们常用的普通查询模式一般是指定搜索类型,然后输入关键字段进行类型搜索,我们在代码上的实现思路跟软件操作基本一致,下面是我制作的对话框(请忽略细节,仅用作测试)。操作步骤如下:

用户首先需要指定用于搜索的属性内部名称,我做了一个下拉菜单供用户选择,默认“V_Name”;

用户输入属性名称,此处控件为编辑框;

用户点击“Search”执行搜索,搜索结果展示在上层列表框中,“MFCDialog”是我调用MFC对话框的测试,与本文内容无关,请忽略

选择列表框中一行数据,点击“OK”新建窗口打开模型。

V6平台是支持用户自定义对象类型和属性拓展的,但是自定义的对象类型也是基于原有的DS类型,例如我们想新建一种新的零件类型,我们只能是基于现有的“VPMReference”类型创建,新拓展属性是依附于对象类型的,可拓展的类型包括int、double、bool、string、date等。所以大家明白这个道理之后,我们以搜索Product模型为例,讲解下如何用代码执行搜索操作。我们知道,Product的DS对象类型就是“VPMReference”,也可以将输入指定为其他的DS类型,甚至也可以是我们自己加的自定义类型;第二个输入项便是属性信息了,我们需要指定要搜索的属性内部名称和属性值,对象的内部属性名称可以用代码或者在服务端的Matrix程序中查询到,此处不再赘述。下面是相关代码:取得对象类型:其中,isPLMType为“VPMReference”,ospType为CATIType_var类型取得对象类型后就可以执行模型查询了,相关代码如下:其中,spVPMReference为对象类型,AttributeSet为查询依据(属性),QueryResult为查询结果。此处我们查询用的接口为“CATAdpPLMQueryServices”,它为我们提供了一些方法使得我们可以通过若干属性取得相应的对象链表,另外它涉及到的一个关键点就是UniqueKey,这个UniqueKey实际上就是一串编码,代表数据库中的唯一标识,类似于Oracle数据库中的UUID,这个UniqueKey在DS软件内部实际上也是跟若干属性关联的,默认就是PLM_ExternalID属性和版本号,当然我们也可以在服务端进行修改关联,我个人不推荐这样做,可能引发异常。结果集被我们查到以后,我们需要取得的这些对象的唯一标识,V6平台中对象的唯一标识接口为CATIAdpPLMIdentificator,我们可以通过遍历查询结果集取得CATIAdpPLMIdentificator类型的链表,这里需要特别指出的是CATIAdpPLMIdentificator是为数据库中对象传递信息的一个接口,可以算作是数据库中的唯一标识。当然数据库中对象唯一标识的另外一种表示就是UniqueKey,上段文字我们已经提到过,它的默认关联属性为PLM_ExternalID和大版本号(majorrevision)和小版本号(minorrevision)。通过遍历标识接口的链表取出这些信息,代码如下:

for(inti=1;i

相关属性查询得到后,对话框界面显示如下:在这里我们做个补充,另一种查询方式是使用“CATAdpPLMExtendedQueryServices”接口,使用方法跟前面类似执行查询,代码如下:

CATAdpPLMQueryAttributeSetiAttributeSetForFilter;rc=iAttributeSetForFilter.AddStringAttribute(istrAttrialue,istrAttriValue);CATIType_varspVPMReferenceType;if(SUCCEEDED(rc))rc=RetrievePLMType(isPLMType,spVPMReferenceType);CATAdpPLMQueryFilteriQueryFilter(spVPMReferenceType,iAttributeSetForFilter);if(SUCCEEDED(rc))rc=CATAdpPLMExtendedQueryServices::GetElementsFromQueryFilter(iQueryFilter,outputComponentsInfos);

取得它的结果信息,代码如下:

CATIType_varspVPMReferenceType;rc=RetrievePLMType(isPLMType,spVPMReferenceType);CATIAdpPLMIdentificator*pIdentificator=NULL;CATAdpPLMComponentsInfosIteriterator=oComponentsInfos.GetIterator();CATAdpPLMComponentInfosoComInfos;while(S_OK==iterator.NextInfos(pIdentificator,oComInfos)){olistOfQueryResults.Append(pIdentificator);CATAdpPLMAttributeSetAttrSet;if(SUCCEEDED(rc))rc=oComInfos.GetAttributeSet(spVPMReferenceType,AttrSet);CATUnicodeStringstrExternalID("");CATStringstr("PLM_ExternalID");if(SUCCEEDED(rc))AttrSet.GetStringAttributeValue(str,strExternalID);olistOfExternalID.Append(strExternalID);}

打开模型,代码如下:

CATOmbLifeCycleRootsBagLifeCycleRootsBag;CATIPLMNavReference*piBoltReference=NULL;CATAdpOpenParametersopenParameters(CATAdpExpandParameters::Authoring);CATAdpOpeneropener(LifeCycleRootsBag,openParameters);rc=opener.CompleteAndOpen(pOpededIdent,IID_CATIPLMNavReference,(void**)&piBoltReference);

新建窗口(windows),新建浏览器(Viewer),浏览器加载模型,窗口添加浏览器,当前布局添加窗口,加载值当前浏览器的代码如下:

CATVisManager*pVisuManager=CATVisManager::GetVisManager();listListIVisu3d;IIDvisu3d=IID_CATI3DGeoVisu;ListIVisu3d.fastadd(&visu3d);CATViewpoint*pViewPoint1=(CATViewpoint*)&(_NavMain3DViewer->GetMain3DViewpoint());pVisuManager->AttachTo(_pRootObjectPath,pViewPoint1,ListIVisu3d,pCommandSelector);

执行结果如下:

结语

现在我重点说下我遇到的问题,上面图中并没有树结构和右键菜单,其中右键菜单我知道如何加进来,左侧的树结构我还没有研究,而且我是在模型已经被打开的情况下才可以这样新建窗口打开的,但是如果模型未被打开时,我这里的新建窗口也是加载不出模型的,但是我可以访问到模型的树结构中的所有信息,包括物理节点信息、特征信息、拓扑信息等,惟独不能像手动打开模型一样正常的显示模型,所以我怀疑CompleteAndOpen方法只是在后台打开并加载模型,前端显示达索并没有提供相应的接口实现,也或者就是一个3DRep的显示问题,如果有朋友有具体的实现方法或者文中有错误/纰漏,希望能告诉我,沟通让我们共同进步。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180119G0DJVN00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券