import os, sys, json, traceback import FreeCAD as App import FreeCADGui as Gui from PySide import QtCore, QtGui, QtWidgets from PySide6 import QtTest from PySide6 import QtOpenGLWidgets ROOT = os.path.abspath(os.environ.get('QI_ROOT') or os.getcwd()) sys.path.insert(0, os.path.join(ROOT, 'src', 'QInventor')) os.environ['QI_TEST'] = 'camera' App.ParamGet('User parameter:BaseApp/Preferences/View').SetString('NavigationStyle', 'Gui::RevitNavigationStyle') def run(): rows=[] try: Gui.activateWorkbench('QInventorWorkbench') import qi_ui, qi_commands, qi_model main=Gui.getMainWindow(); main.resize(1440,940); main.hide(); main.showNormal(); main.raise_(); main.activateWindow() QtTest.QTest.qWaitForWindowExposed(main.windowHandle(),5000) for force in [False, True]: App.ParamGet('User parameter:BaseApp/Preferences/Mod/Sketcher/General').SetBool('ForceOrtho',force) doc=qi_model.new_part('Проверка камеры') body=doc.addObject('PartDesign::Body','Body') sketch=body.newObject('Sketcher::SketchObject','Sketch') doc.recompute() Gui.activeDocument().setEdit(sketch.Name) QtTest.QTest.qWait(1400) view=Gui.activeDocument().activeView() row={'force':force,'camera':view.getCamera(),'viewer_type':str(type(view.getViewer())), 'viewer_dir':dir(view.getViewer())} row['exposed']=main.windowHandle().isExposed() rows.append(row) manager=view.getViewer().getSoRenderManager() row['auto_clip']=manager.getAutoClipping() row['auto_redraw']=manager.isAutoRedraw() row['viewport']=str(manager.getViewportRegion().getViewportSizePixels().getValue()) row['manager_graph']=str(manager.getSceneGraph()) row['manager_camera']=str(manager.getCamera()) graph=view.getSceneGraph() row['root_children']=[str(graph.getChild(i).getTypeId().getName()) for i in range(graph.getNumChildren())] root=sketch.ViewObject.RootNode row['edit_children']=[str(root.getChild(i).getTypeId().getName()) for i in range(root.getNumChildren())] gl=[w for w in main.findChildren(QtWidgets.QWidget) if w.isVisible() and w.metaObject().className()=='QOpenGLWidget' and w.parent().metaObject().className()=='Gui::View3DInventorViewer'][0] row['gl_valid']=gl.isValid() row['gl_context_valid']=gl.context().isValid() if gl.context() else None row['gl_geometry']=[gl.width(),gl.height()] main.grab().save(os.path.join(ROOT,'artifacts','camera-%s.png'%force)) Gui.runCommand('Sketcher_CreateRectangle') QtTest.QTest.qWait(200) for x,y in [(.25,.65),(.42,.35)]: pt=QtCore.QPoint(int(gl.width()*x),int(gl.height()*y)) QtGui.QCursor.setPos(gl.mapToGlobal(pt)) QtTest.QTest.mouseMove(gl,pt); QtTest.QTest.qWait(80) QtTest.QTest.mouseClick(gl,QtCore.Qt.LeftButton,QtCore.Qt.NoModifier,pt) QtTest.QTest.qWait(120) row['geometry']=sketch.GeometryCount QtTest.QTest.keyClick(gl,QtCore.Qt.Key_Escape) Gui.runCommand('Sketcher_LeaveSketch') App.closeDocument(doc.Name) except Exception: rows.append({'error':traceback.format_exc()}) with open(os.path.join(ROOT,'artifacts','camera-probe.json'),'w',encoding='utf-8') as f: json.dump(rows,f,indent=2,ensure_ascii=False,default=str) for n in list(App.listDocuments()):App.closeDocument(n) Gui.getMainWindow().close() QtCore.QTimer.singleShot(100,QtCore.QCoreApplication.quit) QtCore.QTimer.singleShot(5000,run)