Aller au contenu

Messages recommandés

Posté(e)

Salut,

je me suis écris un petit code le plus simple que je sache faire (pour l'instant) pour faire une rotation de fenêtre de 90°.

Mon problème étant que la rotation de la VUE se fait par rapport au 0,0,0 du SCG (j'ai l'impression), donc cela fausse la vue....

Et je ne sais comment faire....

 

(defun c:rot-vue-fenet ()

 (while
   (not (and (setq fenetre (car (entsel "\n Sélectionner une fenêtre :")))
      (or (equal (cdr (assoc 0 (entget fenetre))) "VIEWPORT")
	  (equal (cdr (assoc 0 (entget (cdr (assoc 330 (entget fenetre)))))) "VIEWPORT")
	  )
      )
 )
   )
 
(setq vla-fenetre (vlax-ename->vla-object fenetre))
;(setq Propriété_vla-fenetre (vlax-dump-object vla-fenetre T))

 (setq Haut (vlax-get-property vla-fenetre 'Height)
Larg (vlax-get-property vla-fenetre 'Width)
custom-scale (vlax-get-property vla-fenetre 'CustomScale)
Twist-Angle (vlax-get-property vla-fenetre 'TwistAngle))  

 (vlax-put-property vla-fenetre 'Height Larg)
 (vlax-put-property vla-fenetre 'Width Haut)
 (vlax-put-property vla-fenetre 'TwistAngle (+ Twist-Angle (/ pi -2)))
 (vlax-put-property vla-fenetre 'CustomScale custom-scale)
 )

 

merci d'avance !....

 

[Edité le 24/1/2007 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Je m'étais essayé a cet exercice

 

Mais en vlax ça condense, bravo

 

Une erreur cependant dans ton code

(setq vla-fenetre (vlax-ename->vla-object fenetre))

devrait être

(setq vla-fenetre (vlax-ename->vla-object sel))

 

Autocad n'accepte pas la rotation des fenêtres, sauf avec les grips ou le comportement ressemble plus à un déplacé circulaire qu'une rotation.

 

Essayé de supprimer déja (vlax-put-property vla-fenetre 'TwistAngle (+ Twist-Angle (/ pi -2)))

et voir ce que tu peux faire par la suite.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Bonuscad, merci de ta réponse.

 

Je m'étais essayé a cet exercice

Je l'avais trouvé !.... mais je voulais le simplifier.... et me mettre à l'épreuve....

 

Une erreur cependant dans ton code

(setq vla-fenetre (vlax-ename->vla-object fenetre))

devrait être

(setq vla-fenetre (vlax-ename->vla-object sel))

En effet.... merci ! ... une erreur de copier/coller (le bout de code de selection de fenêtre)

J'édite mon message précédent.

 

Autocad n'accepte pas la rotation des fenêtres, sauf avec les grips ou le comportement ressemble plus à un déplacé circulaire qu'une rotation.

Je ne fait pas de rotation de fenêtre.... j'inverse la hauteur avec la longueur....

 

Essayé de supprimer déja (vlax-put-property vla-fenetre 'TwistAngle (+ Twist-Angle (/ pi -2)))

Je ne vois pas... ça c'est ce qui me fait retourner la vue.... mais peut-être que je ne comprend pas....

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Pfffffffffffff!...

Je bloque lamentablement....

 

TwistAngle me fait tourner la vue selon le point de vue....

 

Je pensais qu'il suffisait que je modifie le "Target" et que je lance TwistAngle, mais non...

 

... je suis planté ....

 

Je vous joint ci-dessous mon code de travail (donc super brouillon, désolé).... si vous avez une idée ....

 

(defun c:tt ()

 (if (= (getvar "TILEMODE") 1) 
   (princ "\n ** Cette commande n'est valable que dans l'espace papier. **")
   (progn
  (if (= (getvar "CVPORT") 1)
    (progn
      (while
	(not (and (setq fenetre (car (entsel "\n Sélectionner une fenêtre :")))
		  (or (equal (cdr (assoc 0 (entget fenetre))) "VIEWPORT")
		      (equal (cdr (assoc 0 (entget (cdr (assoc 330 (entget fenetre)))))) "VIEWPORT")
		      )
		  )
	     )
	)
      (setq ent-fen (entget fenetre)
	    id_fenetre (cdr (assoc 69 ent-fen)))
      
      (if (= id_fenetre nil)
	(progn
	  (setq ent-fen (entget (cdr (assoc 330 ent-fen)))
		id_fenetre (cdr (assoc 69 ent-fen)))
	  )
	)

      (command "_.MSPACE")
      (setvar "CVPORT" id_fenetre)
      )
    )

     ;(cdr (assoc 17 (entget fenetre))) 
     
     (setq centre-fenetre (getvar "VIEWCTR"))
     (setq Target (getvar "target"))
     
     (setq cen_vp (trans centre-fenetre 0 2))
     (setq cen_trg (trans Target 0 2))
     
     (command "_.PSPACE")
     
     (setq centre-fenetre (trans cen_vp 2 3))
     (setq Target-papier (trans cen_trg 2 3))
 
(setq vla-fenetre (vlax-ename->vla-object fenetre))
;(setq Propriété_vla-fenetre (vlax-dump-object vla-fenetre T))

 (setq Haut (vlax-get-property vla-fenetre 'Height)
Larg (vlax-get-property vla-fenetre 'Width)
custom-scale (vlax-get-property vla-fenetre 'CustomScale)
Twist-Angle (vlax-get-property vla-fenetre 'TwistAngle)
sauv-center (vlax-get-property vla-fenetre 'Center)
;Target (vlax-get-property vla-fenetre 'Target)
;center (vlax-get-property vla-fenetre 'center)
)

 ;(vlax-put-property vla-fenetre 'Target (vlax-3D-point Target))

 (vlax-put-property vla-fenetre 'TwistAngle (+ Twist-Angle (/ pi -2)))

 (vlax-put-property vla-fenetre 'Center (vlax-3D-point Target-papier))
   
 (vlax-put-property vla-fenetre 'Height Larg)
 (vlax-put-property vla-fenetre 'Width Haut)

 (vlax-put-property vla-fenetre 'CustomScale custom-scale)

 

 
     ;(vlax-put-property vla-fenetre 'Target (vlax-3D-point '(0 0 0)))

 ;(vlax-put-property vla-fenetre 'Center sauv-center) 

 )
 )
 )

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut,

 

Vite fait d'après ton code, "à mettre au propre" ;)

 

(defun c:tt (/ acDoc PapSp ModSp fenetre ent-fen id_fenetre)
 (vl-load-com)

 (if (= (getvar "TILEMODE") 1)
   (princ
     "\n ** Cette commande n'est valable que dans l'espace papier. **"
   )
   (progn
     (if (= (getvar "CVPORT") 1)
(progn
  (while
    (not
      (and
	(setq fenetre (car (entsel "\n Sélectionner une fenêtre :")))
	(or (equal (cdr (assoc 0 (entget fenetre))) "VIEWPORT")
	    (equal
	      (cdr (assoc 0 (entget (cdr (assoc 330 (entget fenetre))))))
	      "VIEWPORT"
	    )
	)
      )
    )
  )
  (setq	ent-fen	   (entget fenetre)
	id_fenetre (cdr (assoc 69 ent-fen))
  )

  (if (= id_fenetre nil)
    (progn
      (setq ent-fen    (entget (cdr (assoc 330 ent-fen)))
	    id_fenetre (cdr (assoc 69 ent-fen))
      )
    )
  )

  (command "_.MSPACE")
  (setvar "CVPORT" id_fenetre)
)
     )

     ;; Centre de la fenêtre dans le SCG
     (setq centre-fenetre (getvar "VIEWCTR"))

     (command "_.PSPACE")


     (setq vla-fenetre (vlax-ename->vla-object fenetre))

     (setq Haut	 (vla-get-Height vla-fenetre)
    Larg	 (vla-get-Width vla-fenetre)
    custom-scale (vla-get-CustomScale vla-fenetre)
    Twist-Angle	 (vla-get-TwistAngle vla-fenetre)
    Target	 (vlax-get vla-fenetre 'Target)
     )

     ;; Calcul de la nouvelle cible en fonction de la rotation 
     (setq new-target
     (polar centre-fenetre
	    (+ (angle centre-fenetre Target) (/ pi 2))
	    (distance centre-fenetre Target)
     )
     )


     (vla-put-TwistAngle vla-fenetre (+ Twist-Angle (/ pi -2)))

     (vla-put-Target vla-fenetre (vlax-3d-point new-target))

     (vla-put-Height vla-fenetre Larg)
     (vla-put-Width vla-fenetre Haut)

     (vla-put-CustomScale vla-fenetre custom-scale)

   )
 )
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

bon... ben encore une fois merci !!!!!

 

Le temps de le faire....

réponse à 8h30.....

... tu est un lève tôt !!!!

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut,

J'ai un peu remanier le code afin qu'il puisse accepter les "fenêtre polylignes" (que la vue sera retourner, pas la forme de la fenêtre), et qu'il accepte la rotation dans une fenêtre active.

 

 (defun c:rf (/ CENTRE-FENETRE CUSTOM-SCALE ENT-FEN FENETRE HAUT ID_FENETRE LARG NEW-TARGET TARGET TWIST-ANGLE
     VLA-FENETRE ID_FENETRE)
 (vl-load-com)
 (if (= (getvar "TILEMODE") 1)
   (princ "\n ** Cette commande n'est valable que dans l'espace papier. **")
   (progn
     (if (= (getvar "CVPORT") 1)
(progn
  ; selectionner une fenêtre
  (while (not (and (setq fenetre (car (entsel "\n Sélectionner une fenêtre :")))
		   (or (equal (cdr (assoc 0 (entget fenetre))) "VIEWPORT")
		       (equal (cdr (assoc 0 (entget (cdr (assoc 330 (entget fenetre)))))) "VIEWPORT")))))
  (setq ent-fen (entget fenetre)
	id_fenetre (cdr (assoc 69 ent-fen))
	repere-fen-active "NON")
  (if (= id_fenetre nil)
    (progn
      (setq fenetre (cdr (assoc 330 ent-fen))
	    ent-fen (entget fenetre)
	    id_fenetre (cdr (assoc 69 ent-fen)))))
  (command "_.MSPACE")
  (setvar "CVPORT" id_fenetre)
  (setq vla-fenetre (vlax-ename->vla-object fenetre))
  )
(progn
  ; selection fenêtre active
  (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
	vla-fenetre (vla-get-ActivePViewport AcDoc)
	repere-fen-active "OK")
  )
) ; fin de choix fenêtre

     ;; Centre de la fenêtre dans le SCG
     (setq centre-fenetre (getvar "VIEWCTR"))
     
     (command "_.PSPACE")    

     	  (setq Haut (vla-get-Height vla-fenetre)
	Larg (vla-get-Width vla-fenetre)
	custom-scale (vla-get-CustomScale vla-fenetre)
	Twist-Angle (vla-get-TwistAngle vla-fenetre)
	Target (vlax-get vla-fenetre 'Target)
	)

  ;; Calcul de la nouvelle cible en fonction de la rotation
  (setq new-target (polar centre-fenetre (+ (angle centre-fenetre Target) (/ pi 2))
			  (distance centre-fenetre Target)))

  (vla-put-TwistAngle vla-fenetre (+ Twist-Angle (/ pi -2)))
  (vla-put-Target vla-fenetre (vlax-3d-point new-target))
  (vla-put-Height vla-fenetre Larg)
  (vla-put-Width vla-fenetre Haut)
  (vla-put-CustomScale vla-fenetre custom-scale)
     
   (if (equal repere-fen-active "OK")
     (command "_.MSPACE")
     )        
     )    
   )
)

 

... Par contre je n'ai pas (encore) trouvé le moyen de remplacer les (command "_.MSPACE") et (command "_.PSPACE") en vl....

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut,

 

Pour faire en VLA, après avoir fait (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)))

 

Tu peux remplacer :

(if (= (getvar "TILEMODE") 1) ...)

par :

(if (= (vla-get-ActiveSpace AcDoc) 1) ...)

 

Pour passer dans l'espace objet (met TILEMODE à 1)

(vla-put-ActiveSpace AcDoc acModelSpace)

 

Pour passer dans l'espace présentation (met TILEMODE à 0)

(vla-put-ActiveSpace AcDoc acPaperSpace)

 

Une fois dans l'espace présentation, on ne peut utiliser (vla-put-ActivePViewport ...) pour activer une fenêtre précise que si une fenêtre est déjà active.

Donc pour activer une fenêtre -ce qui correspond à (command "_mspace") :

(vla-put-Mspace AcDoc :vlax-true)

 

puis pour en activer une spécifique :

(vla-put-ActivePViewport AcDoc vla-fenetre)

 

 

 

 

 

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re (suite)

 

On peut aussi remplacer :

 

(if (= (getvar "CVPORT") 1) ...)

par :

(if (= (vla-get-Mspace AcDoc) :vlax-false) ...)

 

Sinon, je ne sais si tu veux faire faire une rotation aux fenêtres polygonales (comme pour les fenêtres rectangulaires), si c'est le cas, il faut faire faire la rotation à l'objet qui a servi à faire la fenêtre.

Récupérer l'objet :

(if (/= (cdr (assoc 0 ent-fen)) "VIEWPORT")

(progn

[surligneur](setq pg-fen (vlax-ename->vla-object fenetre)[/surligneur]

fenetre (cdr (assoc 330 ent-fen))

ent-fen (entget fenetre)

id_fenetre (cdr (assoc 69 ent-fen))

)

)

)

 

J'ai changé l'expression pour la condition puisque l'ID-fenetre n'est plus utile, ensuite tu fais :

(vla-put-Mspace AcDoc :vlax-true)

(setq vla-fenetre (vlax-ename->vla-object fenetre))

(vla-put-ActivePViewport AcDoc vla-fenetre)

 

À la fin, pour faire la rotation du polygone :

(if pg-fen

(vla-rotate pg-fen (vla-get-Center vla-fenetre) (/ pi 2))

)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Super ! encore un grand merci !

 

je ne sais si tu veux faire faire une rotation aux fenêtres polygonales (comme pour les fenêtres rectangulaires),

Je ne pense pas que ce soit utile : si l'on fait des fenêtres polygonales, c'est pour s'adapter au objets proches de la fenêtre. Donc je ne vois pas la raison de la faitre tourner (et si c'est une fenêtre cercle, la faire tourner serait pour le fun ... :P )

mais merci pour tes exemples, je me les notes !

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Selon les conseils de (gile), j'ai modifié la routine en enlevant les "command"....

 

Par contre, (vla-put-Mspace AcDoc :vlax-true) fonctionne dans cette routine étrangement avec les fenêtres rectangles : elle s'active bien, mais elle ne se "surligne" pas... (cela fonctionne en "direct" mais pas quand on fait fonctionner la routine .... :casstet: )

 

(defun c:rf (/ ACDOC CENTRE-FENETRE CUSTOM-SCALE ENT-FEN FENETRE HAUT
      ID_FENETRE LARG NEW-TARGET REPERE-FEN-ACTIVE TARGET TWIST-ANGLE
      VLA-FENETRE)
  
  (vl-load-com)
  (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  
  (if (= (vla-get-ActiveSpace AcDoc) 1)
    (princ "\n ** Cette commande n'est valable que dans l'espace papier. **")
    (progn
      (if (= (vla-get-Mspace AcDoc) :vlax-false)
 (progn
   ; selectionner une fenêtre
   (while (not (and (setq fenetre (car (entsel "\n Sélectionner une fenêtre :")))
		    (or (equal (cdr (assoc 0 (entget fenetre))) "VIEWPORT")
			(equal (cdr (assoc 0 (entget (cdr (assoc 330 (entget fenetre)))))) "VIEWPORT")))))
   (setq ent-fen (entget fenetre)
	 id_fenetre (cdr (assoc 69 ent-fen)))
   (if (= id_fenetre nil)
     (progn
       (setq fenetre (cdr (assoc 330 ent-fen))
	     ent-fen (entget fenetre)
	     id_fenetre (cdr (assoc 69 ent-fen)))))
   (vla-put-Mspace AcDoc :vlax-true)
   (setvar "CVPORT" id_fenetre)
   (setq vla-fenetre (vlax-ename->vla-object fenetre))
   )
 (progn
   ; selection fenêtre active
   (setq vla-fenetre (vla-get-ActivePViewport AcDoc)
	 repere-fen-active "OK")
   ))

      ;; Centre de la fenêtre dans le SCG
      (setq centre-fenetre (getvar "VIEWCTR"))

      (vla-put-Mspace AcDoc :vlax-false)

      (setq Haut (vla-get-Height vla-fenetre)
     Larg (vla-get-Width vla-fenetre)
     custom-scale (vla-get-CustomScale vla-fenetre)
     Twist-Angle (vla-get-TwistAngle vla-fenetre)
     Target (vlax-get vla-fenetre 'Target))

      ;; Calcul de la nouvelle cible en fonction de la rotation
      (setq new-target (polar centre-fenetre (+ (angle centre-fenetre Target) (/ pi 2))
		       (distance centre-fenetre Target)))

      (vla-put-TwistAngle vla-fenetre (+ Twist-Angle (/ pi -2)))
      (vla-put-Target vla-fenetre (vlax-3d-point new-target))
      (vla-put-Height vla-fenetre Larg)
      (vla-put-Width vla-fenetre Haut)
      (vla-put-CustomScale vla-fenetre custom-scale)

      (if (equal repere-fen-active "OK")
 (vla-put-Mspace AcDoc :vlax-true)
 )
      )
    )
)

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut,

 

Si tu veux que le cadre de la fenêtre soit surligné quand la fenêtre est activée, il faut ajouter un :

(vla-Regen acDoc acActiveViewport)

après le

(vla-put-Mspace AcDoc :vlax-true)

 

Tu peux aussi remplacer :

(setvar "CVPORT" id_fenetre)

par

(vla-put-ActiveViewport AcDoc vla-fenetre) -ce qui permet d'éviter l'utilisation de ID_fenentre

 

et si tu veux vraiment éliminer tous les getvar/setvar, remplacer :

(setq centre-fenetre (getvar "VIEWCTR"))

par

(setq centre-fenetre (trans (trans (vla-get-Center vla-fenetre) 3 2) 2 0))

 

 

[Edité le 30/1/2007 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re,

merci.

Tu peux aussi remplacer :

(setvar "CVPORT" id_fenetre)

par

(vla-put-ActiveViewport AcDoc vla-fenetre

faute de frappe : le type est vla-get-Active PViewport

 

et si tu veux vraiment éliminer tous les getvar/setvar, remplacer :

(setq centre-fenetre (getvar "VIEWCTR"))

par

(setq centre-fenetre (trans (trans (vla-get-Center vla-fenetre) 3 2) 2 0))

Je comprends, et j'essaye de le faire, d'éviter l'utilisation des "command", mais pourquoi éviter "getvar" ?

 

---------------------------------------------

Codes modifié (sauf getvar)

 

 (defun c:frv (/ ACDOC CENTRE-FENETRE CUSTOM-SCALE ENT-FEN FENETRE HAUT LARG
      NEW-TARGET REPERE-FEN-ACTIVE TARGET TWIST-ANGLE VLA-FENETRE)

 (vl-load-com)
 (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)))

 (if (= (vla-get-ActiveSpace AcDoc) 1)
   (princ "\n ** Cette commande n'est valable que dans l'espace papier. **")
   
   (progn
     (if (= (vla-get-Mspace AcDoc) :vlax-false)
(progn
  ; selectionner une fenêtre
  (while (not (and (setq fenetre (car (entsel "\n Sélectionner une fenêtre :")))
		   (or (equal (cdr (assoc 0 (entget fenetre))) "VIEWPORT")
		       (equal (cdr (assoc 0 (entget (cdr (assoc 330 (entget fenetre)))))) "VIEWPORT")))))
  (setq ent-fen (entget fenetre))

  (if (not (equal (cdr (assoc 0 (entget fenetre))) "VIEWPORT"))
    (setq fenetre (cdr (assoc 330 (entget fenetre)))))

  (setq vla-fenetre (vlax-ename->vla-object fenetre))
	  
  (vla-put-Mspace AcDoc :vlax-true)	  
  (vla-put-ActivePViewport AcDoc vla-fenetre) 
  )
(progn
  ; selection fenêtre active
  (setq vla-fenetre (vla-get-ActivePViewport AcDoc)
	repere-fen-active "OK")
  )
)

     ;; Centre de la fenêtre dans le SCG
     (setq centre-fenetre (getvar "VIEWCTR"))

     (vla-put-Mspace AcDoc :vlax-false)

     (setq Haut (vla-get-Height vla-fenetre)
    Larg (vla-get-Width vla-fenetre)
    custom-scale (vla-get-CustomScale vla-fenetre)
    Twist-Angle (vla-get-TwistAngle vla-fenetre)
    Target (vlax-get vla-fenetre 'Target))

     ;; Calcul de la nouvelle cible en fonction de la rotation
     (setq new-target (polar centre-fenetre (+ (angle centre-fenetre Target) (/ pi 2))
		      (distance centre-fenetre Target)))

     (vla-put-TwistAngle vla-fenetre (+ Twist-Angle (/ pi -2)))
     (vla-put-Target vla-fenetre (vlax-3d-point new-target))
     (vla-put-Height vla-fenetre Larg)
     (vla-put-Width vla-fenetre Haut)
     (vla-put-CustomScale vla-fenetre custom-scale)

     (if (equal repere-fen-active "OK")
(progn
  (vla-put-Mspace AcDoc :vlax-true)
  (vla-Regen acDoc acActiveViewport))
)
     )
   )
)

 

 

 

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

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é