iCAx开思工具箱

标题: 不用 “select_with_class_dialog”,如何直接 获得 鼠标选择的 object [打印本页]

作者: tnsmallpig    时间: 2012-6-14 23:56
标题: 不用 “select_with_class_dialog”,如何直接 获得 鼠标选择的 object
小弟 最近在做ug2次开发的一个项目,现有个问题,想请教下大家。
开发环境 ug4.0, vc6,做了个mfc dll。

现在 需要获得鼠标选中的object,然后创建新的装配体,即 UF_ASSEM_create_component_part()。
貌似获取用鼠标选择的object都是用 UF_UI_select_with_class_dialog 这样的函数,获得 int n_objects,tag_t * object。
但 这些函数都会弹出一个 确认框,要用户点击ok,或者cancel。用户觉得麻烦,有没有其他api或者什么办法可以实现直接获得鼠标选择的物体(鼠标可以选中多个object)。

谢谢先了!


作者: upoint    时间: 2012-6-15 14:11
用USER STYLER特有的选择特性,或者用BLOCK UI也可以
作者: tnsmallpig    时间: 2012-6-15 15:03
upoint 发表于 2012-6-15 14:11
用USER STYLER特有的选择特性,或者用BLOCK UI也可以

我做的对话框是 纯mfc的非模态对话框,不是用ug的USER STYLER生成的。USER STYLER 的特有选择特性就不适应了吧, BLOCK UI 是啥,我先去了解下。
作者: upoint    时间: 2012-6-15 15:46
那你要失望了,非模态对话框是要通过选择对话框实现的,如果你想实现也可以,用MFC非模态对话框+USER STYLER也可以实现
作者: tnsmallpig    时间: 2012-6-15 16:01
upoint 发表于 2012-6-15 15:46
那你要失望了,非模态对话框是要通过选择对话框实现的,如果你想实现也可以,用MFC非模态对话框+USER STYLER也 ...

能否细说下 MFC非模态对话框+USER STYLER,要如何实现 我的要求。

我有找了下资料,用/NXOPEN里的c++类库可以获取 鼠标选中的object。
代码段如下:
#include <NXOpen/Selection.hxx>
.....

        UI * pUI = UI::GetUI();
        if (!pUI)
        {
                return;
        }

        Selection * pSelection = pUI->GetSelectionManager();
        if (!pSelection)
        {
                return;
        }
       
        m_nCntSel = pSelection->GetNumSelectedObjects();
        char pszName[256+1] = "";
       
        for (int i = 0; i < m_nCntSel; i++)
        {
                NXObject * pObject = pSelection->GetSelectedObject(i);
                if (pObject)
                {                                       
                                    tag_t tag1 = pObject->Tag();
                }
        }
...
现在的问题是  获得的tag1 我用在 UF_ASSEM_create_component_part 中,会出错,说是 异常的对象。
我怀疑是 因为用的是/NXOPEN里的c++类库,获得的tag标识不能用在 c 的库函数UF_ASSEM_create_component_part 中。因为这两个是不同的lib。
各位帮忙看下,有没有什么好的办法解决这个 mfc非模态对话框,不用UF_UI_select_with_class_dialog 函数,不需要用户交互点击 ok按钮,直接 获得鼠标选择的对象。

作者: zhangcanwei    时间: 2012-6-16 13:34
先用鼠标将要选择的目标点成高亮显示,然后,遍历这些高亮显示的目标
作者: tnsmallpig    时间: 2012-6-16 19:06
zhangcanwei 发表于 2012-6-16 13:34
先用鼠标将要选择的目标点成高亮显示,然后,遍历这些高亮显示的目标

这个方案我之前试过,先鼠标选中object, “高亮显示”了, 调用api  UF_OBJ_ask_display_properties(object,&disp); 然后判断 disp.highlight_status 是否高亮显示。 但是这个值highlight_status却 是0

可能是因为我操作不对吧,你说的“先用鼠标将要选择的目标点成高亮显示”,要怎么操作呢?



作者: zhangcanwei    时间: 2012-6-18 09:39
tnsmallpig 发表于 2012-6-16 19:06
这个方案我之前试过,先鼠标选中object, “高亮显示”了, 调用api  UF_OBJ_ask_display_properties(obje ...

你确认调用这个函数之前,高亮显示没有消失? 或者你遍历到的确实是正确的目标吗?比如实体的某个面高亮显示了,而实体本身有可能没有高亮,如果你遍历得到的是实体,那就不对了

我只是提供一个思路,自己并没有真正试验过。
作者: jackie2003    时间: 2012-6-28 17:10
nx4, vc6首先确定了你没法用NXOpen,Block UI,所以你只能从已有的东西里面找,UFUN和UI Styler。

UFUN里面有一个global selection,通过UF_UI_ask_global_sel_object_list可以获得当前的用户选择,但是,NX不开放global selection handle,这样就不能应用uf_ui.h里面很多相关的函数,如添加,删除等。这个是否能够满足你的需要,还是需要看你的应用是不是很简单而且有规则可循。

uf_ui.h提供了很多操作selection handle的方法,获得该handle有两种方式,第一种就是你说的,另外一种就是UI Styler,所以,如果你想有复杂的应用,就只能你自己去考虑了。粘贴帮助如下:
The selection pointer is provided to the API programmer in the following ways:

For UI Styler dialogs, the API programmer can call UF_STYLER_ask_value from their callback.
For single and class selection dialogs, NX passes the selection pointer to the API programmer's initialization procedure . See  UF_UI_select_with_single_dialog for details.
NX passes the selection pointer to the API programmer's filter procedure and selection callback.









欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3