Aller au contenu

fmult avec boite de dialogue


zebulon_

Messages recommandés

bonjour,

 

la mise en page dans l'espace papier est souvent quelque chose de fastidieux si on a plusieurs fmult à faire à différentes échelles.

il faut d'abord faire la fmult, puis éventuellement rappeler une vue de l'espace objet, puis enfin règler le facteur d'échelle avec un zoom 1/XP.

 

Je vous propose de tester le lisp suivant qui affiche la liste des vues de l'espace objet, ainsi qu'une vue nommée *générale*

Si on choisit la vue *générale*, le lisp crée une fmult, fait un zoom étendu, demande un point à l'utilisateur représentant le centre de la vue, puis fait un zoom 1/xp avec l'échelle choisie.

Si on choisit un autre vue, le lisp rappelle cette vue et fait un zoom 1/xp avec l'echelle choisie.

Les échelles sont adaptées à une utilisation du mètre en espace objet et du mm en espace papier.

 

Là où ça plante, c'est quand la vue de l'espace objet est une vue perspective.

 

le fichier fmmo.dcl

dcl_settings : default_dcl_settings { audit_level = 0 ;}

Fmmo : dialog {
     label = "FENETRE FMULT";
     initial_focus = "pick_pt";
     : boxed_radio_column {
       label = "Type de FMULT";
       key = "pick_fm";
       : radio_button {
         label = "Saisir 2 points";
         key = "pick_pt";
       }
       : radio_button {
         label = "Saisir Polyligne";
         mnemonic = "P";
         key = "pick_po";
       }
       : radio_button {
         label = "Saisir Objet";
         mnemonic = "O";
         key = "pick_ob";
       }
     }
     : list_box {
       label = "Vues : ";
       key = "List_view";
     }
     : popup_list {
       label = "Echelle : ";
       Alignment = left;
       fixed_width = true;
       edit_width = 10;
       key = "ECH";
       list = "1:1\n1:2\n1:5\n1:10\n1:20\n1:25\n1:50\n1:75\n1:100\n1:200\n1:250\n1:500";
     }
     spacer_1;
     ok_cancel_err;
}

 

 

le fichier fmmo.lsp

 


;;;
;;; lancer une commande autocad

(defun mycmd (LCMD / CMD ETL LELEM RES OLDCMDECHO)
 (setq ETL (entlast))
 (setq OLDCMDECHO (getvar "CMDECHO"))
 (setvar "CMDECHO" 1)
 (foreach CMD LCMD
   (command CMD)
 )
 (while (not (zerop (getvar "cmdactive")))
   (command pause)
 )
 (setvar "CMDECHO" OLDCMDECHO)
 (setq LELEM nil)
 (if (not ETL) 
   (setq ETL (entnext))
   (setq ETL (entnext ETL))
 )
 (while ETL
   (setq LELEM (cons ETL LELEM))
   (setq ETL (entnext ETL))
 )
 (setq RES LELEM)
)


(defun construire_liste (/ VLIST VNAME What_Space What_Pers)
;;
;; Revoie VNLISTO qui contient la liste des vues de l'espace objet.
;; La vue est rappelée dans la FMULT + zoom 1/ECHxp
;; La vue *GENERALE* permet de faire un zoom étendu + zoom centré + zoom 1/ECHxp
;;
 ;construire la liste des vues
 (setq VNLISTO nil)
 (setq VLIST (tblnext "VIEW" T))
 (while vlist
   (setq VNAME (cdr (assoc 2 VLIST)))
   (setq What_Space (cdr (assoc 70 VLIST)))
   (setq What_Pers (cdr (assoc 71 VLIST)))
   (if (= What_Space 0)  ;; que les vues de l'espace objet
     (setq VNLISTO (cons VNAME VNLISTO))
   )
   (setq VLIST (tblnext "VIEW"))
 )
 ;trier les noms des vues
 (If (>= (getvar "maxsort") (length VNLISTO))
   (setq VNLISTO (acad_strlsort VNLISTO))
 )
 ;rajouter au début une vue *GENERALE*
 (setq VNLISTO (cons "*GENERALE*" VNLISTO))
)

