kalos Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 Bonjour, J'aimerai trouver une solution à mon problème. Pour faire simple, j'aimerai savoir s'il y a pas une solution en Lisp d'effectuer une rotation à des blocs tout en gardant les attributs en mode horizontal, et petite précision ces informations de rotation(94° par ex) sont conservées dans un attribut de ce meme bloc. Je remercie vos neurones. kalos
(gile) Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 Salut et bienvenue, Tu peux t'inspirer de ROT ou ROT_0 sur cette page Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
kalos Posté(e) le 2 juillet 2010 Auteur Posté(e) le 2 juillet 2010 Merci à vrai dire je ne me souvenais plus qu'il était dans la liste, c'est déjà un pb de régler :) Je vais voir ce que je peux faire avec ROT_0
(gile) Posté(e) le 2 juillet 2010 Posté(e) le 2 juillet 2010 PS : inutile de re-poster 5 fois le même message... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
kalos Posté(e) le 6 juillet 2010 Auteur Posté(e) le 6 juillet 2010 le probleme reste ouvert! rot_0 marche bien quoique bizarrement axé. "MPT V1.00 Réacteur pour que les coordonnées XYZ d'un bloc correspondent à ses attributs"de Patrick35 pourrait il correspondre à la seconde partie? sachant que j'ai des milliers de blocs à pivoter selon leur valeurs d'attributs.
Patrick_35 Posté(e) le 6 juillet 2010 Posté(e) le 6 juillet 2010 Salut Rot_0 ne fonctionne que si on effectue une opération sur un bloc (rotation, déplacer, copier, etc...) Si tu veux que l'angle de tout les attributs présents soient à 0, tu fais une sélection des blocs (avec attributs), tu parcoures la sélection et les attributs dans lequel tu changes l'angle ps : Pour Cadmin. Il est surprenant de voir le nombre de message de kalos :o @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
kalos Posté(e) le 6 juillet 2010 Auteur Posté(e) le 6 juillet 2010 et je fais ça comment en lisp? parcourir une sélection de bloc, copier la valeur d'attribut rotation et faire pivoter l'objet par cet angle tout en gardant le texte horizontal!
Patrick_35 Posté(e) le 6 juillet 2010 Posté(e) le 6 juillet 2010 Tu créés un jeu de sélection des blocs avec attributs(setq js (ssget "x" '((0 . "INSERT") (66 . 1)))) Tu parcours le jeu de sélection(setq n 0) (while (setq ent (ssname js n)) (setq n (1+ n)) ) En parcourant le jeu de sélection, tu vas rechercher dans chaque bloc les attributs(setq n 0) (while (setq ent (ssname js n)) (setq ent (entget (entnext ent))) (while (/= (cdr (assoc 0 ent)) "SEQEND") ; Tester si c'est la fin des attributs (setq ent (entget (entnext (cdr (assoc -1 ent))))) ) (setq n (1+ n)) ) A chaque attribut trouvé, je force la valeur à 0(setq n 0) (while (setq ent (ssname js n)) (setq ent (entget (entnext ent))) (while (/= (cdr (assoc 0 ent)) "SEQEND") (if (= (cdr (assoc 0 ent)) "ATTRIB") ; tester si c'est un attribut (progn (setq ent (subst (cons 50 0) (assoc 50 ent) ent)) ; modifier la valeur (entmod ent) ; mettre à jour ) ) (setq ent (entget (entnext (cdr (assoc -1 ent))))) ) (setq n (1+ n)) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
kalos Posté(e) le 7 juillet 2010 Auteur Posté(e) le 7 juillet 2010 Merci beaucoup Patrick!!! Je vais plancher la dessus!
kalos Posté(e) le 8 juillet 2010 Auteur Posté(e) le 8 juillet 2010 question: comment recupere t'on le point d'insertion XY du bloc. sous quelle forme il est? "X,Y"?information réutilisé comme point de base de la rotation. il est clair qu 'aprés je n'aurai plus qu'à parcourir ma selection, recuperer cette coordonnée à chaque fois pour le bloc, effectuer ma rotation (rotation "X,Y" "Attribut_angle_de_rotation") Attribut_angle_de_rotation étant spécifié dans chaque bloc.
Patrick_35 Posté(e) le 8 juillet 2010 Posté(e) le 8 juillet 2010 Salut Le code dxf 10 t'indique les coordonnéesLe code dxf 50 est celui de l'angle de l'objet (en radiant) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
kalos Posté(e) le 9 juillet 2010 Auteur Posté(e) le 9 juillet 2010 quel est l'équivalent de trans pour faire une rotation? ce code 50 est entré à quel niveau?voici ma maquette qui ne marche pas puisque adapter à partir de MPT est ce que strcase (* (/ pi 180) Eti_rotation) fonctionne? Merci. (defun c:Attrot(/ bl js n rotation Nom_bloc Eti_rotation) (setq js (ssget "_p")) (setq Nom_bloc "Nom_bloc" Eti_rotation "ROTATION" pi "3,1415926535897932384626433832795" ) (if js (progn (setq n 0) (while (ssname js n) (setq bl (entget (ssname js n))) (if (and (eq (cdr (assoc 0 bl)) "INSERT") (eq (strcase (cdr (assoc 2 bl))) (strcase Nom_bloc))) (if (cdr (assoc 66 bl)) (progn (setq rotation (trans (cdr (assoc 50 bl)) (cdr (assoc -1 bl)) 1)) (while (not (eq (cdr (assoc 0 bl)) "SEQEND")) (if (eq (cdr (assoc 0 bl)) "ATTRIB") (cond ((eq (strcase (cdr (assoc 2 bl))) (strcase (* (/ pi 180) Eti_rotation)) (setq bl (subst (cons 1 (rtos (car rotation))) (assoc 1 bl) bl)) (entmod bl) (entupd (cdr (assoc -1 bl))) ) ) ) (setq bl (entget (entnext (cdr (assoc -1 bl))))) ) ) ) ) (setq n (1+ n)) ) ) ) (princ) )
Patrick_35 Posté(e) le 9 juillet 2010 Posté(e) le 9 juillet 2010 Salut Comme c'est l'attribut que tu souhaites modifier, c'est donc là que le code dxf doit s'appliquer.Pas besoin de rotation, il suffit de mettre la valeur de ce code à 0, tout simplement. ps : la fonction pi existe ; Convertir des radiants en degrées (defun deg(ang) (* 180.0 (/ ang pi)) ) ; Convertir des degrées en radiants (defun rad (ang) (* pi (/ ang 180.0)) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
kalos Posté(e) le 9 juillet 2010 Auteur Posté(e) le 9 juillet 2010 ah non je ne veux pas modifier l'attribut mais la propriété rotation avec la valeur qu est dans l'attribut
Patrick_35 Posté(e) le 9 juillet 2010 Posté(e) le 9 juillet 2010 C'est bien ce que je viens de dire :casstet: Un exemple (setq att (entget (car (nentsel)))) ; sélection d'un attribut (setq att (subst (cons 50 0) (assoc 50 att) att)) ; on force l'angle de l'attribut à 0 (entmod att) ; on met l'attribut à jour @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
kalos Posté(e) le 12 juillet 2010 Auteur Posté(e) le 12 juillet 2010 ceci pourrait m'aider: (defun c:BlockRot ( / SelSet Counter EntName Obj ) (princ "Command: Rotate selected Blocks 180 degrees " ) (if (setq SelSet (ssget '((0 . "INSERT" ))) ) (progn (setq Counter 0 ) (vl-load-com) (while (setq EntName (ssname SelSet Counter )) (setq Obj (vlax-ename->vla-Object EntName ) ) (vlax-put-property Obj "Rotation" (+ (vlax-get Obj "Rotation" ) pi ) ) (vlax-release-Object Obj ) (setq Counter (1+ Counter ) ) ) ) (princ ". . no Block selected ! " ) ) (princ) )
kalos Posté(e) le 12 juillet 2010 Auteur Posté(e) le 12 juillet 2010 je pensai que ca aurait été plus simple...
(gile) Posté(e) le 12 juillet 2010 Posté(e) le 12 juillet 2010 Salut, (vlax-release-Object Obj ) me semble parfaitement inutile.On utilise cette fonction pour libérer les ressources quand on a ouvert ou créé un objet extérieur à AutoCAD (un processus Excel par exemple).Pour les objets AutoCAD comme tes blocs, c'est AutoCAD qui se charge de la libération des ressource à la fermeture du dessin. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour 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