之前用过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动图:

尝试通过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
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的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
我在理解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
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题: