白色治愈之风 发表于 2026-8-24 08:43:32

批量修改透明度工具

仿照网友的界面重新做了修改透明度插件,支持装配环境。注意,装配环境选择的时候,只能在过滤器里面选择组件和当前工作部件下的实体。



白色治愈之风 发表于 2026-8-24 08:47:37

如果过滤器选择实体,即使使用系统自带的编辑对象显示,也不能更改子装配内实体的透明度。

arong_open_nx 发表于 2026-8-24 09:13:41

直接设置装配下实体的原型就可以了

白色治愈之风 发表于 2026-8-24 09:48:06

arong_open_nx 发表于 2026-8-24 09:13
直接设置装配下实体的原型就可以了

试过了,没有成功。根据选中的实体得到他所在组件内部的实体原型,然后改变透明度。你要是成功了能否分享这段代码。

f3634861 发表于 2026-8-25 08:37:16

应该是全部取消透明的问题

f3634861 发表于 2026-8-25 10:11:55

python取消全部透明代码:
# -*- coding: utf-8 -*-
import NXOpen
import NXOpen.UF


class ClearFaceTransparency:
    def __init__(self):
      self.s = NXOpen.Session.GetSession()
      self.uf = NXOpen.UF.UFSession.GetUFSession()
      self.batch = 2000
      self.set_work_to_display()
      self.wp = self.s.Parts.Work
      self.dp = self.s.Parts.Display

    def set_work_to_display(self):
      try:
            dp = self.s.Parts.Display
            if dp and dp != self.s.Parts.Work:
                self.s.Parts.SetWork(dp)
      except Exception:
            pass

    def is_asm(self):
      try:
            return self.dp and self.dp.ComponentAssembly and self.dp.ComponentAssembly.RootComponent
      except Exception:
            return False

    def is_occ(self, o):
      try:
            return bool(o.IsOccurrence)
      except Exception:
            return False

    def add(self, arr, tags, o):
      try:
            t = o.Tag
            if t not in tags:
                tags.add(t)
                arr.append(o)
      except Exception:
            pass

    def collect_faces(self):
      faces, tags = [], set()

      if not self.is_asm():
            try:
                for b in self.wp.Bodies:
                  try:
                        for f in b.GetFaces():
                            self.add(faces, tags, f)
                  except Exception:
                        pass
            except Exception:
                pass
            return faces

      try:
            root = self.dp.ComponentAssembly.RootComponent
            stack = list(root.GetChildren())
      except Exception:
            return faces

      while stack:
            c = stack.pop()

            try:
                p = c.Prototype
            except Exception:
                p = None

            if isinstance(p, NXOpen.Part):
                try:
                  for pb in p.Bodies:
                        try:
                            ob = c.FindOccurrence(pb)
                        except Exception:
                            ob = None

                        if ob:
                            try:
                              for f in ob.GetFaces():
                                    if self.is_occ(f):
                                        self.add(faces, tags, f)
                            except Exception:
                              pass
                except Exception:
                  pass

            try:
                stack.extend(c.GetChildren())
            except Exception:
                pass

      return faces

    def apply_zero(self, objs):
      if not objs:
            return

      for i in range(0, len(objs), self.batch):
            dm = None
            try:
                dm = self.s.DisplayManager.NewDisplayModification()
                dm.ApplyToAllFaces = False
                dm.ApplyToOwningParts = False

                try:
                  dm.NewWidth = NXOpen.DisplayableObject.ObjectWidth.One
                except Exception:
                  pass

                dm.NewTranslucency = 0
                dm.Apply(objs)

            except Exception:
                pass

            finally:
                if dm:
                  try:
                        dm.Dispose()
                  except Exception:
                        pass

    def refresh(self, mark):
      for fn in [
            lambda: self.dp.Views.Refresh(),
            lambda: self.wp.Views.Refresh(),
            lambda: self.dp.ModelingViews.WorkView.UpdateDisplay(),
            lambda: self.uf.Disp.Refresh(),
            lambda: self.s.UpdateManager.DoUpdate(mark)
      ]:
            try:
                fn()
            except Exception:
                pass

    def run(self):
      try:
            self.set_work_to_display()
            self.wp = self.s.Parts.Work
            self.dp = self.s.Parts.Display

            mark = self.s.SetUndoMark(
                NXOpen.Session.MarkVisibility.Visible,
                "取消全部透明"
            )

            faces = self.collect_faces()
            self.apply_zero(faces)
            self.refresh(mark)

      except Exception:
            pass


def main():
    try:
      ClearFaceTransparency().run()
    except Exception:
      pass


if __name__ == "__main__":
    main()

白色治愈之风 发表于 2026-8-25 10:30:12

f3634861 发表于 2026-8-25 10:11
python取消全部透明代码:

全部取消透明度我的插件没有问题。那个按钮就可以实现。

linhai* 发表于 2026-8-25 21:33:15

谢谢分享
页: [1]
查看完整版本: 批量修改透明度工具