Download src/Mod/Sandbox/Gui/Command.cpp from AbdulElahGwaith/FreeCAD: direct link, hf CLI and curl.
- Browser
- Download file 47.2 kB
-
https://huggingface.co/AbdulElahGwaith/FreeCAD/resolve/main/src/Mod/Sandbox/Gui/Command.cpp
- Command line
-
hf download hf://AbdulElahGwaith/FreeCAD/src/Mod/Sandbox/Gui/Command.cpp
-
curl -L -o Command.cpp https://huggingface.co/AbdulElahGwaith/FreeCAD/resolve/main/src/Mod/Sandbox/Gui/Command.cpp
47.2 kB
| // SPDX-License-Identifier: LGPL-2.1-or-later | |
| /*************************************************************************** | |
| * Copyright (c) 2009 Werner Mayer <wmayer@users.sourceforge.net> * | |
| * * | |
| * This file is part of the FreeCAD CAx development system. * | |
| * * | |
| * This library is free software; you can redistribute it and/or * | |
| * modify it under the terms of the GNU Library General Public * | |
| * License as published by the Free Software Foundation; either * | |
| * version 2 of the License, or (at your option) any later version. * | |
| * * | |
| * This library is distributed in the hope that it will be useful, * | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of * | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |
| * GNU Library General Public License for more details. * | |
| * * | |
| * You should have received a copy of the GNU Library General Public * | |
| * License along with this library; see the file COPYING.LIB. If not, * | |
| * write to the Free Software Foundation, Inc., 59 Temple Place, * | |
| * Suite 330, Boston, MA 02111-1307, USA * | |
| * * | |
| ***************************************************************************/ | |
| namespace bp = boost::placeholders; | |
| DEF_STD_CMD(CmdSandboxDocumentThread) | |
| CmdSandboxDocumentThread::CmdSandboxDocumentThread() | |
| :Command("Sandbox_Thread") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Run Several Threads"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_Thread"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool1"; | |
| } | |
| void CmdSandboxDocumentThread::activated(int) | |
| { | |
| App::GetApplication().newDocument("Thread"); | |
| for (int i=0; i<5; i++) { | |
| Sandbox::DocumentThread* dt = new Sandbox::DocumentThread(); | |
| dt->setObjectName(QStringLiteral("MyMesh_%1").arg(i)); | |
| QObject::connect(dt, SIGNAL(finished()), dt, SLOT(deleteLater())); | |
| dt->start(); | |
| } | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxDocumentTestThread) | |
| CmdSandboxDocumentTestThread::CmdSandboxDocumentTestThread() | |
| :Command("Sandbox_TestThread") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Test Thread"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_TestThread"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool1"; | |
| } | |
| void CmdSandboxDocumentTestThread::activated(int) | |
| { | |
| App::GetApplication().newDocument("Thread"); | |
| Sandbox::DocumentTestThread* dt = new Sandbox::DocumentTestThread(); | |
| QObject::connect(dt, SIGNAL(finished()), dt, SLOT(deleteLater())); | |
| dt->start(); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD_A(CmdSandboxDocumentSaveThread) | |
| CmdSandboxDocumentSaveThread::CmdSandboxDocumentSaveThread() | |
| :Command("Sandbox_SaveThread") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Save Thread"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox save function"); | |
| sWhatsThis = "Sandbox_SaveThread"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdSandboxDocumentSaveThread::activated(int) | |
| { | |
| App::Document* doc = App::GetApplication().getActiveDocument(); | |
| Sandbox::DocumentSaverThread* dt = new Sandbox::DocumentSaverThread(doc); | |
| QObject::connect(dt, SIGNAL(finished()), dt, SLOT(deleteLater())); | |
| dt->start(); | |
| } | |
| bool CmdSandboxDocumentSaveThread::isActive() | |
| { | |
| return App::GetApplication().getActiveDocument() != 0; | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxDocThreadWithSeq) | |
| CmdSandboxDocThreadWithSeq::CmdSandboxDocThreadWithSeq() | |
| :Command("Sandbox_SeqThread") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Thread and Sequencer"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_SeqThread"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool2"; | |
| } | |
| void CmdSandboxDocThreadWithSeq::activated(int) | |
| { | |
| App::GetApplication().newDocument("Thread"); | |
| Sandbox::DocumentThread* dt = new Sandbox::DocumentThread(); | |
| dt->setObjectName(QStringLiteral("MyMesh")); | |
| QObject::connect(dt, SIGNAL(finished()), dt, SLOT(deleteLater())); | |
| dt->start(); | |
| int max = 10000; | |
| int max = 100000000; | |
| Base::SequencerLauncher seq("Do something meaningful…", max); | |
| double val=0; | |
| for (int i=0; i<max; i++) { | |
| for (int j=0; j<max; j++) { | |
| val = sin(0.12345); | |
| } | |
| seq.next(true); | |
| } | |
| (void)val; | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxDocThreadBusy) | |
| CmdSandboxDocThreadBusy::CmdSandboxDocThreadBusy() | |
| :Command("Sandbox_BlockThread") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Thread and No Sequencer"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_BlockThread"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool3"; | |
| } | |
| void CmdSandboxDocThreadBusy::activated(int) | |
| { | |
| App::GetApplication().newDocument("Thread"); | |
| Sandbox::DocumentThread* dt = new Sandbox::DocumentThread(); | |
| dt->setObjectName(QStringLiteral("MyMesh")); | |
| QObject::connect(dt, SIGNAL(finished()), dt, SLOT(deleteLater())); | |
| dt->start(); | |
| int max = 10000; | |
| int max = 100000000; | |
| double val=0; | |
| for (int i=0; i<max; i++) { | |
| for (int j=0; j<max; j++) { | |
| val = sin(0.12345); | |
| } | |
| } | |
| (void)val; | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxDocumentNoThread) | |
| CmdSandboxDocumentNoThread::CmdSandboxDocumentNoThread() | |
| :Command("Sandbox_NoThread") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("GUI Thread"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_NoThread"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool4"; | |
| } | |
| void CmdSandboxDocumentNoThread::activated(int) | |
| { | |
| App::GetApplication().newDocument("Thread"); | |
| App::Document* doc = App::GetApplication().getActiveDocument(); | |
| Sandbox::DocumentProtector dp(doc); | |
| App::DocumentObject* obj = dp.addObject("Mesh::Cube", "MyCube"); | |
| (void)obj; | |
| dp.recompute(); | |
| App::GetApplication().closeDocument("Thread"); | |
| // this forces an exception | |
| App::DocumentObject* obj2 = dp.addObject("Mesh::Cube", "MyCube"); | |
| (void)obj2; | |
| dp.recompute(); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxWorkerThread) | |
| CmdSandboxWorkerThread::CmdSandboxWorkerThread() | |
| :Command("Sandbox_WorkerThread") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Worker Thread"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_WorkerThread"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool1"; | |
| } | |
| void CmdSandboxWorkerThread::activated(int) | |
| { | |
| Sandbox::WorkerThread* wt = new Sandbox::WorkerThread(); | |
| QObject::connect(wt, SIGNAL(finished()), wt, SLOT(deleteLater())); | |
| wt->start(); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxPythonLockThread) | |
| CmdSandboxPythonLockThread::CmdSandboxPythonLockThread() | |
| :Command("Sandbox_PythonLockThread") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Locked Python Threads"); | |
| sToolTipText = QT_TR_NOOP("Uses Python's thread module where each thread is locked"); | |
| sWhatsThis = "Sandbox_PythonLockThread"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdSandboxPythonLockThread::activated(int) | |
| { | |
| doCommand(Doc, | |
| "import thread, time, Sandbox\n" | |
| "def adder(doc):\n" | |
| " lock.acquire()\n" | |
| " dp=Sandbox.DocumentProtector(doc)\n" | |
| " dp.addObject(\"Mesh::Ellipsoid\",\"Mesh\")\n" | |
| " dp.recompute()\n" | |
| " lock.release()\n" | |
| "\n" | |
| "lock=thread.allocate_lock()\n" | |
| "doc=App.newDocument()\n" | |
| "for i in range(2):\n" | |
| " thread.start_new(adder,(doc,))\n" | |
| "\n" | |
| "time.sleep(1)\n" | |
| ); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxPythonNolockThread) | |
| CmdSandboxPythonNolockThread::CmdSandboxPythonNolockThread() | |
| :Command("Sandbox_NolockPython") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Unlocked Python Threads"); | |
| sToolTipText = QT_TR_NOOP("Uses Python's thread module where each thread is unlocked"); | |
| sWhatsThis = "Sandbox_NolockPython"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdSandboxPythonNolockThread::activated(int) | |
| { | |
| doCommand(Doc, | |
| "import thread, time, Sandbox\n" | |
| "def adder(doc):\n" | |
| " dp=Sandbox.DocumentProtector(doc)\n" | |
| " dp.addObject(\"Mesh::Ellipsoid\",\"Mesh\")\n" | |
| " dp.recompute()\n" | |
| "\n" | |
| "doc=App.newDocument()\n" | |
| "for i in range(2):\n" | |
| " thread.start_new(adder,(doc,))\n" | |
| "\n" | |
| "time.sleep(1)\n" | |
| ); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxPySideThread) | |
| CmdSandboxPySideThread::CmdSandboxPySideThread() | |
| :Command("Sandbox_PySideThread") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("PySide Threads"); | |
| sToolTipText = QT_TR_NOOP("Uses PySide's thread module"); | |
| sWhatsThis = "Sandbox_PySideThread"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdSandboxPySideThread::activated(int) | |
| { | |
| doCommand(Doc, | |
| "from PySide import QtCore; import Sandbox\n" | |
| "class Thread(QtCore.QThread):\n" | |
| " def run(self):\n" | |
| " dp=Sandbox.DocumentProtector(doc)\n" | |
| " dp.addObject(\"Mesh::Ellipsoid\",\"Mesh\")\n" | |
| " dp.recompute()\n" | |
| "\n" | |
| "doc=App.newDocument()\n" | |
| "threads=[]\n" | |
| "for i in range(2):\n" | |
| " thread=Thread()\n" | |
| " threads.append(thread)\n" | |
| " thread.start()\n" | |
| "\n" | |
| ); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxPythonThread) | |
| CmdSandboxPythonThread::CmdSandboxPythonThread() | |
| :Command("Sandbox_PythonThread") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Python Threads"); | |
| sToolTipText = QT_TR_NOOP("Uses class PythonThread running Python code in its run() method"); | |
| sWhatsThis = "Sandbox_PythonThread"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdSandboxPythonThread::activated(int) | |
| { | |
| App::GetApplication().newDocument("Thread"); | |
| for (int i=0; i<5; i++) { | |
| Sandbox::PythonThread* pt = new Sandbox::PythonThread(); | |
| pt->setObjectName(QStringLiteral("MyMesh_%1").arg(i)); | |
| QObject::connect(pt, SIGNAL(finished()), pt, SLOT(deleteLater())); | |
| pt->start(); | |
| } | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxPythonMainThread) | |
| CmdSandboxPythonMainThread::CmdSandboxPythonMainThread() | |
| :Command("Sandbox_PythonMainThread") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Python Main Thread"); | |
| sToolTipText = QT_TR_NOOP("Runs Python code in the main thread"); | |
| sWhatsThis = "Sandbox_PythonMainThread"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdSandboxPythonMainThread::activated(int) | |
| { | |
| doCommand(Doc, | |
| "import Sandbox\n" | |
| "doc=App.newDocument()\n" | |
| "dp=Sandbox.DocumentProtector(doc)\n" | |
| "dp.addObject(\"Mesh::Ellipsoid\",\"Mesh\")\n" | |
| "dp.recompute()\n" | |
| ); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxDocThreadWithDialog) | |
| CmdSandboxDocThreadWithDialog::CmdSandboxDocThreadWithDialog() | |
| :Command("Sandbox_Dialog") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Thread and Modal Dialog"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_Dialog"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool7"; | |
| } | |
| void CmdSandboxDocThreadWithDialog::activated(int) | |
| { | |
| App::GetApplication().newDocument("Thread"); | |
| Sandbox::DocumentThread* dt = new Sandbox::DocumentThread(); | |
| dt->setObjectName(QStringLiteral("MyMesh")); | |
| QObject::connect(dt, SIGNAL(finished()), dt, SLOT(deleteLater())); | |
| dt->start(); | |
| //QFileDialog::getOpenFileName(); | |
| QColorDialog::getColor(Qt::white,Gui::getMainWindow()); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdSandboxDocThreadWithFileDlg) | |
| CmdSandboxDocThreadWithFileDlg::CmdSandboxDocThreadWithFileDlg() | |
| :Command("Sandbox_FileDialog") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Thread and File Dialog"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_FileDialog"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool7"; | |
| } | |
| void CmdSandboxDocThreadWithFileDlg::activated(int) | |
| { | |
| App::GetApplication().newDocument("Thread"); | |
| Sandbox::DocumentThread* dt = new Sandbox::DocumentThread(); | |
| dt->setObjectName(QStringLiteral("MyMesh")); | |
| QObject::connect(dt, SIGNAL(finished()), dt, SLOT(deleteLater())); | |
| dt->start(); | |
| QFileDialog::getOpenFileName(); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| class CmdSandboxEventLoop : public Gui::Command | |
| { | |
| public: | |
| CmdSandboxEventLoop(); | |
| const char* className() const | |
| { return "CmdSandboxEventLoop"; } | |
| protected: | |
| void activated(int iMsg); | |
| bool isActive(void); | |
| private: | |
| QEventLoop loop; | |
| }; | |
| CmdSandboxEventLoop::CmdSandboxEventLoop() | |
| :Command("Sandbox_EventLoop") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Local Event Loop"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_EventLoop"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool6"; | |
| } | |
| void CmdSandboxEventLoop::activated(int) | |
| { | |
| QTimer timer; | |
| timer.setSingleShot(true); | |
| QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); | |
| timer.start(5000); // 5s timeout | |
| loop.exec(); | |
| Base::Console().message("CmdSandboxEventLoop: timeout\n"); | |
| } | |
| bool CmdSandboxEventLoop::isActive(void) | |
| { | |
| return (!loop.isRunning()); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| class CmdSandboxMeshLoader : public Gui::Command | |
| { | |
| public: | |
| CmdSandboxMeshLoader(); | |
| const char* className() const | |
| { return "CmdSandboxMeshLoader"; } | |
| protected: | |
| void activated(int iMsg); | |
| bool isActive(void); | |
| private: | |
| QEventLoop loop; | |
| }; | |
| CmdSandboxMeshLoader::CmdSandboxMeshLoader() | |
| :Command("Sandbox_MeshLoad") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Load Mesh in Thread"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_MeshLoad"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool6"; | |
| } | |
| void CmdSandboxMeshLoader::activated(int) | |
| { | |
| // use current path as default | |
| QStringList filter; | |
| filter << QObject::tr("All Mesh Files (*.stl *.ast *.bms *.obj)"); | |
| filter << QObject::tr("Binary STL (*.stl)"); | |
| filter << QObject::tr("ASCII STL (*.ast)"); | |
| filter << QObject::tr("Binary Mesh (*.bms)"); | |
| filter << QObject::tr("Alias Mesh (*.obj)"); | |
| filter << QObject::tr("Inventor V2.1 ascii (*.iv)"); | |
| //filter << "Nastran (*.nas *.bdf)"; | |
| filter << QObject::tr("All Files (*.*)"); | |
| // Allow multi selection | |
| QString fn = Gui::FileDialog::getOpenFileName(Gui::getMainWindow(), | |
| QObject::tr("Import mesh"), QString(), filter.join(QLatin1String(";;"))); | |
| Sandbox::MeshLoaderThread thread(fn); | |
| QObject::connect(&thread, SIGNAL(finished()), &loop, SLOT(quit())); | |
| thread.start(); | |
| loop.exec(); | |
| Base::Reference<Mesh::MeshObject> data = thread.getMesh(); | |
| App::Document* doc = App::GetApplication().getActiveDocument(); | |
| Mesh::Feature* mesh = doc->addObject<Mesh::Feature>("Mesh"); | |
| mesh->Mesh.setValuePtr((Mesh::MeshObject*)data); | |
| mesh->purgeTouched(); | |
| } | |
| bool CmdSandboxMeshLoader::isActive(void) | |
| { | |
| return (hasActiveDocument() && !loop.isRunning()); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| Base::Reference<Mesh::MeshObject> loadMesh(const QString& s) | |
| { | |
| Mesh::MeshObject* mesh = new Mesh::MeshObject(); | |
| mesh->load((const char*)s.toUtf8()); | |
| return mesh; | |
| } | |
| DEF_STD_CMD_A(CmdSandboxMeshLoaderBoost) | |
| CmdSandboxMeshLoaderBoost::CmdSandboxMeshLoaderBoost() | |
| :Command("Sandbox_MeshLoaderBoost") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Load Mesh in Boost-Thread"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_MeshLoaderBoost"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool6"; | |
| } | |
| void CmdSandboxMeshLoaderBoost::activated(int) | |
| { | |
| // use current path as default | |
| QStringList filter; | |
| filter << QObject::tr("All Mesh Files (*.stl *.ast *.bms *.obj)"); | |
| filter << QObject::tr("Binary STL (*.stl)"); | |
| filter << QObject::tr("ASCII STL (*.ast)"); | |
| filter << QObject::tr("Binary Mesh (*.bms)"); | |
| filter << QObject::tr("Alias Mesh (*.obj)"); | |
| filter << QObject::tr("Inventor V2.1 ascii (*.iv)"); | |
| //filter << "Nastran (*.nas *.bdf)"; | |
| filter << QObject::tr("All Files (*.*)"); | |
| // Allow multi selection | |
| QString fn = Gui::FileDialog::getOpenFileName(Gui::getMainWindow(), | |
| QObject::tr("Import mesh"), QString(), filter.join(QLatin1String(";;"))); | |
| boost::packaged_task< Base::Reference<Mesh::MeshObject> > pt | |
| (boost::bind(&loadMesh, fn)); | |
| boost::unique_future< Base::Reference<Mesh::MeshObject> > fi=pt.get_future(); | |
| boost::thread task(boost::move(pt)); // launch task on a thread | |
| fi.wait(); // wait for it to be finished | |
| App::Document* doc = App::GetApplication().getActiveDocument(); | |
| Mesh::Feature* mesh = doc->addObject<Mesh::Feature>("Mesh"); | |
| mesh->Mesh.setValuePtr((Mesh::MeshObject*)fi.get()); | |
| mesh->purgeTouched(); | |
| } | |
| bool CmdSandboxMeshLoaderBoost::isActive(void) | |
| { | |
| return hasActiveDocument(); | |
| } | |
| DEF_STD_CMD_A(CmdSandboxMeshLoaderFuture) | |
| CmdSandboxMeshLoaderFuture::CmdSandboxMeshLoaderFuture() | |
| :Command("Sandbox_MeshLoaderFuture") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Load Mesh in QFuture"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_MeshLoaderFuture"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool6"; | |
| } | |
| void CmdSandboxMeshLoaderFuture::activated(int) | |
| { | |
| // use current path as default | |
| QStringList filter; | |
| filter << QObject::tr("All Mesh Files (*.stl *.ast *.bms *.obj)"); | |
| filter << QObject::tr("Binary STL (*.stl)"); | |
| filter << QObject::tr("ASCII STL (*.ast)"); | |
| filter << QObject::tr("Binary Mesh (*.bms)"); | |
| filter << QObject::tr("Alias Mesh (*.obj)"); | |
| filter << QObject::tr("Inventor V2.1 ascii (*.iv)"); | |
| //filter << "Nastran (*.nas *.bdf)"; | |
| filter << QObject::tr("All Files (*.*)"); | |
| // Allow multi selection | |
| QStringList fn = Gui::FileDialog::getOpenFileNames(Gui::getMainWindow(), | |
| QObject::tr("Import mesh"), QString(), filter.join(QLatin1String(";;"))); | |
| QFuture< Base::Reference<Mesh::MeshObject> > future = QtConcurrent::mapped | |
| (fn, loadMesh); | |
| QFutureWatcher< Base::Reference<Mesh::MeshObject> > watcher; | |
| watcher.setFuture(future); | |
| // keep it responsive during computation | |
| QEventLoop loop; | |
| QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); | |
| loop.exec(); | |
| App::Document* doc = App::GetApplication().getActiveDocument(); | |
| for (QFuture< Base::Reference<Mesh::MeshObject> >::const_iterator it = future.begin(); it != future.end(); ++it) { | |
| Mesh::Feature* mesh = doc->addObject<Mesh::Feature>("Mesh"); | |
| mesh->Mesh.setValuePtr((Mesh::MeshObject*)(*it)); | |
| mesh->purgeTouched(); | |
| } | |
| } | |
| bool CmdSandboxMeshLoaderFuture::isActive(void) | |
| { | |
| return hasActiveDocument(); | |
| } | |
| namespace Mesh { | |
| typedef Base::Reference<const MeshObject> MeshObjectConstRef; | |
| typedef std::list<MeshObjectConstRef> MeshObjectConstRefList; | |
| typedef std::vector<MeshObjectConstRef> MeshObjectConstRefArray; | |
| } | |
| struct MeshObject_greater : public std::binary_function<const Mesh::MeshObjectConstRef&, | |
| const Mesh::MeshObjectConstRef&, bool> | |
| { | |
| bool operator()(const Mesh::MeshObjectConstRef& x, | |
| const Mesh::MeshObjectConstRef& y) const | |
| { | |
| return x->countFacets() > y->countFacets(); | |
| } | |
| }; | |
| class MeshTestJob | |
| { | |
| public: | |
| MeshTestJob() | |
| { | |
| } | |
| ~MeshTestJob() | |
| { | |
| } | |
| Mesh::MeshObject* run(const std::vector<Mesh::MeshObjectConstRef>& meshdata) | |
| { | |
| std::vector<Mesh::MeshObjectConstRef> meshes = meshdata; | |
| if (meshes.empty()) | |
| return 0; // nothing todo | |
| Mesh::MeshObjectConstRef myMesh = 0; | |
| std::sort(meshes.begin(), meshes.end(), MeshObject_greater()); | |
| myMesh = meshes.front(); | |
| if (meshes.size() > 1) { | |
| MeshCore::MeshKernel kernel; | |
| // copy the data of the first mesh, this will be the new model then | |
| kernel = myMesh->getKernel(); | |
| for (std::vector<Mesh::MeshObjectConstRef>::iterator it = meshes.begin(); it != meshes.end(); ++it) { | |
| if (*it != myMesh) { | |
| Base::Console().message("MeshTestJob::run() in thread: %p\n", QThread::currentThreadId()); | |
| } | |
| } | |
| // avoid to copy the data | |
| Mesh::MeshObject* mesh = new Mesh::MeshObject(); | |
| mesh->swap(kernel); | |
| return mesh; | |
| } | |
| else { | |
| Mesh::MeshObject* mesh = new Mesh::MeshObject(); | |
| mesh->setKernel(myMesh->getKernel()); | |
| return mesh; | |
| } | |
| } | |
| }; | |
| DEF_STD_CMD_A(CmdSandboxMeshTestJob) | |
| CmdSandboxMeshTestJob::CmdSandboxMeshTestJob() | |
| : Command("Sandbox_MeshTestJob") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Test Mesh Job"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_MeshTestJob"; | |
| sStatusTip = sToolTipText; | |
| sPixmap = "Std_Tool7"; | |
| } | |
| void CmdSandboxMeshTestJob::activated(int) | |
| { | |
| Mesh::MeshObjectConstRefList meshes; | |
| App::Document* app_doc = App::GetApplication().getActiveDocument(); | |
| std::vector<Mesh::Feature*> meshObj = Gui::Selection().getObjectsOfType<Mesh::Feature>(app_doc->getName()); | |
| for (std::vector<Mesh::Feature*>::iterator it = meshObj.begin(); it != meshObj.end(); ++it) { | |
| meshes.push_back((*it)->Mesh.getValuePtr()); | |
| } | |
| int iteration = 1; | |
| while (meshes.size() > 1) { | |
| int numJobs = QThread::idealThreadCount(); | |
| if (numJobs < 0) numJobs = 2; | |
| while (numJobs > (int)(meshes.size()+1)/2) | |
| numJobs /= 2; | |
| numJobs = std::max<int>(1, numJobs); | |
| // divide all meshes we have into several groups | |
| std::vector<Mesh::MeshObjectConstRefArray> mesh_groups; | |
| while (numJobs > 0) { | |
| int size = (int)meshes.size(); | |
| int count = size / numJobs; | |
| --numJobs; | |
| Mesh::MeshObjectConstRefArray meshes_per_job; | |
| for (int i=0; i<count; i++) { | |
| meshes_per_job.push_back(meshes.front()); | |
| meshes.pop_front(); | |
| } | |
| mesh_groups.push_back(meshes_per_job); | |
| } | |
| // run the actual multi-threaded mesh test | |
| Base::Console().message("Mesh test (step %d)…\n",iteration++); | |
| MeshTestJob meshJob; | |
| QFuture<Mesh::MeshObject*> mesh_future = QtConcurrent::mapped | |
| (mesh_groups, boost::bind(&MeshTestJob::run, &meshJob, bp::_1)); | |
| // keep it responsive during computation | |
| QFutureWatcher<Mesh::MeshObject*> mesh_watcher; | |
| mesh_watcher.setFuture(mesh_future); | |
| QEventLoop loop; | |
| QObject::connect(&mesh_watcher, SIGNAL(finished()), &loop, SLOT(quit())); | |
| loop.exec(); | |
| for (QFuture<Mesh::MeshObject*>::const_iterator it = mesh_future.begin(); it != mesh_future.end(); ++it) { | |
| meshes.push_back(Mesh::MeshObjectConstRef(*it)); | |
| } | |
| } | |
| if (meshes.empty()) { | |
| Base::Console().error("The mesh test failed to create a valid mesh.\n"); | |
| return; | |
| } | |
| } | |
| bool CmdSandboxMeshTestJob::isActive(void) | |
| { | |
| return hasActiveDocument(); | |
| } | |
| class MeshThread : public QThread | |
| { | |
| public: | |
| MeshThread(Base::Reference<Mesh::MeshObject> m, QObject* p=0) | |
| : QThread(p), mesh(m) | |
| {} | |
| protected: | |
| void run() | |
| { | |
| for (int i=0; i<100;i++) { | |
| Base::Reference<Mesh::MeshObject> new_ref; | |
| new_ref = mesh; | |
| } | |
| } | |
| private: | |
| Base::Reference<Mesh::MeshObject> mesh; | |
| }; | |
| DEF_STD_CMD_A(CmdSandboxMeshTestRef) | |
| CmdSandboxMeshTestRef::CmdSandboxMeshTestRef() | |
| : Command("Sandbox_MeshTestRef") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Test Mesh Reference"); | |
| sToolTipText = QT_TR_NOOP("Runs a sandbox test function"); | |
| sWhatsThis = "Sandbox_MeshTestRef"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdSandboxMeshTestRef::activated(int) | |
| { | |
| Gui::WaitCursor wc; | |
| std::vector< std::shared_ptr<QThread> > threads; | |
| Base::Reference<Mesh::MeshObject> mesh(new Mesh::MeshObject); | |
| int num = mesh.getRefCount(); | |
| for (int i=0; i<10; i++) { | |
| std::shared_ptr<QThread> trd(new MeshThread(mesh)); | |
| trd->start(); | |
| threads.push_back(trd); | |
| } | |
| QTimer timer; | |
| QEventLoop loop; | |
| QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); | |
| timer.start(2000); | |
| loop.exec(); | |
| threads.clear(); | |
| Mesh::MeshObject* ptr = (Mesh::MeshObject*)mesh; | |
| if (!ptr) | |
| Base::Console().error("Object deleted\n"); | |
| if (num != mesh.getRefCount()) | |
| Base::Console().error("Reference count is %d\n",mesh.getRefCount()); | |
| } | |
| bool CmdSandboxMeshTestRef::isActive(void) | |
| { | |
| return true; | |
| } | |
| //=========================================================================== | |
| // Std_GrabWidget | |
| //=========================================================================== | |
| DEF_STD_CMD_A(CmdTestGrabWidget) | |
| CmdTestGrabWidget::CmdTestGrabWidget() | |
| : Command("Std_GrabWidget") | |
| { | |
| sGroup = "Standard-Test"; | |
| sMenuText = "Grab Widget"; | |
| sToolTipText = "Grabs a widget"; | |
| sWhatsThis = "Std_GrabWidget"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdTestGrabWidget::activated(int) | |
| { | |
| QCalendarWidget* c = new QCalendarWidget(); | |
| c->hide(); | |
| QPixmap p = c->grab(c->rect()); | |
| QLabel* label = new QLabel(); | |
| label->resize(c->size()); | |
| label->setPixmap(p); | |
| label->show(); | |
| delete c; | |
| } | |
| bool CmdTestGrabWidget::isActive(void) | |
| { | |
| return true; | |
| } | |
| //=========================================================================== | |
| // Std_ImageNode | |
| //=========================================================================== | |
| DEF_3DV_CMD(CmdTestImageNode) | |
| class RenderArea : public QWidget | |
| { | |
| private: | |
| QPainterPath path; | |
| int penWidth; | |
| QColor penColor; | |
| public: | |
| RenderArea(const QPainterPath &path, QWidget *parent=0) | |
| : QWidget(parent), path(path), penColor(0,0,127) | |
| { | |
| penWidth = 2; | |
| setBackgroundRole(QPalette::Base); | |
| } | |
| QSize minimumSizeHint() const | |
| { | |
| return QSize(50, 50); | |
| } | |
| QSize sizeHint() const | |
| { | |
| return QSize(100, 30); | |
| } | |
| void setFillRule(Qt::FillRule rule) | |
| { | |
| path.setFillRule(rule); | |
| update(); | |
| } | |
| void setPenWidth(int width) | |
| { | |
| penWidth = width; | |
| update(); | |
| } | |
| void setPenColor(const QColor &color) | |
| { | |
| penColor = color; | |
| update(); | |
| } | |
| void paintEvent(QPaintEvent *) | |
| { | |
| QPainter painter(this); | |
| painter.setRenderHint(QPainter::Antialiasing); | |
| painter.scale(width() / 100.0, height() / 100.0); | |
| painter.translate(50.0, 50.0); | |
| painter.translate(-50.0, -50.0); | |
| painter.setPen(QPen(penColor, penWidth, Qt::SolidLine, Qt::RoundCap, | |
| Qt::RoundJoin)); | |
| painter.setBrush(QBrush(QColor(0,85,255), Qt::SolidPattern)); | |
| painter.drawPath(path); | |
| painter.setPen(Qt::white); | |
| painter.drawText(25, 40, 70, 20, Qt::AlignHCenter|Qt::AlignVCenter, | |
| QStringLiteral("Distance: 2.784mm")); | |
| } | |
| }; | |
| class GDIWidget : public QWidget | |
| { | |
| public: | |
| GDIWidget(QWidget* parent) : QWidget(parent) | |
| { | |
| setAttribute(Qt::WA_PaintOnScreen); | |
| setAttribute(Qt::WA_NativeWindow); | |
| } | |
| QPaintEngine *paintEngine() const { | |
| return 0; | |
| } | |
| protected: | |
| void paintEvent(QPaintEvent *event) { | |
| HWND hWnd = (HWND)this->winId(); | |
| HDC hdc = GetDC(hWnd); | |
| SelectObject(hdc, GetSysColorBrush(COLOR_WINDOW)); | |
| Rectangle(hdc, 0, 0, width(), height()); | |
| RECT rect = {0, 0, width(), height() }; | |
| DrawTextA(hdc, "Hello World!", 12, &rect, | |
| DT_SINGLELINE | DT_VCENTER | DT_CENTER); | |
| ReleaseDC(hWnd, hdc); | |
| } | |
| }; | |
| CmdTestImageNode::CmdTestImageNode() | |
| : Command("Std_ImageNode") | |
| { | |
| sGroup = "Standard-Test"; | |
| sMenuText = "SoImage Node"; | |
| sToolTipText = "SoImage node"; | |
| sWhatsThis = "Std_ImageNode"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdTestImageNode::activated(int) | |
| { | |
| QString text = QStringLiteral("Distance: 2.7jgiorjgor84mm"); | |
| QFont font; | |
| QFontMetrics fm(font); | |
| int w = Gui::QtTools::horizontalAdvance(fm, text); | |
| int h = fm.height(); | |
| QPainterPath roundRectPath; | |
| roundRectPath.moveTo(100.0, 5.0); | |
| roundRectPath.arcTo(90.0, 0.0, 10.0, 10.0, 0.0, 90.0); | |
| roundRectPath.lineTo(5.0, 0.0); | |
| roundRectPath.arcTo(0.0, 0.0, 10.0, 10.0, 90.0, 90.0); | |
| roundRectPath.lineTo(0.0, 95.0); | |
| roundRectPath.arcTo(0.0, 90.0, 10.0, 10.0, 180.0, 90.0); | |
| roundRectPath.lineTo(95.0, 100.0); | |
| roundRectPath.arcTo(90.0, 90.0, 10.0, 10.0, 270.0, 90.0); | |
| roundRectPath.closeSubpath(); | |
| Gui::MDIView* view = Gui::getMainWindow()->activeWindow(); | |
| Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer(); | |
| SoImage* node = new SoImage(); | |
| QImage image(w+10,h+10,QImage::Format_ARGB32_Premultiplied);// = p.toImage(); | |
| image.fill(0x00000000); | |
| QPainter painter(&image); | |
| painter.setRenderHint(QPainter::Antialiasing); | |
| painter.setPen(QPen(QColor(0,0,127), 2, Qt::SolidLine, Qt::RoundCap, | |
| Qt::RoundJoin)); | |
| painter.setBrush(QBrush(QColor(0,85,255), Qt::SolidPattern)); | |
| QRectF rectangle(0.0, 0.0, w+10, h+10); | |
| painter.drawRoundedRect(rectangle, 5, 5); | |
| painter.setPen(QColor(255,255,255)); | |
| painter.drawText(5,h+3, text); | |
| painter.end(); | |
| SoSFImage texture; | |
| Gui::BitmapFactory().convert(image, texture); | |
| node->image = texture; | |
| SoAnnotation* anno = new SoAnnotation(); | |
| anno->addChild(node); | |
| static_cast<SoGroup*>(viewer->getSceneGraph())->addChild(anno); | |
| } | |
| //=========================================================================== | |
| // Sandbox_GDIWidget | |
| //=========================================================================== | |
| DEF_STD_CMD(CmdTestGDIWidget) | |
| CmdTestGDIWidget::CmdTestGDIWidget() | |
| : Command("Sandbox_GDIWidget") | |
| { | |
| sGroup = "Standard-Test"; | |
| sMenuText = "GDI Widget"; | |
| sToolTipText = "GDI widget"; | |
| sWhatsThis = "Sandbox_GDIWidget"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdTestGDIWidget::activated(int) | |
| { | |
| GDIWidget* gdi = new GDIWidget(Gui::getMainWindow()); | |
| gdi->show(); | |
| gdi->resize(200,200); | |
| gdi->move(400,400); | |
| gdi->setAttribute(Qt::WA_DeleteOnClose); | |
| } | |
| //=========================================================================== | |
| // Sandbox_RedirectPaint | |
| //=========================================================================== | |
| DEF_STD_CMD(CmdTestRedirectPaint) | |
| CmdTestRedirectPaint::CmdTestRedirectPaint() | |
| : Command("Sandbox_RedirectPaint") | |
| { | |
| sGroup = "Standard-Test"; | |
| sMenuText = "Redirect Paint"; | |
| sToolTipText = "Redirect paint"; | |
| sWhatsThis = "Sandbox_RedirectPaint"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdTestRedirectPaint::activated(int) | |
| { | |
| QCalendarWidget* cal = new QCalendarWidget(); | |
| cal->setWindowTitle(QStringLiteral("QCalendarWidget")); | |
| cal->show(); | |
| QPixmap img(cal->size()); | |
| cal->render(&img); | |
| QLabel* label = new QLabel(); | |
| label->setPixmap(img); | |
| label->show(); | |
| label->setWindowTitle(QStringLiteral("QLabel")); | |
| } | |
| //=========================================================================== | |
| // Sandbox_CryptographicHash | |
| //=========================================================================== | |
| DEF_STD_CMD(CmdTestCryptographicHash) | |
| CmdTestCryptographicHash::CmdTestCryptographicHash() | |
| : Command("Sandbox_CryptographicHash") | |
| { | |
| sGroup = "Standard-Test"; | |
| sMenuText = "Cryptographic Hash"; | |
| sToolTipText = "Cryptographic hash"; | |
| sWhatsThis = "Sandbox_CryptographicHash"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdTestCryptographicHash::activated(int) | |
| { | |
| QByteArray data = "FreeCAD"; | |
| QByteArray hash = QCryptographicHash::hash(data, QCryptographicHash::Md5); | |
| QMessageBox::information(0,QLatin1String("Hash of: FreeCAD"),QString::fromLatin1(hash)); | |
| } | |
| //=========================================================================== | |
| // Sandbox_WidgetShape | |
| //=========================================================================== | |
| DEF_3DV_CMD(CmdTestWidgetShape) | |
| CmdTestWidgetShape::CmdTestWidgetShape() | |
| : Command("Sandbox_WidgetShape") | |
| { | |
| sGroup = "Standard-Test"; | |
| sMenuText = "Widget Shape"; | |
| sToolTipText = "Widget shape"; | |
| sWhatsThis = "Sandbox_WidgetShape"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdTestWidgetShape::activated(int) | |
| { | |
| SandboxGui::SoWidgetShape* shape = new SandboxGui::SoWidgetShape; | |
| shape->setWidget(new QCalendarWidget()); | |
| Gui::MDIView* view = Gui::getMainWindow()->activeWindow(); | |
| Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer(); | |
| static_cast<SoGroup*>(viewer->getSceneGraph())->addChild(shape); | |
| } | |
| // ------------------------------------------------------------------------------- | |
| DEF_STD_CMD(CmdMengerSponge) | |
| CmdMengerSponge::CmdMengerSponge() | |
| :Command("Sandbox_MengerSponge") | |
| { | |
| sAppModule = "Sandbox"; | |
| sGroup = QT_TR_NOOP("Sandbox"); | |
| sMenuText = QT_TR_NOOP("Menger Sponge"); | |
| sToolTipText = QT_TR_NOOP("Menger sponge"); | |
| sWhatsThis = "Sandbox_MengerSponge"; | |
| sStatusTip = sToolTipText; | |
| } | |
| struct Param { | |
| int level; | |
| float x,y,z; | |
| Param(int l, float x, float y, float z) | |
| : level(l), x(x), y(y), z(z) | |
| { | |
| } | |
| }; | |
| typedef Base::Reference<Mesh::MeshObject> MeshObjectRef; | |
| MeshObjectRef globalBox; | |
| // Create a Box and Place it a coords (x,y,z) | |
| MeshObjectRef PlaceBox(float x, float y, float z) | |
| { | |
| MeshObjectRef mesh = new Mesh::MeshObject(*globalBox); | |
| Base::Matrix4D m; | |
| m.move(x,y,z); | |
| mesh->getKernel().Transform(m); | |
| return mesh; | |
| } | |
| MeshObjectRef Sierpinski(int level, float x0, float y0, float z0) | |
| { | |
| float boxnums = std::pow(3.0f,level); | |
| float thirds = boxnums / 3; | |
| float twothirds = thirds * 2; | |
| QList<float> rangerx, rangery, rangerz; | |
| if (level == 0) { | |
| rangerx << x0; | |
| rangery << y0; | |
| rangerz << z0; | |
| } | |
| else { | |
| rangerx << x0 << (x0 + thirds) << (x0 + twothirds); | |
| rangery << y0 << (y0 + thirds) << (y0 + twothirds); | |
| rangerz << z0 << (z0 + thirds) << (z0 + twothirds); | |
| } | |
| int block = 1; | |
| QList<int> skip; skip << 5 << 11 << 13 << 14 << 15 << 17 << 23; | |
| MeshObjectRef mesh = new Mesh::MeshObject(); | |
| for (QList<float>::iterator i = rangerx.begin(); i != rangerx.end(); ++i) { | |
| for (QList<float>::iterator j = rangery.begin(); j != rangery.end(); ++j) { | |
| for (QList<float>::iterator k = rangerz.begin(); k != rangerz.end(); ++k) { | |
| if (!skip.contains(block)) { | |
| if (level > 0) | |
| mesh->addMesh(*Sierpinski(level-1,*i,*j,*k)); | |
| else | |
| mesh->addMesh(*PlaceBox(*i,*j,*k)); | |
| } | |
| block++; | |
| } | |
| } | |
| } | |
| return mesh; | |
| } | |
| MeshObjectRef runSierpinski(const Param& p) | |
| { | |
| return Sierpinski(p.level,p.x,p.y,p.z); | |
| } | |
| MeshObjectRef makeParallelMengerSponge(int level, float x0, float y0, float z0) | |
| { | |
| float boxnums = std::pow(3.0f,level); | |
| float thirds = boxnums / 3; | |
| float twothirds = thirds * 2; | |
| QList<float> rangerx, rangery, rangerz; | |
| rangerx << x0 << (x0 + thirds) << (x0 + twothirds); | |
| rangery << y0 << (y0 + thirds) << (y0 + twothirds); | |
| rangerz << z0 << (z0 + thirds) << (z0 + twothirds); | |
| int block = 1; | |
| QList<int> skip; skip << 5 << 11 << 13 << 14 << 15 << 17 << 23; | |
| // collect the arguments for the algorithm in a list | |
| QList<Param> args; | |
| for (QList<float>::iterator i = rangerx.begin(); i != rangerx.end(); ++i) { | |
| for (QList<float>::iterator j = rangery.begin(); j != rangery.end(); ++j) { | |
| for (QList<float>::iterator k = rangerz.begin(); k != rangerz.end(); ++k) { | |
| if (!skip.contains(block)) { | |
| args << Param(level-1, *i, *j, *k); | |
| } | |
| block++; | |
| } | |
| } | |
| } | |
| QFuture<MeshObjectRef> future = QtConcurrent::mapped(args, runSierpinski); | |
| QFutureWatcher<MeshObjectRef> watcher; | |
| watcher.setFuture(future); | |
| // keep it responsive during computation | |
| QEventLoop loop; | |
| QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); | |
| loop.exec(); | |
| MeshObjectRef mesh = new Mesh::MeshObject(); | |
| for (QFuture<MeshObjectRef>::const_iterator it = future.begin(); it != future.end(); ++it) { | |
| mesh->addMesh(**it); | |
| (*it)->clear(); | |
| } | |
| return mesh; | |
| } | |
| void CmdMengerSponge::activated(int) | |
| { | |
| bool ok; | |
| int level = QInputDialog::getInt(Gui::getMainWindow(), | |
| QStringLiteral("Menger sponge"), | |
| QStringLiteral("Recursion depth:"), | |
| 3, 1, 5, 1, &ok); | |
| if (!ok) | |
| return; | |
| int ret = QMessageBox::question(Gui::getMainWindow(), | |
| QStringLiteral("Parallel"), | |
| QStringLiteral("Run this in a thread pool?"), | |
| QMessageBox::Yes|QMessageBox::No); | |
| bool parallel=(ret == QMessageBox::Yes); | |
| float x0=0,y0=0,z0=0; | |
| globalBox = Mesh::MeshObject::createCube(1,1,1); | |
| MeshObjectRef mesh; | |
| if (parallel) | |
| mesh = makeParallelMengerSponge(level,x0,y0,z0); | |
| else | |
| mesh = Sierpinski(level,x0,y0,z0); | |
| MeshCore::MeshKernel& kernel = mesh->getKernel(); | |
| // remove duplicated points | |
| MeshCore::MeshFixDuplicatePoints(kernel).Fixup(); | |
| // remove internal facets | |
| MeshCore::MeshEvalInternalFacets eval(kernel); | |
| eval.Evaluate(); | |
| kernel.DeleteFacets(eval.GetIndices()); | |
| // repair neighbourhood | |
| kernel.RebuildNeighbours(); | |
| App::Document* doc = App::GetApplication().newDocument(); | |
| Mesh::Feature* feature = doc->addObject<Mesh::Feature>("MengerSponge"); | |
| feature->Mesh.setValue(*mesh); | |
| feature->purgeTouched(); | |
| } | |
| DEF_STD_CMD_A(CmdTestGraphicsView) | |
| CmdTestGraphicsView::CmdTestGraphicsView() | |
| : Command("Std_TestGraphicsView") | |
| { | |
| sGroup = QT_TR_NOOP("Standard-Test"); | |
| sMenuText = QT_TR_NOOP("New Graphics View"); | |
| sToolTipText= QT_TR_NOOP("Creates a new view window for the active document"); | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdTestGraphicsView::activated(int) | |
| { | |
| Gui::GraphicsView3D* view3D = new Gui::GraphicsView3D(getActiveGuiDocument(), Gui::getMainWindow()); | |
| view3D->setWindowTitle(QStringLiteral("Graphics scene")); | |
| view3D->setWindowIcon(QApplication::windowIcon()); | |
| view3D->resize(400, 300); | |
| Gui::getMainWindow()->addWindow(view3D); | |
| } | |
| bool CmdTestGraphicsView::isActive(void) | |
| { | |
| return (getActiveGuiDocument()!=NULL); | |
| } | |
| //=========================================================================== | |
| // Std_TestTaskBox | |
| //=========================================================================== | |
| DEF_STD_CMD(CmdTestTaskBox) | |
| CmdTestTaskBox::CmdTestTaskBox() | |
| : Command("Std_TestTaskBox") | |
| { | |
| sGroup = "Standard-Test"; | |
| sMenuText = "Task Box"; | |
| sToolTipText = "Task box"; | |
| sWhatsThis = "Std_TestTaskBox"; | |
| sStatusTip = sToolTipText; | |
| } | |
| void CmdTestTaskBox::activated(int) | |
| { | |
| QWidget* w = new SandboxGui::TaskPanelView(); | |
| w->setAttribute(Qt::WA_DeleteOnClose); | |
| w->show(); | |
| } | |
| void CreateSandboxCommands() | |
| { | |
| Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager(); | |
| rcCmdMgr.addCommand(new CmdSandboxDocumentThread()); | |
| rcCmdMgr.addCommand(new CmdSandboxDocumentTestThread()); | |
| rcCmdMgr.addCommand(new CmdSandboxDocumentSaveThread()); | |
| rcCmdMgr.addCommand(new CmdSandboxDocThreadWithSeq()); | |
| rcCmdMgr.addCommand(new CmdSandboxDocThreadBusy()); | |
| rcCmdMgr.addCommand(new CmdSandboxDocumentNoThread()); | |
| rcCmdMgr.addCommand(new CmdSandboxWorkerThread()); | |
| rcCmdMgr.addCommand(new CmdSandboxPythonLockThread()); | |
| rcCmdMgr.addCommand(new CmdSandboxPythonNolockThread()); | |
| rcCmdMgr.addCommand(new CmdSandboxPySideThread()); | |
| rcCmdMgr.addCommand(new CmdSandboxPythonThread()); | |
| rcCmdMgr.addCommand(new CmdSandboxPythonMainThread()); | |
| rcCmdMgr.addCommand(new CmdSandboxDocThreadWithDialog()); | |
| rcCmdMgr.addCommand(new CmdSandboxDocThreadWithFileDlg()); | |
| rcCmdMgr.addCommand(new CmdSandboxEventLoop); | |
| rcCmdMgr.addCommand(new CmdSandboxMeshLoader); | |
| rcCmdMgr.addCommand(new CmdSandboxMeshLoaderBoost); | |
| rcCmdMgr.addCommand(new CmdSandboxMeshLoaderFuture); | |
| rcCmdMgr.addCommand(new CmdSandboxMeshTestJob); | |
| rcCmdMgr.addCommand(new CmdSandboxMeshTestRef); | |
| rcCmdMgr.addCommand(new CmdTestGrabWidget()); | |
| rcCmdMgr.addCommand(new CmdTestImageNode()); | |
| rcCmdMgr.addCommand(new CmdTestWidgetShape()); | |
| rcCmdMgr.addCommand(new CmdTestGDIWidget()); | |
| rcCmdMgr.addCommand(new CmdTestRedirectPaint()); | |
| rcCmdMgr.addCommand(new CmdTestCryptographicHash()); | |
| rcCmdMgr.addCommand(new CmdMengerSponge()); | |
| rcCmdMgr.addCommand(new CmdTestGraphicsView()); | |
| rcCmdMgr.addCommand(new CmdTestTaskBox()); | |
| } | |