Bred Posté(e) le 23 janvier 2007 Posté(e) le 23 janvier 2007 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...
bonuscad Posté(e) le 23 janvier 2007 Posté(e) le 23 janvier 2007 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
Bred Posté(e) le 24 janvier 2007 Auteur Posté(e) le 24 janvier 2007 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...
Bred Posté(e) le 24 janvier 2007 Auteur Posté(e) le 24 janvier 2007 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...
(gile) Posté(e) le 25 janvier 2007 Posté(e) le 25 janvier 2007 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
Bred Posté(e) le 25 janvier 2007 Auteur Posté(e) le 25 janvier 2007 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...
Bred Posté(e) le 29 janvier 2007 Auteur Posté(e) le 29 janvier 2007 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...
(gile) Posté(e) le 29 janvier 2007 Posté(e) le 29 janvier 2007 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
(gile) Posté(e) le 29 janvier 2007 Posté(e) le 29 janvier 2007 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
Bred Posté(e) le 29 janvier 2007 Auteur Posté(e) le 29 janvier 2007 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...
Bred Posté(e) le 29 janvier 2007 Auteur Posté(e) le 29 janvier 2007 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...
(gile) Posté(e) le 30 janvier 2007 Posté(e) le 30 janvier 2007 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
Bred Posté(e) le 30 janvier 2007 Auteur Posté(e) le 30 janvier 2007 Re,merci. Tu peux aussi remplacer :(setvar "CVPORT" id_fenetre)par (vla-put-ActiveViewport AcDoc vla-fenetrefaute 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...
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