Files
create/src/Mod/Image/Gui/Command.cpp

245 lines
8.3 KiB
C++

/***************************************************************************
* *
* This program 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. *
* for detail see the LICENCE text file. *
* Jürgen Riegel 2002 *
* *
***************************************************************************/
#include "PreCompiled.h"
#ifndef _PreComp_
# include <QAction>
# include <QFileDialog>
# include <QImage>
# include <QImageReader>
# include <QMessageBox>
# include <QTextStream>
#endif
#include <time.h>
#if defined(FC_OS_WIN32)
#include <sys/timeb.h>
#endif
#include <Base/Exception.h>
#include <Base/Tools.h>
#include <Base/Interpreter.h>
#include <App/Document.h>
#include <Gui/Application.h>
#include <Gui/MainWindow.h>
#include <Gui/Command.h>
#include <Gui/BitmapFactory.h>
#include "ImageOrientationDialog.h"
#if HAVE_OPENCV2
# include "opencv2/opencv.hpp"
#endif
#include "ImageView.h"
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
using namespace ImageGui;
DEF_STD_CMD(CmdImageOpen)
CmdImageOpen::CmdImageOpen()
: Command("Image_Open")
{
sAppModule = "Image";
sGroup = QT_TR_NOOP("Image");
sMenuText = QT_TR_NOOP("Open...");
sToolTipText = QT_TR_NOOP("Open image view");
sWhatsThis = "Image_Open";
sStatusTip = sToolTipText;
sPixmap = "Image_Open";
}
void CmdImageOpen::activated(int iMsg)
{
Q_UNUSED(iMsg);
// add all supported QImage formats
QString formats;
QTextStream str(&formats);
str << QObject::tr("Images") << " (";
QList<QByteArray> qtformats = QImageReader::supportedImageFormats();
for (QList<QByteArray>::Iterator it = qtformats.begin(); it != qtformats.end(); ++it) {
str << "*." << it->toLower() << " ";
}
str << ");;" << QObject::tr("All files") << " (*.*)";
// Reading an image
QString s = QFileDialog::getOpenFileName(Gui::getMainWindow(), QObject::tr("Choose an image file to open"),
QString(), formats);
if (!s.isEmpty()) {
try {
s = Base::Tools::escapeEncodeFilename(s);
// load the file with the module
Command::doCommand(Command::Gui, "import Image, ImageGui");
#if PY_MAJOR_VERSION < 3
Command::doCommand(Command::Gui, "ImageGui.open(unicode(\"%s\",\"utf-8\"))", (const char*)s.toUtf8());
#else
Command::doCommand(Command::Gui, "ImageGui.open(\"%s\",\"utf-8\")", (const char*)s.toUtf8());
#endif
}
catch (const Base::PyException& e){
// Usually thrown if the file is invalid somehow
e.ReportException();
}
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DEF_STD_CMD_A(CmdCreateImagePlane)
CmdCreateImagePlane::CmdCreateImagePlane()
:Command("Image_CreateImagePlane")
{
sAppModule = "Image";
sGroup = QT_TR_NOOP("Image");
sMenuText = QT_TR_NOOP("Create image plane...");
sToolTipText = QT_TR_NOOP("Create a planar image in the 3D space");
sWhatsThis = "Image_CreateImagePlane";
sStatusTip = sToolTipText;
sPixmap = "Image_CreateImagePlane";
}
void CmdCreateImagePlane::activated(int iMsg)
{
Q_UNUSED(iMsg);
QString formats;
QTextStream str(&formats);
str << QObject::tr("Images") << " (";
QList<QByteArray> qtformats = QImageReader::supportedImageFormats();
for (QList<QByteArray>::Iterator it = qtformats.begin(); it != qtformats.end(); ++it) {
str << "*." << it->toLower() << " ";
}
str << ");;" << QObject::tr("All files") << " (*.*)";
// Reading an image
QString s = QFileDialog::getOpenFileName(Gui::getMainWindow(), QObject::tr("Choose an image file to open"),
QString(), formats);
if (!s.isEmpty()) {
QImage impQ(s);
if (impQ.isNull()) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Error opening image"),
QObject::tr("Could not load the chosen image"));
return;
}
// ask user for orientation
ImageOrientationDialog Dlg;
if (Dlg.exec() != QDialog::Accepted)
return; // canceled
Base::Vector3d p = Dlg.Pos.getPosition();
Base::Rotation r = Dlg.Pos.getRotation();
std::string FeatName = getUniqueObjectName("ImagePlane");
double xPixelsPerM = impQ.dotsPerMeterX();
double width = impQ.width();
width = width * 1000 / xPixelsPerM;
int nWidth = static_cast<int>(width+0.5);
double yPixelsPerM = impQ.dotsPerMeterY();
double height = impQ.height();
height = height * 1000 / yPixelsPerM;
int nHeight = static_cast<int>(height+0.5);
QString pyfile = Base::Tools::escapeEncodeFilename(s);
openCommand("Create ImagePlane");
doCommand(Doc,"App.activeDocument().addObject('Image::ImagePlane','%s\')",FeatName.c_str());
doCommand(Doc,"App.activeDocument().%s.ImageFile = '%s'",FeatName.c_str(),(const char*)pyfile.toUtf8());
doCommand(Doc,"App.activeDocument().%s.XSize = %d",FeatName.c_str(),nWidth);
doCommand(Doc,"App.activeDocument().%s.YSize = %d",FeatName.c_str(),nHeight);
doCommand(Doc,"App.activeDocument().%s.Placement = App.Placement(App.Vector(%f,%f,%f),App.Rotation(%f,%f,%f,%f))"
,FeatName.c_str(),p.x,p.y,p.z,r[0],r[1],r[2],r[3]);
doCommand(Doc,"Gui.SendMsgToActiveView('ViewFit')");
commitCommand();
}
}
bool CmdCreateImagePlane::isActive()
{
return App::GetApplication().getActiveDocument();
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DEF_STD_CMD(CmdImageScaling)
CmdImageScaling::CmdImageScaling()
: Command("Image_Scaling")
{
sAppModule = "Image";
sGroup = QT_TR_NOOP("Image");
sMenuText = QT_TR_NOOP("Scale...");
sToolTipText = QT_TR_NOOP("Image Scaling");
sWhatsThis = "Image_Scaling";
sStatusTip = sToolTipText;
sPixmap = "Image_Scaling";
}
void CmdImageScaling::activated(int iMsg)
{
Q_UNUSED(iMsg);
// To Be Defined
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#if HAVE_OPENCV2
DEF_STD_CMD(CmdImageCapturerTest);
CmdImageCapturerTest::CmdImageCapturerTest()
: Command("Image_CapturerTest")
{
sAppModule = "Image";
sGroup = ("Image");
sMenuText = ("CapturerTest");
sToolTipText = ("test camara capturing");
sWhatsThis = "Image_CapturerTest";
sStatusTip = sToolTipText;
sPixmap = "camera-photo";
}
void CmdImageCapturerTest::activated(int iMsg)
{
using namespace cv;
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return;
Mat edges;
namedWindow("edges",1);
for(;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
imshow("edges", edges);
if(waitKey(30) >= 0) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
}
#endif
void CreateImageCommands(void)
{
Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager();
rcCmdMgr.addCommand(new CmdImageOpen());
rcCmdMgr.addCommand(new CmdCreateImagePlane());
#if HAVE_OPENCV2
rcCmdMgr.addCommand(new CmdImageCapturerTest());
#endif
}