Aller au contenu

Même zoom qu\'un dessin source


Messages recommandés

Posté(e)

Je souhaiterais faire correspondre un zoom en espace objet d'un dessin dwg cible par rapport à un zoom en espace objet d'un dessin dwg ouvert, les dessins ouverts sont dans la même session AutoCAD (MAP).

 

Mon algorithme serait le suivant :

 

1 Si deux dwg seulement ouverts alors prendre le zoom de l'autre desssin (source) et l'appliquer dans le dessin courant (cible).

2 Sinon sélectionnez un dwg source dans une liste des dessins ouverts et de faire le zoom dans le dessin courant (cible).

 

 

Voici une ébauche de la fonction de mise en place du zoom :

(defun c:affiche_zoom ()

(setq hauteur_ecran (getvar "viewsize"));récupéré dans le dessin source

(setq centre_ecran  (getvar "viewctr"));récupéré dans le dessin source

(command "zoom" "c" centre_ecran  hauteur_ecran);zoom centre dans le dessin cible

);fin defun affiche_zoom

 

 

Pour la suite comment récupérer des valeurs de variables sans aller sur le dessin source.

 

Merci pour vos développements,

 

A plus

Posté(e)

Bonjour

 

je pense qu'il est nécessaire de passer par un fichier tampon

 

l'exemple que je te donne écrit dans le fichier "testzoom.txt"

en lançant zoom1 dans le dessin source

puis en lançant zoom2 dans le dessin cible

tu vas lire les données enregistrées

et faire le zoom avec les mêmes valeurs

bien sû il faut loader le lisp dans les deuc fichiers.

 

est-ce que çà fonctionne ?

est-ce çà répond à tes besoins ?

(defun c:zoom1()

(setq fichier (strcat "C:\\testzoom.txt"))

(setq f (open fichier "w"))

 

(setq hauteur_ecran (getvar "viewsize")

centre_ecran (getvar "viewctr")

champ1 (rtos hauteur_ecran 2 3)

champ2 (rtos (car centre_ecran) 2 3)

champ3 (rtos (cadr centre_ecran) 2 3)

champ4 (rtos (caddr centre_ecran) 2 3)

)

 

(write-line champ1 f)

(write-line champ2 f)

(write-line champ3 f)

(write-line champ4 f)

 

(close f)

(command "zoom" "c" centre_ecran hauteur_ecran)

)

 

;++++++++++++++++++++++++

 

(defun c:zoom2()

 

(setq fichier "C:\\testzoom.txt")

(setq f (open fichier "r"))

 

(setq hauteur_ecran (read-line f))

(setq centre_ecran (list (atof (read-line f))

(atof (read-line f))

(atof (read-line f))

)

)

(command "zoom" "c" centre_ecran hauteur_ecran)

)

 

amicalement

Posté(e)

Salut,

 

J'ai essayé de faire quelque chose qui réponde à la demande.

Si seulement 2 dessins sont ouvert le zoom de la fenêtre active du dessin non actif est appliqué au dessin actif.

Si plus de 2 dessins sont ouverts, on choisit le dessin source dans une boite de dialogue.

Fonctionne avec les vues 3d.

 

;; ZDOC (gile)
;; Applique à la fenêtre active du dessin courant le zoom le la fenêtre active du dessin sélectionné
;; Si un seul autre dessin est ouvert, il n'y a pas de sélection

