jeanpoco Posté(e) le 30 septembre 2006 Posté(e) le 30 septembre 2006 Bonjour, Je suis à la recherche d'une routine,d'un lisp ou d'un programme, donnant dans un dessin autocad le nombre total de polylignes, lainsi que leur somme totale.Pour info,je pourrais utiliser les CHAMPS ,combinés à un TABLEAU....mais un peu long quand on a un cinquantaine de polylignes.. Merci pour vos idées. POCO.
(gile) Posté(e) le 30 septembre 2006 Posté(e) le 30 septembre 2006 Salut, ((lambda (/ ss n long obj) (if (setq ss (ssget "_X" '((0 . "LWPOLYLINE")))) (progn (setq n (sslength ss)) (princ (strcat "\nLe dessin contient : " (itoa n) " polylignes, ") ) (setq long 0.0) (repeat n (setq obj (vlax-ename->vla-object (ssname ss (setq n (1- n)))) long (+ long (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj) ) ) ) ) (princ (strcat "d'une longueur totale de : " (rtos long))) ) ) (princ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
phil_vsd Posté(e) le 30 septembre 2006 Posté(e) le 30 septembre 2006 Réponse en 60 mn chrono ! J'ai même pas eu le temps d'imaginer la réponse que déjà elle apparaît ! "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
jeanpoco Posté(e) le 30 septembre 2006 Auteur Posté(e) le 30 septembre 2006 Merci Gile pour ta reponse, Je suis un peu novice en programmation mais comment j'intègre tout cela dans autocad,je veux dire tes lignes de programmes? Merci POCO
(gile) Posté(e) le 30 septembre 2006 Posté(e) le 30 septembre 2006 Salut, Comme je ne savais pas ce que tu voulais exactement, j'ai juste donné ces quelques lignes comme exemple.C'est une fonction lambda, tu copies tout le code, tu le colles sur la ligne de commade et tu tapes ENTER. Le nombre de polylignes et la longueur totale s'affichera sur la ligne de commande. Si la fonction te conviens en l'état et que tu veux t'en faire une commande,colle le code dans le bloc note et remplace : ((lambda au début du code, par : (defun c:MaFonction (tu peux remplacer MaFonction par ce que tu veux en évitant les nom de commandes déjà définis) et supprime la dernière paranthèse (il doit y avoir autant de paranthèses ouvrantes que de fermantes). Puis enregistre le fichier avec l'extension .lsp et charge le dans AutoCAD. Ils uffit ensuite de taper "MaFonction" ou ce que tu auras mis derrière c: dans le defun). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
jeanpoco Posté(e) le 30 septembre 2006 Auteur Posté(e) le 30 septembre 2006 Merci beaucoup GilesLongue vie à toi. POCO
jeanpoco Posté(e) le 30 septembre 2006 Auteur Posté(e) le 30 septembre 2006 Salut Gile, J'ai bien suivi tes instructions et a bien incorporé ton programme dans autocad.J'ai le resultat siuvant: "Le dessin contient : 2 polylignes, d'une longueur totale de : 30" ....(par exemple).Serait il possible la longueur de chaque polyligne....P1=...P2=...,en plus de la longueur toale. Merci. POCO
(gile) Posté(e) le 30 septembre 2006 Posté(e) le 30 septembre 2006 Re, ((lambda (/ ss tot n long obj lst) (if (setq ss (ssget "_X" '((0 . "LWPOLYLINE")))) (progn (setq n (sslength ss)) (princ (strcat "\n\nLe dessin contient : " (itoa n) " polylignes") ) (setq tot 0.0) (repeat n (setq obj (vlax-ename->vla-object (ssname ss (setq n (1- n)))) long (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj) ) lst (cons (strcat "P" (itoa (1+ n)) " = " (rtos long)) lst) tot (+ tot long) ) ) (mapcar 'print lst) (princ (strcat "\nLongueur totale = " (rtos tot))) (textscr) ) (princ "\nLe dessin ne contient pas de polylignes.") ) (princ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
x_all Posté(e) le 1 octobre 2006 Posté(e) le 1 octobre 2006 slt.... je doit etre un peu neuneu..... si je colle ta fonction lambda, j'ai un message: Le dessin contient : 6 polylignes; erreur: no function definition: VLAX-ENAME->VLA-OBJECT pareil si je fait un fichier lisp... de plus, un truc qui serai géant, se serai que la somme des poly tienne compte des calques... pour sortir les réseaux vrd... du genresomme des EU:....somme des EP:...... sinon? est ce que la fonction tien compte des calques non alumés? de manière a pouvoir la lancer sur chaque calque... edit.................. harf.. je vien de voir le titre du forum... je suis sous 2006... sans doute pour ça que ça tourne pas. :( [Edité le 1/10/2006 par x_all] quelques trucs sur autocad
lecrabe Posté(e) le 1 octobre 2006 Posté(e) le 1 octobre 2006 Bon Matin Regarde aussi ce sujet et mon message final qui te renvoie vers la routine ZVOL.LSP ! http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=598#pid40237 Le Decapode Autodesk Expert Elite Team
(gile) Posté(e) le 1 octobre 2006 Posté(e) le 1 octobre 2006 Salut x_all, je suis sous 2006... sans doute pour ça que ça tourne pas. Ça devrait tourner sous 2006 sans problème, j'ai effectivement oublié de glisser un (vl-load-com) en début de routine, mais il me semble que ceci n'est plus nécéssaire depuis les versions 2004. sinon? est ce que la fonction tien compte des calques non alumés? Telle quelle la routine fonctionne sur tous les calques (actif/inactif, gelé/dégelé, vérouillé/dévérouillé) si tu veux écarter certains calques, il faut remplacer :(ssget "_X" '((0 . "LWPOLYLINE"))) par :(ssget "_A" '((0 . "LWPOLYLINE"))), et les calques gelés ne seront pas traités. de plus, un truc qui serai géant, se serai que la somme des poly tienne compte des calques... Quelque chose comme ça ? ((lambda (/ ss tot nb n long obj lst lay l_lay) (vl-load-com) (if (setq ss (ssget "_X" '((0 . "LWPOLYLINE")))) (progn (setq nb (sslength ss) n 0 tot 0.0) (princ (strcat "\n\nLe dessin contient : " (itoa nb) " polylignes") ) (repeat nb (setq obj (vlax-ename->vla-object (ssname ss n)) long (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj) ) tot (+ tot long) lay (vla-get-Layer obj) ) (princ (strcat "\nP" (itoa (setq n (1+ n))) " = " (rtos long) "\tCalque : " lay ) ) (if (setq l_lay (assoc lay lst)) (setq lst (subst (cons lay (+ long (cdr l_lay))) l_lay lst)) (setq lst (cons (cons lay long) lst)) ) ) (mapcar '(lambda (x) (princ (strcat "\nLongueur totale sur le calque " (car x) " : " (rtos (cdr x)) ) ) ) lst ) (princ (strcat "\nLongueur totale dans le dessin = " (rtos tot))) (textscr) ) (princ "\nLe dessin ne contient pas de polylignes.") ) (princ) ) ) [Edité le 1/10/2006 par (gile)] 1 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
x_all Posté(e) le 1 octobre 2006 Posté(e) le 1 octobre 2006 pwa (gile) !!! que rajouter à ça....je reste une fois de plus admiratif pour ta maitrise du lisp...et ta générosité à nous faire profiter de tes lumières.... merci tout plein...c'est nikel pile poil ce qui me fallait :) quelques trucs sur autocad
mimine Posté(e) le 17 octobre 2006 Posté(e) le 17 octobre 2006 Merci gile ça m'enleve une épine du pied
jimmy06 Posté(e) le 1 août 2007 Posté(e) le 1 août 2007 Pour reprendre et pour compliquer l'affaire, comment peut-on faire pour generer la somme des surfaces de plusieurs polylignes dans un bloc dynamic avec attributs; du genre la surface de l'appartement apparait sur le plan et est calculée selon les polylignes de l'ensemble des pièces. Si quelqu'un peut m'aider... Un grand merci !
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