Aller au contenu

Rotation Blocs et attributs


Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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.

Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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!

Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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.

 

 

Posté(e)

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)
)

Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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)
)

Posté(e)

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

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é