<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Problem changing element BuiltInParameter in Revit API Forum</title>
    <link>https://forums.autodesk.com/t5/revit-api-forum/problem-changing-element-builtinparameter/m-p/12678306#M6198</link>
    <description>&lt;P&gt;&lt;SPAN&gt;Hello!&amp;nbsp;I have a problem with changing element parameters&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;public partial class FormChageLevel : Window
{
    private Document _doc;
    public Dictionary&amp;lt;string, List&amp;lt;Element&amp;gt;&amp;gt; ElementsByLevel { get; set; }

    public FormChageLevel(Document document)
    {
        _doc = document;
        InitializeComponent();
        ElementsByLevel = GetElementsByLevel(_doc);
        this.DataContext = this;
    }
...&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I have a function that creates a Dictionary: a level and all the elements on it.&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;        public Dictionary&amp;lt;string, List&amp;lt;Element&amp;gt;&amp;gt; GetElementsByLevel(Document doc)
        {
            Dictionary&amp;lt;string, List&amp;lt;Element&amp;gt;&amp;gt; elementsByLevel = new Dictionary&amp;lt;string, List&amp;lt;Element&amp;gt;&amp;gt;();
            FilteredElementCollector collector = new FilteredElementCollector(doc);
            List&amp;lt;Level&amp;gt; levels = collector.OfClass(typeof(Level)).Cast&amp;lt;Level&amp;gt;().ToList();
            foreach (Level level in levels)
            {
                List&amp;lt;Element&amp;gt; elementInLevel = new List&amp;lt;Element&amp;gt;();
                ElementLevelFilter levelFilter = new ElementLevelFilter(level.Id);
                FilteredElementCollector elementsList = new FilteredElementCollector(doc);
                List&amp;lt;Element&amp;gt; elements = elementsList.WherePasses(levelFilter).ToList();
                foreach (Element element in elements)
                {
                    elementInLevel.Add(element);
                }
                elementsByLevel.Add(level.Name, elementInLevel);
            }
            return elementsByLevel;
        }&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I also have a function that returns an array of BuiltInParamete, depending on the category (in progress)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;        public static BuiltInParameter[] GetParametersForMovingItems(Element element)
        {
            string category = element.Category.Name;
            BuiltInParameter[] parameters;
            BuiltInParameter baseLevel;
            BuiltInParameter baseOffset; 
            BuiltInParameter topLevel;
            BuiltInParameter topOffset;
            if (category == "OST_Walls")
            {
                baseLevel = BuiltInParameter.WALL_BASE_CONSTRAINT;
                baseOffset = BuiltInParameter.WALL_BASE_OFFSET;
                topLevel = BuiltInParameter.WALL_HEIGHT_TYPE;
                topOffset = BuiltInParameter.WALL_TOP_OFFSET;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset, topLevel, topOffset };
            }
            else if (category == "OST_StructuralColumns")
            {
                baseLevel = BuiltInParameter.FAMILY_BASE_LEVEL_PARAM;
                baseOffset = BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM;
                topLevel = BuiltInParameter.FAMILY_TOP_LEVEL_PARAM;
                topOffset = BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset, topLevel, topOffset };
            }
            else if (category == "OST_Floors")
            {
                baseLevel = BuiltInParameter.LEVEL_PARAM;
                baseOffset = BuiltInParameter.FLOOR_HEIGHTABOVELEVEL_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            else if (category == "OST_Ceilings")
            {
                baseLevel = BuiltInParameter.LEVEL_PARAM;
                baseOffset = BuiltInParameter.CEILING_HEIGHTABOVELEVEL_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            else if (category == "OST_Roofs")
            {
                baseLevel = BuiltInParameter.ROOF_BASE_LEVEL_PARAM;
                baseOffset = BuiltInParameter.ROOF_LEVEL_OFFSET_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            else if (category == "OST_Windows" || category == "OST_Doors")
            {
                baseLevel = BuiltInParameter.FAMILY_LEVEL_PARAM;
                baseOffset = BuiltInParameter.INSTANCE_SILL_HEIGHT_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            else if (category == "OST_Stairs" || category == "OST_Ramps")
            {
                baseLevel = BuiltInParameter.STAIRS_BASE_LEVEL_PARAM;
                baseOffset = BuiltInParameter.STAIRS_BASE_OFFSET;
                topLevel = BuiltInParameter.STAIRS_TOP_LEVEL_PARAM;
                topOffset = BuiltInParameter.STAIRS_TOP_OFFSET;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset, topLevel, topOffset };
            }
            else if (category == "OST_StairsRailing")
            {
                baseLevel = BuiltInParameter.STAIRS_RAILING_BASE_LEVEL_PARAM;
                baseOffset = BuiltInParameter.STAIRS_RAILING_HEIGHT_OFFSET;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            else
            {
                baseLevel = BuiltInParameter.FAMILY_LEVEL_PARAM;
                baseOffset = BuiltInParameter.INSTANCE_ELEVATION_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            return parameters;
        }&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, when running TransferringElementsToAnotherLevel() there is an error that levelParameter.Set("TEST") is read-only&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;     public void TransferringElementsToAnotherLevel()
        {
            string exportLevelName = LevelExport.SelectedItem as string;
            string importLevelName = levelImport.SelectedItem as string;
            var transaction = new Transaction(_doc, "Test");        
                transaction.Start();
                foreach (Element element in ElementsByLevel[exportLevelName])
                {
                    BuiltInParameter[] levelExportParametrs = CommandChangeLevel.GetParametersForMovingItems(element);
                    var levelParameter = element.get_Parameter(levelExportParametrs[0]);
                        if (levelParameter?.HasValue == true)
                        {
                            var oldLevel = _doc.GetElement(levelParameter.AsElementId()) as Level;
                            levelParameter.Set(importLevelName);
                        }
                }
                transaction.Commit();           
        }&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;SPAN&gt;Thank you in advance for your assistance!&lt;/SPAN&gt;&lt;/P&gt;</description>
    <pubDate>Mon, 01 Apr 2024 09:07:47 GMT</pubDate>
    <dc:creator>2lenin-off</dc:creator>
    <dc:date>2024-04-01T09:07:47Z</dc:date>
    <item>
      <title>Problem changing element BuiltInParameter</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/problem-changing-element-builtinparameter/m-p/12678306#M6198</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Hello!&amp;nbsp;I have a problem with changing element parameters&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;public partial class FormChageLevel : Window
{
    private Document _doc;
    public Dictionary&amp;lt;string, List&amp;lt;Element&amp;gt;&amp;gt; ElementsByLevel { get; set; }

    public FormChageLevel(Document document)
    {
        _doc = document;
        InitializeComponent();
        ElementsByLevel = GetElementsByLevel(_doc);
        this.DataContext = this;
    }
...&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I have a function that creates a Dictionary: a level and all the elements on it.&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;        public Dictionary&amp;lt;string, List&amp;lt;Element&amp;gt;&amp;gt; GetElementsByLevel(Document doc)
        {
            Dictionary&amp;lt;string, List&amp;lt;Element&amp;gt;&amp;gt; elementsByLevel = new Dictionary&amp;lt;string, List&amp;lt;Element&amp;gt;&amp;gt;();
            FilteredElementCollector collector = new FilteredElementCollector(doc);
            List&amp;lt;Level&amp;gt; levels = collector.OfClass(typeof(Level)).Cast&amp;lt;Level&amp;gt;().ToList();
            foreach (Level level in levels)
            {
                List&amp;lt;Element&amp;gt; elementInLevel = new List&amp;lt;Element&amp;gt;();
                ElementLevelFilter levelFilter = new ElementLevelFilter(level.Id);
                FilteredElementCollector elementsList = new FilteredElementCollector(doc);
                List&amp;lt;Element&amp;gt; elements = elementsList.WherePasses(levelFilter).ToList();
                foreach (Element element in elements)
                {
                    elementInLevel.Add(element);
                }
                elementsByLevel.Add(level.Name, elementInLevel);
            }
            return elementsByLevel;
        }&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I also have a function that returns an array of BuiltInParamete, depending on the category (in progress)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;        public static BuiltInParameter[] GetParametersForMovingItems(Element element)
        {
            string category = element.Category.Name;
            BuiltInParameter[] parameters;
            BuiltInParameter baseLevel;
            BuiltInParameter baseOffset; 
            BuiltInParameter topLevel;
            BuiltInParameter topOffset;
            if (category == "OST_Walls")
            {
                baseLevel = BuiltInParameter.WALL_BASE_CONSTRAINT;
                baseOffset = BuiltInParameter.WALL_BASE_OFFSET;
                topLevel = BuiltInParameter.WALL_HEIGHT_TYPE;
                topOffset = BuiltInParameter.WALL_TOP_OFFSET;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset, topLevel, topOffset };
            }
            else if (category == "OST_StructuralColumns")
            {
                baseLevel = BuiltInParameter.FAMILY_BASE_LEVEL_PARAM;
                baseOffset = BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM;
                topLevel = BuiltInParameter.FAMILY_TOP_LEVEL_PARAM;
                topOffset = BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset, topLevel, topOffset };
            }
            else if (category == "OST_Floors")
            {
                baseLevel = BuiltInParameter.LEVEL_PARAM;
                baseOffset = BuiltInParameter.FLOOR_HEIGHTABOVELEVEL_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            else if (category == "OST_Ceilings")
            {
                baseLevel = BuiltInParameter.LEVEL_PARAM;
                baseOffset = BuiltInParameter.CEILING_HEIGHTABOVELEVEL_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            else if (category == "OST_Roofs")
            {
                baseLevel = BuiltInParameter.ROOF_BASE_LEVEL_PARAM;
                baseOffset = BuiltInParameter.ROOF_LEVEL_OFFSET_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            else if (category == "OST_Windows" || category == "OST_Doors")
            {
                baseLevel = BuiltInParameter.FAMILY_LEVEL_PARAM;
                baseOffset = BuiltInParameter.INSTANCE_SILL_HEIGHT_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            else if (category == "OST_Stairs" || category == "OST_Ramps")
            {
                baseLevel = BuiltInParameter.STAIRS_BASE_LEVEL_PARAM;
                baseOffset = BuiltInParameter.STAIRS_BASE_OFFSET;
                topLevel = BuiltInParameter.STAIRS_TOP_LEVEL_PARAM;
                topOffset = BuiltInParameter.STAIRS_TOP_OFFSET;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset, topLevel, topOffset };
            }
            else if (category == "OST_StairsRailing")
            {
                baseLevel = BuiltInParameter.STAIRS_RAILING_BASE_LEVEL_PARAM;
                baseOffset = BuiltInParameter.STAIRS_RAILING_HEIGHT_OFFSET;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            else
            {
                baseLevel = BuiltInParameter.FAMILY_LEVEL_PARAM;
                baseOffset = BuiltInParameter.INSTANCE_ELEVATION_PARAM;
                parameters = new BuiltInParameter[] { baseLevel, baseOffset };
            }
            return parameters;
        }&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, when running TransferringElementsToAnotherLevel() there is an error that levelParameter.Set("TEST") is read-only&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;     public void TransferringElementsToAnotherLevel()
        {
            string exportLevelName = LevelExport.SelectedItem as string;
            string importLevelName = levelImport.SelectedItem as string;
            var transaction = new Transaction(_doc, "Test");        
                transaction.Start();
                foreach (Element element in ElementsByLevel[exportLevelName])
                {
                    BuiltInParameter[] levelExportParametrs = CommandChangeLevel.GetParametersForMovingItems(element);
                    var levelParameter = element.get_Parameter(levelExportParametrs[0]);
                        if (levelParameter?.HasValue == true)
                        {
                            var oldLevel = _doc.GetElement(levelParameter.AsElementId()) as Level;
                            levelParameter.Set(importLevelName);
                        }
                }
                transaction.Commit();           
        }&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;SPAN&gt;Thank you in advance for your assistance!&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 01 Apr 2024 09:07:47 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/problem-changing-element-builtinparameter/m-p/12678306#M6198</guid>
      <dc:creator>2lenin-off</dc:creator>
      <dc:date>2024-04-01T09:07:47Z</dc:date>
    </item>
    <item>
      <title>Re: Problem changing element BuiltInParameter</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/problem-changing-element-builtinparameter/m-p/12678327#M6199</link>
      <description>&lt;P&gt;Looks complicated. Does it work in a simpler context?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I would replace the dictionary of elements by a dictionary of ElementId instead. The Element objects may go out ot scope. It is safer to just use the element id and pass it in to doc.GetElement to ensure that yiou have fresh valid Element objects.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 01 Apr 2024 09:27:04 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/problem-changing-element-builtinparameter/m-p/12678327#M6199</guid>
      <dc:creator>jeremy_tammik</dc:creator>
      <dc:date>2024-04-01T09:27:04Z</dc:date>
    </item>
    <item>
      <title>Re: Problem changing element BuiltInParameter</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/problem-changing-element-builtinparameter/m-p/12680702#M6200</link>
      <description>&lt;P&gt;Thanks for the answer. It didn’t work in a simpler context either, but it seems I found the cause of the error.&lt;/P&gt;&lt;P&gt;How can I ignore objects with "IsReadOnly = True" attribute and empty SuperComponent value through a filter?&lt;/P&gt;</description>
      <pubDate>Tue, 02 Apr 2024 08:46:37 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/problem-changing-element-builtinparameter/m-p/12680702#M6200</guid>
      <dc:creator>2lenin-off</dc:creator>
      <dc:date>2024-04-02T08:46:37Z</dc:date>
    </item>
    <item>
      <title>Re: Problem changing element BuiltInParameter</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/problem-changing-element-builtinparameter/m-p/12680870#M6201</link>
      <description>&lt;P&gt;Maybe you can use RevitLookup or some other database exploration method to determine which built-in parameter holds the value of IsReadOnly and implement a parameter filter to handle that criterion.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Apr 2024 09:52:03 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/problem-changing-element-builtinparameter/m-p/12680870#M6201</guid>
      <dc:creator>jeremy_tammik</dc:creator>
      <dc:date>2024-04-02T09:52:03Z</dc:date>
    </item>
  </channel>
</rss>

