Aller au contenu

Création d\'un nouveau calque gelé dans des fenêtres existantes


Steven

Messages recommandés

Salut à tous.

 

On m'a soumis une question à laquelle je n'arrive pas à trouver la solution.

 

J'ai un immeuble de 8 étages avec dans chacun des fichiers 3 présentations existantes.

sur un des étages, je créé un nouveau calque (faux plancher). Ensuite je créé une nouvelle présentation. Dans cette présentation, je montre le plan ou le calqpinage du faux plancher. Toutefois, dans les trois autres présentations (celles qui existent déjà), je gèle le calque du faux plancher car il n'a pas lieu d'être. cependant, je dois rajouter le calque et ma nouvelle présentation du faux plancher sur mes 7 autres étages. Le soucis est que lorsque j'importe le calque du faux plancher sur les 7 autres étages, je suis obligé d'aller dans toutes les présentations existantes pour geler le calque du faux plancher.

 

Ma question est: Existe-t-il un moyen pour que, lorsque j'importe par exemple le calque "faux placher" du R+8 sur les 7 autres étages, le calque "faux plancher" soit gelé automatiquement dans les présentation existantes de chacun des 7 autres étages?

 

Pour lr moment, je dois gelé manuellement dans chacune des trois fenêtres existantes de chaque fichier le calque du faux plancher soit 21 ou 24 fois., je ne vous dis pas qu'au bout du 3ème fichier, on a déjà marre...

 

j'ai voulu essayé avec un filtre de calque, un état de calque (lman) mais sans succès. Ou j'ai loupé quelque chose.

 

Note:

 

Je tiens à préciser que "geler dans les nouvelles fenêtre" ne règle rien à mon problème puisque le calque doit être gelé dans des fenêtres qui sont déjà existantes.

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Steven,

moi j'utilise ce lisp pour geler dans les presentations le calque courant puis je l'active ou je veut....

Lisp:

; Programme qui permet d'éteindre le calque courant dans toutes les fenêtres flottantes
; de toutes les présentations, sauf éventuellement dans la fenêtre active.

; Gestion des erreurs et restauration de l'environnement
; Cette procédure est stéreotypée dans mes programmes LISP
(defun *error* (msg)
 (command)                                                                      ; Annulation des commandes en cours
 (restaureEnv)                                                                  ; Appel à la procédure de restauration
 (princ "\nerreur: ")
 (princ msg)
 (princ)
)

; Restauration de l'environnement
; Cette procédure est stéreotypée dans mes programmes LISP
(defun RestaureEnv ()
 (if (/= *old1* nil) (setvar "cmdecho" *old1*))                                 ; restaure la variable CMDECHO
 (if (/= *old2* nil) (setvar "LAYOUTREGENCTL" *old2*))                          ; restaure la variable LAYOUTREGENCTL
)

; Boucle qui permet d'éteindre le calque courant dans la fenêtre en cours.
; Ceci se fait par le biais des données étendues (xDtata) de la fenêtre en cours,
; dans lesquelles il faut incorporer la liste pointée
; (1003 . Nom_du_Calque) entre les codes (1002 . {) et (1002 . })
(Defun Boucle3 ( / xData xType NewData NewType k)
 (vla-getxdata CurrentPViewport0 "" 'xType 'xData)                              ; Récupération des données xData de la fenêtre
 (setq k (vlax-safearray-get-u-bound xType 1))                                  ; Nb d'éléments dans xData
 (setq NewType (vlax-make-safearray vlax-vbInteger (cons 0 (+ k 1))))           ; Création d'un nouveau tableau Type
 (setq NewData (vlax-make-safearray vlax-vbVariant (cons 0 (+ k 1))))           ; Création d'un nouveau tableau Data

 (setq n 0)
 (repeat (+ k 1)                                                                ; boucle pour recopier les éléments des tableaux
   (vlax-safearray-put-element Newtype n (vlax-safearray-get-element xType n))  ; Recopie xType dans NewType
   (vlax-safearray-put-element NewData n (vlax-safearray-get-element xData n))  ; Recopie xData dans NewData
   (setq n (1+ n))                                                              ; Incrémente
 )
 
 (vlax-safearray-put-element Newtype (+ k 1) 1002)                              ; insere le dernier atome de la liste
 (vlax-safearray-put-element NewData (+ k 1) "}")                               ; insere le dernier atome de la liste
 
 (vlax-safearray-put-element Newtype (- k 1) 1003)                              ; insere l'atome en avant dernière position
 (vlax-safearray-put-element NewData (- k 1) ActiveLayer0)                      ; insere l'atome en avant dernière position

 (vla-setxdata CurrentPViewport0 NewType NewData)                               ; Enregistre la nouvelle liste dans la fenêtre

 (if (equal CurrentLayout0 ActiveLayout0)                                       ; Si l'utilisateur se trouve dans une présentation
   (progn                                                                       ; alors il faut régénérer les fenêtres de la présentation
     (vla-display CurrentPViewport0 0)                                          ; Régénère la fenêtre
     (vla-display CurrentPViewport0 1)                                          ; Régénère la fenêtre
   ))
)

