Topheur Posté(e) le 26 mai 2018 Posté(e) le 26 mai 2018 Bonjour les lispeurs et les lispeuses :) J'ai besoin de votre aide pour comprendre ce lisp ;;;Taper GAGB pour utiliser (defun c:gagb (/ ss n lst) (if (setq ss (ssget '((0 . "INSERT")))) (progn (setq n -1) (while (setq pt (ssname ss (setq n (1+ n)))) (setq lst (cons (cdr (assoc 10 (entget pt))) lst)) ) (command "_.pline") (mapcar '(lambda (x) (command "_non" x)) lst) (command) ) ) (princ) ) Il permet de relier les blocs sélectionnés par leur point de base entre eux. J'aimerais adapter ce code en choisissant mon PREMIER BLOC OU mon PREMIER POINT (si c'est plus simple).Puis relier de ce PREMIER bloc (ou point) les autres blocs que je sélectionnerais. Un petit dessin... Sur le dessin j'ai mis de la couleur car je ne veux pas comme le lisp actuel une seule polyligne, je voudrais une ligne par bloc mais la couleur serais toujours la même. En bref je clique pour avoir mon premier point puis je sélectionne TOUS les blocs que je veux ramener à ce premier point, j'appuie sur entrée et mes lignes sont tracées automatiquement. Dans l'idée, je voulais définir un premier point via;point de départ (setq pdep (getpoint "\nSpécifiez le premier point: ")) ;; point de départ Puis faire une boucle while qui feraitavec une(command "_.line" qui aurait pour point pdep => point base bloc 1puis pdep => point base bloc 2etc...Si on ne peut pas tracer dans l'ordre de sélection, se n'ai pas grave, c'est juste la solution qui me parais la plus simple... ou pas :D Merci de votre aide :) Citer
(gile) Posté(e) le 26 mai 2018 Posté(e) le 26 mai 2018 Salut, Tu peux essayer ça : (defun c:XXX (/ br elst pt ss i) (and (setq br (car (entsel "\nSelectionnez le bloc de départ: "))) (setq elst (entget br)) (setq pt (trans (cdr (assoc 10 elst)) br 0)) (= (cdr (assoc 0 elst)) "INSERT") (princ "\nSélectionnez les blocs à relier.") (setq ss (ssget '((0 . "INSERT")))) (or (ssdel br ss) T) (repeat (setq i (sslength ss)) (setq elst (entget (ssname ss (setq i (1- i))))) (entmakex (list (cons 0 "LINE") (cons 10 pt) (cons 11 (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 0)) ) ) ) ) (princ) ) Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Topheur Posté(e) le 26 mai 2018 Auteur Posté(e) le 26 mai 2018 Salut, Tu peux essayer ça : (defun c:XXX (/ br elst pt ss i) (and (setq br (car (entsel "\nSelectionnez le bloc de départ: "))) (setq elst (entget br)) (setq pt (trans (cdr (assoc 10 elst)) br 0)) (= (cdr (assoc 0 elst)) "INSERT") (princ "\nSélectionnez les blocs à relier.") (setq ss (ssget '((0 . "INSERT")))) (or (ssdel br ss) T) (repeat (setq i (sslength ss)) (setq elst (entget (ssname ss (setq i (1- i))))) (entmakex (list (cons 0 "LINE") (cons 10 pt) (cons 11 (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 0)) ) ) ) ) (princ) ) Bonjour Gile, C'est ce que je cherche mais j'aimerais connaitre le nom de la variable enregistrant les points de base car lorsque le lisp trace le trait, j'aimerais insérer un bloc dynamique au point d'insertion du bloc.J'ai compris que pt est le point de départ mais pour le reste...Moi, pour tracer un trait j'utilise command ... Merci de ton aide. Citer
(gile) Posté(e) le 27 mai 2018 Posté(e) le 27 mai 2018 Salut, Il n'y a pas de variable pour ce point dans le code proposé.J'en ai rajouté une dans le code ci-dessous. (defun c:XXX (/ br elst p0 ss i pt) (and (setq br (car (entsel "\nSelectionnez le bloc de départ: "))) (setq elst (entget br)) (= (cdr (assoc 0 elst)) "INSERT") (setq p0 (trans (cdr (assoc 10 elst)) br 1)) ; point d'insertion du bloc de départ (princ "\nSélectionnez les blocs à relier.") (setq ss (ssget '((0 . "INSERT")))) (or (ssdel br ss) T) ; supprimer le bloc de départ du jeu de sélection ;; parcourir le jeu de sélection (repeat (setq i (sslength ss)) (setq elst (entget (ssname ss (setq i (1- i)))) ; données DXF du bloc pt (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 1) ; point d'insertion du bloc ) ;; construction de la ligne (command "_.line" p0 pt "") ) ) (princ) ) Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Topheur Posté(e) le 27 mai 2018 Auteur Posté(e) le 27 mai 2018 Salut, Il n'y a pas de variable pour ce point dans le code proposé.J'en ai rajouté une dans le code ci-dessous. (defun c:XXX (/ br elst p0 ss i pt) (and (setq br (car (entsel "\nSelectionnez le bloc de départ: "))) (setq elst (entget br)) (= (cdr (assoc 0 elst)) "INSERT") (setq p0 (trans (cdr (assoc 10 elst)) br 1)) ; point d'insertion du bloc de départ (princ "\nSélectionnez les blocs à relier.") (setq ss (ssget '((0 . "INSERT")))) (or (ssdel br ss) T) ; supprimer le bloc de départ du jeu de sélection ;; parcourir le jeu de sélection (repeat (setq i (sslength ss)) (setq elst (entget (ssname ss (setq i (1- i)))) ; données DXF du bloc pt (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 1) ; point d'insertion du bloc ) ;; construction de la ligne (command "_.line" p0 pt "") ) ) (princ) ) Bonjour Gile, Comme c'est la fête des mamans aujourd'hui, je n'ai pas le temps de regarder le code aujourd'hui.Je te ferais un retour après avoir regardé. Merci Citer
Topheur Posté(e) le 28 mai 2018 Auteur Posté(e) le 28 mai 2018 Salut, Il n'y a pas de variable pour ce point dans le code proposé.J'en ai rajouté une dans le code ci-dessous. (defun c:XXX (/ br elst p0 ss i pt) (and (setq br (car (entsel "\nSelectionnez le bloc de départ: "))) (setq elst (entget br)) (= (cdr (assoc 0 elst)) "INSERT") (setq p0 (trans (cdr (assoc 10 elst)) br 1)) ; point d'insertion du bloc de départ (princ "\nSélectionnez les blocs à relier.") (setq ss (ssget '((0 . "INSERT")))) (or (ssdel br ss) T) ; supprimer le bloc de départ du jeu de sélection ;; parcourir le jeu de sélection (repeat (setq i (sslength ss)) (setq elst (entget (ssname ss (setq i (1- i)))) ; données DXF du bloc pt (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 1) ; point d'insertion du bloc ) ;; construction de la ligne (command "_.line" p0 pt "") ) ) (princ) ) Bonjour Gile, Comme promis, je reviens donner mes impressions.Ce lisp fonctionne parfaitement. Pendant que l'on y est "Où il y a de la gêne, il n'y a pas de plaisir" :D Peut-on inscrire dans une variable, le nombres de blocs sélectionné ? Idem pour un nombre de clic ?J'ai un code similaire que j'utilise avec un clic sur le premier bloc(sans sélection) puis clic (2e point) sur le bloc suivant et ainsi de suite.Je l'utilise dans le cas ou je n'ai que du dessin.J'aimerais avoir le nombre de clic dans ma variable. Merci :) Citer
(gile) Posté(e) le 28 mai 2018 Posté(e) le 28 mai 2018 Pour le nombre d'objets sélectionnés, tu peux utiliser la fonction sslength.Le nombre de clics, je ne comprends pas. En tous cas ce n'est pas significatif parce qu'on peut faire une sélection de multiples manières (fenêtre, polygone, clic). Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Topheur Posté(e) le 28 mai 2018 Auteur Posté(e) le 28 mai 2018 Pour le nombre d'objets sélectionnés, tu peux utiliser la fonction sslength.Le nombre de clics, je ne comprends pas. En tous cas ce n'est pas significatif parce qu'on peut faire une sélection de multiples manières (fenêtre, polygone, clic). J'ai réussi avec la fonction sslength !!! :(rires forts): Je n'y arrivais pas car dans le code suivant :(setpropertyvalue bloc "ATTRIBUT_NBRS_BLOCS" (itoa nbs_blocs)) je n'avais pas mis itoa... Pour en revenir au clic, j'étais un peu pressé.En fait je n'ai pas besoin de savoir combien de clic l'utilisateur à fait. Sujet résolu, mais je pense avoir encore besoin de tes lumières dans de futur lisp. @ bientôt :) Citer
Messages recommandés