最近在做一个项目,需要获取NX装配结构信息,这里把代码分享给大家,希望对各位有帮助,注意以下几点:

1)代码获取了PART的属性、表达式等,因此一些细节可能需要您根据实际情况修改。

2)读写XML用的pugixml,需要您包含到工程中,接口使用的是宽字符模式,所以在pugiconfig.hpp需要打开宽字符开关。

题外话,本人用过的解析XML的库有微软MSXML、markup、tinyxml、pugixml等,其中pugixml是最好用的,强烈推荐给大家,下载地址:pugixml

3)代码功能是传入一个装配part,生成一个包含装配信息的xml。

4)代码采用ug open c实现,如果您需要在C#、Java等其他工程中调用,可将其包装成独立的exe,采用后台方式调用。

5)如果您不需要生成XML,可不生成,直接使用其内存对象即可。

6)该代码只是抛砖引玉,仅供参考。

VS后台传参如下:

由于装配结构嵌套可能非常多,生成的xml结构大致如下:

代码如下:

  1. 1 // GenarateAssemblyInfo.cpp : 定义控制台应用程序的入口点。
  2. 2 //
  3. 3
  4. 4 #include "stdafx.h"
  5. 5 #include "pugiconfig.hpp"
  6. 6 #include "pugixml.hpp"
  7. 7 #include <windows.h>
  8. 8 #include <stdlib.h>
  9. 9 #include <uf_attr.h>
  10. 10 #include <uf_modl.h>
  11. 11 #include <uf.h>
  12. 12 #include <uf_part.h>
  13. 13 #include <uf_assem.h>
  14. 14 #include <uf_ui_ugopen.h>
  15. 15 #include <map>
  16. 16 #include <vector>
  17. 17 #include <NXSigningResource.cpp>
  18. 18 using namespace std;
  19. 19
  20. 20 #ifndef SAFE_DELETE
  21. 21 #define SAFE_DELETE(p) do{ if(p){delete(p);(p)=NULL;} }while(0)
  22. 22 #endif
  23. 23 typedef struct _tagAssemblyInfo
  24. 24 {
  25. 25 _tagAssemblyInfo()
  26. 26 {
  27. 27
  28. 28 }
  29. 29
  30. 30 virtual ~_tagAssemblyInfo()
  31. 31 {
  32. 32 for (vector<_tagAssemblyInfo*>::iterator iter = children.begin(); iter != children.end(); ++iter)
  33. 33 {
  34. 34 SAFE_DELETE (*iter);
  35. 35 }
  36. 36 }
  37. 37
  38. 38 string path;//原型路径
  39. 39 map<string,map<string, string>> attr; //组,键值对
  40. 40 vector<_tagAssemblyInfo*> children;//子件
  41. 41 }AssemblyInfo;
  42. 42
  43. 43
  44. 44 string TCHAR2char( const TCHAR* STR)
  45. 45 {
  46. 46 string strchar;
  47. 47 if (!*STR)
  48. 48 {
  49. 49 return strchar;
  50. 50 }
  51. 51
  52. 52 //返回字符串的长度
  53. 53 int size = WideCharToMultiByte(CP_ACP, 0, STR, -1, NULL, 0, NULL, FALSE);
  54. 54
  55. 55 //申请一个多字节的字符串变量
  56. 56 char* str = new char[sizeof(char) * size];
  57. 57
  58. 58 //将STR转成str
  59. 59 WideCharToMultiByte(CP_ACP, 0, STR, -1, str, size, NULL, FALSE);
  60. 60 strchar = str;
  61. 61 delete (str);
  62. 62
  63. 63 return strchar;
  64. 64 }
  65. 65
  66. 66 TCHAR* char2TCAHR(const char* str)
  67. 67 {
  68. 68 int size = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
  69. 69
  70. 70 TCHAR* retStr = new TCHAR[size * sizeof(TCHAR)];
  71. 71
  72. 72 MultiByteToWideChar(CP_ACP, 0, str, -1, retStr, size);
  73. 73
  74. 74 return retStr;
  75. 75 }
  76. 76
  77. 77 void ReadExpression(AssemblyInfo* info,tag_t obj)
  78. 78 {
  79. 79 if ((NULL == info) || (NULL_TAG == obj))
  80. 80 {
  81. 81 return ;
  82. 82 }
  83. 83
  84. 84 int number_of_exps = 0;
  85. 85 tag_t *exps = NULL;
  86. 86 UF_MODL_ask_exps_of_part(obj,&number_of_exps,&exps);
  87. 87 char *name = "Exp";
  88. 88 for (int i = 0; i < number_of_exps; ++i)
  89. 89 {
  90. 90 tag_t expTag = *(exps + i);
  91. 91 char* expStr = NULL;
  92. 92 UF_MODL_ask_exp_tag_string(expTag, &expStr);
  93. 93 char* leftStr = NULL;
  94. 94 char* rightStr = NULL;
  95. 95 UF_MODL_dissect_exp_string(expStr, &leftStr, &rightStr,&expTag );
  96. 96 info->attr[name].insert(make_pair(leftStr,rightStr));
  97. 97 UF_free(expStr);
  98. 98 UF_free(leftStr);
  99. 99 UF_free(rightStr);
  100. 100 }
  101. 101
  102. 102 UF_free(exps);
  103. 103 }
  104. 104
  105. 105
  106. 106 void ReadAttribute(AssemblyInfo* info,tag_t obj)
  107. 107 {
  108. 108 if ((NULL == info) || (NULL_TAG == obj))
  109. 109 {
  110. 110 return ;
  111. 111 }
  112. 112
  113. 113 char* category[] = {"ParameterExpression","ParameterMapping", "FxPartThumbnail"}; //组名称
  114. 114
  115. 115 for (int i = 0; i < _countof(category); ++i)
  116. 116 {
  117. 117 int num_attributes = 0;
  118. 118 logical has_attribute = false;
  119. 119
  120. 120 UF_ATTR_info_t attr_info = {0};
  121. 121 UF_ATTR_init_user_attribute_info(&attr_info);
  122. 122
  123. 123 UF_ATTR_iterator_t query;
  124. 124 UF_ATTR_init_user_attribute_iterator(&query);
  125. 125 query.category = category[i];
  126. 126 query.check_category = true;
  127. 127 query.type = UF_ATTR_string;
  128. 128
  129. 129 UF_ATTR_get_user_attribute(obj,&query,&attr_info,&has_attribute);
  130. 130 while (has_attribute)
  131. 131 {
  132. 132 info->attr[query.category].insert(make_pair(attr_info.title,attr_info.string_value));
  133. 133 UF_ATTR_free_user_attribute_info_strings(&attr_info);
  134. 134 UF_ATTR_get_next_user_attribute(obj,&query,&attr_info,&has_attribute);
  135. 135 }
  136. 136 }
  137. 137 }
  138. 138
  139. 139 void GetAssembly(AssemblyInfo* info,tag_t occ)
  140. 140 {
  141. 141 if ((NULL == info) || (NULL_TAG == occ))
  142. 142 {
  143. 143 return ;
  144. 144 }
  145. 145 tag_t prototype = UF_ASSEM_ask_prototype_of_occ(occ);
  146. 146 UF_PART_set_display_part(prototype);
  147. 147
  148. 148 //根据obj获取路径及属性
  149. 149 char part_fspec [MAX_FSPEC_SIZE+1] = {0};
  150. 150 UF_PART_ask_part_name(prototype,part_fspec);
  151. 151 info->path = part_fspec;
  152. 152
  153. 153 //根据obj获取属性
  154. 154 ReadAttribute(info, prototype);
  155. 155
  156. 156 //根据obj获取表达式
  157. 157 ReadExpression(info, prototype);
  158. 158
  159. 159 //遍历子节点
  160. 160 tag_t *child_part_occs = NULL;
  161. 161
  162. 162 int number = UF_ASSEM_ask_part_occ_children(occ, &child_part_occs);
  163. 163 for (int i = 0; i < number; ++i)
  164. 164 {
  165. 165 AssemblyInfo* childInfo = new AssemblyInfo();
  166. 166 info->children.push_back(childInfo);
  167. 167 GetAssembly(childInfo, *(child_part_occs + i));
  168. 168 }
  169. 169
  170. 170 UF_free(child_part_occs);
  171. 171 }
  172. 172
  173. 173 void WriteNode(AssemblyInfo* info, pugi::xml_node parent)
  174. 174 {
  175. 175 if ((NULL == info) || (NULL == parent))
  176. 176 {
  177. 177 return ;
  178. 178 }
  179. 179 _TCHAR* tmpStr = NULL;
  180. 180 pugi::xml_node assembly = parent.append_child(_T("assembly"));
  181. 181 tmpStr = char2TCAHR(info->path.c_str());
  182. 182 assembly.append_attribute(_T("name")).set_value(tmpStr);
  183. 183 SAFE_DELETE(tmpStr);
  184. 184 pugi::xml_node attrs = assembly.append_child(_T("attrs"));
  185. 185
  186. 186 //属性
  187. 187 for (map<string,map<string, string>>::iterator iter = info->attr.begin(); iter != info->attr.end(); ++iter)
  188. 188 {
  189. 189 pugi::xml_node category = attrs.append_child(_T("category"));
  190. 190 tmpStr = char2TCAHR(iter->first.c_str());
  191. 191 category.append_attribute(_T("name")).set_value(tmpStr);
  192. 192 SAFE_DELETE(tmpStr);
  193. 193 map<string, string>& attrsMap = iter->second;
  194. 194 for (map<string, string>::iterator iterAttr = attrsMap.begin(); iterAttr != attrsMap.end(); ++iterAttr)
  195. 195 {
  196. 196 pugi::xml_node attr = category.append_child(_T("attr"));
  197. 197 tmpStr = char2TCAHR(iterAttr->first.c_str());
  198. 198 attr.append_attribute(_T("name")).set_value(tmpStr);
  199. 199 SAFE_DELETE(tmpStr);
  200. 200 tmpStr = char2TCAHR(iterAttr->second.c_str());
  201. 201 attr.append_attribute(_T("value")).set_value(tmpStr);
  202. 202 SAFE_DELETE(tmpStr);
  203. 203 }
  204. 204 }
  205. 205
  206. 206 //子节点
  207. 207 pugi::xml_node children = assembly.append_child(_T("children"));
  208. 208 for (int i = 0; i < info->children.size(); ++i)
  209. 209 {
  210. 210 WriteNode(info->children[i], children);
  211. 211 }
  212. 212 }
  213. 213
  214. 214 void WriteXml(AssemblyInfo* info,_TCHAR* xmlFile)
  215. 215 {
  216. 216 if ((NULL == info) || (NULL == xmlFile))
  217. 217 {
  218. 218 return ;
  219. 219 }
  220. 220
  221. 221 pugi::xml_document doc;
  222. 222 pugi::xml_node decNode = doc.append_child(pugi::node_declaration);
  223. 223 pugi::xml_attribute vAttr = decNode.append_attribute(_T("version"));
  224. 224 vAttr.set_value(_T("1.0"));
  225. 225 pugi::xml_attribute encAttr = decNode.append_attribute(_T("encoding"));
  226. 226 encAttr.set_value(_T("utf-8"));
  227. 227
  228. 228 pugi::xml_node root = doc.append_child(_T("root"));
  229. 229 WriteNode(info,root);
  230. 230
  231. 231 doc.save_file(xmlFile, _T("\t"), pugi::format_indent, pugi::encoding_utf8);
  232. 232 }
  233. 233
  234. 234 int _tmain(int argc, _TCHAR* argv[])
  235. 235 {
  236. 236 if (argc < 3)
  237. 237 {
  238. 238 return 0;
  239. 239 }
  240. 240
  241. 241 if (UF_initialize() != 0)
  242. 242 {
  243. 243 return 0;
  244. 244 }
  245. 245
  246. 246 const _TCHAR* prtPath = argv[1];
  247. 247 TCHAR* xmlFile = argv[2];
  248. 248 tag_t tag = NULL_TAG;
  249. 249 UF_PART_load_status_t status;
  250. 250 UF_PART_open(TCHAR2char(prtPath).c_str(),&tag,&status);
  251. 251 if (status.failed)
  252. 252 {
  253. 253 return 0;
  254. 254 }
  255. 255
  256. 256 tag_t occ = UF_ASSEM_ask_root_part_occ(tag);
  257. 257 AssemblyInfo* info = new AssemblyInfo();
  258. 258 if (NULL == info)
  259. 259 {
  260. 260 return 0;
  261. 261 }
  262. 262
  263. 263 GetAssembly(info, occ);
  264. 264 WriteXml(info,xmlFile);
  265. 265
  266. 266 UF_terminate();
  267. 267 delete info;
  268. 268 return 0;
  269. 269 }