; Enumération des fenêtres flottantes
; Les sous-objets d'une présentation représentent tous les éléments dessinés dans la présentation (blocs, fenêtres...),
; mais le premier sous-objet représente toujours la vue active de la présentation elle-même.
; Il faut donc sauter le premier test.
(Defun Boucle2 (CurrentPViewport0)
 (if (and var1 (vlax-method-applicable-p CurrentPViewport0 'Display)            ; Vérification que l'objet est une fenêtre (PViewPort)
   (not (Equal CurrentPViewport0 ActivePViewport0))) (boucle3))                 ; et que la fenêtre en cours n'est pas active
 (setq Var1 T)                                                                  ; Variable qui sert à sauter le 1er test
)

; Enumération des présentations
(Defun Boucle1 (CurrentLayout0)
 (if (Not (Equal CurrentLayout0 ModelSpace0))                                   ; Si la présentation en cours n'est pas l'espace objet
   (progn
     (setq Var1 nil)                                                            ; Variable utile pour la boucle2
     (if (= (vla-get-count (Vla-Get-Block CurrentLayout0)) 0)
       (progn
         (vla-put-activelayout Activedoc CurrentLayout0)
         (vla-put-activelayout Activedoc ActiveLayout0)
       ))
     (vlax-map-collection (Vla-Get-Block CurrentLayout0) 'Boucle2)              ; boucle sur les sous-objets de la présentation
   ))
)

; Programme principal
(Defun C:GelerCalqueP ()
 (vl-load-com)                                                                  ; Chargement des fonctions ActiveX
 (setq *old1* (getvar "cmdecho"))                                               ; Sauvegarde de la variable
 (setq *old2* (getvar "LAYOUTREGENCTL"))                                        ; Sauvegarde de la variable
 (setvar "cmdecho" 0)                                                           ; Messages désactivés
 (setvar "LAYOUTREGENCTL" 0)                                                    ; Régénération systématique des présentations
 (Setq ActiveLayer0 (getvar "CLayer"))                                          ; Nom du calque courant
 (Setq ActiveDoc (vla-get-ActiveDocument (vlax-get-acad-object)))               ; Document actif
 (setq ActiveLayout0 (vla-get-activelayout ActiveDoc))                          ; Présentation courante (y compris espace objet)
 (if (= (getvar "tilemode") 0)                                                  ; si on est dans l'espace papier
   (setq ActivePViewport0 (Vla-Get-ActivePViewport ActiveDoc))                  ; alors il faut sauvegarder la fenêtre active
   (setq ActivePViewport0 nil)                                                  ; sinon pas de fenêtre active
 )
 (setq ModelSpace0 (vla-get-Layout (vla-get-ModelSpace Activedoc)))             ; Identificateur de l'espace objet
 (setq Layouts0 (vla-get-Layouts ActiveDoc))                                    ; liste de toutes les présentations (+ espace objet)
 (vlax-map-collection Layouts0 'Boucle1)                                        ; sous-programme de traitement de chaque présentation
 (setq Var1 nil)                                                                ; Variable qui sert à choisir le message final
 (if (and ActivePViewport0                                                      ; s'il existe une fenêtre active
   (not (equal (Vla-Get-ActivePViewport ActiveDoc) ActivePViewport0)))          ; et que cette fenêtre n'est plus la même qu'au départ
     (progn
       (Vla-put-ActivePViewport ActiveDoc ActivePViewport0)                     ; alors restaurer la fenêtre de départ
       (setq Var1 T)                                                            ; choisir le message final correspondant
     )
 )
 (RestaureEnv)                                                                  ; Appel à la procédure de restauration
 (if var1                                                                       ; choix du message
   (princ (strcat "Le calque " ActiveLayer0 " a été gelé dans les autres fenêtres flottantes"))
   (princ (strcat "Le calque " ActiveLayer0 " a été gelé dans toutes les fenêtres flottantes"))
 )
 (princ)
)

(princ "\nFonction C:GelerCalqueP chargée - tapez GelerCalqueP pour l'éxecuter.")
(princ)

; pour utiliser ce programme, créer un bouton dans une barre d'outils.
; Puis taper la macro : ^C^CGelerCalqueP
; A chaque session Autocad, il faut recharger le programme,
; ou-bien le rajouter à la liste des programmes chargés au démarrage (menu Outils->Charger une application...)

; Pour moi :
; (Princ (= (cdadr (entget (vlax-vla-object->ename CurrentPViewport0))) "VIEWPORT") ; ceci est une autre méthode d'identification

 

Merci à l'auteur.....

DAO: AutoCAD(2D & 3D), Covadis

CAO: 3D's MAX, Rhinoceros 3D, REVIT

GeoModeliSation: AutoCAD MEP, RhinoTerrain

Rendu: Vray for Rhino, Keyshot, Lumion

Programmation: Grasshopper, Dynamo, VisualStudio

 

C.V.

Profil LinkedIn

Book

Site web

 

http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg

Lien vers le commentaire
Partager sur d’autres sites

Si tu créais ton calque "gelé dans toutes les fenêtres" (et non pas geler dans les nouvelles fenêtres), ça te ferait peut être moins de boulot à réactiver ce calque dans 1 présentation par fichier (plutôt que le réactiver dans 3 présentations par fichiers).

Autocad 2021 - Revit 2022 - Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Salut rhymone.

Ce lisp est cool mais sur mon poste, il ne fonctionne que dans la présentation courante.

C'est-à-dire que lorsque je suis dans une présentation avec plusieurs fenêtre, je me mets en EO dans une fenêtre. J'active le lisp et le calque courant est actif dans la fenêtre dans laquelle je suis et gelé dans les autres fenêtres. par contre, le calque courant est toujours actif dans toutes les autres fenêtres des autres présentations.

Ou, j'ai loupé un truc, ou il manque un p'tit truc à ce lisp qui devrait régler mon problème.

 

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

Si tu créais ton calque "gelé dans toutes les fenêtres" (et non pas geler dans les nouvelles fenêtres), ça te ferait peut être moins de boulot à réactiver ce calque dans 1 présentation par fichier (plutôt que le réactiver dans 3 présentations par fichiers).

 

Forcement...

 

merci à toi ;)

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 ans après...

Bonjour,

 

Il trop bien ce lisp!!!

 

Mais je savoir si c'est possible de geler dans un présentation un certain nombre de calque prédéfini

 

C'est que je voudrais mettre en place un fichier DWT avec des présentation prédéfini

 

Donc moi j'ai une charte graphique qui a plusieurs réseaux (réseaux pluvial, EU, AEP....)

je voudrais dans chaque présentation activé mes calques correspondant aux réseaux indiquer dans ma présentation

 

par pour ma présentation RESEAUX PLUVIALE ,je voudrais activé seulement les calques du réseaux pluviale

 

Donc j'ai nommé mes calques par des préfixes

 

exemples: RESEAUX PLUVIALE:

 

PR_PLUVIALE-RESEAUX-CANALISATION

PR_PLUVIALE-RESEAUX-CANALISATION2

PR_PLUVIALE-RESEAUX-CANALISATION3

PR_PLUVIALE-RESEAUX-CANALISATION3

Lien vers le commentaire
Partager sur d’autres sites

je voudrais déactiver une liste de calques selon leur nom

Voici à quoi pourrait ressembler la syntaxe d'une macro qui Gèle tous les calques commençant par PR

^C^C-calque;g;pr*;;

ou Désactivé

^C^C-calque;in;pr*;;

ou Activé

^C^C-calque;ac;pr*;;

Studio Gfilm - Agence de communication par l'image

 

"Le matin tu peux rester couché pour poursuivre ton rêve, ou te lever pour le réaliser"

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é