Comment sauvegarder et restaurer automatiquement la disposition (taille et position) des fenêtres de travail Revit sur plusieurs écrans étendus ?
La gestion et la sauvegarde automatisée de l’organisation des fenêtres de travail Revit sur plusieurs écrans étendus n’est pas une fonctionnalité nativement disponible dans Revit. Pour y parvenir, une solution de développement personnalisé via l’API Revit est nécessaire, généralement sous la forme d’une macro VSTA ou d’un complément (.NET/C#).
Voici la démarche experte pour aborder ce besoin :
-
DIAGNOSTIC DE LA FONCTIONNALITÉ NATIVE
- Revit ne propose pas d’outils intégrés pour enregistrer et recharger des configurations spécifiques de fenêtres (vues de projet, propriétés, arborescence) sur différents écrans. Chaque session de travail nécessite un repositionnement manuel si l’on souhaite une disposition particulière.
-
APPROCHE PROGRAMMATIQUE VIA L’API REVIT (.NET/C#)
- La solution réside dans l’écriture d’un code personnalisé utilisant l’API Revit et l’API Windows (via P/Invoke).
- Exemple de code fourni (C#) : Le snippet de code présenté utilise l’interface
IExternalCommandde l’API Revit, qui permet d’exécuter des commandes personnalisées. Il intègre un appel à la fonctionMoveWindowde l’API Windows (user32.dll).[Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] class MultiScreenMaximizeCommand : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { int minX = int.MaxValue; int minY = int.MaxValue; int allScreensWidth = 0; int allScreensMinHeight = int.MaxValue; foreach (Screen screen in Screen.AllScreens) { minX = Math.Min(minX, screen.WorkingArea.X); minY = Math.Min(minY, screen.WorkingArea.Y); allScreensWidth += screen.WorkingArea.Width; allScreensMinHeight = Math.Min(allScreensMinHeight, screen.WorkingArea.Height); } NativeMethods.MoveWindow(ComponentManager.ApplicationWindow, minX, minY, allScreensWidth, allScreensMinHeight, true); return Result.Succeeded; } } [DllImport("user32.dll", SetLastError = true)] public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); - Fonctionnement du code exemple :
- Il identifie tous les écrans connectés au système (
Screen.AllScreens). - Il calcule la zone de travail combinée de tous ces écrans.
- Il utilise
NativeMethods.MoveWindow(un appel P/Invoke à l’API Windows) pour redimensionner et repositionner la fenêtre principale de l’application Revit (ComponentManager.ApplicationWindow) afin qu’elle s’étende sur l’ensemble de ces écrans.
- Il identifie tous les écrans connectés au système (
-
ADAPTATION POUR LA GESTION DES FENÊTRES DE VUES INDIVIDUELLES
- Le code fourni est une base pour la fenêtre principale de Revit. Pour gérer les fenêtres de vues individuelles (les ‹ fenêtres enfants › ou ‹ child windows › mentionnées), des modifications et extensions sont nécessaires :
- Identification des écrans cibles : Le code devrait être ajusté pour cibler spécifiquement 2 des 3 écrans, par exemple en filtrant
Screen.AllScreenspar position ou nom. - Accès aux vues ouvertes : Utiliser l’API Revit pour obtenir la liste des vues actuellement ouvertes dans le document (
UIDocument.GetOpenViews()). - Manipulation des fenêtres de vues : Pour chaque vue, il faudrait obtenir son handle de fenêtre (hWnd) et utiliser
MoveWindowou des méthodes similaires de l’API Windows pour définir sa taille et sa position sur les écrans désirés. Cela peut être complexe car Revit gère ses vues dans un environnement MDI (Multiple Document Interface) ou SDI (Single Document Interface) selon les versions et les modes, et l’accès direct aux handles de fenêtres des vues peut varier. - Sauvegarde/Restauration : Pour sauvegarder une configuration, le code devrait enregistrer les positions et dimensions de chaque fenêtre de vue dans un fichier (XML, JSON) ou dans les paramètres utilisateur. Pour restaurer, il lirait ces données et appliquerait les positions et tailles enregistrées.
- Identification des écrans cibles : Le code devrait être ajusté pour cibler spécifiquement 2 des 3 écrans, par exemple en filtrant
- Le code fourni est une base pour la fenêtre principale de Revit. Pour gérer les fenêtres de vues individuelles (les ‹ fenêtres enfants › ou ‹ child windows › mentionnées), des modifications et extensions sont nécessaires :
-
COMPÉTENCES REQUISES ET BONNES PRATIQUES
- Cette solution demande des compétences avancées en programmation C#, en utilisation de l’API Revit, et en interopérabilité avec l’API Windows (P/Invoke).
- Pour des besoins récurrents et une solution robuste, il est recommandé de faire développer un complément Revit par un expert, plutôt qu’une simple macro, afin d’assurer la compatibilité avec les futures versions de Revit et une meilleure maintenabilité.