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 : 

Attribution d'une nouvelle valeur à un paramètre avec FamilyManager.Set() ou FamilyManager.SetValueString()

1 RÉPONSE 1
RÉSOLU
Répondre
Message 1 sur 2
Thomas_LECUPPRE_Let_it_BIM
449 Visites, 1 Réponse

Attribution d'une nouvelle valeur à un paramètre avec FamilyManager.Set() ou FamilyManager.SetValueString()

Bonjour, j'essaye tant bien que mal d'utiliser les fonctions FamilyManager.SetValueString() et FamilyManager.Set() dans le code ci-dessous :

 

				rfaManager = importedRfa.FamilyManager;
                FamilyParameterSet rfaParameters = rfaManager.Parameters;
                //TaskDialog.Show("listes parametres", rfaManager.CurrentType.Name + " & " + rfaParameters.Size.ToString());
                foreach (FamilyParameter para in rfaParameters)
                {
                    int i = 0;
                    foreach(string pName in nomParametres)
                    {
                        if(para.Definition.Name == pName)
                        {
                            TaskDialog.Show("Erreur de conversion", 
                                para.DisplayUnitType.ToString() +"\nNom du paramètre FamilyParameter : " +
                                para.Definition.Name + "\nNom du paramètre string : " +
                                pName + "\nType de paramètre : " +
                                para.StorageType);
                            
                            string paraValue = valeuresParametres[i];
                            switch (para.StorageType)
                            {
                                case StorageType.Integer:
                                    int vInt;
                                    if (int.TryParse(paraValue, out vInt))
                                    {
                                        using (Transaction tr = new Transaction(importedRfa, "Nouveau type"))
                                        {
                                            tr.Start();
                                            try { rfaManager.Set(para, vInt); }
                                            catch (Exception e) { TaskDialog.Show("Int catch", e.Message); }
                                            tr.Commit();
                                            tr.Dispose();
                                        }
                                    }
                                    else
                                    {
                                        TaskDialog.Show("Erreur de conversion",
                                            "Impossible de convertir " + paraValue + " en Integer");
                                    }
                                    break;
                                 case StorageType.Double:
                                    double vDouble;
                                    if (double.TryParse(paraValue, out vDouble))
                                    {
                                        using (Transaction tr = new Transaction(importedRfa, "Nouveau type"))
                                        {
                                            tr.Start();
                                            try { rfaManager.Set(para, vDouble); }
                                            catch (Exception e) { TaskDialog.Show("Double catch", e.Message); }
                                            tr.Commit();
                                            tr.Dispose();
                                        }
                                    }
                                    else
                                    {
                                        TaskDialog.Show("Erreur de conversion",
                                            "Impossible de convertir " + paraValue + " en Double");
                                    }
                                    break;
                                case StorageType.String:
                                    using (Transaction tr = new Transaction(importedRfa, "Nouveau type"))
                                    {
                                        tr.Start();
                                        try { rfaManager.Set(para, paraValue); }
                                        catch (Exception e) { TaskDialog.Show("String catch", e.Message); }
                                        tr.Commit();
                                        tr.Dispose();
                                    }
                                    break;
                                /*case StorageType.ElementId:
                                    break;*/
                                default:
                                    TaskDialog.Show("Erreur de conversion",
                                            "Impossible de trouver le type du paramètre.\n" +
                                            "le programme renvoi la valeur : " + para.StorageType);
                                    break;
                            }
                        }
                        i++;
                    }
                }

 

Mon problème est que Revit m'affiche bien les informations avec mes TaskDialog mais ne fait pas le travail demandé.

Il arrive parfois (de manière je dirais aléatoire) que le programme casse sans me renvoyer d'erreur. De plus, lorsque le programme n'arrive pas à exécuter "rfaManager.Set(para, maVariable)", il ne me renvoi rien avec le catch.

 

Dans le fichier ci-joint, l'ensemble du code présent dans ce post.

 

Merci d'avance pour vos réponses.

Étiquettes (2)
1 RÉPONSE 1
Message 2 sur 2

Je n'ai toujours pas d'idée de ce pourquoi cela ne fonctionnait pas mais j'ai trouvé une solution :

rfaManager = importedRfa.FamilyManager;
                List<FamilyParameter> rfaParameters = rfaManager.GetParameters().ToList();
                //TaskDialog.Show("listes parametres", rfaManager.CurrentType.Name + " & " + rfaParameters.Count.ToString());
                foreach (FamilyParameter para in rfaParameters)
                {
                    if (nomParametres.Contains(para.Definition.Name))
                    {
                        //TaskDialog.Show("Infos", para.Definition.Name + "\n" + para.StorageType);
                        int indexValeur = nomParametres.IndexOf(para.Definition.Name);
                        StorageType paraType = para.StorageType;
                        using(Transaction trans = new Transaction(importedRfa, "set"))
                        {
                            switch (paraType)
                            {
                                case StorageType.Double:
                                    try
                                    {
                                        trans.Start();
                                        rfaManager.SetValueString(para, valeuresParametres[indexValeur] + "mm");
                                        trans.Commit();
                                    }
                                    catch(Exception e) 
                                    {
                                        TaskDialog.Show("Error on Double",
                                            "Nom du paramètre : " + para.Definition.Name 
                                            + "\nValeur voulue : " + valeuresParametres[indexValeur] + "mm"
                                            + "\n" + e.Message);   
                                    }
                                    break;
                                case StorageType.Integer:
                                    try
                                    {
                                        trans.Start();
                                        rfaManager.Set(para, int.Parse(valeuresParametres[indexValeur]));
                                        trans.Commit();
                                    }
                                    catch (Exception e)
                                    {
                                        TaskDialog.Show("Error on String",
                                            "\nNom du paramètre : " + para.Definition.Name
                                            + "\nType de parametre : " + para.StorageType
                                            + "\nValeur voulue : " + valeuresParametres[indexValeur]
                                            + "\n" + e.Message);
                                    }
                                    break;
                                case StorageType.String:
                                    try
                                    {
                                        trans.Start();
                                        rfaManager.SetValueString(para, valeuresParametres[indexValeur]);
                                        trans.Commit();
                                    }
                                    catch (Exception e)
                                    {
                                        TaskDialog.Show("Error on String",
                                            "\nNom du paramètre : " + para.Definition.Name
                                            + "Type de parametre : " + para.StorageType
                                            + "\nValeur voulue : " + valeuresParametres[indexValeur]
                                            + "\n" + e.Message);
                                    }
                                    break;
                            }
                        }
                    }
                }

Ce code permet de résoudre deux problèmes que j'avais :

- Le non fonctionnement des fonctions FamilyManager.SetValueString() et FamilyManager.Set() 

 

- La valeur des paramètres.

     En effet, lorsque je voulais entrer une valeur de 100, malgré que ma famille soit en millimètre, revit faisait tout seul la conversion avec les pouces ( vive le système impérial ... ). Pour résoudre ce problème, je spécifie "mm" après ma valeur pour que Revit fasse la conversion tout seul. Une méthode est celle de Jeremy Tammik que je trouve personnellement beaucoup plus complexe.

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