Creating Search Queries-如何编写查询语句,在 V5 文档中检索零部件对象?
本文介绍如何创建并执行检索,在 CATIA V5 文档中查找模型对象。
- 本案例学习要点
- CAACafSearch 示例工程
- CAACafSearch 实现功能
- CAACafSearch 启动方式
- CAACafSearch 源码路径
- 实现分步详解
- 内容小结
- 参考资料
本案例可学到的内容
- 创建简单检索条件(对应 CATIA【搜索】命令的常规选项卡用法);
- 创建基于知识工程类型与属性的检索条件(对应【搜索】命令的高级选项卡用法);
- 创建组合检索条件(两个条件间实现与、或、非逻辑运算);
- 通过本地化字符串或转换格式字符串生成检索条件;
- 执行检索查询;
- 将检索结果置入预选高亮对象(PSO)。
CAACafSearch 示例工程
CAACafSearch 实现功能

该名为「搜索演示器」的命令通过如下交互界面,供用户在预设筛选条件与多种检索环境之间进行选择:
图 2:搜索演示对话框

共有八种预设检索条件,具体如下:
图 3:筛选条件列表

所有筛选条件会在状态命令启动时统一创建、退出时统一销毁;仅在销毁前保留筛选条件的文本(多语言格式或 Transformat 格式)。用户点击【执行】按钮后会触发动作函数,该函数根据保存的文本重新生成筛选条件,并结合当前检索上下文执行查询。
共有四种检索上下文,具体如下:
图 4:检索上下文列表

如需了解这四种检索上下文的详细信息,请参阅技术文档 [1]。
用户点击执行按钮后,查询到的对象数量会在编辑框中显示,同时选中对象自动预选高亮。
图 5:一次查询结果

