如何在Opencascade中移动三维模型?

2024-10-01 07:37:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码创建了一个三维模型,并用Opencascade将其显示在wxpython框架中

我要变换/移动选定的三维模型。我如何做到这一点

另外,是否可以多次加载同一个Step文件,并使它们可以移动,甚至可以将它们捕捉在一起?我还没有找到这样的好消息来源

我试着移动它:

    def OnReplace(self):
        a = self._display.GetSelectedShape
        a.MoveTo(400,500)   

到目前为止我的代码缩短了:

from __future__ import print_function
import time
try:
    import wx
except ImportError:
    raise ImportError('Please install wxPython.')
from OCC.Display import OCCViewer
from OCC.STEPControl import STEPControl_Reader

class wxBaseViewer(wx.Panel):
    def __init__(self, parent=None):
        wx.Panel.__init__(self, parent)
        self.Bind(wx.EVT_SIZE, self.OnSize)
        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)

        self._display = None
        self._inited = False

    def GetWinId(self):
        timeout = 10  # 10 seconds
        win_id = self.GetHandle()
        init_time = time.time()
        delta_t = 0.  # elapsed time, initialized to 0 before the while loop
        # if ever win_id is 0, enter the loop untill it gets a value
        while win_id == 0 and delta_t < timeout:
            time.sleep(0.1)
            wx.SafeYield()
            win_id = self.GetHandle()
            delta_t = time.time() - init_time
        # check that win_id is different from 0
        if win_id == 0:
            raise AssertionError("Can't get win Id")
        # otherwise returns the window Id
        return win_id

    def OnSize(self, event):
        if self._inited:
            self._display.OnResize()
    def OnReplace(self, event):
        pass
    def OnKeyDown(self, event):
        pass

class wxViewer3d(wxBaseViewer):
    def __init__(self, *kargs):
        wxBaseViewer.__init__(self, *kargs)

        self._drawbox = False
        self._zoom_area = False
        self._select_area = False
        self._inited = False
        self._leftisdown = False
        self._middleisdown = False
        self._rightisdown = False
        self._selection = None
        self._scrollwheel = False
        self._key_map = {}
        self.dragStartPos = None

    def InitDriver(self):
        self._display = OCCViewer.Viewer3d(self.GetWinId())
        self._display.Create()
        self._display.SetModeShaded()
        self._inited = True
        self._SetupKeyMap()

    def _SetupKeyMap(self):
        def set_shade_mode():
            self._display.DisableAntiAliasing()
            self._display.SetModeShaded()
        self._key_map = {ord('M'): self.OnReplace}

    def OnKeyDown(self, evt):
        code = evt.GetKeyCode()
        try:
            self._key_map[code]()
        except KeyError:
            print('unrecognized key %i' % evt.GetKeyCode())

    def OnReplace(self):
        a = self._display.GetSelectedShape
        a.MoveTo(400,500)        

def StepViewer():
    class AppFrame(wx.Frame):
        def __init__(self, parent):
            wx.Frame.__init__(self, parent, -1, "3D Viewer",
                              style=wx.DEFAULT_FRAME_STYLE, size=(1280 , 720))            
            # 3D View Panel
            self.canva = wxViewer3d(self)
        def runTests(self):
            self.canva._display.Test()

    app = wx.App(False)
    wx.InitAllImageHandlers()
    frame = AppFrame(None)
    frame.Show(True)
    wx.SafeYield()
    frame.canva.InitDriver()
    frame.runTests()
    app.SetTopWindow(frame)
    app.MainLoop()

if __name__ == "__main__":
    StepViewer()

Tags: fromimportselfnoneidfalsetimeinit