获取NX装配结构信息的更多相关文章

  1. 使用JDBC connect获取数据库表结构信息

    1.这是生成代码的关键 引入maven依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysq ...

  2. NX二次开发-UF_ASSEM_ask_component_data获取装配部件的相关信息

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_assem.h> ], void* user_ ...

  3. c#通过oledb获取excel文件表结构信息

    这个问题来自论坛提问,同理可以获得access等数据库的表结构信息. using System; namespace ConsoleApplication11 { class Program { pu ...

  4. NX二次开发-UFUN获取图层类别的信息UF_LAYER_ask_category_info

    1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_ui.h> 5 #include <uf_layer.h> 6 7 ...

  5. Postgresql 导出表结构信息

    项目用了Postgresql 数据库,项目组要出表结构的文档,手写太麻烦,想用slq脚本导出一份.查了一番资料,似乎没有多好的方法.dump方式导出的脚本太乱,没法直接写在word文档里.只能自己写s ...

  6. sqlserver获取数据库表结构

    SqlServer获取所有数据库,表,表结构 --获取所有数据库 SELECT * FROM Master..SysDatabases ORDER BY Name --获取test数据库下所有表 us ...

  7. ios获取CELLID,LAC等信息方法

    搞了一个来月的这个东西了,还是没有完全解决问题,下面方法可以获取简单的Cell信息,方法一://CoreTelephony.h//主要就这两个结构体,其他需要的话,自己添加struct CTServe ...

  8. 获取SqlServer2005表结构(字段,主键,外键,递增,描述)

    1.获取表的基本字段属性 --获取SqlServer中表结构 SELECT syscolumns.name,systypes.name,syscolumns.isnullable, syscolumn ...

  9. java中访问mysql数据库中的表结构信息

    package cn.hncu.meta; import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.Re ...

随机推荐

  1. Node.js的基础知识点

    一,语言 和 环境(平台) 之间的关系 1,浏览器环境 中的 Javascript 浏览器中 Javascript 的组成部分 ECMAScript核心 + DOM + BOM 2,Node环境 中的 ...

  2. OpenCV(Open Source Computer Vision Library)计算机视觉库

    OpenCV(最基本的滤波到高级的物体检测皆有涵盖) 简介: OpenCV 是跨平台的,可以在  Windows.Linux.Mac OS.Android.iOS 等操作系统上运行. OpenCV 的 ...

  3. Android开发之TextView中间设置横线,适用于电商项目,商品原价之类的功能。

    textview.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG ); //中间横线 textview.getPaint().setFlags(Pai ...

  4. Android开发之开源框架OKHTTP的Get请求代码,得到json字符串方法

      <span style="white-space:pre"> </span><pre name="code" class=&q ...

  5. 【HttpRunner v3.x】笔记 ——5. 测试用例-config

    上一篇中,我们了解到了config,在配置中,我们可以配置测试用例级级别的一些设置,比如基础url.验证.变量.导出. 我们一起来看,官方给出的一个例子: from httprunner import ...

  6. 【pytest】(四) pytest的一些其他的运行用法

    1. 可以设置当失败N个后停止测试 pytest -x 是当第一个失败产生后,停止 pytest --maxfail=2, 这里就是当失败2个用例后,停止测试 2.pytest 在命令行模式下支持多种 ...

  7. springboot AOP实战

    目录 AOP实战 maven依赖 定义切面 采用扫描类的方式 采用注解的方式 通知 前置通知 后置通知 返回通知 异常通知 环绕通知 JoinPoint 获取切点处的注解 git AOP实战 mave ...

  8. Postman发送POST请求到Spring Boot的正确姿势

    最近用Spring Boot搭建了一些restful api,写起来真的很爽.但是当用Postman测试一些POST请求的接口的时候却遇到一些问题,上网冲浪查了一堆博客资料,发现都讲得不清不楚,于是记 ...

  9. 13props 对象

    props: { homeData: { type: Object, required: true } }, 父组件传递给子组件是对象homeData或者数组: homeData={name:'zs' ...

  10. java向上转型神解析

    向上转型 经典案例 向上转型 向上转型应注意的问题 向上转型的好处 静态方法的调用 经典案例 public class Animal { public void eat(){ System.out.p ...