ScoAD Posté(e) le 12 novembre 2008 Posté(e) le 12 novembre 2008 Bonjour,je cherche à faire une routine qui permet de sélectionner plusieurs attributs pour leurs données un nouvel angle de rotation.Je bloquer sur la sélection des attributs."Entsel" sélection le bloc, et "nentsel" me permet de ne sélectionner qu'un seul attributs.Comme puis je sélectionner les attributs en cliquant dessus.Merci
jalna Posté(e) le 12 novembre 2008 Posté(e) le 12 novembre 2008 Salut! Et pourquoi ne pas utiliser "Sélection rapide".......... "Je suis fasciné par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre... Et les avions aussi... En même temps l'air tu peux pas le toucher... Ca existe et ça existe pas... Ca nourrit l'homme sans qu'il ait faim... It's magic ! L'air c'est beau en même temps tu peux pas le voir, c'est doux et tu peux pas le toucher... L'air, c'est un peu comme mon cerveau..."J-C Van DammeMon forum : http://plexus.forumactif.org/
ScoAD Posté(e) le 12 novembre 2008 Auteur Posté(e) le 12 novembre 2008 Je ne souhaite pas utiliser: "Sélection rapide", car l'utilisateur doit rester libre de sélectionner n'importe quels attributs (Avec un angle de rotation quelconque) pour leurs donner un angle indentique à tous.En esperant avoir être clair.
Patrick_35 Posté(e) le 12 novembre 2008 Posté(e) le 12 novembre 2008 Salut A moins que cela soit le même bloc pour essayer d'automatiser la sélection (à condition que l'ordre des attributs sont les mêmes que ceux de la base) , pas de miracle, nentsel. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
ScoAD Posté(e) le 12 novembre 2008 Auteur Posté(e) le 12 novembre 2008 merci, ça a le mérite d'être clair!
(gile) Posté(e) le 12 novembre 2008 Posté(e) le 12 novembre 2008 Salut, Pour sélectionner plusieurs attributs, le plus simple est de les sélectionner un par un dans une boucle et de les stocker dans une liste : (while (and (setq ent (car (nentsel"\nSélectionnez un attribut: "))) (= (cdr (assoc 0 (entget ent))) "ATTRIB") ) (setq lst (cons ent lst)) ) Ou en utilisant cette routine un peu plus élaborée : - les attributs sélectionnés se mettent en surbrillance ;- la sélection d'un attribut déjà sélectionné, dé-sélectionne celui-ci ;- la sélection est validée par Entée, Espace ou clic droit. (defun SelAtt (/ att lst) (setvar "ERRNO" 0) (while (/= (getvar "ERRNO") 52) (if (and (setq ent (car (nentsel"\nSélectionnez un attribut: "))) (= (cdr (assoc 0 (entget ent))) "ATTRIB") ) (if (member ent lst) (progn (setq lst (vl-remove ent lst)) (redraw ent 4) ) (progn (setq lst (cons ent lst)) (redraw ent 3) ) ) ) ) (mapcar (function (lambda (x) (redraw x 4))) lst) lst ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ScoAD Posté(e) le 14 novembre 2008 Auteur Posté(e) le 14 novembre 2008 merci gile,Mais lorsque je teste selatt, AutoCAD me répond:Commande inconnue "SELATT". Appuyez sur F1 pour obtenir de l'aide. Iam don't understand?
ScoAD Posté(e) le 14 novembre 2008 Auteur Posté(e) le 14 novembre 2008 merci gile,Mais lorsque je teste selatt, AutoCAD me répond:Commande inconnue "SELATT". Appuyez sur F1 pour obtenir de l'aide. De ce qui suis me fonctionne pas? (defun c:BOC_ATTROT (/ ) (Présentation) ;;définition des valeurs par défaut (setq BOCINFO1 "0") (setq BOCINFO1 (GETSTRING "Souhaitez vous remettre tout les attributs à un angle de rotation de 0? <0>:" )) (if (= BOCINFO1 "0") (Progn (while (and (setq BOCENT1 (car (nentsel"\nSélectionnez un attribut: "))) (= (cdr (assoc 0 (entget BOCENT1))) "ATTRIB") ) (setq BOCLST (cons BOCENT1 BOCLST)) ) ; (setq BOCSEL1 (ssget '((0 . "ATTRIB")))) ; (while (setq BOCDAT1 (entget BOCLST)) (setq BOCDAT1 (subst (cons 50 (* pi (/ 90 180.0))) (assoc 50 BOCDAT1) BOCDAT1)) (ENTMOD) (ENTUPD) ; ) ) ) ;reset variables (setvar "clayer" BOCLAY) (setvar "cmdecho" 1) (setvar "attdia" BOCATT2) (setvar "attreq" BOCATT1) (setvar "osmode" ACCROCH) (setq *error* temperr);restore *error* (princ) ) Iam don't understand?
(gile) Posté(e) le 14 novembre 2008 Posté(e) le 14 novembre 2008 Salut, SELATT n'est pas une commande, c'est une routine à utiliser dans ton programme comme une fonction LISP. Elle retourne la liste des attributs sélectionnés.si tu veux la tester en ligne de commande, il faut faire : (selatt) Un exemple d'utilisation pour mettre une rotation de 30° à chaque attribut sélectionné : (foreach att (selatt) (setq elst (entget att)) (entmod (subst (cons 50 (angtof "30")) (assoc 50 elst) elst)) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ScoAD Posté(e) le 14 novembre 2008 Auteur Posté(e) le 14 novembre 2008 a d'abord :o merci encore (entmod (subst (cons 50 (angtof "0")) (assoc 50 elst) elst))ça marche mai pas ça: (entmod (subst (cons 50 (angtof BOCINFO1)) (assoc 50 elst) elst)) ???
(gile) Posté(e) le 14 novembre 2008 Posté(e) le 14 novembre 2008 Re, Je ne comprends pas bien ce que tu veux faire. Si tu veux mettre la rotation des attributs à 0, il suffit de faire :(entmod (subst '(50 . 0.0) (assoc 50 elst) elst)) Regarde bien l'aide pour voir le type d'argument requis par chaque fonction.Pour une rotation dans une liste DXF le deuxième terme de la paire doit être un nombre réel représentant la valeur de l'angle en radians. Donc tout dépend de ce que contient la variable BOCINFO1. La fonction angtof convertit une chaîne représentant un angle exprimé en unités angulaires courante (degrés) en un nombre réel représentant ce même angle en radians. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ScoAD Posté(e) le 14 novembre 2008 Auteur Posté(e) le 14 novembre 2008 BOCINFO1, proviens d'un GETREAL donc en millimetre, c'est pour que l'utilisateur dans un angle.
(gile) Posté(e) le 14 novembre 2008 Posté(e) le 14 novembre 2008 BOCINFO1, proviens d'un GETREAL donc en millimetre :casstet: :casstet: La fonction getreal (obtenir un réel, en français) retourne un nombre réel enté par l'utilisateur 3.56 par exemple. Mais ce nombre n'est pas affecté à une unité particulière et peut aussi bien servir à représenter une distance en kilomètres qu'un angle exprimé en degrés, en grades, ou en radians.C'est le programmateur (toi) qui, en fonction de l'invite de getreal, sait ce que représente ce nombre et devra si besoin le convertir dans l'unité nécessaire à la suite du programme. Si tu veux demander à l'utilisateur de spécifier un angle, regarde du côté des fonctions getangle ou getorient.Elles retournent toujours l'angle en radians.Elles permettent à l'utilisateur de spécifier l'angle soit en cliquant 2 points à l'écran soit en entrant l'angle à la ligne de commande. Dans ce dernier cas la valeur entrée est automatiquement convertie de l'unité angulaire courante en radians. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ScoAD Posté(e) le 14 novembre 2008 Auteur Posté(e) le 14 novembre 2008 Merci,Mais je ne comprends vraiment pas pour ce qui suis ne fonctionne pas! (setq BOCINFO1 (getangle "Spécifier le nouvelle angles pour ces attributs à un angle de rotation de O? :" )) ..... (if (and (/= BOCINFO1 "0") (/= BOCINFO1 "o") (/= BOCINFO1 "")) (Progn (foreach att (selatt) (setq elst (entget att)) (entmod (subst (cons 50 BOCINFO1) (assoc 50 elst) elst)) ) ) OK, je suis désolé, j'ai trouvé le probleme, j'ai interverti un O avec un Zéro !Vraiment désolé pour le dérangement,merci de votre aide.[Edité le 14/11/2008 par ScoAD]
(gile) Posté(e) le 14 novembre 2008 Posté(e) le 14 novembre 2008 Attention au type des valeurs : (setq BOCINFO1 (getangle "Spécifier le nouvelle angles pour ces attributs à un angle de rotation de O? :" )) Attribue à BOCINFO1 un nombre réel . (type BOCINFO1) retourne REAL D'un autre côté, (and (/= BOCINFO1 "0") (/= BOCINFO1 "o") (/= BOCINFO1 "")) Compare BOCINFO1, qui est un réel à des chaînes : "0", "o", "". (type "0") retourne STRDonc, l'expression retournera toujours T. Il faut faire(if (/= BOCINFO1 0) ...)Sans les guillemets. Essaye sur la console Visual LISP ou à la ligne de commande (/= 0 "0") Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ScoAD Posté(e) le 17 novembre 2008 Auteur Posté(e) le 17 novembre 2008 merci bien, pour ces explications.
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