#RTCEUR Wish 2 – Highlight and Isolate Warning Elements

@marcellosgamb suggested an API that runs thru every error in a model turns element w/error red then as u fix each error turn normal

There is no API access to the Revit “Review Warnings” data, so this implementation requires the user to export the warning data. The program then imports this HTML, parses it to find the element IDs, and then isolates and colors the elements in two 3D views.

public void ShowWarningElements()
{
    Document doc = this.ActiveUIDocument.Document;

    string filename = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "warnings.html");

    IList<ElementId> ids = new List<ElementId>();

    using (StreamReader sr = new StreamReader(filename))
    {
        string line = "";
        while ((line = sr.ReadLine()) != null)
        {
            string[] row = System.Text.RegularExpressions.Regex.Split(line,"id ");
            if (row.Length != 3)
            {
                continue;
            }
            string id1 = row[1].Split(' ')[0];
            string id2 = row[2].Split(' ')[0];

            ids.Add(new ElementId(int.Parse(id1)));
            ids.Add(new ElementId(int.Parse(id2)));
        }
    }    

    View isolateView = new FilteredElementCollector(doc).OfClass(typeof(View)).Cast<View>().Where(q => q.Name == "IsolateWarningElements").FirstOrDefault();
    View overrideView = new FilteredElementCollector(doc).OfClass(typeof(View)).Cast<View>().Where(q => q.Name == "OverrideWarningElements").FirstOrDefault();

    OverrideGraphicSettings ogs = new OverrideGraphicSettings();
    Color red = new Color(255, 0, 0);
    ogs.SetProjectionLineColor(red);
    ogs.SetProjectionLineWeight(8);

    Element solidFill = new FilteredElementCollector(doc).OfClass(typeof(FillPatternElement)).Where(q => q.Name.Contains("Solid")).First();

    ogs.SetProjectionFillPatternId(solidFill.Id);
    ogs.SetProjectionFillColor(new Color(0, 255,0));

    using (Transaction t = new Transaction(doc, "Isolate/Override Warnings"))
    {
        t.Start();
        isolateView.IsolateElementsTemporary(ids);

        foreach (ElementId id in ids)
        {
            overrideView.SetElementOverrides(id, ogs);
        }
        t.Commit();
    }
}

15 thoughts on “#RTCEUR Wish 2 – Highlight and Isolate Warning Elements

  1. A nice solution Harry. Its easy to get so focused on what the API can or can’t do that we forget about going out the door and coming back in another. I do hope that someone in the API group monitors these feeds and is making a list…

    – Brian –

  2. Big newbie to API’s…..

    When creating the new API in C++ or whatever language that is.. All I need to do is post that code in?

  3. hmmm i have troubles getting this here..

    “sequence contains no elements system.core

    at

    system.linq.enumerable.first (sources)(IEnumsources)
    at
    ARCHISOFT_warnings.Warnings.showwarnings…

    can you help me?

      • i got this message :

        Erreur CS1061: ‘ee.ThisDocument’ ne contient pas une définition pour ‘ActiveUIDocument’ et aucune méthode d’extension ‘ActiveUIDocument’ acceptant un premier argument de type ‘ee.ThisDocument’ n’a été trouvée (une directive using ou une référence d’assembly est-elle manquante ?)
        Construction échouée. (00:00:00.4606258)

          • ok i did with Application macros .. then this message appears :

            a problem has bees dectected.

            system.invalidoperationexception:sequence contains no elements at macromodule.executemacro_(macromodule*, Astring*)
            at
            uimacrogeneralmanager.runmacro(uimacrogeneralmanager*,
            Macromodule* pmodule, astring* macroname)

Leave a comment