(defun do_accept ()
 (setq VIEW (get_tile "List_view"))
 (setq ECH (get_tile "ECH"))
 (setq PICK_FM (get_tile "pick_fm"))
 (done_dialog 2)
)


(defun zoom_general ()
 (command "_ZOOM" "_e")
 (initget 1)
 (setq pick_ptg (getpoint "\nCentre de la fenêtre : "))
 (command "_ZOOM" "_c" pick_ptg "")
)

(defun do_list_view ()
 (setq VIEW $value)
 (if (= VIEW "0") ;; vue générale
   (mode_tile "ECH" 0)
   (if (= (cdr (assoc 71 (tblsearch "view" (nth (atoi VIEW) VNLISTO)))) 0) ; activer echelle que si c'est n'est pas une vue perspective
     (mode_tile "ECH" 0)
     (mode_tile "ECH" 1)
   )
 )
)


(defun main_FM ()
 ;initalisation des variables
 (command "_PSPACE")
 (setq VIEW "0")
 (setq ECH "5")  ; par défaut au 1:100
 ;construction de la liste des vues
 (construire_liste)
 ;ouverture de la boîte de dialogue
 (setq dcl_id (load_dialog "fmmo.dcl"))

 (if (not (new_dialog "Fmmo" dcl_id)) (exit))

 (start_list "List_view")
   (mapcar 'add_list VNLISTO)
 (end_list)

 (set_tile "ECH" ECH)
 (set_tile "List_view" VIEW)
 
 (action_tile "List_view" "(do_list_view)")
 (action_tile "accept" "(do_accept)")
 (action_tile "cancel" "(done_dialog 0)")
 (setq what_next (start_dialog))

 (unload_dialog dcl_id)
 ;Création du FMULT en fonction des paramètres de la boîte de dialogue
 (if (= What_next 2)
   (progn
     (setq VNAME (nth (atoi VIEW) VNLISTO))
     (setq val_ECH
       (cond
         ((= ECH "0") "1000/1XP")
         ((= ECH "1") "1000/2XP")
         ((= ECH "2") "1000/5XP")
         ((= ECH "3") "1000/10XP")
         ((= ECH "4") "1000/20XP")
         ((= ECH "5") "1000/25XP")
         ((= ECH "6") "1000/50XP")
         ((= ECH "7") "1000/75XP")
         ((= ECH "8") "1000/100XP")
         ((= ECH "9") "1000/200XP")
         ((= ECH "10") "1000/250XP")
         ((= ECH "11") "1000/500XP")
       )
     )
     (setq CLAY (getvar "CLAYER"))
     (if (not (tblsearch "LAYER" "FMULT"))
       (command "_layer" "_M" "FMULT" "_P" "_N" "FMULT" "")
       (command "_LAYER" "L" "FMULT" "AC" "FMULT" "_S" "FMULT" "")
     )

     (setq oldFILL (getvar "FILLMODE"))
     (setvar "FILLMODE" 0)

     (cond
       ((= PICK_FM "pick_pt") (mycmd '("_.mview")))
       ((= PICK_FM "pick_po") (mycmd '("_.mview" "_p")))
       ((= PICK_FM "pick_ob") (mycmd '("_.mview" "_ob")))
     )

     (command "_MSPACE")
     
     (if (= VNAME "*GENERALE*")
       (zoom_general)
       (command "_view" "_r" VNAME)
     )
     ;;; ne faire que si ce n'est pas une vue perspective
     (if (= (cdr (assoc 71 (tblsearch "view" VNAME))) 0)
       (command "_ZOOM" val_ECH)
     )
     (command "_PSPACE")

     (setvar "FILLMODE" oldFILL)
     (command "_regenall")


     (command "_LAYER" "_S" CLAY "")
   )
 )
)


(defun C:FMMO ()
 (setq OLD_CMD (getvar "cmdecho"))
 (setvar "cmdecho" 0)
 (setq TM (getvar "tilemode"))
 (if (= TM 1)
   (progn
     (command "PSLTSCALE" "1")
     (command "REGNAUTO" "IN")
     (command "ECHLTP" "0.20")
     (setvar "TILEMODE" 0)
     (command "REGNAUTO" "AC")
   )
 )
 (main_FM)
 (setvar "cmdecho" OLD_CMD)
 (princ)
)

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Je viens de tester et il m'indique une erreur dans le fichier de la boite de dialogue!

Ligne 34

Erreur de syntaxe.

Vu mes connaissances tres minime en autolisp je te fais parvenir ce message!

A+

"Je suis fasciné par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre... Et les avions aussi... En même temps l'air tu peux pas le toucher... Ca existe et ça existe pas... Ca nourrit l'homme sans qu'il ait faim... It's magic ! L'air c'est beau en même temps tu peux pas le voir, c'est doux et tu peux pas le toucher... L'air, c'est un peu comme mon cerveau..."

J-C Van Damme

Lien vers le commentaire
Partager sur d’autres sites

Merci de ta rapiditée

Non la ligne 34 est bien sur une seule ligne

Voila cette ligne:

list = "1:1\n1:2\n1:5\n1:10\n1:20\n1:25\n1:50\n1:75\n1:100\n1:200\n1:250\n1:500";< br /> }

 

"Je suis fasciné par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre... Et les avions aussi... En même temps l'air tu peux pas le toucher... Ca existe et ça existe pas... Ca nourrit l'homme sans qu'il ait faim... It's magic ! L'air c'est beau en même temps tu peux pas le voir, c'est doux et tu peux pas le toucher... L'air, c'est un peu comme mon cerveau..."

J-C Van Damme

Lien vers le commentaire
Partager sur d’autres sites

Ok ca marche!!

Pas mal du tout!!

"Je suis fasciné par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre... Et les avions aussi... En même temps l'air tu peux pas le toucher... Ca existe et ça existe pas... Ca nourrit l'homme sans qu'il ait faim... It's magic ! L'air c'est beau en même temps tu peux pas le voir, c'est doux et tu peux pas le toucher... L'air, c'est un peu comme mon cerveau..."

J-C Van Damme

Lien vers le commentaire
Partager sur d’autres sites

Merci,

 

maintenant s'il y a quelqu'un qui saurait comment on peut déterminer si la vue de l'espace objet est une vue perspective, alors qu'on est dans l'espace papier ?

 

Après, ce qui serait encore bien, ce serait de rajouter un bouton "paramétrer" pour pouvoir changer la liste des échelles et le facteur de zoom correspondant et éventuellement la valeur de l'ECHLTP et du PSLTSCALE voulu. Ces données, il faudrait les stocker dans un fichier qu'il serait judicieux de ranger où ? A priori, je vais mettre ça dans le répertoire ROAMABLEROOTPREFIX ?

 

amicalement

 

Zebulon_

 

 

[Edité le 21/10/2005 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

maintenant s'il y a quelqu'un qui saurait comment on peut déterminer si la vue de l'espace objet est une vue perspective, alors qu'on est dans l'espace papier ?

 

Tu peux enregistrer la vue courante au début de ton code :

(command "_-view" "_s" "courant") 

Puis la traiter comme les autres vues enregistrées, et la suprimer à la fin:

(command "_-view" "_d" "courant") 

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

Lien vers le commentaire
Partager sur d’autres sites

re,

 

au début de mon code, je peux très bien déjà être dans l'espace papier, auquel cas ça ne marchera pas. Et puis, il faudrait encore vérifier si le nom "courant" existe déjà, avant de faire le save ... :calim:

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

maintenant s'il y a quelqu'un qui saurait comment on peut déterminer si la vue de l'espace objet est une vue perspective, alors qu'on est dans l'espace papier ?

 

VIEWMODE est pas mal. Tu dois faire la bascule en EO quand même.

 

Je reprends tes propos :

 

la mise en page dans l'espace papier est souvent quelque chose de fastidieux si on a plusieurs fmult à faire à différentes échelles.

il faut d'abord faire la fmult, puis éventuellement rappeler une vue de l'espace objet, puis enfin règler le facteur d'échelle avec un zoom 1/XP.

 

Avec la barre d'outils FENETRES, je ne me prends plus la tête avec tout ca.

Je selectionne mes fenêtres et je tape mon échelle direct.

 

Mais bravo, je trouve ton utilitaire bien sympa ! pour le centrage notamment.

 

[Edité le 21/10/2005 par Tramber]

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

maintenant s'il y a quelqu'un qui saurait comment on peut déterminer si la vue de l'espace objet est une vue perspective, alors qu'on est dans l'espace papier ?

Je suis une bille en 3D mais pmeut-être avec les variables target et viewdir ?

 

Après, ce qui serait encore bien, ce serait de rajouter un bouton "paramétrer" pour pouvoir changer la liste des échelles et le facteur de zoom correspondant et éventuellement la valeur de l'ECHLTP et du PSLTSCALE voulu. Ces données, il faudrait les stocker dans un fichier qu'il serait judicieux de ranger où ?

Et pourquoi pas dans des registres perso ?

 

Ton utilitaire est vraiment sympa. J'aurai juste un bémol

Je viens de voir que si je n'ai pas de vue prédéfini, j'ai un message sur acad_strlsort

 

@+

 

[Edité le 21/10/2005 par Patrick_35]

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

Lien vers le commentaire
Partager sur d’autres sites

Je réponds à Patrick :

 

VIEWDIR donne un vecteur, première difficulté, et je pense que le problème n'est pas la vue en isométrique juste le mode de perspective.

 

Le prog ne donne la bonne échelle que si on part d'une vue existante, si je ne me trompe. Ou le contraire... :cool:

 

et puis je remarque que tu ne prends pas le controle des UCSVP, UCSFOLLOW et UCSORTHO. C'est dommage.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Zébulon,

 

J'ai essayé rapidement ton programme qui m'a l'air prometteur.

 

Tu as rencontré le même problème que moi (les vues en perpectives)

 

Je te conseillerais plutôt:

[surligneur] (if (zerop (logand 1 (getvar "viewmode")))[/surligneur]

au lieu de

(if (= (cdr (assoc 71 (tblsearch "view" VNAME))) 0)

 

Je me sers aussi de la variable "ViewTwist" pour faire tourner ma vue.

 

Voilà une routine pour faire tourner une fenêtre de 90°, peut être te donneras t-elle des idées!

Je me demande si des fonctions (vl- ...)ou (vlax-...) ne permettrait pas des actions plus simple et plus sures?

Mais un pro du VL va nous dire ça ;)

(defun c:r_viewport ( / e_vport dxf_vport base_pt lg_view ht_view h_vue pt_ctr-view pt_dl pt_ur)
(cond
	((zerop (getvar "TILEMODE"))
		(setvar "CMDECHO" 0)
		(command "_.undo" "_begin")
		(if (/= (getvar "CVPORT") 1)
			(command "_.pspace")
		)
		(setq e_vport nil dxf_vport nil)
		(while (null e_vport)
			(setq e_vport (ssget "_+.:E:S" '((0 . "VIEWPORT"))))
			(if e_vport (setq e_vport (ssname e_vport 0)))
		)
		(setq
			dxf_vport (entget e_vport)
			base_pt (cdr (assoc 10 dxf_vport))
			lg_view (cdr (assoc 40 dxf_vport))
			ht_view (cdr (assoc 41 dxf_vport))
			h_vue (cdr (assoc 45 dxf_vport))
		)
		(command "_.mspace")
		(setvar "CVPORT" (cdr (assoc 69 dxf_vport)))
		(setq pt_ctr-view (getvar "VIEWCTR"))
		(initget "+ -")
		(if (eq (getkword "\nRotation de +90° ou -90°? [+/-] <+>: ") "-")
			(command "_.dview" "" "_twist" (angtos (rem (- (getvar "VIEWTWIST") (/ pi 2)) pi) 0 5) "")
			(command "_.dview" "" "_twist" (angtos (rem (+ (getvar "VIEWTWIST") (/ pi 2)) pi) 0 5) "")
		)
		(command "_.-view" "_save" "$bascul_vue")
		(command "_.-layer" "_state" "_save" "$bascul_vue" "" "" "")
;			(command "_.-layer" "_state" "_save" "$bascul_vue" "_on" "_froze" "_lock" "_plot" "_newvp" "_color" "_linetype" "_weight" "_plotstyle" "" "" "")
		(command "_.pspace")
		(setq pt_dl
			(list
				(- (car base_pt) (/ ht_view 2.0))
				(- (cadr base_pt) (/ lg_view 2.0))
				(caddr base_pt)
			)
		)
		(setq pt_ur
			(list
				(+ (car base_pt) (/ ht_view 2.0))
				(+ (cadr base_pt) (/ lg_view 2.0))
				(caddr base_pt)
			)
		)
		(entdel e_vport)
		(command "_.mview" pt_dl pt_ur)
		(command "_.mspace")
		(command "_.-view" "_restore" "$bascul_vue")
		(command "_.-view" "_delete" "$bascul_vue")
		(command "_.-layer" "_state" "_restore" "$bascul_vue" "_delete" "$bascul_vue" "" "")
		(if (zerop (logand 1 (getvar "viewmode")))
			(command "_.zoom" "_ce" pt_ctr-view (strcat (rtos (/ ht_view h_vue)) "XP"))
		)
		(command "_.pspace")
		(command "_.undo" "_end")
		(setvar "CMDECHO" 1)
	)
	(T (prompt "\n*** Commande non autorisée dans l'espace objet ***"))
)
(prin1)
)

 

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

Lien vers le commentaire
Partager sur d’autres sites

Merci les gars, j'ai un peu de grain à moudre... Je vous tiens au courant

 

Et pourquoi pas dans des registres perso ?

 

le problème, c'est que je suis une bille en matière de registres...

 

Amicalement

 

Zebulon_

 

 

[Edité le 24/10/2005 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Tu peux définir une clé d'accès général par exemple pour ton lisp FFMO.

(setq Cle_Zeb "HKEY_CURRENT_USER\ \Software\ \Autodesk\ \Autocad\ \Zebulon\ \FFMO"); (enlever les espaces entres les deux \)

Faire une lecture

(setq Val_1 (vl-registry-read Cle_Zeb "Cle_1"))

Une écriture

(vl-registry-write Cle_Zeb "Cle_1" Val_1)

Ou encore pour effacer une clé

(vl-registry-delete Cle_Zeb "Cle_1")

 

Pour ce qui est du vl, je ne sais pas si ça répond correctement à la question, mais c'est au cas ou

(setq Vues (vla-get-views (vla-get-activedocument (vlax-get-acad-object))))
(vlax-for Vue Vues
 (princ (strcat "\n\tVue : " (vla-get-name Vue)))
 (princ "\t,Direction : ")(princ (vlax-safearray->list (vlax-variant-value (vla-get-direction Vue))))
 (princ "\t,Target : ")(princ (vlax-safearray->list (vlax-variant-value (vla-get-target Vue))))
)
(princ)

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...

zebulon

Je crois avoir trouvé le problème des mview en perspective.

 

Le programme (BenView)

crée une fenêtre (viewport) dans l’espace papier (paper space) à partir d’une vue (view) en espace objet (model space)

 

et crée une vue (view) dans l’espace objet (model space) à partir d’une fenêtre (viewport) dans l’espace papier (paper space) 2D/3D R14/2006.

 

Démo disponible

http://www.colba.net/~bencad/ltscale/index.html

 

Lien vers le commentaire
Partager sur d’autres sites

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é