Aller au contenu

Correction d'une routine


La Lozère

Messages recommandés

Salut,

Voilà, sur le chantier où je suis, on utilise une routine permettant de supprimer des barbules faites par Autopiste à partir du moment ou la ligne à une pente inférieur à une valeur de x% et colore en rouge les barbules en remblai et en vert les barbules en déblais.

Sauf, que la commande bug, car il existe des lignes de valeur nul, et du coup, Autocad renvoi:

 

; erreur: division par zéro

 

Je suis nul en lisp, alors, y aurait-il une âme charitable, qui pourrait corriger le code, pour ne plus avoir cette erreur.

 

Merci d'avance.

 

Voici le code:

;PROGRAMME POUR EFFACER LES BARBULES INFERIEURS A UNE PENTE DONNEE
;*****************************************************************

(defun c:efb ()

;initialisation des couleurs deblai et remblai
(setq couldeblai 3)
(setq coulremblai 1)

;initialisation de la variable de groupe PICKSTYLE à 1
(setvar "PICKSTYLE" 0)

;recuperation du nom de calque desentites a traiter
(setq ent (car (entsel "\nCliquez un barbule :")))
(setq calqent (cdr (assoc 8 (entget ent))))

zoom etendu pour accelerer le traitement
(command "zoom" "et")

;recuperation de la valeur limite de pente
(setq valpente (getint "\nEntrez la valeur limite de la pente pour l effacement des barbules :"))

(setq pentedeblaimin 190.0 pentedeblaimax 500.0)


(setq jsb (ssget "x" (list (cons 8 calqent))))
(setq i 0)
(repeat (sslength jsb)
(setq entb (ssname jsb i))
(setq bdentb (entget entb))
(setq pointd (cdr (assoc 10 bdentb)))
(setq ptd (list (car pointd) (cadr pointd)))
(setq pointf (cdr (assoc 11 bdentb)))
(setq ptf (list (car pointf) (cadr pointf)))
(setq deltad (distance ptd ptf))
(setq deltaz (- (caddr pointd) (caddr pointf)))
(setq penteb (abs (* (/ deltaz deltad) 100)))
;comparaison des valeurs
(if (<= penteb valpente)
	(command "effacer" entb "")
	(progn
		(if (and (> penteb pentedeblaimin) (< penteb pentedeblaimax))
			(command "changer" entb "" "pr" "co" couldeblai "")
			(command "changer" entb "" "pr" "co" coulremblai "")
		);fin du if
	);fin du progn
);fin du if	
(setq i (+ i 1))
);fin du repeat

(command "zoom" "p")

);fin du defun c:efb

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Voici une modif vite faite (pas testée):

 

;PROGRAMME POUR EFFACER LES BARBULES INFERIEURS A UNE PENTE DONNEE
;*****************************************************************

(defun c:efb ( / ent calqent valpente pentedeblaimin pentedeblaimax
jsb entb bdentb pointd pointf ptd ptf deltad deltaz penteb)

;initialisation des couleurs deblai et remblai
(setq couldeblai 3)
(setq coulremblai 1)

;initialisation de la variable de groupe PICKSTYLE à 1
(setvar "PICKSTYLE" 0)

;recuperation du nom de calque des entites a traiter
(setq ent (car (entsel "\nCliquez un barbule :")))
(setq calqent (cdr (assoc 8 (entget ent))))

;zoom etendu pour accelerer le traitement
(command "zoom" "et")

;recuperation de la valeur limite de pente
(setq valpente (getint "\nEntrez la valeur limite de la pente pour l effacement des barbules :"))

(setq pentedeblaimin 190.0 pentedeblaimax 500.0)


(setq jsb (ssget "x" (list (cons 8 calqent))))
(setq i 0)
(repeat (sslength jsb)
       (setq entb (ssname jsb i))
       (setq bdentb (entget entb))
       (setq pointd (cdr (assoc 10 bdentb)))
       (setq ptd (list (car pointd) (cadr pointd)))
       (setq pointf (cdr (assoc 11 bdentb)))
       (setq ptf (list (car pointf) (cadr pointf)))
       (setq deltad (distance ptd ptf))
       (setq deltaz (- (caddr pointd) (caddr pointf)))
       (if (> deltad 0)
           (progn
               (setq penteb (abs (* (/ deltaz deltad) 100)))
               ;comparaison des valeurs
               (if (<= penteb valpente)
                       (command "effacer" entb "")
                       (progn
                               (if (and (> penteb pentedeblaimin) (< penteb pentedeblaimax))
                                       (command "changer" entb "" "pr" "co" couldeblai "")
                                       (command "changer" entb "" "pr" "co" coulremblai "")
                               );fin du if
                       );fin du progn
               );fin du if
           );fin du progn
           (command "effacer" entb "");commenter cette ligne pour ne pas effacer les lignes de longueur 0
       );fin du if
(setq i (+ i 1))
);fin du repeat

(command "zoom" "p")

);fin du defun c:efb

 

Les lignes de longueur nulle sont supprimées.

