/*************************************************************************** * * * 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 # include # include # include # include # include #endif #include #if defined(FC_OS_WIN32) #include #endif #include #include #include #include #include #include #include #include #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 qtformats = QImageReader::supportedImageFormats(); for (QList::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 qtformats = QImageReader::supportedImageFormats(); for (QList::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(width+0.5); double yPixelsPerM = impQ.dotsPerMeterY(); double height = impQ.height(); height = height * 1000 / yPixelsPerM; int nHeight = static_cast(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 }