目录
一、概述
二、学习资料
三、学习案例——编辑树列表
3.1 UI界面分析
3.2编辑树列表方法一
3.3编辑树列表方法二
3.4编辑树列表方法二(解决以上问题)
三、总结
首先要感谢NX二次开发者无私奉献以及默默无闻的帮助和支持,在这里我推荐一个NX二次开发爱好者的qq群聊753801561,群内大佬如云,热衷于钻研技术。
一、概述
在NX二次开发过程中,开发人员经常会使用树列表(Tree)来存储不同的信息,而且还可能对这些信息数据进行编辑操作。本文将以NX12.0为例,介绍两种编辑树列表的方法。
二、学习资料
1、各类NX二次开发教学视频;
2、官方参考案例:$UGII_BASE_DIR/ugopen/SampleNXOpenApplications/C++/BlockStyler/TreeListDemo;
3、帮助文档:BlockStyler中Node(节点)、Tree(树列表)、TreeListMenu(右键调用函数)。
三、学习案例——编辑树列表
3.1 UI界面分析
3.2编辑树列表方法一
SetAskEditControlHandler”。该方法用于设置编辑时采取什么样的控件。而其三种控件分别是ListBox(列表框)、ComboBox(复合框)和None(不可编辑)。前两个控件的下拉菜单通过“SetEditOptions”方法进行设置。最终是否接受编辑需要采用“SetOnEditOptionSelectedHandler”方法来确定。
NXOpen::BlockStyler::Tree::EditControlOption NXOpen_EditTree::OnEditOptionSelectedCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID, int selectedOptionID, NXString selectedOptionText, NXOpen::BlockStyler::Tree::ControlType type)
{NXOpen::BlockStyler::Tree::EditControlOption OnEditOptionSelected = BlockStyler::Tree::EditControlOptionReject;//接受或者禁止编辑选项,EditControlOptionAccept接受,EditControlOptionReject禁止try{//---- Enter your callback code here -----if (BlockStyler::Tree::ControlTypeComboBox == type)//ComboBox(复合列表框){OnEditOptionSelected = BlockStyler::Tree::EditControlOptionAccept;}else if (BlockStyler::Tree::ControlTypeListBox == type)//ListBox(列表框){OnEditOptionSelected = BlockStyler::Tree::EditControlOptionAccept;}else if (BlockStyler::Tree::ControlTypeNone == type)//None(不可编辑){OnEditOptionSelected = BlockStyler::Tree::EditControlOptionReject;}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return OnEditOptionSelected;
}NXOpen::BlockStyler::Tree::ControlType NXOpen_EditTree::AskEditControlCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID)
{NXOpen::BlockStyler::Tree::ControlType AskEditControl = BlockStyler::Tree::ControlTypeNone;try{//---- Enter your callback code here -----if (columnID == 1){AskEditControl = BlockStyler::Tree::ControlTypeComboBox;//查询控件编辑类型,第二列复合框,第三列列表框,其余不可编辑std::vector<NXOpen::NXString> options;options.push_back(NXOpen::NXString("ControlTypeComboBox1"));options.push_back(NXOpen::NXString("ControlTypeComboBox2"));tree->SetEditOptions(options, 1);//在设置编辑期间默认的选择0为第一个,1为第二个。}else if (columnID == 2){AskEditControl = BlockStyler::Tree::ControlTypeListBox;std::vector<NXOpen::NXString> options;options.push_back(NXOpen::NXString("ControlTypeListBox1"));options.push_back(NXOpen::NXString("ControlTypeListBox2"));options.push_back(NXOpen::NXString("ControlTypeListBox3"));tree->SetEditOptions(options, 0);}else if (columnID == 3){ AskEditControl = BlockStyler::Tree::ControlTypeComboBox;std::vector<NXOpen::NXString> options;strValue = node->GetColumnDisplayText(columnID);options.push_back(strValue);tree->SetEditOptions(options, 0);}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return AskEditControl;
}
图1 ComboBox(复合框)选择
图2 ListBox(列表框)选择
图3 ComboBox(复合框)直接编辑
3.3编辑树列表方法二
“SetOnBeginLabelEditHandler”。该方法用于设置开始编辑标签所执行内容,以及确定哪一列可编辑。最终是否接受编辑需要采用“SetOnEndLabelEditHandler”方法来确定。手动触发编辑标签的方法是按下键盘键“F2”,为了人性化操作,我们采用树列表的双击回调“SetOnDefaultActionHandler”来模拟手动触发。
void NXOpen_EditTree::OnDefaultAction(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID)
{try{if (columnID == 4){std::vector<BlockStyler::Node *> selectedNode = tree_control0->GetSelectedNodes();selectedNode[0]->SetColumnDisplayText(4, "Default Action");NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeInformation, "Default Action: Four column text is changed");selectedNode.clear();}else if (columnID == 5){keybd_event(113, 0, 0, 0);//第三个参数0表示按下//有问题,不论控制几列总是在允许双击列表的第一列模拟键盘F2}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}
}NXOpen::BlockStyler::Tree::BeginLabelEditState NXOpen_EditTree::OnBeginLabelEditCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID)
{NXOpen::BlockStyler::Tree::BeginLabelEditState OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateDisallow;//第四、第五列允许双击编辑try{//---- Enter your callback code here -----if(columnID ==4){OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateAllow;//BeginLabelEditStateAllow允许双击编辑,BeginLabelEditStateDisallow不允许双击编辑}else if (columnID == 5){OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateAllow;}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return OnBeginLabelEdit;
}NXOpen::BlockStyler::Tree::EndLabelEditState NXOpen_EditTree::OnEndLabelEditCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int, NXString editedText)
{NXOpen::BlockStyler::Tree::EndLabelEditState OnEndLabelEdit = BlockStyler::Tree::EndLabelEditStateRejectText;//EndLabelEditStateRejectText,拒绝编辑;EndLabelEditStateAcceptText接受编辑try{//---- Enter your callback code here -----OnEndLabelEdit = BlockStyler::Tree::EndLabelEditStateAcceptText;}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return OnEndLabelEdit;
}
图4 双击节点直接替换内容
图5 双击第六列模仿按键盘F2
不知为何总是出现在设置双击后的第一个支持双击的列表,如果一列可以用,多列有问题,但是设置为支持双击后单击列,会停顿几面,支持在修改相应的列,如图6所示
图6 设置支持双击后的相应列,然后单击停顿几秒即可编辑
3.4编辑树列表方法二(解决以上问题)
在调试的过程中,我发现设置允许双击单独的一列可以正常运行,但是两列、三列同时支持双击操作时,无论点击第几列总是第一列编辑,同时结合群内大佬提示“回调是多次的,你在需要的列中再返回允许,其余时返回不允许”的提示,让我想到可以对允许双击的列进行全局变量的设置,每次双击,即在相应的列允许编辑,其他列不允许编辑,这样就实现了双击编辑这一功能。关键代码如下:
int TreeColumn;//定义一个全局边量记录点击的那一列void NXOpen_EditTree::OnDefaultAction(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID)
{try{if (columnID == 4){/*std::vector<BlockStyler::Node *> selectedNode = tree_control0->GetSelectedNodes();selectedNode[0]->SetColumnDisplayText(4, "Default Action");NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeInformation, "Default Action: Four column text is changed");selectedNode.clear();*//*uc1601("第五列", 1);*/keybd_event(113, 0, 0, 0);//第三个参数0表示按下//有问题,不论控制几列总是在允许双击列表的第一列模拟键盘F2keybd_event(113, 0, KEYEVENTF_KEYUP, 0); //按F2抬起}else if (columnID == 5){/*uc1601("第六列", 1);*/keybd_event(113, 0, 0, 0);//第三个参数0表示按下//有问题,不论控制几列总是在允许双击列表的第一列模拟键盘F2keybd_event(113, 0, KEYEVENTF_KEYUP, 0); //按F2抬起}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}
}NXOpen::BlockStyler::Tree::BeginLabelEditState NXOpen_EditTree::OnBeginLabelEditCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int columnID)
{NXOpen::BlockStyler::Tree::BeginLabelEditState OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateDisallow;//第四、第五列允许双击编辑try{//---- Enter your callback code here -----if(columnID == TreeColumn){OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateAllow;//BeginLabelEditStateAllow允许双击编辑,BeginLabelEditStateDisallow不允许双击编辑}//else if (columnID == 5)//{// OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateAllow;//}else if (columnID == TreeColumn){OnBeginLabelEdit = BlockStyler::Tree::BeginLabelEditStateDisallow;}}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return OnBeginLabelEdit;
}NXOpen::BlockStyler::Tree::EndLabelEditState NXOpen_EditTree::OnEndLabelEditCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *node, int, NXString editedText)
{NXOpen::BlockStyler::Tree::EndLabelEditState OnEndLabelEdit = BlockStyler::Tree::EndLabelEditStateRejectText;//EndLabelEditStateRejectText,拒绝编辑;EndLabelEditStateAcceptText接受编辑try{//---- Enter your callback code here -----OnEndLabelEdit = BlockStyler::Tree::EndLabelEditStateAcceptText;}catch (exception& ex){//---- Enter your exception handling code here -----NXOpen_EditTree::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());}return OnEndLabelEdit;
}
三、总结
综上所述,操作方式多种多样,在NX支持的情况下,可根据具体的情况进行选择编辑方式,除了上述的编辑方式,还其他的非树列表自带编辑方式。例如选择行数据后显示新控件进行编辑、或是双击行数据后,弹出新界面编辑等方式。只要是能满足需求,且功能人性化,采用哪种方式均可。
源码链接
https://download.csdn.net/download/weixin_47753171/88881192?spm=1001.2014.3001.5503