找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 78|回复: 2

[原创] NX2512二次开发一键透明小工具的代码编写,使用C++API修改透明度-3

[复制链接]

2666

主题

1121

回帖

2万

积分

中将

积分
27713
发表于 2 小时前 | 显示全部楼层 |阅读模式
NX2512二次开发一键透明小工具的代码编写-2
https://www.ugsnx.com/forum.php? ... 183&fromuid=2527201
(出处: UG爱好者)

上一篇功能已经写完,用的是C的开放API UF_OBJ_set_translucency改的透明度

这边再补个用C++的displayModification显示修改器改透明度的方法。

具体过程就是创建一个displayModification修改器对象,设置修改器的透明度值,将所有要改的面放到一个vector动态数组里,然后把vector数组传给设置好透明度的displayModification修改器对象进行透明度修改。

还是写apply_cb()里的方法,在点击应用按钮时执行。
2.jpg
1.jpg

  1. //获取透明度数值输入框属性
  2. PropertyList* integerProps = integer0->GetProperties();
  3. int integer = integerProps->GetInteger("Value");
  4. delete integerProps;
  5. integerProps = NULL;

  6. //获取选中的的面的对象集合
  7. PropertyList* faceSelectProps = face_select0->GetProperties();
  8. std::vector<NXOpen::TaggedObject*> faces = faceSelectProps->GetTaggedObjectVector("SelectedObjects");
  9. delete faceSelectProps;
  10. faceSelectProps = NULL;

  11. //获取选中的体的对象集合
  12. PropertyList* bodySelectProps = bodySelect0->GetProperties();
  13. std::vector<NXOpen::TaggedObject*> bodys = bodySelectProps->GetTaggedObjectVector("SelectedObjects");
  14. delete bodySelectProps;
  15. bodySelectProps = NULL;

  16. //创建一个显示修改器
  17. DisplayModification* displayModification;
  18. displayModification = theSession->DisplayManager()->NewDisplayModification();

  19. //把透明数值设置进修改器
  20. displayModification->SetNewTranslucency(integer);

  21. //要修改的对象集合
  22. std::vector<DisplayableObject*> objects;

  23. //遍历选中的面对象
  24. for (TaggedObject* face : faces)
  25. {
  26.         //TaggedObject指针转型成Face
  27.         NXOpen::Face* selectedFace = dynamic_cast<NXOpen::Face*>(face);
  28.         //加到修改对象集合里
  29.         objects.push_back(selectedFace);
  30. }

  31. //遍历选中的体对象
  32. for (TaggedObject* body : bodys)
  33. {
  34.         //TaggedObject指针转型成Body
  35.         NXOpen::Body* selectedBody = dynamic_cast<NXOpen::Body*>(body);
  36.         //获取体上全部的面集合
  37.         std::vector< NXOpen::Face* > faces = selectedBody->GetFaces();
  38.         //遍历面
  39.         for (Face* face : faces)
  40.         {
  41.                 //把面也加到修改对象集合里
  42.                 objects.push_back(face);
  43.         }
  44. }

  45. //修改集合里的对象
  46. displayModification->Apply(objects);
  47. //删除堆区的数据
  48. delete displayModification;
复制代码
这边在获取体对象后还要获取选择的体上的所有面对象,把面放入vector里。还有一个就是对话框里获取的面和体的对象是TaggedObject指针类型,我们把指针强转成Face指针后才放入vector数值里。最后NewDisplayModification()这个new出来在堆区的对象要记得删下。

全部取消透明也是一样的逻辑
4.jpg
  1. //创建一个显示修改器
  2. DisplayModification* displayModification;
  3. displayModification = theSession->DisplayManager()->NewDisplayModification();
  4. //设置透明度为0
  5. displayModification->SetNewTranslucency(0);
  6. //获取工作部件的所有体
  7. Part* workPart = theSession->Parts()->Work();
  8. BodyCollection* bodies = workPart->Bodies();

  9. //要修改对象的集合
  10. std::vector<DisplayableObject*> objects;

  11. //遍历所有体
  12. for (Body* body : *bodies)
  13. {
  14.         //把体直接加修改对象的集合里
  15.         objects.push_back(body);

  16.         //获取体上的所有面
  17.         std::vector< NXOpen::Face* > faces = body->GetFaces();

  18.         //把面也加集合里
  19.         for (Face* face : faces)
  20.         {
  21.                 objects.push_back(face);
  22.         }
  23. }

  24. //对集合对象执行透明度修改
  25. displayModification->Apply(objects);
  26. //删除堆区数据
  27. delete displayModification;
复制代码


用的函数、容器、对象类型等都在下面这几个头文件里,要加下
  1. #include <NXOpen/PartCollection.hxx>
  2. #include <NXOpen/BodyCollection.hxx>
  3. #include <NXOpen/Body.hxx>
  4. #include <NXOpen/Face.hxx>
  5. #include <NXOpen/DisplayModification.hxx>
  6. #include <NXOpen/DisplayManager.hxx>
复制代码
3.jpg

生成dll文件后测试功能即可
1.gif
附上源码、对话框和dll文件
tran.rar (29.67 KB, 下载次数: 4)

4

主题

314

回帖

4448

积分

中尉

积分
4448
发表于 1 小时前 | 显示全部楼层
厉害了大师

0

主题

461

回帖

7129

积分

少校

积分
7129
发表于 13 分钟前 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

咨询QQ:1359218528|发帖须知!|Archiver|手机版|小黑屋|UG爱好者论坛 ( 京ICP备10217105号-2 )

GMT+8, 2026-3-27 17:27

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表