La Lozère Posté(e) le 27 octobre 2011 Posté(e) le 27 octobre 2011 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
bryce Posté(e) le 27 octobre 2011 Posté(e) le 27 octobre 2011 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. :) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
La Lozère Posté(e) le 28 octobre 2011 Auteur Posté(e) le 28 octobre 2011 T'es un chef, ça marche nickel....Merci www.cad-is.fr Autocad Map 2021 - Covadis/Autopiste V18.0c Pisser sous la douche ne suffira pas
La Lozère Posté(e) le 4 avril 2012 Auteur Posté(e) le 4 avril 2012 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 : 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
bryce Posté(e) le 5 avril 2012 Posté(e) le 5 avril 2012 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... Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
La Lozère Posté(e) le 5 avril 2012 Auteur Posté(e) le 5 avril 2012 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
bonuscad Posté(e) le 5 avril 2012 Posté(e) le 5 avril 2012 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
La Lozère Posté(e) le 5 avril 2012 Auteur Posté(e) le 5 avril 2012 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
bryce Posté(e) le 5 avril 2012 Posté(e) le 5 avril 2012 D'accord avec Bonuscad, je ne vois pas comment ce programme pourrait distinguer un déblai d'un remblai.Pourquoi une pente entre 19% et 50% serait-elle forcément un déblai ? :unsure: Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
bonuscad Posté(e) le 5 avril 2012 Posté(e) le 5 avril 2012 A priori, celui qui a adapté le code s'est appuyé sur le modèle standard des talus routier: a savoir3 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
La Lozère Posté(e) le 6 avril 2012 Auteur Posté(e) le 6 avril 2012 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, 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
bonuscad Posté(e) le 6 avril 2012 Posté(e) le 6 avril 2012 (modifié) 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é le 6 avril 2012 par bonuscad Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
La Lozère Posté(e) le 6 avril 2012 Auteur Posté(e) le 6 avril 2012 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
bonuscad Posté(e) le 6 avril 2012 Posté(e) le 6 avril 2012 J'ai édité le code précédent.Si ça te convient, tant mieux, car cela reste sommaire... Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
La Lozère Posté(e) le 6 avril 2012 Auteur Posté(e) le 6 avril 2012 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
bonuscad Posté(e) le 6 avril 2012 Posté(e) le 6 avril 2012 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant