Communauté
BIM Revit, BIM et Autodesk Construction Cloud (ACC) - Français
Bienvenue sur le forum AEC francophone dédié aux solutions BIM de la société Autodesk. Cet espace est dédié aux professionnels et passionnés du secteur de l'Architecture, de l'Ingénierie et de la Construction (AEC) qui utilisent le logiciel Revit ainsi que les plateformes collaboratives d'Autodesk (ACC et Autodesk Forma). Partagez vos connaissances, posez des questions, collaborez sur des idées, et explorez les sujets, que vous soyez architecte, ingénieur, gestionnaire de projet ou tout autre acteur de l'AEC.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

Gestion de la data panneau "dockable" - Revit api c#

15 RÉPONSES 15
RÉSOLU
Répondre
Message 1 sur 16
samuel.cailletMDQ7N
906 Visites, 15 Réponses

Gestion de la data panneau "dockable" - Revit api c#

Bonjour,

Pour faire simple, je cherche à créer un outils de contrôle d'objets.

Dans le détail cela donne un panneau intégré à Revit (sous la forme d'un panneau dockable) avec une ListBox qui contiendrait des objets avec diverses informations. Ces informations serait actualisées en temps réel en fonction des actions effectuées dans revit.
Je suis parvenu à créer ce panneau à l'aide des ressources mises à disposition par @jeremytammik link
Je parviens également à créer des évènements pour récupérer les informations link 
Ma difficulté se porte principalement sur la gestion de la data, la communication entre les class, le contexte valide de l'API.

 

J'ai créé un objet/Model qui me permet de faire une liste d'objets (Pour le moment il n'y a qu'une variable mais je souhaite en avoir un certain nombre).

 

 

public class ElementModel
    {
        public string Identifiant { get; set; }
    }

 

 

 

Dans le code du panneau "dockable", je souhaite utiliser une ObservableCollection (d'après mes recherches c'est ce qu'il faut utiliser pour que la listbox soit toujours à jour)

 

 

public ObservableCollection<ElementModel> Elements { get; set; }

 

 


Une fois l'information récupérée dans une variable, je ne sais pas où la stocker depuis l'évènement dans ma "base de donné" (Exemple : variable string = Identifiant) ?

Pour résumer, je souhaite créer une base de données en commun avec les différentes class pour que mon panneau affiche l'information en temps réel.

J'ai appris sur le tas et par moi même grâce aux ressources d'internet, il y a peut etre des concepts basic du langage qui malheureusement m'échappent... Je m'excuse donc si le questionnement n'est pas correct ou non justifié, en tout cas toute aide serait grandement appréciée. S'il manque des informations, je peux compléter.

Merci d'avance

Samuel Caillet

Étiquettes (2)
15 RÉPONSES 15
Message 2 sur 16

Salut,

 

Ce n'est pas très clair !

Si j'ai bien compris, aujourd'hui tu arrive à récupérer les données de ton élément puis tu transmet ces données à ton DockPanel afin de les afficher à l'utilisateur. Est-ce bien cela ?

 

Si  oui, tu parle ensuite de stockage des données. Quel est l'objectif de ce stockage ? 

 

😉



PIRO Charles
Developer

PIRO CIE
Linkedin


Message 3 sur 16

Bonjour,


Merci pour ta réponse,

 

En réalité, je n'arrive pas à sortir cette variable de la partie Execute de l'événement.
D'où la question suivante, Que faire de cette variable ? ou plutôt Comment déposer ou mettre à jour ma liste d'objets.
Je souhaite avoir une liste d'objet accessible en écriture et en lecture. c'est ce que j'entends par "stockage".

 

J'espère que c'est un peu plus clair ?! 😅

Message 4 sur 16

Une fois que j'aurais créé cette "base de données"/liste d'objet, je souhaite que le DockPanel interagisse avec.
Afficher l'identifiant de l'objet ou supprimer l'objet par exemple.
Message 5 sur 16

Ok, donc si je comprend bien lorsque tu sélectionne un objet revit tu arrive bien à obtenir les infos mais tu ensuite tu ne sais pas comment les envoyer à ton dockpanel afin que ce dernier puisse les "lire" ?



PIRO Charles
Developer

PIRO CIE
Linkedin


Message 6 sur 16

C'est ça ! Pour donner un autre exemple, je détecte l'évènement "L'identifiant a changé", je vais alors souhaiter savoir si le nouvel identifiant existe déjà dans ma fameuse liste d'objet. Si ce n'est pas le cas, alors j'ajoute l'identifiant et automatiquement le DockPanel doit pouvoir afficher l'objet.

Message 7 sur 16

Tu utilise quel type d'évènement : DocumentChanged, IUpdater ou Idling ?

 

😉



PIRO Charles
Developer

PIRO CIE
Linkedin


Message 8 sur 16

J'utilise IUpdater ! Ce n'est peut-être pas le plus adapté ?

Message 9 sur 16

Suivant le fonctionnement décrit cela ne me semble pas déconnant !

Voici une petite lecture sur la différence avec le documentchanged : documentchanged-versus-dynamic-model-updater 

Je te prépare (dans la journée) un exemple avec l'IUpdater et un dockPanel.

 

😉



PIRO Charles
Developer

PIRO CIE
Linkedin


Message 10 sur 16

Ok !


@Charles.Piro  a écrit :

Suivant le fonctionnement décrit cela ne me semble pas déconnant !


C'est plutôt rassurant de lire ça ! 😀
D'après ce que je lis le IUpdater est plus intéressant en therme de performance car il est possible de pointer plus précisément ce que l'on souhaite regarder (je me souviens avoir déjà consulté cette page).

 


@Charles.Piro  a écrit :

Je te prépare (dans la journée) un exemple avec l'IUpdater et un dockPanel.

Un grand merci d'avance pour l'aide !

Message 11 sur 16

Je précise un point sur lequel je n'ai pas encore travaillé mais le DockPanel ouvert et actualisé doit l'être selon le projet. Si deux projets sont ouverts, lorsque l'on change, le panneau doit s'actualiser.
J'ai vu ce sujet qui me semble pertinent, mais je pense que j'aurais besoin d'aide également pour cette partie-là. link
Je ne connais pas l'impact que cela peut avoir sur la façon de gérer la liste d'objets.

Message 12 sur 16

Salut,

 

voici une solution avec quelques éléments qui devraient t'aider un peu !

Il y a un dockpanel qui contient des champs : nom / id / identifiant

Il y a un IUPdater qui fonctionne lors de la modification du paramètre "identifiant" d'un élément (catégorie "Mur" de paramétré)

Il y a un Idling qui permet de renvoyer la valeur validée dans le dockPanel vers l'élément.

 

Fonctionnement de la solution : 

Ouverture du dockpanel via le ruban complément puis External Tools

Sélection d'un élément de la catégorie "Mur"

Modification du paramètre identifiant de l'élément (->affichage des données dans le panel une fois le paramètre modifié)

Modification de la valeur de l'identifiant dans le dockPanel puis clic sur "Valider"

Mise à jour de la nouvelle valeur dans le paramètre de l'élément Revit

 

Attention, j'ai constitué cette solution un peu vite, il peu y avoir quelques erreurs si tu l'utilise tel quel !! Lors de l'ouverture du premier document le dockpanel sera déjà ouvert (mais l'idling et l'iupdater ne seront pas initialisés), il faut le fermer puis relancer la commande via le ruban "complément".

 

Concernant le point de ton dernier message, si tu souhaite que le dockpanel se mette à jour d'un document à l'autre, il faut que tu utilise un évènement View_Activated afin de détecter les changement de vue et donc potentiellement de document.

 

😉



PIRO Charles
Developer

PIRO CIE
Linkedin


Message 13 sur 16

Un grand merci pour cet exemple et le temps passé !
Il m'a permis de revoir la manière dont le panneau est appelé.
J'ai ainsi la possibilité d'interagir de l'extérieur du panneau.
Depuis l'évènement, j'arrive maintenant à ce que l'identifiant s'affiche automatiquement dans la liste box du DockPanel. L'observable collection fonctionne à merveille ! 😊

J'identifie une nouvelle problématique, sauf erreur de ma part, l'opération ctr+z vient compliquer la tâche.
En effet, si l'utilisateur modifie un identifiant mais qu'il revient en arrière avec ctrl+Z, cela ne semble pas exécuter l'évènement. Tu as déjà été confronté à cela ?

A nouveau merci, ton aide me fait avancer ! 😃

Message 14 sur 16

Si je comprends bien tout ce que j'ai lu, il faut que je change ma méthode de détection pour pouvoir prendre en compte le retour arrière/avant.
J'avoue ne pas comprendre pourquoi l'IUpdater ne prend pas en charge cet aspect...
Résolu : Re: IUpdater interface does not listen to Undo Redo - Autodesk Community - Revit Products

Message 15 sur 16
Message 16 sur 16

Salut,

 

si tu souhaite analyser les retour en arrière (undo), il faut que utilise le documentChanged au lieu de l'IUPdater.

Voici un bout de code qui fonctionne avec l'exemple que je t'ai envoyé :

 

private void App_DocumentChanged(object sender, Autodesk.Revit.DB.Events.DocumentChangedEventArgs e)
        {
            BuiltInCategory[] multiCat = new BuiltInCategory[1]
               {
                        BuiltInCategory.OST_Walls
               };
            ElementMulticategoryFilter categoryFilter = new ElementMulticategoryFilter(multiCat);
            ICollection<ElementId> collIdModified = e.GetModifiedElementIds(categoryFilter);
            if (collIdModified.Count() > 0)
            {
                foreach (ElementId id in collIdModified)
                {
                    Element elmnt = e.GetDocument().GetElement(id);
                    Command.m_MyDockableWindow.UpdateViewModel(elmnt);
                }
            }

        }

 

 

😉



PIRO Charles
Developer

PIRO CIE
Linkedin


Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report