Как переместить 3D-модель в Opencascade? - PullRequest
0 голосов
/ 05 июня 2019

Код, который у меня есть, создает 3D-модель и отображает ее в кадре wxpython с помощью Opencascade.

Я хочу преобразовать / переместить выбранную 3D-модель.Как мне этого добиться?

Кроме того, возможно ли загрузить один и тот же файл шага более одного раза и сделать возможным его перемещение или даже соединение их вместе?Я не нашел хороших источников для чего-то подобного.

Моя попытка переместить это:

    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()
...