jjzjj

Teamcenter_NX集成开发:通过NXOpen查询零组件是否存在

huangym1 2023-03-28 原文

之前用过NXOpen PDM的命名空间下的类,现在记录一下通过PDM命名空间下的类查询Teamcenter零组件的信息,也可以用来判断该零组件是否存在。

1-该工程为DLL工程,直接在NX界面调用,所以直接获取NXSession。

2-查询函数advanced用到的查询为:__NX_STD_ANY_ITEM_QUERY,可以在Teamcenter查询构建器模块中看到该查询。

 

  1 // Mandatory UF Includes
  2 #include <uf.h>
  3 #include <uf_object_types.h>
  4 
  5 // Internal Includes
  6 #include <NXOpen/ListingWindow.hxx>
  7 #include <NXOpen/NXMessageBox.hxx>
  8 #include <NXOpen/UI.hxx>
  9 #include <NXOpen/LogFile.hxx>
 10 
 11 // Internal+External Includes
 12 #include <NXOpen/Annotations.hxx>
 13 #include <NXOpen/Assemblies_Component.hxx>
 14 #include <NXOpen/Assemblies_ComponentAssembly.hxx>
 15 #include <NXOpen/Body.hxx>
 16 #include <NXOpen/BodyCollection.hxx>
 17 #include <NXOpen/Face.hxx>
 18 #include <NXOpen/Line.hxx>
 19 #include <NXOpen/NXException.hxx>
 20 #include <NXOpen/NXObject.hxx>
 21 #include <NXOpen/Part.hxx>
 22 #include <NXOpen/PartCollection.hxx>
 23 #include <NXOpen/Session.hxx>
 24 
 25 #include <NXOpen/PDM_SoaConnectionHandle.hxx>
 26 #include <NXOpen/PDM_PdmSession.hxx>
 27 #include <NXOpen/PDM_PdmSearch.hxx>
 28 #include <NXOpen/PDM_PdmFile.hxx>
 29 #include <NXOpen/PDM_PdmNavigatorNode.hxx>
 30 #include <NXOpen/PDM_PdmPart.hxx>
 31 #include <NXOpen/PDM_PdmSearchManager.hxx>
 32 #include <NXOpen/PDM_SoaQuery.hxx>
 33 #include <NXOpen/PDM_SearchResult.hxx>
 34 
 35 // Std C++ Includes
 36 #include <iostream>
 37 #include <sstream>
 38 
 39 using namespace NXOpen;
 40 using std::string;
 41 using std::exception;
 42 using std::stringstream;
 43 using std::endl;
 44 using std::cout;
 45 using std::cerr;
 46 
 47 NXOpen::ListingWindow *lw = NULL;
 48 NXOpen::NXMessageBox *mb = NULL;
 49 
 50 void do_it();
 51 void print(const NXString &);
 52 void print(const string &);
 53 void print(const char*);
 54 void showClickMessage(int &iRet);
 55 
 56 //------------------------------------------------------------------------------
 57 // Entry point(s) for unmanaged internal NXOpen C/C++ programs
 58 //------------------------------------------------------------------------------
 59 extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
 60 {
 61     try
 62     {
 63         // 获取NXSession并初始化
 64         NXOpen::Session *theSession = NXOpen::Session::GetSession();
 65         NXOpen::UI *theUI = NXOpen::UI::GetUI();
 66         NXOpen::Part *displayPart(theSession->Parts()->Display());
 67         NXOpen::PDM::PdmSession * pdmSession = theSession->PdmSession();
 68         NXOpen::LogFile *lf = theSession->LogFile();    
 69         lw = theSession->ListingWindow();    
 70         mb = theUI->NXMessageBox();        
 71 
 72         // 获取设置数据
 73         bool isSsoEnabled;
 74         NXOpen::NXString ssoServerUrl;
 75         NXOpen::NXString ssoAppID;
 76         NXOpen::NXString connectString;
 77         NXOpen::NXString discriminator;
 78         pdmSession->GetSsoSettings(&isSsoEnabled, &ssoServerUrl, &ssoAppID);
 79         pdmSession->GetTcserverSettings(&connectString, &discriminator);
 80     
 81         // 查询Teamcenter中零组件 000015200AA000000
 82         NXOpen::PDM::PdmSearchManager *pdmSearchManager = theSession->PdmSearchManager();
 83         NXOpen::PDM::PdmSearch *pdmSearch = pdmSearchManager->NewPdmSearch();
 84         std::vector<NXOpen::NXString> entries;
 85         std::vector<NXOpen::NXString> values;
 86         entries.push_back("item_id");
 87         values.push_back("000015200AA000000");
 88         NXOpen::PDM::SearchResult * advancedSearchResults = pdmSearch->Advanced(entries, values);
 89         if (advancedSearchResults == NULL)
 90             return;
 91         std::vector<NXString> resultMfkIds = advancedSearchResults->GetResultMfkIds();
 92         std::vector<NXString> resultObjectNames = advancedSearchResults->GetResultObjectNames();
 93         std::vector<NXString> resultObjectTypes = advancedSearchResults->GetResultObjectTypes();
 94 
 95         // 输出查询到零组件的信息到信息框
 96         print("输出查询到零组件的信息到信息框");
 97         for (int idx = 0; idx < (int)resultMfkIds.size(); idx++){
 98             print("resultMfkIds = " + resultMfkIds[idx]);
 99             lf->WriteLine("resultMfkIds = " + resultMfkIds[idx]);
100         }
101         for (int idx = 0; idx < (int)resultObjectNames.size(); idx++){
102             print("resultObjectNames = " + resultObjectNames[idx]);
103             lf->WriteLine("resultObjectNames = " + resultObjectNames[idx]);
104         }
105         for (int idx = 0; idx < (int)resultObjectTypes.size(); idx++){
106             print("resultObjectTypes = " + resultObjectTypes[idx]);
107             lf->WriteLine("resultObjectTypes = " + resultObjectTypes[idx]);
108         }
109     
110         print("输出信息到信息框");
111         print("ssoAppID = " + ssoAppID);
112         print("ssoServerUrl = " + ssoServerUrl);
113         print("connectString = " + connectString);
114         print("discriminator = " + discriminator);
115         
116         // 输出信息到日志文件
117         print("输出信息到日志文件");
118         lf->WriteLine("LogFileName = " + lf->FileName());
119         lf->WriteLine("ssoServerUrl = " + ssoServerUrl);
120         lf->WriteLine("ssoAppID = " + ssoAppID);
121         lf->WriteLine("connectString = " + connectString);
122         lf->WriteLine("discriminator = " + discriminator);
123 
124         // 输出查询到零组件的信息到提示框
125         int iRet = mb->Show("resultMfkIds", NXOpen::NXMessageBox::DialogTypeError, resultMfkIds);
126         showClickMessage(iRet);
127         iRet = mb->Show("resultObjectNames", NXOpen::NXMessageBox::DialogTypeWarning, resultObjectNames);
128         showClickMessage(iRet);
129         iRet = mb->Show("resultObjectTypes", NXOpen::NXMessageBox::DialogTypeInformation, resultObjectTypes);
130         showClickMessage(iRet);
131         iRet = mb->Show("resultObjectTypes", NXOpen::NXMessageBox::DialogTypeQuestion, resultObjectTypes);
132         showClickMessage(iRet);
133     }
134     catch (const NXException& e1)
135     {
136         UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
137     }
138     catch (const exception& e2)
139     {
140         UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
141     }
142     catch (...)
143     {
144         UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
145     }
146 }
147 
148 
149 //------------------------------------------------------------------------------
150 // Unload Handler
151 //------------------------------------------------------------------------------
152 extern "C" DllExport int ufusr_ask_unload()
153 {
154     return (int)NXOpen::Session::LibraryUnloadOptionImmediately;// 调试用
155     //return (int)NXOpen::Session::LibraryUnloadOptionAtTermination;// 程序发布用
156     //return (int)NXOpen::Session::LibraryUnloadOptionExplicitly;
157 }
158 
159 void showClickMessage(int &iRet){
160     if (iRet == 1){
161         mb->Show("提示", NXOpen::NXMessageBox::DialogTypeInformation, "你点击了是");
162     }
163     else if (iRet == 2){
164         mb->Show("提示", NXOpen::NXMessageBox::DialogTypeInformation, "你点击了否");
165     }
166     else if (iRet == -2){
167         mb->Show("提示", NXOpen::NXMessageBox::DialogTypeInformation, "你点击了确定");
168     }
169 }
170 
171 void print(const NXString &msg)
172 {
173     if (!lw->IsOpen()) lw->Open();
174     lw->WriteLine(msg);
175 }
176 void print(const string &msg)
177 {
178     if (!lw->IsOpen()) lw->Open();
179     lw->WriteLine(msg);
180 }
181 void print(const char * msg)
182 {
183     if (!lw->IsOpen()) lw->Open();
184     lw->WriteLine(msg);
185 }

 

程序执行后截图:

 

 

 

 

 

 

 

GIF动图:

 

有关Teamcenter_NX集成开发:通过NXOpen查询零组件是否存在的更多相关文章

  1. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  4. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  6. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

  7. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  8. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  9. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  10. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

随机推荐