(defun c:zdoc (/ lst source choice svp tvp cen)
 (vl-load-com)
 (or *acad* (setq *acad* (vlax-get-acad-object)))
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
 (vlax-for doc (vla-get-Documents *acad*)
   (if (not (equal *acdoc* doc))
     (setq lst (cons (cons (vla-get-Name doc) doc) lst))
   )
 )
 (if (    (setq source (cdar lst))
   (if (setq choice (Listbox "Fichier source"
                             nil
                             (mapcar '(lambda (x) (cons (car x) (car x))) lst)
                             1
                    )
       )
     (setq source (cdr (assoc choice lst)))
   )
 )
 (if source
   (progn
     (vla-delete (vla-get-ActiveViewport source))
     (setq svp (vla-get-ActiveViewport source)
           tvp (vla-get-ActiveViewport *acdoc*)
     )
     (foreach p '(Direction Target Height Width Center)
       (vlax-put-property tvp p (vlax-get-property svp p))
     )
     (vla-put-ActiveViewport *acdoc* tvp)
   )
 )
 (princ)
)

;; ListBox (gile)
;; Boite de dialogue permettant un ou plusieurs choix dans une liste
;;
;; Arguments
;; title : le titre de la boite de dialogue (chaîne)
;; msg ; message (chaîne), "" ou nil pour aucun
;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...)
;; flag : 0 = liste déroulante
;;        1 = liste choix unique
;;        2 = liste choix multipes
;;
;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2)
;;
;; Exemple d'utilisation
;; (listbox "Présentation" "Choisir une présentation" (mapcar 'cons (layoulist) (layoutlist)) 1)

(defun ListBox (title msg keylab flag / tmp file dcl_id choice)
 (setq tmp  (vl-filename-mktemp "tmp.dcl")
       file (open tmp "w")
 )
 (write-line
   (strcat "ListBox:dialog{label=\"" title "\";")
   file
 )
 (if (and msg (/= msg ""))
   (write-line (strcat ":text{label=\"" msg "\";}") file)
 )
 (write-line
   (cond
     ((= 0 flag) "spacer;:popup_list{key=\"lst\";")
     ((= 1 flag) "spacer;:list_box{key=\"lst\";")
     (T "spacer;:list_box{key=\"lst\";multiple_select=true;")
   )
   file
 )
 (write-line "}spacer;ok_cancel;}" file)
 (close file)
 (setq dcl_id (load_dialog tmp))
 (if (not (new_dialog "ListBox" dcl_id))
   (exit)
 )
 (start_list "lst")
 (mapcar 'add_list (mapcar 'cdr keylab))
 (end_list)
 (action_tile
   "accept"
   "(or (= (get_tile \"lst\") \"\")
   (if (= 2 flag) (progn
   (foreach n (str2lst (get_tile \"lst\") \" \")
   (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice)))
   (setq choice (reverse choice)))
   (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab)))))
   (done_dialog)"
 )
 (start_dialog)
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 choice
)

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

Posté(e)

Merci Didier, Merci Gile,

 

Cela fait 1 heure que je cherche dans la bible du developers visual lisp,

 

Ca y est j'ai un trou sur mon crane,

 

Merci c'est effectivement ca fonctionne sur map 2009.

 

Je vais la tester avec plus de 2 fichiers.

 

Merci,

 

Fabrice

 

PS : Gile, si tu viens à Rennes un de ces quatre, un apéro sera de la partie !

 

[Edité le 8/1/2010 par fabcad]

Posté(e)

Il y a des subtilités un peu curieuse avec les ActiveViewport : :casstet:

- pour pouvoir en récupérer les propriétés actuelles, il faut d'abord la 'supprimer' (vla-delete ...)

- pour mettre à jour l'affichage des modifications dans la fenêtre active, il faut l'activer (vla-put-active ...)

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

  • 4 ans après...
Posté(e)

Bonjour Gile,

 

Je reviens sur ton code, je suis sur autocad 2012 et il ne fonctionne pas chez moi.

Il ne bascule pas dans l'autre plan, mais pas de zoom sur la zone.

Une idée ?

Posté(e)

Salut,

 

Ce LISP ne fait pas basculer dans un autre dessin, il récupère juste le zoom d'un autre dessin ouvert dans la même session et l'applique au dessin courant.

S'il n'y a qu'un dessin ouvert dans la session le LISP ne fait rien bien sûr, s'il y a seulement deux dessins ouverts, c'est le zoom de l'autre dessin qui est applique, et s'il y a plus de deux dessins ouverts, on choisi le dessin dans une boite de dialogue.

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é