列文章目录
UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer
目录
列文章目录
前言
一、知识点提取汇总
二、案例需求分析
1、最终效果图
2、需求分解
三、程序分析
1、源码所在目录
2、主要功能分析
前言
随着工业智能化的不断发展,UG二次开发的需求越来越多,也吸引了大批的二开从业人员,本人作为一名资深IT从业者(10年+)也毅然加入二次开发大军。
然而,和流行IT行业(互联网、金融、医疗等)相比,工业智能化的门槛显得更高一点,专业的工业软件,相对封闭的开发理念和更小的开发圈子,让刚进入二开的从业者有点举步维艰。边学边整理,希望通过这系列文章的整理能给二开的生态增添一叶绿。
一、知识点提取汇总
1、树列表控件的初始化和数据加载
2、选择对象控件过滤器使用
3、对象颜色拾取器的使用
4、遍历组件方法的实现
5、树列表控件通过递归方法实现多层目录加载
二、案例需求分析
1、最终效果图
2、需求分解
本案的需求分解如下:
1)加载装配目录到树列表,通过选取树列表的方式,实现配件的选取
2)也可以通过组件选择器的方式,选取配件
3)为选取的配件设置颜色
三、程序分析
1、源码所在目录
UGOPEN\SampleNXOpenApplications\C++\AssemblyViewer
2、主要功能分析
1)树列表控件的初始化和回调方法
treeList = dynamic_cast<NXOpen::BlockStyler::Tree*>(theDialog->TopBlock()->FindBlock("treeList"));
//注册回调方法
treeList->SetOnSelectHandler(make_callback(this, &AssemblyViewer::OnSelectCallback));
void AssemblyViewer::OnSelectCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *, int columnID, bool selected)
{
try
{
if(selected == true)
{
PartCleanup();
ComponentSelection();
}
}
catch(exception& ex)
{
}
}
void AssemblyViewer::ComponentSelection()
{
try
{
bool singleComponent = IsSingleComponentSelection();
std::vector<NXOpen::TaggedObject *>selObjectData = GetSelectedObjects();
std::vector<NXOpen::TaggedObject *>selNodeComps = GetSelectedNodes();
// Create a DisplayModification object to set the color
if (selObjectData.size()>0)
{
HighlightComponent(selObjectData,false);
drawAll = singleComponent?false:true;
HighlightComponent(selObjectData, true);
}
if (selNodeComps.size()>0)
{
HighlightComponent(selNodeComps,false);
drawAll = singleComponent?false:true;
HighlightComponent(selNodeComps, true);
}
}
catch(exception& ex)
{
}
}
2) 树列表控件通过递归方法实现多层目录加载
void AssemblyViewer::PopulateTree(NXOpen::Assemblies::Component *component)
{
std::vector<Component *> childComponent = component->GetChildren();
int childComponentCount = childComponent.size();
for(int i=0; i<childComponentCount; ++i)
{
BlockStyler::Node *node = treeList->CreateNode(childComponent[i]->Name());
NXOpen::DataContainer *nodeData = node->GetNodeData();
nodeData->AddTaggedObject("Data",childComponent[i]);
treeNodes.push_back(node);
delete nodeData;
nodeData = NULL;
node->SetForegroundColor(198);
treeList->InsertNode(node,parentNode,NULL,treeList->NodeInsertOptionLast);
parentNode = node;
PopulateTree(childComponent[i]);
parentNode = node->ParentNode();
}
}
3) 选择对象控件过滤器使用
selComponent = dynamic_cast<NXOpen::BlockStyler::UIBlock*>(theDialog->TopBlock()->FindBlock("selComponent"));
NXOpen::Selection::SelectionAction action = Selection::SelectionActionClearAndEnableSpecific;
std::vector<NXOpen::Selection::MaskTriple>selectionMask_array(2);
selectionMask_array[0].Type = UF_component_type ;
selectionMask_array[0].Subtype = UF_component_subtype ;
selectionMask_array[1].Type = UF_component_type;
selectionMask_array[1].Subtype = UF_part_occurrence_subtype;
NXOpen::BlockStyler::PropertyList *selComponentProps = selComponent->GetProperties();
selComponentProps->SetSelectionFilter("SelectionFilter",action,selectionMask_array);
delete selComponentProps;
selComponentProps = NULL;
4) 对象颜色拾取器的使用
NXOpen::BlockStyler::PropertyList *selColorProps =selColor->GetProperties();
std::vector<int > colorValue = selColorProps->GetIntegerVector("Value");
5) 遍历组件方法的实现
void AssemblyViewer::PopulateTree(NXOpen::Assemblies::Component *component)
{
std::vector<Component *> childComponent = component->GetChildren();
int childComponentCount = childComponent.size();
for(int i=0; i<childComponentCount; ++i)
{
BlockStyler::Node *node = treeList->CreateNode(childComponent[i]->Name());
NXOpen::DataContainer *nodeData = node->GetNodeData();
nodeData->AddTaggedObject("Data",childComponent[i]);
treeNodes.push_back(node);
delete nodeData;
nodeData = NULL;
node->SetForegroundColor(198);
treeList->InsertNode(node,parentNode,NULL,treeList->NodeInsertOptionLast);
parentNode = node;
PopulateTree(childComponent[i]);
parentNode = node->ParentNode();
}
}
遍历组件主要用了GetChildren()方法:
std::vector<Component *> childComponent = component->GetChildren();
然后通过PopulateTree递归的方式实现对组件的所有目录的遍历
6)设置所选组件的颜色
void AssemblyViewer::ApplyColor(std::vector<NXOpen::TaggedObject *>&selObjectData)
{
try
{
//---- Enter your callback code here -----
NXOpen::BlockStyler::PropertyList *selColorProps =selColor->GetProperties();
std::vector<int > colorValue = selColorProps->GetIntegerVector("Value");
delete selColorProps;
selColorProps = NULL;
DisplayModification *displayModification1 = theSession->DisplayManager()->NewDisplayModification();
displayModification1->SetApplyToAllFaces(false);
displayModification1->SetApplyToOwningParts(false);
displayModification1->SetNewColor(colorValue[0]);
std::vector<DisplayableObject *> objects1;
int selObjectCount = selObjectData.size();
for(int i=0; i<selObjectCount; ++i)
{
objects1.push_back(dynamic_cast<NXOpen::DisplayableObject *>(selObjectData[i]));
}
displayModification1->Apply(objects1);
objects1.clear();
delete displayModification1;
displayModification1 = NULL;
PartCleanup();
}
catch(exception& ex)
{
}
}
使用displayModification类,实现了对所选对象的颜色设置