Récupérer la valeur de rotation pour modfier un angle dynamique

Fermé
Xavier - 8 août 2013 à 08:40
 Xavier - 10 août 2013 à 10:27
Bonjour,

J'ai plusieurs blocs dynamique avec un jeu de rotation nommé « Angle1 »
Je souhaiterais savoir s'il existe un lisp qui récupère la valeur de rotation du bloc pour l'inscrire en valeur négative dans Angle1.

Merci
A voir également:

1 réponse

Bonjour,

Je ne pense pas que tu puisses trouver un Lisp tout fait pour ça.

Si ça peut t'aider, voici une fonction qui renvoie l'angle (en degrés) d'un bloc.
(/ (* (cdr (assoc 50 (entget (car (entsel))))) 180) pi)

Copier/Coller cette fonction sur la ligne de commande et selectionner un bloc.

A+.
0
Merci, je récupère bien l'angle de rotation du bloc,

Mais existe-t-il ? (je sais... j'insiste mais vu le nombre de plans et de blocs à modifier..) un lisp ou des bouts de codes qui :

Permet de parcourir tous les blocs dynamique du dessin
et un autre pour écrire dans la propriété Angle1.

Peut-être qu'avec quelques exemples et morceaux de codes je pourrais m'en sortir ?
0
Avant d'aller plus loin, c'est quoi la propriété Angle1?
Je ne connais pas cette propriété d'un block.
Ce ne serait pas plutôt un attribut?
0
Bonjour Yoda, désolé de ne répondre que maintenant mais je n'ai pas d'ordinateur chez moi.

Je confirme qu'Angle1 n'est pas un attribut mais une propriété.

Tous les blocs sont faits de la même manière et contiennes un paramètre avec une action de rotation (par défaut le nom de l'étiquettes de propriété est Angle1).

Mon souci est que la rotation du bloc est indépendante de la rotation du paramètre dynamique, je cherche donc à avoir la même valeur mais en négatif de cette manière quel que soit l'angle de rotation du bloc le symbole ayant l'étiquette Angle1 reste horizontal.
0
Bonjour,

Ce que tu appelle étiquette, c'est un attribut, et Angle1 est le nom de cet attribut.
J'ai déniché sur le net un lisp que j'ai un peu adapté.
Faire un essai sur une copie.
Charger le lisp et taper rot_att sur la ligne de commande. Tiens moi au courant.

Voici le lisp (à copier dans un fichier nommé rot_att.lsp)

;ROTATION DES ATTRIBUTS D UN BLOC
(defun c:rot_att()

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

;En parcourant le jeu de sélection, tu vas rechercher dans chaque bloc les attributs
  
  (setq ent (entget (entnext ent))) 
 
  (while (/= (cdr (assoc 0 ent)) "SEQEND") ; Tester si c'est la fin des attributs 
 
 ;A chaque attribut trouvé, je force la valeur à 0
  (while (/= (cdr (assoc 0 ent)) "SEQEND") 
 
    (if (and (= (cdr (assoc 0 ent)) "ATTRIB") (= (cdr (assoc 2 ent)) "ANGLE1")); tester si c'est un attribut  nommé ANGLE1
 
      (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)) 

)
)
0
Je connais ce lisp je crois qu'il est de Patrick_35 mais ne correspond pas du tout à la situation.

Je m'exprime mal, merci pour ta patience .... Hic !! Je vais tenter par l'exemple :

Tu fais un bloc avec dedans 2 rectangles
Sur l'un des rectangle tu crées un jeu de paramètre de rotation (par défaut Angle1)
Maintenant les propriétés du bloc en « divers » il y a Nom, Rotation, etc...
Dans « Personnalisé » il y a Angle1, Position1 X, etc...
La rotation s'effectue sur les deux rectangle alors que l'angle sur un seul

Ce matin j'ai tenté un truc du genre ...

(defun C:angle (/ bl pr ang rot)
(vl-load-com)
(setq bl (vlax-ename->vla-object (car (entsel)))
pr (vlax-invoke bl 'getdynamicblockproperties) 
ang (nth 0 pr) 
)
(set rot (* (cdr (assoc 50 (entget (car (entsel))))) 180) -pi) 
(vlax-put ang 'value rot)
)


Mais ça ne marche pas ... oups !
0