FreeCAD

Форк
0
/
mainwindow.cpp 
179 строк · 5.6 Кб
1

2
#include <Python.h>
3
#include <QtGui>
4
#include <QtWidgets>
5
#include <sstream>
6
#include <string>
7
#if defined(Q_WS_X11)
8
#include <QX11EmbedContainer>
9
#endif
10

11
#include "mainwindow.h"
12

13
MainWindow::MainWindow()
14
{
15
    createActions();
16
    createMenus();
17
#if defined(Q_WS_X11)
18
    setCentralWidget(new QX11EmbedContainer(this));
19
#else
20
    setCentralWidget(new QWidget(this));
21
#endif
22
}
23

24
void MainWindow::createActions()
25
{
26
    loadAct = new QAction(tr("&Load"), this);
27
    loadAct->setStatusTip(tr("Load FreeCAD module"));
28
    connect(loadAct, SIGNAL(triggered()), this, SLOT(loadFreeCAD()));
29

30
    newAct = new QAction(tr("New document"), this);
31
    newAct->setStatusTip(tr("Create new document in the FreeCAD module"));
32
    connect(newAct, SIGNAL(triggered()), this, SLOT(newDocument()));
33
    newAct->setDisabled(true);
34

35
    embedAct = new QAction(tr("Embed"), this);
36
    embedAct->setStatusTip(tr("Embed FreeCAD as child window"));
37
    connect(embedAct, SIGNAL(triggered()), this, SLOT(embedWindow()));
38
    embedAct->setDisabled(true);
39

40
    exitAct = new QAction(tr("E&xit"), this);
41
    exitAct->setShortcut(tr("Ctrl+Q"));
42
    exitAct->setStatusTip(tr("Exit the application"));
43
    connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
44

45
    aboutAct = new QAction(tr("&About"), this);
46
    aboutAct->setStatusTip(tr("Show the application's About box"));
47
    connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
48
}
49

50
void MainWindow::createMenus()
51
{
52
    fileMenu = menuBar()->addMenu(tr("&File"));
53
    fileMenu->addAction(exitAct);
54

55
    editMenu = menuBar()->addMenu(tr("Free&CAD"));
56
    editMenu->addAction(loadAct);
57
    editMenu->addAction(newAct);
58
    editMenu->addAction(embedAct);
59

60
    menuBar()->addSeparator();
61

62
    helpMenu = menuBar()->addMenu(tr("&Help"));
63
    helpMenu->addAction(aboutAct);
64
}
65

66
void MainWindow::loadFreeCAD()
67
{
68
    QString path = QFileDialog::getExistingDirectory(this, "FreeCAD module path");
69
    if (!path.isEmpty()) {
70
        path.replace('\\', '/');
71
        PyObject* main = PyImport_AddModule("__main__");
72
        PyObject* dict = PyModule_GetDict(main);
73
        std::stringstream cmd;
74
        cmd << "import sys,os\n"
75
            << "sys.path.append(\"" << (const char*)path.toLatin1() << "\")\n"
76
            << "os.chdir(\"" << (const char*)path.toLatin1() << "\")\n"
77
            << "import FreeCADGui\n"
78
            << "FreeCADGui.showMainWindow()\n";
79

80
        PyObject* result = PyRun_String(cmd.str().c_str(), Py_file_input, dict, dict);
81
        if (result) {
82
            Py_DECREF(result);
83
            loadAct->setDisabled(true);
84
            newAct->setEnabled(true);
85
            embedAct->setEnabled(true);
86
        }
87
        else {
88
            PyObject *ptype, *pvalue, *ptrace;
89
            PyErr_Fetch(&ptype, &pvalue, &ptrace);
90
            PyObject* pystring = PyObject_Str(pvalue);
91
            const char* error = PyUnicode_AsUTF8(pystring);
92
            QMessageBox::warning(this, "Error", error);
93
            Py_DECREF(pystring);
94
        }
95
        Py_DECREF(dict);
96
    }
97
}
98

99
void MainWindow::newDocument()
100
{
101
    PyObject* main = PyImport_AddModule("__main__");
102
    PyObject* dict = PyModule_GetDict(main);
103
    const char* cmd = "FreeCAD.newDocument()\n";
104

105
    PyObject* result = PyRun_String(cmd, Py_file_input, dict, dict);
106
    if (result) {
107
        Py_DECREF(result);
108
    }
109
    else {
110
        PyObject *ptype, *pvalue, *ptrace;
111
        PyErr_Fetch(&ptype, &pvalue, &ptrace);
112
        PyObject* pystring = PyObject_Str(pvalue);
113
        const char* error = PyUnicode_AsUTF8(pystring);
114
        QMessageBox::warning(this, "Error", error);
115
        Py_DECREF(pystring);
116
    }
117
    Py_DECREF(dict);
118
}
119

120
void MainWindow::embedWindow()
121
{
122
    PyObject* main = PyImport_AddModule("__main__");
123
    PyObject* dict = PyModule_GetDict(main);
124
    std::stringstream cmd;
125
    cmd << "class BlankWorkbench (Workbench):\n"
126
        << "   MenuText = \"Blank\"\n"
127
        << "   ToolTip = \"Blank workbench\"\n"
128
        << "\n"
129
        << "   def Initialize(self):\n"
130
        << "      return\n"
131
        << "   def GetClassName(self):\n"
132
        << "      return \"Gui::BlankWorkbench\"\n"
133
        << "\n"
134
        << "FreeCADGui.addWorkbench(BlankWorkbench)\n"
135
        << "FreeCADGui.activateWorkbench(\"BlankWorkbench\")\n"
136
        << "\n";
137

138
#if defined(Q_WS_X11) || defined(Q_OS_WIN)
139
    WId hwnd = this->centralWidget()->winId();
140
    cmd << "FreeCADGui.embedToWindow(\"" << hwnd << "\")\n"
141
        << "\n";
142
#endif
143

144
    PyObject* result = PyRun_String(cmd.str().c_str(), Py_file_input, dict, dict);
145
    if (result) {
146
        Py_DECREF(result);
147

148
#if !defined(Q_WS_X11)
149
        // This is a workaround for the lack of a replacement of QX11EmbedWidget with Qt5
150
        QWidget* mw = nullptr;
151
        for (auto it : qApp->topLevelWidgets()) {
152
            if (it->inherits("Gui::MainWindow")) {
153
                mw = it;
154
                break;
155
            }
156
        }
157
        if (mw) {
158
            QVBoxLayout* vb = new QVBoxLayout();
159
            centralWidget()->setLayout(vb);
160
            vb->addWidget(mw);
161
        }
162
#endif
163

164
        embedAct->setDisabled(true);
165
    }
166
    else {
167
        PyObject *ptype, *pvalue, *ptrace;
168
        PyErr_Fetch(&ptype, &pvalue, &ptrace);
169
        PyObject* pystring = PyObject_Str(pvalue);
170
        const char* error = PyUnicode_AsUTF8(pystring);
171
        QMessageBox::warning(this, "Error", error);
172
        Py_DECREF(pystring);
173
    }
174
    Py_DECREF(dict);
175
}
176

177
void MainWindow::about()
178
{
179
    QMessageBox::about(this, tr("About"), tr("Demonstrates remote control of FreeCAD"));
180
}
181

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.