UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer(树列表)

 列文章目录

UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer(树列表)
UG/NX二次开发Siemens官方NXOPEN实例解析—2.2 Selection(选择过滤器)
UG/NX二次开发Siemens官方NXOPEN实例解析—2.3 Selection_UIStyler(边倒角)
UG/NX二次开发Siemens官方NXOPEN实例解析—2.4 File2Points(读取文本)
UG/NX二次开发Siemens官方NXOPEN实例解析—2.5 QuickExtrude(拉伸)
UG/NX二次开发Siemens官方NXOPEN实例解析—2.6 CreateNote(注释)
UG/NX二次开发Siemens官方NXOPEN实例解析—2.7 DiameterSymbol(标注符号) 
UG/NX二次开发Siemens官方NXOPEN实例解析—2.8 DrawingCycle(图纸打印)
UG/NX二次开发Siemens官方NXOPEN实例解析—2.9 InteropCallCFromDotNet(VB调用VC++ DLL实践)
UG/NX二次开发Siemens官方NXOPEN实例解析—2.10 InteropNXOpenWithUFWrap(NXOPEN与Ufun混合使用)

前言

        随着工业智能化的不断发展,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类,实现了对所选对象的颜色设置

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MarcoPro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值