Si tu pouvais poster un dessin de test, ce serait cool. :)

Lien vers le commentaire
Partager sur d’autres sites

  • 5 mois après...

Hello,

Je reviens vers vous pour faire une nouvelle petite correction sur ce lisp.

Voilà, il marche nickel dans 90% des cas, mais sur notre dernier projet, les pentes de talus sont très faible, à un point tel que normalement on ne met pas de barbules.... Mais le client étant roi...

Donc dans ce cas, il nous faut des barbules pour les talus, et dans ce cas, ils sont à 2.5%, mais que là, le lisp ne fait plus le tri entre les barbules en remblai de celles en déblai, il les met toutes en remblai????

 

Cette fois, je joint un fichier test :rolleyes: : ICI ou ICI

-Dans la zone 1, on fixe la valeur à 1%: Marche pas

-Dans la zone 2, on fixe la valeur à 50%: Marche

 

A plus et merci.

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Dans le programme, la ligne suivante

 

(setq pentedeblaimin 190.0 pentedeblaimax 500.0)

 

fixe des valeurs de pente mini et maxi pour les déblais.

Seules les pentes entre 19% et 50% sont donc considérées comme des déblais.

 

N'étant pas du métier, je ne sais pas quelle en est la raison, mais c'est ce qui est défini dans le programme d'origine...

Lien vers le commentaire
Partager sur d’autres sites

Salut bryce,

J'ai bien essayé de changer cette valeur en mettant 1 par exemple, mais du coup, cela me met tout en vert, cela ne fait pas non plus le trie... :angry:

 

Bref, je ne vois pas... Dans l'exemple de la zone 1 , les talus sont à 2.5% (déblai et remblai)...

 

Sa marche chez toi?

 

Merci

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

J'ai comme l'impression que cette routine n'est pas le code d'origine, que celui ci a été détourné de sa fonction première pour en faire une identification de déblais remblai.

 

Personnellement je vois pas comment ce code pourrait effectuer cela d'une façon fiable. Sachant que les barbule sont toujours dessinés dans le sens haut de talus vers bas de talus, je vois pas comment identifier (en récupérant la pente de celles-ci qui logiquement sera toujours du haut vers le bas) si c'est du remblais ou du déblai...

 

Pour moi avec ce code c'est mission impossible.

 

