diff --git a/src/module_vmap/module/javascript/app/vmap/tools/insert.js b/src/module_vmap/module/javascript/app/vmap/tools/insert.js index 36e8096d1d253a017a391572046c43214b9582c5..6e01c71fad23a4a0c796cc4cafe41ee526e0c131 100644 --- a/src/module_vmap/module/javascript/app/vmap/tools/insert.js +++ b/src/module_vmap/module/javascript/app/vmap/tools/insert.js @@ -1069,9 +1069,11 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.startDrawi var this_ = this; this.draw_.on('drawend', function (evt) { - // Si la géométrie est un cercle, alors elle est remplacée par un polygone à 32 côtés var feature = evt.feature; + // Si la géométrie est un cercle, alors elle est remplacée par un polygone à 32 côtés feature = this_.updateCircleGeoms(feature); + // Évite les intersections avec les autres couches si besoin + feature = this_.avoidIntersections(feature); }, this); @@ -1142,6 +1144,105 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.updateCirc return feature; }; + +/** + * Edit the given feature to avoid intersections with layers defined in snapOptions.avoidIntersections + * @param {ol.Feature} olFeature + * @returns {ol.Feature} + */ +nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.avoidIntersections = function (olFeature) { + oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.avoidIntersections'); + + // Objets métiers à intersecter + var aIntersectionBos = []; + for (var bo_id in this['snapOptions']['avoidIntersections']) { + if (this['snapOptions']['avoidIntersections'][bo_id] === true) { + aIntersectionBos.push(bo_id); + } + } + + // Remplace la géométrie par celle calculée + if (aIntersectionBos.length > 0) { + this.setDiffGeom_(aIntersectionBos, olFeature) + } +} + +nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.setDiffGeom_ = function (aIntersectionBos, olFeature, opt_options) { + oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.setDiffGeom_'); + + if (!goog.isArray(aIntersectionBos)) { + return 0; + } + if (!goog.isDefAndNotNull(olFeature)) { + return 0; + } + if (!goog.isDefAndNotNull(opt_options)) { + opt_options = { + bo_index: 0 + } + } + + var this_ = this; + var sEWKTGeom = oVmap.getEWKTFromGeom(olFeature.getGeometry()); + + this.getDiffGeom_(aIntersectionBos[opt_options.bo_index], sEWKTGeom).then(function(sNewEWKTGeom){ + + // Remplace la géométrie + olFeature.setGeometry(oVmap.getGeomFromEWKT(sNewEWKTGeom)); + + // Relance la fonction pour les autres objets métiers + opt_options.bo_index ++; + if (opt_options.bo_index < aIntersectionBos.length) { + this_.setDiffGeom_(aIntersectionBos, olFeature, opt_options); + } + }, function(err){ + console.log('Cannot get the diff geom: ', err) + }); + +} + +nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getDiffGeom_ = function (sBoId, sEWKTGeom) { + oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.getDiffGeom_'); + + var deferred = this.$q_.defer(); + ajaxRequest({ + 'method': 'POST', + 'url': oVmap['properties']['api_url'] + '/vmap/querys/' + sBoId + '/diff_geometry', + 'headers': { + 'X-HTTP-Method-Override': 'GET', + 'Accept': 'application/x-vm-json' + }, + 'data': { + 'intersect_geom': sEWKTGeom + }, + 'scope': this.$scope_, + 'success': function (response) { + + if (!goog.isDefAndNotNull(response['data'])) { + deferred.reject('response.data not defined'); + return 0; + } + if (goog.isDefAndNotNull(response['data']['errorMessage'])) { + deferred.reject(response['data']['errorMessage']); + return 0; + } + if (!goog.isDefAndNotNull(response['data'][0])) { + deferred.reject('response.data[0] not defined'); + return 0; + } + if (!goog.isDefAndNotNull(response['data'][0]['diff_geom'])) { + deferred.reject('response.data[0].diff_geom not defined'); + return 0; + } + deferred.resolve(response['data'][0]['diff_geom']); + }, + 'error': function (response) { + deferred.reject(response); + } + }); + return deferred.promise; +} + /** * Update feature for scope.oInsertObject */ @@ -1608,6 +1709,10 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.loadBoVect oBo['bo_snapping_loaded'] = null; return 0; } + if (!goog.isDefAndNotNull(response['data'][0])) { + oBo['bo_snapping_loaded'] = null; + return 0; + } if (response['data'][0]['count'] > this_['snapOptions']['snappingObjectsLimit']) { oBo['bo_snapping_loaded'] = null; var text = 'Limit de points atteinte pour object '; @@ -1620,7 +1725,8 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.loadBoVect if (goog.isDefAndNotNull(response['data'][i]['geom'])) { geom = response['data'][i]['geom']; aFeatures.push(new ol.Feature({ - geometry: oVmap.getGeomFromEWKT(geom) + geometry: oVmap.getGeomFromEWKT(geom), + 'bo_id': bo_id })); } }