该图展示了第一次检索的运行结果:规格树中有三个对象被高亮预选。在三维视图可视区域内,仅点与凸台特征呈现预选高亮;切换至隐藏元素显示状态后,草图也会变为预选高亮样式。
如何启动 CAACafSearch 示例
- Windows 系统:
安装根目录\CAAApplicationFrame.edu\CNext\code\dictionary\ - UNIX 系统:
安装根目录/CAAApplicationFrame.edu/CNext/code/dictionary/
其中InstallRootDirectory为 CAA 安装光盘的安装根目录。
在该文件中,删除下面两行代码前的#注释符,之后执行mkCreateRuntimeView命令。
#CAAAfrGeneralWksAddin CATIWorkbenchAddin libCAAAfrGeneralWksAddin
#CAAAfrGeneralWksAddin CATIAfrGeneralWksAddin libCAAAfrGeneralWksAddin
上述两行用于注册通用工作台插件,对应案例文档【3】中的CAAAfrGeneralWksAddin示例,该示例隶属于 CAAApplicationFrame.edu 框架下的CAAAfrGeneralWksAddin.m模块。
- 点击菜单栏【文件】→【打开】
- 在文件选择弹窗选中
CAACafSearch.CATPart,点击【打开】 - 点击菜单栏【编辑】→【Search Demonstrator...(搜索演示工具)】
- 在搜索演示对话框内,选定一条筛选条件与检索范围
- 点击【启动】
- 点击【关闭】
- 再次点击菜单栏【文件】→【打开】
- 在文件选择弹窗选中
CAACafSearch.CATProduct,点击【打开】 - 点击菜单栏【编辑】→【Search Demonstrator...(搜索演示工具)】
- 在搜索演示对话框内,选定一条筛选条件与检索范围
- 点击【启动】
- 点击【关闭】
(*) 该模型文件存放在 CAACATIAApplicationFrm.edu 框架的 InputData 目录中:
- Windows 系统路径:
安装根目录\CAACATIAApplicationFrm.edu\InputData\ - Unix 系统路径:
安装根目录/CAACATIAApplicationFrm.edu/InputData/
其中 InstallRootDirectory 为 CAA 安装包的根目录路径。
CAACafSearch 源码位置
CAACafSearch 示例由多个类文件组成,代码存放于 CAACATIAApplicationFrm.edu 框架下的 CAACafSearch.m 模块目录:
- Windows 系统:
安装根目录\CAACATIAApplicationFrm.edu\CAACafSearch.m\ - Unix 系统:
安装根目录/CAACATIAApplicationFrm.edu/CAACafSearch.m/
InstallRootDirectory 指代 CAA 开发盘的安装根文件夹。
项目包含三个类:
- CAACafSearchCmd:状态命令类,负责创建检索条件、供用户执行查询并通过预选高亮(PSO)展示查询结果。本文仅讲解和搜索 API相关的代码片段。
- CAACafSearchDlg:绑定 CAACafSearchCmd 状态命令的对话框类,本文不对该类展开详述。
- CAACafLaunchNextQueryNotification:用户点击启动按钮时,由 CAACafSearchDlg 发送的通知类;CAACafSearchCmd 接收该通知后,赋值对话框代理 [5],触发查询执行与结果展示动作。本文不对该类展开详述。
前置依赖代码为通用工作台插件,该插件内置了搜索演示命令。如需详情,可查阅 CAAAfrGeneralWksAddin 示例【3】文档里的「CAAAfrGeneralWksAddin 代码存放位置」章节。
分步实现
- 创建检索引擎、检索上下文与服务组件
- 构建检索筛选条件
- 执行检索查询
- 通过 PSO 预选高亮展示查询到的对象
创建检索引擎、检索上下文及服务组件
在 CAACafSearchCmd 类的构造函数中,实例化状态命令运行全程所需的各类搜索组件。各类组件通过全局函数CATCreateInstance结合CATIniSearchxxxComponent头文件中定义的 CLSID 标识符完成创建【6】。
...
#include "CATIIniSearchServices.h"
#include "CATIIniSearchEngine.h"
#include "CATIIniSearchContext.h"
#include "CATIniSearchEngineComponent.h"
#include "CATIniSearchContextComponent.h"
#include "CATIniSearchServicesComponent.h"
// 创建搜索引擎实例
::CATCreateInstance(CLSID_CATIniSearchEngineComponent, NULL, 0,
IID_CATIIniSearchEngine,
(void**)&_pIniSearchEngineOnCurrentEngine);
// 创建搜索上下文实例
::CATCreateInstance(CLSID_CATIniSearchContextComponent, NULL, 0,
IID_CATIIniSearchContext,
(void**)&_pIniSearchContextOnCurrentContext);
// 创建搜索服务实例
::CATCreateInstance(CLSID_CATIniSearchServicesComponent, NULL, 0,
IID_CATIIniSearchServices,
(void**)&_pIniSearchServices);
...
_pIniSearchEngineOnCurrentEngine(CATIIniSearchEngine类型)管理,后续在 CAACafSearchCmd 的动作函数中,依靠该指针执行用户选定的检索。_pIniSearchContextOnCurrentContext(CATIIniSearchContext类型)管理。执行查询前,程序从 CAACafSearchDlg 对话框实例中读取用户所选检索范围;上下文是查询入参之一,另一个入参为检索条件。CATIIniSearchServices接口指针_pIniSearchServices管控。
构建筛选条件
- 生成筛选条件对象
- 将条件文本存入全局链表
- 销毁筛选条件对象
简易检索条件:
- 基于颜色的筛选条件
- 基于颜色与可见性的筛选条件
- 基于线型与线粗的筛选条件
- 基于图层的筛选条件
- 基于名称的筛选条件
高级检索条件:
- 读取类型字典
- 基于尺寸属性的筛选条件
- 基于字符串属性的筛选条件
- 基于用户自定义属性的筛选条件
-
基于颜色的检索条件
pIniSearchColorCriterion为CATIIniSearchColorCriterion接口指针,用于管控该组件。CATIIniSearchColorCriterion * pIniSearchColorCriterion = NULL ;
rc = ::CATCreateInstance(CLSID_CATIniSearchColorCriterionComponent, NULL, 0,
IID_CATIIniSearchColorCriterion,
(void**)&pIniSearchColorCriterion);
...
通过CATIIniSearchColorCriterion接口配置颜色参数:
...
unsigned int *Color = new unsigned int[3];
Color[0]=255; Color[1]=0; Color[2]=0;
CATUnicodeString ColorName;
rc = pIniSearchColorCriterion->FindColorNameFromRGBColorCode(Color,ColorName);
rc = pIniSearchColorCriterion->SetParameters(Color[0],Color[1],Color[2],
CATIniSearchEnumeration::Equal,
ColorName);
delete []Color;
...
FindColorNameFromRGBColorCode函数依据 RGB 三色值查询对应颜色名称;若无匹配色名,返回错误码E_FAIL。系统内置 48 种基础色 + 16 种自定义色,共 64 个预设色名。获取到的色名ColorName作为入参传入SetParameters,用于拼接生成检索条件的显示文本。
最后读取该检索条件的文本内容:
...
CATIIniSearchCriterion * pSearchCriterion = NULL ;
rc = pIniSearchColorCriterion->QueryInterface(IID_CATIIniSearchCriterion,
(void**) &pSearchCriterion);
CATUnicodeString Text = "" ;
pSearchCriterion->GetNLSQuery(Text);
...
最终生成的条件文本:
Color=Basic 25Basic 25是系统内红色对应的标准色名。- 基于颜色与可见性的筛选条件
pIniSearchColorCriterion为CATIIniSearchColorCriterion接口指针,用作该组件的操作句柄。rc = ::CATCreateInstance(CLSID_CATIniSearchColorCriterionComponent, NULL, 0,
IID_CATIIniSearchColorCriterion,
(void**)&pIniSearchColorCriterion);
Color[0]=253; Color[1]=4; Color[2]=191;
rc = pIniSearchColorCriterion->SetParameters(Color[0],Color[1],Color[2],
CATIniSearchEnumeration::Equal);
delete []Color;
pIniSearchVisibilityCriterion是CATIIniSearchVisibilityCriterion接口指针,为组件操作句柄。rc = ::CATCreateInstance(CLSID_CATIniSearchVisibilityCriterionComponent, NULL, 0,
IID_CATIIniSearchVisibilityCriterion,
(void**)&pIniSearchVisibilityCriterion);
SetParameters方法配置参数:筛选属性为显示属性CATShowAttr、匹配规则为等于(Equal)。CATIIniSearchVisibilityCriterion::CATShowAttr,
CATIniSearchEnumeration::Equal);
rc = ::CATCreateInstance(CLSID_CATIniSearchAndCriterionComponent, NULL, 0,
IID_CATIIniSearchAndCriterion,
(void**)&pIniSearchAndCriterion);
pIniSearchColorCriterion);
rc = pIniSearchAndCriterion->QueryInterface(IID_CATIIniSearchCriterion,
(void**) &pSearchCriterion);
CATUnicodeString Text = "" ;
pSearchCriterion->GetNLSQuery(Text);
-
基于线型与线宽的筛选条件
pIniSearchDashedCriterion为CATIIniSearchDashedCriterion接口指针,作为该组件的操作句柄。rc = ::CATCreateInstance(CLSID_CATIniSearchDashedCriterionComponent, NULL, 0,
IID_CATIIniSearchDashedCriterion,
(void**)&pIniSearchDashedCriterion);
CATVisPropertiesValues类的线型读写接口 Get/SetLineType),也可使用字符串。本示例采用本地化字符串"Dotted",即多语言名称;搜索命令里的线型下拉框会展示全部线型本地化名称。CATIniSearchEnumeration::Equal);
pIniSearchWeightCriterion是CATIIniSearchWeightCriterion接口指针,对应组件操作句柄。rc = ::CATCreateInstance(CLSID_CATIniSearchWeightCriterionComponent, NULL, 0,
IID_CATIIniSearchWeightCriterion,
(void**)&pIniSearchWeightCriterion);
rc = pIniSearchWeightCriterion->SetParameters(weight,
CATIniSearchEnumeration::Superior);
rc = ::CATCreateInstance(CLSID_CATIniSearchAndCriterionComponent, NULL, 0,
IID_CATIIniSearchAndCriterion,
(void**)&pIniSearchAndCriterion);
pIniSearchDashedCriterion);
rc = pIniSearchAndCriterion->QueryInterface(IID_CATIIniSearchCriterion,
(void**) &pSearchCriterion);
CATUnicodeString Text = "" ;
pSearchCriterion->GetNLSQuery(Text);
(Weight>0.1mm & Dashed=Dotted)-
基于图层的筛选条件
pIniSearchLayer2Criterion为CATIIniSearchLayerCriterion接口指针,作为该组件的操作句柄。rc = ::CATCreateInstance(CLSID_CATIniSearchLayerCriterionComponent, NULL, 0,
IID_CATIIniSearchLayerCriterion,
(void**)&pIniSearchLayer2Criterion);
SetParameters方法设置图层编号:LayerIndex.BuildFromNum(2);
rc = pIniSearchLayer2Criterion->SetParameters(LayerIndex,
CATIniSearchEnumeration::Equal);
pIniSearchLayer3Criterion是CATIIniSearchLayerCriterion接口指针,对应组件操作句柄。rc = ::CATCreateInstance(CLSID_CATIniSearchLayerCriterionComponent, NULL, 0,
IID_CATIIniSearchLayerCriterion,
(void**)&pIniSearchLayer3Criterion);
SetParameters配置图层编号:LayerIndex.BuildFromNum(3);
rc = pIniSearchLayer3Criterion->SetParameters(LayerIndex,
CATIniSearchEnumeration::Equal);
rc = ::CATCreateInstance(CLSID_CATIniSearchOrCriterionComponent, NULL, 0,
IID_CATIIniSearchOrCriterion,
(void**)&pIniSearchOrCriterion);
pIniSearchLayer3Criterion);
rc = pIniSearchOrCriterion ->QueryInterface(IID_CATIIniSearchCriterion,
(void**) &pSearchCriterion);
CATUnicodeString Text = "" ;
pSearchCriterion->GetNLSQuery(Text);
(Layer=2 + Layer=3)- 基于名称的筛选条件
pIniSearchNameLineCriterion为CATIIniSearchNameCriterion接口指针,作为组件操作句柄。rc = ::CATCreateInstance(CLSID_CATIniSearchNameCriterionComponent, NULL, 0,
IID_CATIIniSearchNameCriterion,
(void**)&pIniSearchNameLineCriterion);
Line*,此处*不作为通配符使用。CorrectString方法可将字符*按普通星号字符解析、而非通配符;该方法第二个入参用于标记原字符串不含通配符,最终筛选文本可体现该效果。CATUnicodeString StringToCorrect = "Line*" ;
_pIniSearchServices->CorrectString(StringToCorrect,FALSE,Name);
SetParameters绑定处理后的字符串,配置不区分大小写:Line、line、LINE 均能匹配。rc = pIniSearchNameLineCriterion->SetParameters(Name,CaseSensibility,
CATIniSearchEnumeration::Equal);
pIniSearchNameWidthCriterion是CATIIniSearchNameCriterion接口指针。rc = ::CATCreateInstance(CLSID_CATIniSearchNameCriterionComponent, NULL, 0,
IID_CATIIniSearchNameCriterion,
(void**)&pIniSearchNameWidthCriterion);
*Width*中*为通配符,无需字符串校正;开启区分大小写,仅大写小写完全一致的Width才可命中。CATBoolean CaseSensibility = TRUE ;
rc = pIniSearchNameWidthCriterion->SetParameters(Name,CaseSensibility,
CATIniSearchEnumeration::Equal);
rc = ::CATCreateInstance(CLSID_CATIniSearchExceptCriterionComponent, NULL, 0,
IID_CATIIniSearchExceptCriterion,
(void**)&pIniSearchExceptCriterion);
pIniSearchNameWidthCriterion);
rc = pIniSearchExceptCriterion->QueryInterface(IID_CATIIniSearchCriterion,
(void**) &pSearchCriterion);
CATUnicodeString Text = "" ;
pSearchCriterion->GetTransFormatQuery(Text);
(Name=Line'*' - Name_CAP=*Width*)
Name:对应不区分大小写匹配Name_CAP:对应区分大小写匹配
-
读取类型字典
CATIType,可通过类型字典获取【1】。pITypeDictionaryOnCurrentDic = CATGlobalFunctions::GetTypeDictionary();
pITypeDictionaryOnCurrentDic字典指针。-
基于尺寸属性的筛选条件
pIniSearchTypeCriterion是CATIIniSearchTypeCriterion接口指针,作为组件操作句柄。rc = ::CATCreateInstance(CLSID_CATIniSearchTypeCriterionComponent, NULL, 0,
IID_CATIIniSearchTypeCriterion,
(void**)&pIniSearchTypeCriterion);
FindTypeInPackage方法获取孔特征对应的类型;该方法前两个入参说明参考检索技术文档【1】。本例中孔(Hole)隶属于零件设计(PartDesign)模块包。rc = pITypeDictionaryOnCurrentDic->FindTypeInPackage("Hole","PartDesign",TypePtr);
CATIType类型指针传入类型条件组件;SetParameters最后一个入参为对应工作台内部名,搜索命令的【工作台】下拉列表展示全部工作台,内部名获取方式查阅技术文档【1】。CATIniSearchEnumeration::Equal,"CATPrtSearch");
rc = ::CATCreateInstance(CLSID_CATIniSearchDimensionCriterionComponent, NULL, 0,
IID_CATIIniSearchDimensionCriterion,
(void**)&pIniSearchDimensionCriterion);
CATUnicodeString AttributeValue = "10.0mm" ;
CATUnicodeString AttributeNLSName = "Diameter" ;
rc = pIniSearchDimensionCriterion->SetParameters(AttributeInternalName,
AttributeValue,
CATIniSearchEnumeration::SupEqual,
AttributeNLSName);
rc = ::CATCreateInstance(CLSID_CATIniSearchAndCriterionComponent, NULL, 0,
IID_CATIIniSearchAndCriterion,
(void**)&pIniSearchAndCriterion);
pIniSearchDimensionCriterion);
rc = pIniSearchAndCriterion->QueryInterface(IID_CATIIniSearchCriterion,
(void**) &pSearchCriterion);
CATUnicodeString Text = "" ;
pSearchCriterion->GetTransFormatQuery(Text);
CATPrtSearch.Hole.Diameter>=10mm-
基于字符串属性的筛选条件
pIniSearchTypeCriterion为CATIIniSearchTypeCriterion接口指针,用作该组件的操作句柄。rc = ::CATCreateInstance(CLSID_CATIniSearchTypeCriterionComponent, NULL, 0,
IID_CATIIniSearchTypeCriterion,
(void**)&pIniSearchTypeCriterion);
FindTypeInPackage【1】方法获取产品特征对应的类型。rc = pITypeDictionaryOnCurrentDic->FindTypeInPackage("Product","ProductPackage", TypePtr);
CATIType接口指针作为参数传入类型组件。SetParameters方法最后一个入参是该特征所属工作台的内部名称【1】。CATIniSearchEnumeration::Equal,
"CATProductSearch");
pIniSearchStringCriterion是CATIIniSearchStringCriterion接口指针与组件句柄。rc = ::CATCreateInstance(CLSID_CATIniSearchStringCriterionComponent, NULL, 0,
IID_CATIIniSearchStringCriterion,
(void**)&pIniSearchStringCriterion );
CATUnicodeString AttributeNLSName = "Part Number" ;
CATUnicodeString AttributeValue = "CAAPart*" ;
CATBoolean CaseSensibility = FALSE ;
rc = pIniSearchStringCriterion->SetParameters(AttributeInternalName,
AttributeValue,
CaseSensibility ,
CATIniSearchEnumeration::Equal,
AttributeNLSName);
rc = ::CATCreateInstance(CLSID_CATIniSearchAndCriterionComponent, NULL, 0,
IID_CATIIniSearchAndCriterion,
(void**)&pIniSearchAndCriterion);
pIniSearchStringCriterion);
rc = pIniSearchAndCriterion->QueryInterface(IID_CATIIniSearchCriterion,
(void**) &pSearchCriterion);
CATUnicodeString Text = "" ;
pSearchCriterion->GetTransformatQuery(Text);
CATProductSearch.Product.PartNumber="CAAPart*"-
基于用户自定义属性的筛选条件
pIniSearchTypeCriterion为CATIIniSearchTypeCriterion接口指针,作为组件操作句柄,实现细节参考上一章节。CAAAttr为用户自定义属性,因此创建自定义属性筛选组件,pIniSearchUserCriterion是CATIIniSearchUserCriterion接口指针与组件句柄。rc = ::CATCreateInstance(CLSID_CATIniSearchUserCriterionComponent, NULL, 0,
IID_CATIIniSearchUserCriterion,
(void**)&pIniSearchUserCriterion);
CATUnicodeString AttributeValue = ".1" ;
rc = pIniSearchUserCriterion->SetParameters(AttributeInternalName,
AttributeValue,
CATIniSearchEnumeration::InfEqual);
rc = ::CATCreateInstance(CLSID_CATIniSearchAndCriterionComponent, NULL, 0,
IID_CATIIniSearchAndCriterion,
(void**)&pIniSearchAndCriterion);
pIniSearchUserCriterion);
rc = pIniSearchAndCriterion->QueryInterface(IID_CATIIniSearchCriterion,
(void**) &pSearchCriterion);
CATUnicodeString Text = "" ;
pSearchCriterion->GetNLSQuery(Text);
'Product Structure'.Product.CAAAttr<=.1Product Structure:工作台显示名称;Product:特征类型名;CAAAttr:自定义属性名。可与上一条格式化查询文本做对照。-
执行检索查询
_pSearchDlg->GetCurrentCriterion(CriterionIndex);
CATUnicodeString CriterionText = "";
if ( NULL != _pListCriterionTexts )
{
if ( (CriterionIndex >= 1) && (CriterionIndex <= _pListCriterionTexts->Size()) )
{
CriterionText = (*_pListCriterionTexts)[CriterionIndex];
}
}
_pSearchDlg->GetCurrentContext(ContextValue);
CATIIniSearchServices接口的DecodeStringToCriterion方法,由条件文本反向生成检索条件对象。
_pIniSearchServices是前文「创建引擎、上下文与服务组件」章节实例化的服务组件句柄;入参CriterionText即上一步取出的条件文本,出参pIniSearchCriterion为新生成条件的接口指针。第二个入参FALSE代表:解析出错时不弹出错误提示窗口。rc = _pIniSearchServices->DecodeStringToCriterion(CriterionText,
FALSE,
pIniSearchCriterion);
_pIniSearchContextOnCurrentContext为之前创建的上下文组件指针。_pIniSearchEngineOnCurrentEngine是已创建的搜索引擎对象。_pIniSearchContextOnCurrentContext);
LaunchSearchOnDocument默认入参为 NULL,代表在当前激活文档内执行搜索。-
在 PSO 中显示检索到的对象
CATPSO实例中。成员变量_pPso在CAACafSearchCmd类的构造函数内完成获取,代码如下:if ( NULL != pEditor )
{
_pPso = pEditor->GetPSO();
}
GetEditor是CATStateCommand(状态命令)的成员方法,用于获取关联激活文档的CATFrmEditor编辑器实例,PSO 实例由该编辑器创建【6】。CATIIniSearchEngine接口的GetFoundObjects方法获取全部检索结果,返回值pListOfFoundObjects为CATSO类型对象,存储所有对象的完整路径;列表内每个元素都是可视化框架下的CATPathElement对象。pListOfFoundObjects不会为空;若无匹配对象,GetFoundObjects直接返回错误码E_FAIL。int nbelt = 0 ;
_pIniSearchEngineOnCurrentEngine->GetFoundObjects(pListOfFoundObjects);
AddElements将对象全路径添加至 PSO,全部添加完毕后调用EndAddElements结束添加操作。if ( NULL != _pPso )
{
for ( int i= 0 ; i < nbelt ; i++ )
{
CATBaseUnknown * pCurrent = (*pListOfFoundObjects)[i] ;
if ( NULL != pCurrent )
{
_pPso->AddElements(pCurrent);
}
}
_pPso->EndAddElements();
}

浙公网安备 33010602011771号