PARP Research Group University of Murcia, Spain


src/qvgui/qvdesigner/facade/itemfactory.cpp

00001 /*
00002  *      Copyright (C) 2008. PARP Research Group.
00003  *      <http://perception.inf.um.es>
00004  *      University of Murcia, Spain.
00005  *
00006  *      This file is part of the QVision library.
00007  *
00008  *      QVision is free software: you can redistribute it and/or modify
00009  *      it under the terms of the GNU Lesser General Public License as
00010  *      published by the Free Software Foundation, version 3 of the License.
00011  *
00012  *      QVision is distributed in the hope that it will be useful,
00013  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  *      GNU Lesser General Public License for more details.
00016  *
00017  *      You should have received a copy of the GNU Lesser General Public
00018  *      License along with QVision. If not, see <http://www.gnu.org/licenses/>.
00019  */
00020 
00021 
00022 #include "itemfactory.h"
00023 
00024 #include <QVApplication>
00025 #include <QVMPlayerCamera>
00026 #include <QVWorker>
00027 #include "qvworkers/qvfilterselectorworker.h"
00028 #include "qvworkers/qvimageretarderworker.h"
00029 #include "qvworkers/qvimagemeansworker.h"
00030 #include "qvworkers/qvgraphsworker.h"
00031 #include "qvworkers/qvpointworker.h"
00032 #include <QVImageCanvas>
00033 #include <QVNumericPlot>
00034 #include <QVHistogramPlot>
00035 #include <QVCPUPlot>
00036 #include <QVYUV4MPEG2Recorder>
00037 #include <QVYUV4MPEG2CameraWorker>
00038 #include <QVSynchronizerWorker>
00039 
00041 ItemFactory::ItemFactory(): QObject()
00042 {
00043         inputItems.append("QVMPlayerCamera");
00044         inputItems.append("QVPointWorker");
00045 
00046         outputItems.append("QVImageCanvas");
00047         outputItems.append("QVNumericPlot");
00048         outputItems.append("QVHistogramPlot");
00049         outputItems.append("QVCPUPlot");
00050         middleItems.append("QVGraphsWorker");
00051         middleItems.append("QVFilterSelectorWorker<uchar,1>");
00052         middleItems.append("QVFilterSelectorWorker<uchar,3>");
00053         middleItems.append("QVImageRetarderWorker<uchar,3>");
00054         middleItems.append("QVImageRetarderWorker<uchar,1>");
00055         middleItems.append("QVImageMeans<uChar,1>");
00056         middleItems.append("QVImageMeans<uChar,3>");
00057         outputItems.append("QVYUV4MPEG2Recorder");
00058         outputItems.append("QVYUV4MPEG2Camera");
00059         outputItems.append("QVSynchronizer");
00060         // Añadimos los tipos de las IPP.
00061         foreach(QString qvippWorkerName, getQVIPPWorkersNames())
00062                 middleItems.append(qvippWorkerName);
00063 
00064         // Añadimos los tipos creados por el usuario.
00065 /*      foreach(QVPropertyContainer* qvp, qvApp->getQVPropertyContainers()) {
00066                 QVWorker* worker;
00067                 if((worker = dynamic_cast<QVWorker*>(qvp)) != NULL)
00068                         middleItems.append(worker.getName());
00069                 }*/
00070 }
00071 
00072 QList<QString> ItemFactory::getItemTypes() const
00073 {
00074         return inputItems + middleItems + outputItems;
00075 }
00076 
00077 QList<QString> ItemFactory::getInputItemTypes() const
00078 {
00079         return inputItems;
00080 }
00081 
00082 QList<QString> ItemFactory::getMiddleItemTypes() const
00083 {
00084         return middleItems;
00085 }
00086 
00087 QList<QString> ItemFactory::getOutputItemTypes() const
00088 {
00089         return outputItems;
00090 }
00091 
00092 QVPropertyContainer *ItemFactory::createContainer(QString type, QString name) const
00093 {
00094         QVPropertyContainer *qvippWorker = newQVIPPWorker(type, name);
00095         if (qvippWorker != NULL)
00096                 return qvippWorker;
00097         else if (type == "QVMPlayerCamera") {
00098                 QVMPlayerCamera* mpc = new QVMPlayerCamera(name);
00099                 if (mpc->getPropertyValue<QString>("URL").isEmpty())
00100                         mpc->setPropertyValue("URL", QString("http://perception.inf.um.es/public_data/videos/misc/penguin.dv"));
00101                 return mpc;
00102         }
00103         else if (type == "QVYUV4MPEG2Camera") return new QVYUV4MPEG2CameraWorker(name);
00104         else if (type == "QVYUV4MPEG2Recorder") return new QVYUV4MPEG2Recorder(name);
00105         else if (type == "QVImageCanvas") return new QVImageCanvas(name);
00106         else if (type == "QVNumericPlot") return new QVNumericPlot(name);
00107         else if (type == "QVHistogramPlot") return new QVHistogramPlot(name);
00108         else if (type == "QVCPUPlot") return new QVCPUPlot(name);
00109         else if (type == "QVGraphsWorker") return new QVGraphsWorker(name);
00110         else if (type == "QVFilterSelectorWorker<uchar,1>") return new QVFilterSelectorWorker<uchar, 1>(name);
00111         else if (type == "QVFilterSelectorWorker<uchar,3>") return new QVFilterSelectorWorker<uchar, 3>(name);
00112         else if (type == "QVImageRetarderWorker<uchar,3>") return new QVImageRetarderWorker<uchar, 3>(name);
00113         else if (type == "QVImageRetarderWorker<uchar,1>") return new QVImageRetarderWorker<uchar, 1>(name);
00114         else if (type == "QVImageMeans<uChar,1>") return new QVImageMeans<uChar, 1>(name);
00115         else if (type == "QVImageMeans<uChar,3>") return new QVImageMeans<uChar, 3>(name);
00116         else if (type == "QVPointWorker") return new QVPointWorker(name);
00117         else if (type == "QVSynchronizer") return new QVSynchronizer(name);
00118         else if (userWorkers.contains(type)) {
00119                 QVWorker * newWorker = (QVWorker *)QMetaType::construct(userWorkers.value(type), (void *)0);
00120                 newWorker->setName(name);
00121                 return newWorker;
00122         }
00123         return 0;
00124 }
00125 
00126 bool ItemFactory::deleteContainer(QVPropertyContainer *cont) const
00127 {
00128         // obtiene el nombre y el valor del tipo de la subclase concreta
00129         QString type = typeName(cont);
00130 
00131 /*      // lo destruye dependiendo de como se ha creado
00132         if (isUserType(type))
00133                 QMetaType::destroy(userWorkers.value(type), (void *)cont);
00134         else
00135                 delete cont;*/
00136 
00137         delete cont;
00138 
00139         return TRUE;
00140 }
00141 
00142 QString ItemFactory::containerType(QVPropertyContainer *cont) const
00143 {
00144         // obtiene el nombre y el valor del tipo de la subclase concreta
00145         return QString(typeName(cont));
00146 }
00147 
00148 const QString ItemFactory::registerUserWorker(QVWorker * worker)
00149 {
00150         const char * choptypeidname = typeName(worker);
00151 
00152         // obtiene el nombre y el valor del tipo de la subclase concreta
00153         QString typeString(choptypeidname);
00154         int type = QMetaType::type(choptypeidname);
00155 
00156         // almacena el subtipo concreto del objeto, si no existía ya y si estaba registrado en el sistema con qRegisterMetaType<Type>("Type")
00157         if ( (type != 0) && (!middleItems.contains(typeString)) ) {
00158                 middleItems.append(typeString);
00159                 userWorkers.insert(typeString, type);
00160                 return typeString;
00161         }
00162         return QString();
00163 }
00164 
00165 bool ItemFactory::isUserType(QString type) const
00166 {
00167         return userWorkers.contains(type);
00168 }
00169 
00170 const char *ItemFactory::typeName(QVPropertyContainer *cont) const
00171 {
00172         char *qvippWorkerName = QVIPPWorkerName(cont);
00173         if (qvippWorkerName != NULL)
00174                 return qvippWorkerName;
00175 
00176         if(dynamic_cast<QVYUV4MPEG2CameraWorker*>(cont) != NULL) return "QVYUV4MPEG2Camera";
00177         else if(dynamic_cast<QVYUV4MPEG2Recorder*>(cont) != NULL) return "QVYUV4MPEG2Recorder";
00178         else if(dynamic_cast<QVImageCanvas*>(cont) != NULL) return "QVImageCanvas";
00179         else if(dynamic_cast<QVNumericPlot*>(cont) != NULL) return "QVNumericPlot";
00180         else if(dynamic_cast<QVHistogramPlot*>(cont) != NULL) return "QVHistogramPlot";
00181         else if(dynamic_cast<QVCPUPlot*>(cont) != NULL) return "QVCPUPlot";
00182         else if(dynamic_cast<QVGraphsWorker*>(cont) != NULL) return "QVGraphsWorker";
00183         else if(dynamic_cast<QVFilterSelectorWorker<uchar,1>*>(cont) != NULL) return "QVFilterSelectorWorker<uchar,1>";
00184         else if(dynamic_cast<QVFilterSelectorWorker<uchar,3>*>(cont) != NULL) return "QVFilterSelectorWorker<uchar,3>";
00185         else if(dynamic_cast<QVImageRetarderWorker<uchar,3>*>(cont) != NULL) return "QVImageRetarderWorker<uchar,3>";
00186         else if(dynamic_cast<QVImageRetarderWorker<uchar,1>*>(cont) != NULL) return "QVImageRetarderWorker<uchar,1>";
00187         else if(dynamic_cast<QVImageMeans<uChar,1>*>(cont) != NULL) return "QVImageMeans<uChar,1>";
00188         else if(dynamic_cast<QVImageMeans<uChar,3>*>(cont) != NULL) return "QVImageMeans<uChar,3>";
00189         else if(dynamic_cast<QVPointWorker*>(cont) != NULL) return "QVPointWorker";
00190         else if(dynamic_cast<QVSynchronizer*>(cont) != NULL) return "QVSynchronizer";
00191 
00192         // obtiene el tipo real del objeto (la sunclase concreta de worker) en un formato char * de longitud+nombre (ejemplo: 8MyWorker)
00193         const char * typeidname = typeid(*cont).name();
00194 
00195         // se salta la pirmera parte de la cadena, la que contiene el número de caracteres del tipo
00196         int i = 0;
00197         while ( (typeidname[i] != '\0') && ((typeidname[i] == '0') || (typeidname[i] == '1') || (typeidname[i] == '2') || (typeidname[i] == '3') ||
00198                 (typeidname[i] == '4') || (typeidname[i] == '5') || (typeidname[i] == '6') || (typeidname[i] == '7') || (typeidname[i] == '8') ||
00199                 (typeidname[i] == '9')) ) {
00200                 i++;
00201         }
00202         return (typeidname + i*(sizeof(char)));
00203 }
00204 
00205 



QVision framework. PARP research group, copyright 2007, 2008.