IIlwisObject OperationHelperRaster::initialize(const IIlwisObject &inputObject, IlwisTypes tp, quint64 what) { Resource resource(tp); if (inputObject->ilwisType() & itCOVERAGE) { ICoverage cov = inputObject.as<Coverage>(); if (inputObject->ilwisType() == itRASTER) { IRasterCoverage gcInput = inputObject.as<RasterCoverage>(); if ( what & itRASTERSIZE) { Size<> sz = gcInput->size(); BoundingBox box(sz); resource.addProperty("size", IVARIANT(box.size())); } if ( what & itGEOREF) { resource.addProperty("georeference", IVARIANT(gcInput->georeference())); } if ( what & itDOMAIN) { resource.addProperty("domain", IVARIANT(gcInput->datadef().domain())); } } if ( what & itCOORDSYSTEM) { resource.addProperty("coordinatesystem", IVARIANT(cov->coordinateSystem())); } } resource.prepare(); IIlwisObject obj; obj.prepare(resource); if (inputObject->ilwisType() & itCOVERAGE) { OperationHelper::initialize(inputObject, obj, tp, what); } return obj; }
OperationImplementation::State TransformCoordinates::prepare(ExecutionContext *ctx, const SymbolTable &sym) { QString inputfile = _expression.parm(0).value(); QString code = _expression.parm(1).value(); QString newmap = _expression.parm(0,false).value(); // Goede file? if (!_inputFeatures.prepare(inputfile, itFEATURE)) { ERROR2(ERR_COULD_NOT_LOAD_2,inputfile,""); return sPREPAREFAILED; } // Zijn er wel punten? if ( _inputFeatures->featureCount(itLINE) == 0){ ERROR2(ERR_INVALID_PROPERTY_FOR_2,TR("number of points"), TR("pointrastercrossing operation")); return sPREPAREFAILED; } //Valide coordinaatsysteen if (!_csy.prepare(code)) { ERROR2(ERR_COULD_NOT_LOAD_2,code,"" ); return sPREPAREFAILED; } // Is de nieuwe file wel schrijfbaar? OperationHelperFeatures helper; IIlwisObject obj = helper.initialize(_inputFeatures.as<IlwisObject>(), itFEATURE, itUNKNOWN) ; if ( !obj.isValid()) { ERROR2(ERR_INVALID_INIT_FOR_2,"FeatureCoverage",inputfile); return sPREPAREFAILED; } _outputFeatures = obj.as<FeatureCoverage>(); _outputFeatures->name(newmap); return sPREPARED; }
QVariantList OperationCatalogModel::resolveValidation(const QString &metaid, const QString& objectid, int sourceParameterIndex) { QVariantList result; try { Resource resource = mastercatalog()->id2Resource(metaid.toULongLong()); IIlwisObject obj; obj.prepare(objectid.toULongLong()); if ( obj.isValid() && resource.isValid()){ QStringList lst = resource["inparameters"].toString().split("|"); int maxParmCount = lst.last().toInt(); for(int i = 0; i < maxParmCount; ++i){ QString parmPrefix = "pin_" + QString::number(i+1) + "_"; if ( resource.hasProperty(parmPrefix + "validationcondition")){ int source = resource[parmPrefix + "validationsource"].toInt(); if ( source == sourceParameterIndex){ QString condition = resource[parmPrefix + "validationcondition"].toString(); if ( condition != sUNDEF){ if ( condition.indexOf("columns") == 0){ tableCase(obj, condition, i, result); }else if ( condition.indexOf("domain") == 0){ domainCase(obj, condition, i, result); }else if ( condition.indexOf("values with") == 0){ valueListCase(obj, condition, i, result); } } } } } } return result; }catch(const ErrorObject& err){ } return result; }
OperationImplementation::State RasterSlicing::prepare(ExecutionContext *ctx, const SymbolTable &) { QString raster = _expression.parm(0).value(); QString outputName = _expression.parm(0,false).value(); if (!_inputRaster.prepare(raster, itRASTER)) { ERROR2(ERR_COULD_NOT_LOAD_2,raster,""); return sPREPAREFAILED; } QString domainName = _expression.parm(1).value(); if (!_numericItems.prepare(domainName)) { ERROR2(ERR_COULD_NOT_LOAD_2,domainName,""); return sPREPAREFAILED; } _bounds.resize(_numericItems->count(), 0); int i =0; for(auto& v : _bounds){ v = _numericItems->item(i++)->as<Interval>()->range().min(); } IIlwisObject outputObj = OperationHelperRaster::initialize(_inputRaster,itRASTER, itCOORDSYSTEM | itGEOREF); if ( !outputObj.isValid()) { ERROR1(ERR_NO_INITIALIZED_1, "output rastercoverage"); return sPREPAREFAILED; } _outputRaster = outputObj.as<RasterCoverage>(); _outputRaster->name(outputName); return sPREPARED; }
void GridBlockInternal::fetchFromSource() { IIlwisObject obj = mastercatalog()->get(_rasterid); if ( obj.isValid()){ IRasterCoverage raster = obj.as<RasterCoverage>(); raster->getData(_id); } }
bool CrosssectionTool::canUse(const IIlwisObject& obj, const QString& name ) const { if (!obj.isValid()) return false; if(!hasType(obj->ilwisType(), itRASTER)) return false; return name == VisualAttribute::LAYER_ONLY; }
bool MouseGotoPixelEditor::canUse(const IIlwisObject& obj, const QString& name) const { if (!obj.isValid()) return false; if (!hasType(obj->ilwisType(), itRASTER)) return false; return name == VisualAttribute::LAYER_ONLY; }
bool ApplyUndefinedValueDefinition::canUse(const IIlwisObject &obj, const QString &name) const { if (!obj.isValid()) return false; if ( obj->ilwisType() == itRASTER) { Ilwis::IRasterCoverage raster = obj.as<RasterCoverage>(); return hasType(raster->datadef().domain()->ilwisType(), itNUMERICDOMAIN); } return false; }
void MasterCatalogModel::deleteObject(const QString &id) { bool ok; quint64 objid = id.toULongLong(&ok); Resource resource = mastercatalog()->id2Resource(objid); IIlwisObject obj; obj.prepare(resource); if ( !obj.isValid()) return; obj->remove(); }
bool IlwisObjectModel::canUse(const QString &id) { if ( _ilwisobject.isValid()){ bool ok; quint64 myid = id.toULongLong(&ok); if ( ok){ IIlwisObject obj; obj.prepare(myid); if ( obj.isValid()) return _ilwisobject->canUse(obj.ptr()); } } return false; }
void domainCase(const IIlwisObject& obj, const QString& condition, int parmIndex, QVariantList& result) { if (hasType(obj->ilwisType(), itRASTER)) { IRasterCoverage raster = obj.as<RasterCoverage>(); QStringList parts = condition.split("="); QVariantMap mp; if ( parts.size() == 2){ if (parts[0] == "domain"){ QString domainType = parts[1]; if ( domainType == "numericdomain"){ mp["parameterIndex"] = parmIndex; mp["result"] = hasType(raster->datadef().domain()->ilwisType(), itNUMERICDOMAIN) ? obj->resource().url().toString() : ""; mp["uielement"] = "textfield"; }else if ( domainType == "itemdomain"){ mp["parameterIndex"] = parmIndex; mp["result"] = hasType(raster->datadef().domain()->ilwisType(), itITEMDOMAIN) ? obj->resource().url().toString() : ""; mp["uielement"] = "textfield"; } } else if ( parts[0] == "valuetype"){ QString valueType = parts[1]; IlwisTypes vt = IlwisObject::name2Type(valueType); mp["parameterIndex"] = parmIndex; mp["result"] = hasType(raster->datadef().domain()->valueType(), vt) ? obj->resource().url().toString() : ""; mp["uielement"] = "textfield"; } } result.append(mp); } }
void tableCase(const IIlwisObject &obj, const QString& condition, int parmIndex, QVariantList& result) { ITable tbl ; if (hasType(obj->ilwisType(), itCOVERAGE)){ ICoverage coverage = obj.as<Coverage>(); tbl = coverage->attributeTable(); }else if (hasType(obj->ilwisType(), itTABLE) ){ tbl = obj.as<Table>(); } QVariantMap mp; mp["parameterIndex"] = parmIndex; QStringList names; int index; IlwisTypes domainType = itTEXTDOMAIN | itITEMDOMAIN | itNUMERICDOMAIN; if ( (index = condition.indexOf(" with ")) != -1){ QString domainPart = condition.mid(index + 6); QStringList parts = domainPart.split("="); QVariantMap mp; if ( parts.size() == 2){ QStringList types = parts[1].split(","); IlwisTypes domainType = 0; for(auto tp: types){ domainType |= IlwisObject::name2Type(tp); } } } for(int c=0; c < tbl->columnCount(); ++c){ if ( domainType != itUNKNOWN){ DataDefinition def = tbl->columndefinition(c).datadef(); if ( hasType(def.domain()->ilwisType(), domainType)) names.append(tbl->columndefinition(c).name()); }else { names.append(tbl->columndefinition(c).name()); } } mp["result"] = names; mp["uielement"] = "list"; result.append(mp); }
bool CreateNumericDomain::execute(ExecutionContext *ctx, SymbolTable &symTable) { if (_prepState == sNOTPREPARED) if((_prepState = prepare(ctx, symTable)) != sPREPARED) return false; IIlwisObject obj; Resource res = Resource(itNUMERICDOMAIN); res.prepare(); obj.prepare(res); obj->setDescription(_domaindesc); INumericDomain numdom = obj.as<NumericDomain>(); NumericRange numrange(_vmin,_vmax,_vres); numdom->range(numrange.clone()); if ( _parent.isValid()) numdom->setParent(_parent); QVariant value; value.setValue<IDomain>(numdom); ctx->setOutput(symTable,value,numdom->name(),itDOMAIN,numdom->source()); return true; }
/** * Executes an operation (or workflow) and generates output * @param parameters the input and output parameters that the user filled in */ QString OperationCatalogModel::executeoperation(quint64 operationid, const QString& parameters) { if ( operationid == 0 || parameters == "") return sUNDEF; Resource operationresource = mastercatalog()->id2Resource(operationid); if ( !operationresource.isValid()) return sUNDEF; em->clearList(); QString expression; QStringList parms = parameters.split("|"); bool hasInvalidParameters = false; for(int i = 0; i < parms.size(); ++ i){ if (operationresource.ilwisType() & itWORKFLOW){ int parm = i + 1; if (operationresource[QString("pout_%1_optional").arg(parm)] == "false" && i < operationresource["outparameters"].toInt()) { QString value = parms[i + operationresource["inparameters"].toInt()]; QString output = value.split("@@")[0]; if (output.size() == 0) { em->addError(1, "Output parameter " + QString::number(i) + " is undefined with name " + operationresource[QString("pout_%1_name").arg(parm)].toString()); hasInvalidParameters = true; } else { for (const char& c : output.toStdString()) { if (!isalnum(c) && c != ':' && c != '/' && c != '\\' && c != '.') { em->addError(1, "Output parameter " + QString::number(i) + " is not a valid name"); hasInvalidParameters = true; break; } } } } if (operationresource[QString("pin_%1_optional").arg(parm)] == "false" && i < operationresource["inparameters"].toInt() && parms[i].size() == 0) { em->addError(1, "Input parameter " + QString::number(i) + " is undefined with name " + operationresource[QString("pin_%1_name").arg(parm)].toString()); hasInvalidParameters = true; } } if(i < operationresource["inparameters"].toInt()){ if ( expression.size() != 0) expression += ","; expression += parms[i]; } } if (hasInvalidParameters) return sUNDEF; QString allOutputsString; bool duplicateFileNames = false; QStringList parts = operationresource["outparameters"].toString().split("|"); int maxparms = parts.last().toInt(); int count = 1; for(int i=(parms.size() - maxparms); i<parms.size(); ++i){ QString output = parms[i]; QString pout = QString("pout_%1_type").arg(count++); IlwisTypes outputtype = operationresource[pout].toULongLong(); if ( output.indexOf("@@") != -1 ){ QString format; QStringList parts = output.split("@@"); output = parts[0]; if ( output == "") continue; //Check if user didnt put the same output name in another output field int occurences = 0; for(int j=(parms.size() - maxparms); j<parms.size(); ++j){ QString compareString = parms[j].split("@@")[0]; if(output == compareString){ occurences++; } } //Add the duplicate name to the list of duplicate names if(occurences>1){ duplicateFileNames = true; em->addError(1, "Workflow did not execute, multiple occurences of an output name"); } QString formatName = parts[1]; if ( operationresource.ilwisType() & itWORKFLOW) { QStringList existingFileNames; DIR *directory; //If not memory QString fileName; if(formatName == "Memory" ){ //Get all files in the internal catalog QString dataLocation = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/internalcatalog"; directory = opendir(dataLocation.toStdString().c_str()); }else { //Get all files in the directory QString dataLocation = output; dataLocation.remove("file:///"); QStringList splitUrl = dataLocation.split("/"); fileName = splitUrl.last(); QString query = "name='" + formatName + "'"; std::multimap<QString, Ilwis::DataFormat> formats = Ilwis::DataFormat::getSelectedBy(Ilwis::DataFormat::fpNAME, query); if ( formats.size() == 1){ QString connector = (*formats.begin()).second.property(DataFormat::fpCONNECTOR).toString(); QString code = (*formats.begin()).second.property(DataFormat::fpCODE).toString(); QVariantList extensions = Ilwis::DataFormat::getFormatProperties(DataFormat::fpEXTENSION,outputtype, connector, code); fileName += "."; fileName += extensions[0].toString(); } splitUrl.removeLast(); dataLocation = splitUrl.join("/"); directory = opendir(dataLocation.toStdString().c_str()); } struct dirent *file; //Put the existing file names in a list for later use while ((file = readdir (directory)) != NULL) { existingFileNames.push_back(file->d_name); } closedir(directory); //Check if a file with the same name already exist for(int j=0;j<existingFileNames.size();++j){ if(formatName == "Memory"){ if(existingFileNames[j] == output) { duplicateFileNames = true; em->addError(1, "Workflow did not execute duplicate name: " + output + ". Please change this name."); } }else{ if(existingFileNames[j] == fileName){ duplicateFileNames = true; em->addError(1, "Workflow did not execute duplicate name: " + fileName + ". Please change this name."); } } } } if ( hasType(outputtype, itCOLUMN)){ if ( formatName == "Memory"){ output = modifyTableOutputUrl(output, parms); }else output = parms[0] + "[" + output + "]"; } if ( formatName == "Keep original"){ IIlwisObject obj; obj.prepare(parms[0], operationresource["pin_1_type"].toULongLong()); if ( obj.isValid()){ IlwisTypes type = operationresource[pout].toULongLong(); QVariantList values = DataFormat::getFormatProperties(DataFormat::fpCODE,type,obj->provider()); if ( values.size() != 0){ format = "{format(" + obj->provider() + ",\"" + values[0].toString() + "\")}"; }else{ kernel()->issues()->log(QString("No valid conversion found for provider %1 and format %2").arg(obj->provider()).arg(IlwisObject::type2Name(type))); return sUNDEF; } } } //overrule the user if he wants to store things in the internalcatalog, then the format is by defintion stream if ( context()->workingCatalog()->source().url() == INTERNAL_OBJECT) formatName == "Memory"; if ( formatName != "Memory"){ // special case if ( format == "") { QString query = "name='" + formatName + "'"; std::multimap<QString, Ilwis::DataFormat> formats = Ilwis::DataFormat::getSelectedBy(Ilwis::DataFormat::fpNAME, query); if ( formats.size() == 1){ format = "{format(" + (*formats.begin()).second.property(DataFormat::fpCONNECTOR).toString() + ",\"" + (*formats.begin()).second.property(DataFormat::fpCODE).toString() + "\")}"; } } // if there is no path we extend it with a path unless the output is a new column, output is than the "old" table so no new output object if ( output.indexOf("://") == -1 ) output = context()->workingCatalog()->source().url().toString() + "/" + output + format; else output = output + format; }else{ if ( hasType(outputtype,itRASTER)){ format = "{format(stream,\"rastercoverage\")}"; }else if (hasType(outputtype, itFEATURE)){ format = "{format(stream,\"featurecoverage\")}"; }else if (hasType(outputtype, itTABLE | itCOLUMN)){ format = "{format(stream,\"table\")}"; }else if (hasType(outputtype, itCATALOG)){ format = "{format(stream,\"catalog\")}"; }else if (hasType(outputtype, itDOMAIN)){ format = "{format(stream,\"domain\")}"; }else if (hasType(outputtype, itCOORDSYSTEM)){ format = "{format(stream,\"coordinatesystem\")}"; }else if (hasType(outputtype, itGEOREF)){ format = "{format(stream,\"georeference\")}"; } output = output + format; } } if(!allOutputsString.isEmpty()){ allOutputsString.append(","); } allOutputsString += output; } if(!duplicateFileNames){ if ( allOutputsString == "") expression = QString("script %1(%2)").arg(operationresource.name()).arg(expression); else expression = QString("script %1=%2(%3)").arg(allOutputsString).arg(operationresource.name()).arg(expression); OperationExpression opExpr(expression); try { QThread* thread = new QThread; OperationWorker* worker = new OperationWorker(opExpr); worker->moveToThread(thread); thread->connect(thread, &QThread::started, worker, &OperationWorker::process); thread->connect(worker, &OperationWorker::finished, thread, &QThread::quit); thread->connect(worker, &OperationWorker::finished, worker, &OperationWorker::deleteLater); thread->connect(thread, &QThread::finished, thread, &QThread::deleteLater); thread->start(); return "TODO"; } catch (const ErrorObject& err){ emit error(err.message()); } } return sUNDEF; }