有情感的NPC 发表于 2026-3-27 15:19:36

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

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()里的方法,在点击应用按钮时执行。



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

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

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

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

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

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

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

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

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

全部取消透明也是一样的逻辑

//创建一个显示修改器
DisplayModification* displayModification;
displayModification = theSession->DisplayManager()->NewDisplayModification();
//设置透明度为0
displayModification->SetNewTranslucency(0);
//获取工作部件的所有体
Part* workPart = theSession->Parts()->Work();
BodyCollection* bodies = workPart->Bodies();

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

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

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

      //把面也加集合里
      for (Face* face : faces)
      {
                objects.push_back(face);
      }
}

//对集合对象执行透明度修改
displayModification->Apply(objects);
//删除堆区数据
delete displayModification;

用的函数、容器、对象类型等都在下面这几个头文件里,要加下
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/DisplayModification.hxx>
#include <NXOpen/DisplayManager.hxx>

生成dll文件后测试功能即可

附上源码、对话框和dll文件


相随* 发表于 2026-3-27 16:19:35

厉害了大师

lo9 发表于 2026-3-27 17:14:21

谢谢分享

pzhzshun 发表于 2026-3-28 04:02:08

感谢分享!收藏学习了。

chenyaohua 发表于 2026-3-28 19:30:51

赞一下希望能多分享一些例子

legondfire 发表于 2026-4-3 15:20:46

谢谢分享!

sqsysweey 发表于 2026-4-3 15:32:37

高人,俺得好好学学

2080463189 发表于 2026-4-10 19:01:00

感谢分享!收藏学习了。

凡夫俗子1234 发表于 2026-4-11 08:38:53

太棒了,感谢分享

luzhiwei0733 发表于 2026-4-11 08:56:25

大神,你装NX2512是完整版的?带有API的?能给我安装包吗?网上找的都是阉割版,没办法二次开发
页: [1] 2
查看完整版本: NX2512二次开发一键透明小工具的代码编写,使用C++API修改透明度-3