La seule chose qui serait faisable c'est en identifiant l'axe de référence pour déterminer la position 2D des extrémités des barbules par rapport à celui-ci (quel est le plus proche de l'axe, le point haut ou le point bas de la barbule?). Cela serait déjà un peu plus fiable pour les cas simple, mais en cas de merlon par exemple il y aurait encore de mauvaise interprétation.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Salut Bonuscad,

Je suis d'accord avec toi, je ne sais pas d'où vient cette routine. Mais ce que je sais, c'est qu'elle marche la plus part du temps.

Dans mon fichier exemple, si tu l'appliques à la zone 2, ça marche... :blink: Mais pourquoi plus à la zone 2 qu'à la zone une????? Alors là....

 

Merci quand même.

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

A priori, celui qui a adapté le code s'est appuyé sur le modèle standard des talus routier: a savoir

3 pour 2 en remblai soit une pente de 66.67%

et 1 pour 1 en déblai soit 50% (talus en terre meuble), pour de la rocaille on a des pentes bien plus fortes.

 

Donc en partant de ces règles standard, il a conçu un code pour fonctionner en règle générale sur des talus courants.

Si on s'écarte de ces règles, le code ne vaut plus rien du tout...

Donc trier des barbules avec des pentes faibles, comme tu désire le faire, est infaisable dans l'état du code et même avec un code mieux conçu, cela ne serait pas encore tip-top (barbules de merlon, de fossés difficile à interpreter)

 

Mais rien n'est infaisable, mais le code à pondre serait assez conséquent avec beaucoup de tests à effectuer.

Si tu sens d'attaque....

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Merci pour l'info bonuscad, ça me permet de mieux comprendre,

Ne vous embêtez pas, je vais me débrouiller comme ça.

Et à savoir si je suis d'attaque.... non, :rolleyes: la dernière fois que j'ai fait de la prog lisp, c'était lors de ma formation CAO-DAO après le BTS soit, il y a 18 ans...

 

Mais bon, j'ai fait une proposition d'amélioration à Géomédia, pour intégrer des options supplémentaire lors de l'habillage des projets autopiste, on verra ce que ça donne.

En fait ce topic ce combine un peu avec celui-là, mais qui n'a pas trop de succès...

 

Merci et à plus.

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

la dernière fois que j'ai fait de la prog lisp, c'était lors de ma formation CAO-DAO après le BTS soit, il y a 18 ans...

Bon, essayes ce code (qui est assez sommaire), je ne teste plus les pentes, mais plutôt l'orientement des barbules par rapport à l'axe principal de la voie. J'ai fais l'impasse sur les problèmes de fossé ou merlon, en dehors de ces cas, ça devrait fonctionner...

 

(defun c:deb-remb ( / js dxf_cod js_ax ref_pente n ent_barb dxf_barb dxf_10 dxf_11 pt_proj)
 (princ "\nChoix d'une barbule modèle pour le filtrage: ")
 (while
   (null
     (setq js
       (ssget "_+.:E:S"
         (list
           '(0 . "LINE")
           (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
           (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
         )
       )
     )
   )
   (princ "\nCe n'est pas un objet valable pour cette fonction!")
 )
 (vl-load-com)
 (setq
   dxf_cod (entget (ssname js 0))
   js
   (ssget "_X" 
     (foreach m (foreach n dxf_cod (if (not (member (car n) '(0 67 410 8 6 62 48 420 70))) (setq lremov (cons (car n) lremov))))
       (setq dxf_cod (vl-remove (assoc m dxf_cod) dxf_cod))
     )
   )
 )
 (princ "\nChoisir l'axe de la voie: ")
 (while
   (null
     (setq js_ax
       (ssget "_+.:E:S"
         (list
           '(0 . "*POLYLINE")
           (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
           (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
         )
       )
     )
   )
   (princ "\nCe n'est pas un objet valable pour cette fonction!")
 )
 (cond
   (js
     (initget 5)
     (setq ref_pente (getreal "\nPente en % en dessous delaquelle la barbule est supprimée: "))
     (repeat (setq n (sslength js))
       (setq
         ent_barb (ssname js (setq n (1- n)))
         dxf_barb (entget ent_barb)
         dxf_10 (cdr (assoc 10 dxf_barb))
         dxf_11 (cdr (assoc 11 dxf_barb))
         pt_proj (vlax-curve-getClosestPointTo (vlax-ename->vla-object (ssname js_ax 0)) dxf_10)
       )
       (if
         (>
           (distance (list (car dxf_10) (cadr dxf_10)) (list (car pt_proj) (cadr pt_proj)))
           (distance (list (car dxf_11) (cadr dxf_11)) (list (car pt_proj) (cadr pt_proj)))
         )
         (if (assoc 62 dxf_barb)
           (entmod (subst (cons 62 1) (assoc 62 dxf_barb) dxf_barb))
           (entmod (cons (cons 62 1) dxf_barb))
         )
         (if (assoc 62 dxf_barb)
           (entmod (subst (cons 62 3) (assoc 62 dxf_barb) dxf_barb))
           (entmod (cons (cons 62 3) dxf_barb))
         )
       )
       (if (< (abs (* (/ (- (caddr dxf_10) (caddr dxf_11)) (distance (list (car dxf_10) (cadr dxf_10)) (list (car dxf_11) (cadr dxf_11)))) 100)) ref_pente)
         (entdel ent_barb)
       )
     )
   )
 )
 (prin1)
)

Modifié par bonuscad

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Merci Bonuscad ça marche nickel, juste 2 choses. Je sais j'abuse.

 

Il y a inversion des couleurs, les déblais doivent être en vert et les remblais en rouge.

Ensuite serait-il possible d'ajouter l'option permettant de supprimer les barbules en dessous d'un pourcentage x définit par l'utilisateur.

 

Encore merci.

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

TROP-TROP fort. Mes vagues souvenir me font poser la question suivante:

-Comment faites vous pour faire des routines aussi rapidement. Pour moi c'était une horreur, tout à la main dans un éditeur de texte de base. C'est un peu pour ça que appréhende à me mettre sur l'apprentissage du lisp. Même si je sais que maintenant il y a un éditeur.

 

Encore merci... C'est parfait.

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

Quitte à surprendre, j'utilise (encore) un éditeur de texte basique (Notepad2 pour pas le citer: il indente les lignes pour la lisibilité et surtout il a l'avantage de mettre en évidence les parenthèses apparentées, ce qui est le plus pénible à contrôler en lisp et en plus il peut lire de très très gros fichier en DXF ASCII sans broncher)

 

Après je fais beaucoup de copier-coller de bout de code que je possède déjà, on s'en aperçoit vite car on retrouve souvent les même noms de variable dans mes codes.

Pendant la phase de construction du lisp, je ne déclare pas mes variables locale (sauf celle qui peuvent poser problème si elles ne sont pas réinitialisée entre chaque exécution, soit je la déclare soit je la remet à nil à un endroit approprié du code), comme cela je peux interroger mes variables après un bug pour repérer où cela coince (!nom_de_variable en ligne de commande pour avoir sa valeur). Dans les boucles un peu complexe il m'arrive aussi de faire temporairement un print d'une variable pour suivre en "live" son évolution.

 

Voilà en gros ma manière de monter des lisp, mais il certain que la pratique joue dans la rapidité du montage... (moins d'erreur de syntaxe ou de mauvais arguments passés à une fonction, avec l'habitude on évite ces erreurs que l'on a souvent quand on débute)

 

Je reste ancré sur mes veilles habitudes, j'ai bien essayé l'éditeur Vlisp mais je trouve que vais aussi vite sans, peut être parce que je ne le maîtrise pas assez bien...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité