#1 Tue 20 February 2018 08:26
- yoann
- Participant actif
- Lieu: Grenoble
- Date d'inscription: 19 Sep 2005
- Messages: 120
[MAP] Recherche de sommets libres...
Hello les Mapistes !
Je gère une BD de réseau sous Map2014. Chaque extrémité de mes tronçons doit avoir un nœud inséré dessus (un bloc avec des OD).
Je ne dois pas avoir d’extrémités libres. Les nœuds intermédiaires sur un même tronçon peuvent être libres (sans bloc inséré dessus) mais pas les extrémités...
Je cherche un moyen de vérifier en automatique que je n'ai pas d’extrémités libres, soit avec Map soit avec Covadis. J'ai bien regardé dans les fonctions topologies de ces 2 outils mais sans trouver mon bonheur
Si n’existe pas sous Map/Covadis, je suis preneur d'une technique sous Qgis ou Arcgis après un export shp
Merci d'avance pour votre aide
Bonne journée !
Hors ligne
#2 Tue 20 February 2018 12:59
- Patrice
- JeSuisCharlie
- Date d'inscription: 16 Sep 2005
- Messages: 4779
Re: [MAP] Recherche de sommets libres...
Hello
SVP en ZIP (500 ko Max) un DWG Exemple...
GeoBye. Pat
(Autodesk Expert Elite Team)
Hors ligne
#4 Tue 20 February 2018 16:50
- bruno v.
- Participant actif
- Date d'inscription: 22 Mar 2010
- Messages: 89
Re: [MAP] Recherche de sommets libres...
Bonjour,
Je t'ai fait un truc (qui peut être approfondi si problème détecté)
Dans ton exemple je ne trouve pas de noeuds manquants, pourtant j'ai approfondi le test de validité pour que OD d'altitude du bloc soit égal au z_rg_amont ou z_rg_aval de la polyligne (histoire de cohérence...)
PS: Laisse un peu de temps à la procédure, ce n'est pas instantané.
Copie-colle directement ce qui suit en ligne de commande.
Code:
((lambda ( / js n flag count e_name obj pt_start pt_ent pt_sel js_blk nb e_blk alti_bl) (setq js (ssget "_X" '((0 . "LWPOLYLINE") (67 . 0) (8 . "RH_E[PU]_*"))) count 0) (setvar "CMDECHO" 0) (cond (js (repeat (setq n (sslength js)) (setq flag nil e_name (ssname js (setq n (1- n))) obj (vlax-ename->vla-object e_name) pt_start (vlax-curve-getstartpoint obj) pt_end (vlax-curve-getendpoint obj) ) (cond ((member "rassa" (ade_odgettables e_name)) (vla-GetBoundingBox obj 'll 'ur) (command "_.zoom" "_window" (trans (safearray-value ll) 0 1) (trans (safearray-value ur) 0 1)) (setq pt_sel pt_start) (repeat 2 (setq js_blk (ssget "_C" (trans (mapcar '- pt_sel '(0.05 0.05 0.0)) 0 1) (trans (mapcar '+ pt_sel '(0.05 0.05 0.0)) 0 1) '((0 . "INSERT") (67 . 0) (8 . "RH_E[PU]_*")))) (cond (js_blk (repeat (setq nb (sslength js_blk)) (setq e_blk (ssname js_blk (setq nb (1- nb)))) (if (member "rassn" (ade_odgettables e_blk)) (progn (setq alti_bl (ade_odgetfield e_blk "rassn" "altitude" 0)) (if (or (eq alti_bl (ade_odgetfield e_name "rassa" "z_rg_amont" 0)) (eq alti_bl (ade_odgetfield e_name "rassa" "z_rg_aval" 0))) (setq flag T) ) ) ) ) ) ) (if (not flag) (setq count (1+ count))) (setq flag nil) (setq pt_sel pt_end) ) (command "_.zoom" "_previous") ) ) ) ) ) (setvar "CMDECHO" 1) (princ (strcat (itoa count) " problèmes de noeuds trouvés")) (prin1) ))
Dernière modification par bruno v. (Wed 21 February 2018 09:47)
Hors ligne
#5 Tue 20 February 2018 17:22
- yoann
- Participant actif
- Lieu: Grenoble
- Date d'inscription: 19 Sep 2005
- Messages: 120
Re: [MAP] Recherche de sommets libres...
Merci Bruno pour la routine, mais il doit y avoir un problème....
Moi aussi quand je lance la routine sur la base il me trouve 0 problèmes de nœuds. Mais si je supprime volontairement un bloc sur une extrémité et que je relance la routine, il me trouve toujours 0 erreur....
Hors ligne
#6 Wed 21 February 2018 09:52
- bruno v.
- Participant actif
- Date d'inscription: 22 Mar 2010
- Messages: 89
Re: [MAP] Recherche de sommets libres...
Effectivement,
J'avais mal positionné une variable, j'ai modifié le code dans le post précédent.
En l'appliquant sur ton exemple, la routine détecte 680 problèmes.
Comment voudrais tu mettre en évidence ces problèmes pour les repérer?
Hors ligne
#7 Wed 21 February 2018 10:54
- Patrice
- JeSuisCharlie
- Date d'inscription: 16 Sep 2005
- Messages: 4779
Re: [MAP] Recherche de sommets libres...
Hello Bruno
1) MAGNIFIQUE !
2) Je suggere dessiner (sur le calque courant - Donc on serait eventuellement sur un calque ALERTE) un Cercle d'un rayon R a chaque extremite concernee (ou Inserer un Bloc specifique)
Donc question a poser en debut de routine : Rayon du cercle ou Nom du Bloc ?
MERCI, GeoBye, Pat
(Autodesk Expert Elite Team)
Hors ligne
#8 Wed 21 February 2018 16:22
- bruno v.
- Participant actif
- Date d'inscription: 22 Mar 2010
- Messages: 89
Re: [MAP] Recherche de sommets libres...
Après réflexion le test sur les altitudes n'est peut être pas une bonne solution dans ce cas précis.
J'ai remarqué que certains blocs ont des altitudes qui n'ont rien à voir avec le fil d'eau du réseau: des cotes de tampons en surface par exemple.
Donc pour simplifier et ne tester que l’existence d'un bloc aux extrémités (et en incluant par exemple un cercle vert aux points problématiques comme suggéré par Patrice)
Avec ce code je n'ai que 7 problèmes aux lieux de 680.
Code:
((lambda ( / js n flag count e_name obj pt_start pt_ent pt_sel js_blk) (setq js (ssget "_X" '((0 . "LWPOLYLINE") (67 . 0) (8 . "RH_E[PU]_*"))) count 0) (setvar "CMDECHO" 0) (cond (js (repeat (setq n (sslength js)) (setq flag nil e_name (ssname js (setq n (1- n))) obj (vlax-ename->vla-object e_name) pt_start (vlax-curve-getstartpoint obj) pt_end (vlax-curve-getendpoint obj) ) (cond ((member "rassa" (ade_odgettables e_name)) (vla-GetBoundingBox obj 'll 'ur) (command "_.zoom" "_window" (trans (safearray-value ll) 0 1) (trans (safearray-value ur) 0 1)) (setq pt_sel pt_start) (repeat 2 (setq js_blk (ssget "_C" (trans (mapcar '- pt_sel '(0.1 0.1 0.0)) 0 1) (trans (mapcar '+ pt_sel '(0.1 0.1 0.0)) 0 1) '((0 . "INSERT") (67 . 0) (8 . "RH_E[PU]_*")))) (cond (js_blk (setq flag T) ) (T (setq flag nil count (1+ count)) (command "_.circle" "_none" pt_sel 5.0 "_change" "_last" "" "_properties" "_color" 3 "") ) ) (setq pt_sel pt_end) ) (command "_.zoom" "_previous") ) ) ) ) ) (setvar "CMDECHO" 1) (princ (strcat (itoa count) " problèmes de noeuds trouvés")) (prin1) ))
Hors ligne
#9 Thu 22 February 2018 09:49
- olivier.eckmann
- Participant assidu
- Date d'inscription: 14 Dec 2007
- Messages: 353
Re: [MAP] Recherche de sommets libres...
Bonjour Yoann,
Sans avoir testé, tu aurais surement pu t'en sortir en suivant cette méthode:
1. MAPCLEAN => marquer les nœuds libres : MAP aurait dessiné un bloc sur chaque extrémité de polyligne non raccordée à une autre polyligne, donc sur chaque nœud amont.
2. Covadis immatriculation dans un calque POINT_EXISTANT de tous tes blocs existants Regards/avaloir...
3. Covadis immatriculation dans un calque POINT_MANQUANT de tous tes blocs issus de MAPCLEAN avec distance de recherche 0.01 pour ne pas mettre de point topo si déjà un présent.
Normalement dans le calque POINT_MANQUANT tu ne devrais avoir que les points topo là où il n'y en avait pas eu de créer sur les blocs existants.
Sinon sous QGIS il y un plug-in nommé NETWORKS développé par le CEREMA pour la gestion des réseaux linéaires à voir ce qu'il peut faire réellement.
Olivier
Hors ligne
#10 Mon 26 February 2018 15:18
- yoann
- Participant actif
- Lieu: Grenoble
- Date d'inscription: 19 Sep 2005
- Messages: 120
Re: [MAP] Recherche de sommets libres...
Hello,
Merci pour vos différentes contributions.
@Bruno et Pat : ca fonctionne bien la routine de Bruno, il faudrait juste que je puisse la mettre dans un Lisp...
Sinon, comment modifier la tolérance ? Car je veux aussi vérifier les micro-erreurs de topologie, car parfois j'ai des erreurs minimes <0.01m qui ne ressortent pas.
@Olivier : c'est plus sioux, mais je garde sous la coude
Merci !
Edit1 : j'ai réussi faire le lisp, mais pour la précision des coordonnées, pas réussi...... y des trucs pas logiques. Par exemple je souhaite fixer la tolérance à 0.001m par rapport au point d'insertion du bloc...
Dernière modification par yoann (Mon 26 February 2018 16:38)
Hors ligne
#11 Tue 27 February 2018 22:08
- bruno v.
- Participant actif
- Date d'inscription: 22 Mar 2010
- Messages: 89
Re: [MAP] Recherche de sommets libres...
j'ai réussi faire le lisp, mais pour la précision des coordonnées, pas réussi...... y des trucs pas logiques. Par exemple je souhaite fixer la tolérance à 0.001m par rapport au point d'insertion du bloc...
Voici le code avec une modif pour l'imprécision de l'insertion des blocs. Cercle en vert = pas de bloc, Cercle en jaune = imprécision de l'insertion du bloc. (tolérance 0.001)
Cela à l'air bon avec ton exemple, mais à vérifier quand même (la boulette n'est pas exclue!)
Code:
((lambda ( / js n count e_name obj pt_start pt_ent pt_sel js_blk nb pt_ins) (setq js (ssget "_X" '((0 . "LWPOLYLINE") (67 . 0) (8 . "RH_E[PU]_*"))) count 0) (setvar "CMDECHO" 0) (cond (js (repeat (setq n (sslength js)) (setq flag nil e_name (ssname js (setq n (1- n))) obj (vlax-ename->vla-object e_name) pt_start (vlax-curve-getstartpoint obj) pt_end (vlax-curve-getendpoint obj) ) (cond ((member "rassa" (ade_odgettables e_name)) (vla-GetBoundingBox obj 'll 'ur) (command "_.zoom" "_window" (trans (safearray-value ll) 0 1) (trans (safearray-value ur) 0 1)) (setq pt_sel pt_start) (repeat 2 (setq js_blk (ssget "_C" (trans (mapcar '- pt_sel '(0.1 0.1 0.0)) 0 1) (trans (mapcar '+ pt_sel '(0.1 0.1 0.0)) 0 1) '((0 . "INSERT") (67 . 0) (8 . "RH_E[PU]_*")))) (cond (js_blk (repeat (setq nb (sslength js_blk)) (setq pt_ins (cdr (assoc 10 (entget (ssname js_blk (setq nb (1- nb))))))) (if (not (equal pt_ins pt_sel 0.001)) (progn (setq count (1+ count)) (command "_.circle" "_none" pt_ins 5.0 "_change" "_last" "" "_properties" "_color" 2 ""))) ) ) (T (setq count (1+ count)) (command "_.circle" "_none" pt_sel 5.0 "_change" "_last" "" "_properties" "_color" 3 "") ) ) (setq pt_sel pt_end) ) (command "_.zoom" "_previous") ) ) ) ) ) (setvar "CMDECHO" 1) (princ (strcat (itoa count) " problèmes de noeuds trouvés")) (prin1) ))
Dernière modification par bruno v. (Wed 28 February 2018 08:54)
Hors ligne