Aller au contenu

sélect. plusieurs attributs


Messages recommandés

Posté(e)

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

Posté(e)

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 Damme

Posté(e)

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.

 

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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?

Posté(e)

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?

Posté(e)

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

Posté(e)
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))

 

???

Posté(e)

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

Posté(e)

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

Posté(e)

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]

Posté(e)

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 STR

Donc, 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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité