Bred Posté(e) le 2 mai 2007 Posté(e) le 2 mai 2007 Salut,pour répondre à x-all ici, un petit lisp qui retourne la longueur des lignes + polyligne (2D ou 3D) sélectionné : (taper lg-li-pol pour lancer la commande)- Nota : enlever les espaces (-4 . "[surligneur]< OR[/surligneur]") (-4 . "[surligneur]OR >[/surligneur]") (defun c:lg-li-pol (/ LG SEL X) (setq lg 0 sel nil) (while (not sel) (setq sel (ssget (list '(-4 . "< OR") '(0 . "*POLYLINE") '(0 . "LINE") '(-4 . "OR >")))) ) (repeat (setq x (sslength sel)) (setq lg (+ lg (vla-get-Length (vlax-ename->vla-object (ssname sel (setq x (1- x))))))) ) (alert (strcat "Longueur :" (rtos lg) " .")) (princ) ) Edit : Ajout de la possibilitée de sélectionner les polyligne dites "3D". [Edité le 2/5/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
x_all Posté(e) le 2 mai 2007 Posté(e) le 2 mai 2007 merci beaucoup !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! lippssppssss tu me tire une fière chandelle du pied...!!d'autant que je suis en train de métré un vieux plan vrd ou le dessinateur à pratiquement tout mis dans le calque éléc, murs compris !!! bref super cool ça marche extrat !!!!!!!!!!!MERCI !! quelques trucs sur autocad
x_all Posté(e) le 3 mai 2007 Posté(e) le 3 mai 2007 j'essaye de bricoler la même chose pour cumuler des surfaces de polygone fermé, mais je dois avouer que je ne comprend rien de rien à ton lisp... que veux bien dire la ligne (setq sel (ssget (list '(-4 . "< OR") '(0 . "*POLYLINE") '(0 . "LINE") '(-4 . "OR >")))) j'ai un gif avec un singe qui se gratte confusément la tête qui serai approprié pour donner un aperçu de mon air dubitatif... et qu'es ce qui cloche dans (setq suff (+ surf (vla-get-area (vlax-ename->vla-object (ssname sel (setq x (1- x))))))) bref, je cherche, mais si tu as un peu de temps à me consacrer, tu vas encore m'en faire gagner beaucoup... merci quelques trucs sur autocad
(gile) Posté(e) le 3 mai 2007 Posté(e) le 3 mai 2007 Salut, (setq sel (ssget (list '(-4 . "")))) crée un jeu de sélection avec un filtre, ne pouront être sélectionnéses que les lignes et polylignes. Si tu veux filtrer les polylignes fermées : (setq sel (ssget '((0 . "LWPOLYLINE") (-4 . "&") (70 . 1)))) et qu'es ce qui cloche dans(setq su[surligneur]f[/surligneur]f (+ su[surligneur]r[/surligneur]f (vla-get-area (vlax-ename->vla-object (ssname sel (setq x (1- x))))))) [Edité le 3/5/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
x_all Posté(e) le 3 mai 2007 Posté(e) le 3 mai 2007 bon, ben c pas gagné pour un 1er lisp... avec les éclaircissement de (gile), j'arrive à ça...mais ça marche pas mieux... voir plus bas la maj le message quand je charge c'est:; erreur: no function definition: SSAREA ben voui.. ça pouvais pas etre aussi simple.... grrr ou peut on trouver une liste des comandes lisp?vu que _area marche pas mieux ??? [Edité le 11/8/2011 par x_all] quelques trucs sur autocad
(gile) Posté(e) le 3 mai 2007 Posté(e) le 3 mai 2007 Ça, il fallait pas le changer ;-)sslength n'a rien à voir avec la longueur ou la surface des objets sélectionnés, c'est la fonction qui retourne la "longueur" (le nombre d'éléments) du jeu de sélection. Pour modifier (ou faire) des LISP je te conseille l'éditeur Visual LISP (commande VLIDE ou VLISP). Les différents symbole y apparaissent en couleurs différentes selon leur type, les fonctions prédéfinies en bleu, les chaines de caractères en fuschia, les parenthèses en rouge les entiers en vert foncé les réels en vert plus clair, tout le reste en noir. http://img503.imageshack.us/img503/1227/editeur1gd4.png En cliquant sur "Formater la fenêtre" le code va s'inscrire avec des retraits de ligne correspondant au nombre de parenthèses ouvertes non apariées. Le ssarea n'est pas en bleu, il ne s'agit pas d'une fonction prédéfinie. http://img234.imageshack.us/img234/8900/editeur2fw9.png Après l'avoir remplacé par sslength, on peut charger directement le code dans le dessin courant en cliquanr sur "Charger la fenêtre d'édition active". http://img352.imageshack.us/img352/7159/editeur3ef4.png Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
x_all Posté(e) le 3 mai 2007 Posté(e) le 3 mai 2007 ^^ c vrai que c plus clair comme ça...et du reste en sachant ce que retourne sslength, ça me parait plus logique.. mais j'ai bien des lacune en algorytme, et la syntaxe un peu étrange du lisp est pas la pour m'eclaircir les idées... (setq sf (+ sf (vla-get-area (vlax-ename->vla-object (ssname sel (setq x (1- x))))))) ????????? bon ok, c la que la variable sf va s'incrémenter avec les valeur succéssive de la surface des poly... mais... si j'ai bien tout compris, il faut partir du centre... donc (setq x (1- x)si au "1er tour" x vaut 3, au second x=-2 ??? en plus, (repeat (setq x (ssarea sel))mais alors on fixe la valeur de x aprés le repeat???décidément, le lisp a une logique bien etrange... je peu repotasser le forum des débutant avant d'espérer rebidouiller qq chose pfffff ça marche mais je capte tjs pas comment n'empèche merci beaucoup... quelques trucs sur autocad
bonuscad Posté(e) le 3 mai 2007 Posté(e) le 3 mai 2007 mais alors on fixe la valeur de x aprés le repeat??? Le lisp fonctionne avec les parenthèses, l'exécution se faisant par profondeur d'imbrication. (a (b (c (d)))) ici par exemple d sera évaluer en premier, puis c , puis b et enfin a. Une fois qu'on a compris, ça va beaucoup mieux ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 3 mai 2007 Posté(e) le 3 mai 2007 C'est vrai que ce LISP est écrit d'une manière concise qui n'est pas pour me déplaire mais qui peut être plus difficile à comprendre. en plus, (repeat (setq x (ssarea sel))mais alors on fixe la valeur de x aprés le repeat??? Non, le lisp avec ses parenthèses fonctionne un peu comme l'écriture mathématique est évalué en premier ce qui se trouce à l'intérieur des parenthéses les plus imbriquées et le lésultat est retourné à cet endroit. Dans cet exemple, (sslength sel) est évalué, son résultat est retourné comme argument du (setq x ...) qui lui est retourné comme argument de (repeat ...). Le jeu de sélection est parcourru "à l'envers" de la dernière entité à la première. D'une manière plus "lisible" le code aurait pu être écrit : (defun c:sf-pol (/ sf sel x ent sf_ent) ;; création du jeu de sélection (while (not sel) (setq sel (ssget '((0 . "LWPOLYLINE") (-4 . "&") (70 . 1)))) ) ;; mise à 0 de la surface totale (setq sf 0) ;; mise à 0 du compteur (setq x 0) ;; repeter autant de fois qu'il y a d'entités dans le jeu de sélection (repeat (sslength sel) ;; transformation de la xième entité en vl-object (setq ent (vlax-ename->vla-object (ssname sel x))) ;; surface de l'entité (setq sf_ent (vla-get-area ent)) ;; ajout à la surface totale (setq sf (+ sf sf_ent)) ;; passe à l'entité suivante (setq x (1+ x)) ) ;; affichage du résultat (alert (strcat "surface :" (rtos sf) " .")) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 3 mai 2007 Auteur Posté(e) le 3 mai 2007 Salut,en fait c'est normal que tu ais un peu de mal, car le code est écrits en grande partie en "visual Lisp", est c'est un niveau un peu plus ardu que l'"autolisp", base du lisp sur Autocad. mais grâce à l'éditeur que t'as montré (gile), tu peux visualise ce que ce passe plus facilement, et donc tester, corriger, appeler l'aide, etc ... J'utilise beaucoup le "charger la selection" (à côter de "charger la fenêtre d'édition active") dans l'éditeur, pour voir comment réagis mes codes petit à petit...Ainsi, les valeurs des variables peuvent être directement vus dans la "console" (ex: tu surlignes (while (not sel)(setq sel (ssget '((0 . "LWPOLYLINE") (-4 . "&") (70 . 1)))))et tu "charge la selection",si tu surlignes maintenant que "sel", tu auras une selection das la varable sel (sous la forme "< Selection set: 64c9 >")puis après si tu surligne et charge que "(sslength sel)", tu auras en retour un nombre te donnant donc le nombre d'objet dans sel.etc ......) utilises souvent l'aide, même si elle peut te paraitre au premier abord confuse, on s'y habitue à force .... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
x_all Posté(e) le 4 mai 2007 Posté(e) le 4 mai 2007 en fait c'est normal que tu ais un peu de mal :cool:je commencais a avoir des doutes.. non, sans rire.... vous etes a 1000 lieux de ce que je pourrai espérer faire un jour...n'empèche que vous explications me donne des pistes pour me dépatouillé un peu, mais avec le temps dont je dispose pour me consacrer à la programmation (pas des masses) c'est pas gagné mais je vous remercie de vos lumières... quelques trucs sur autocad
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