{"id":17009,"date":"2020-12-09T16:50:37","date_gmt":"2020-12-09T15:50:37","guid":{"rendered":"https:\/\/www.modelical.com\/es\/?p=17009"},"modified":"2022-03-30T14:22:33","modified_gmt":"2022-03-30T12:22:33","slug":"edit-ceilings-with-revit-api","status":"publish","type":"post","link":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/","title":{"rendered":"Editing ceiling sketch with Revit API"},"content":{"rendered":"<h2>We show you how to do it using programming<\/h2>\n<p>In many projects we will have to model the finishes, which can be a laborious task depending on the complexity of the project.<\/p>\n<p>Revit&#8217;s interface doesn&#8217;t have any tool that allows us to generate finishes automatically using the information of the rooms, however by programming we can easily make solutions to generate walls and floors, as we show with the node of the <a title=\"Modelical Dynamo Package\" href=\"https:\/\/www.modelical.com\/en\/node\/wall-finishes-by-room\/\">Modelical Dynamo Package Wall Finishes by room.<\/a>.<\/p>\n<p>The problem is when we reach the ceilings, after reviewing the <a title=\"API documentation\" href=\"https:\/\/www.revitapidocs.com\/\">API documentation<\/a> and looking for solutions on the web, we find ourselves with the following starting situation:<\/p>\n<li>Ceiling creation is not possible via Revit API.<\/li>\n<li>Ceiling editing is \u201cnot possible\u201d via Revit API.<\/li>\n<p>With this post we will teach the reader how to modify the perimeter of the ceilings, exploiting the perimeter of a room. We will use a small example as a basis for this exercise:<\/p>\n<p>\n<em>Let&#8217;s suppose that, after creating manually all the ceilings of our model, in the last project update there was a mismatch due to a change in the architecture.<\/em><\/p>\n<p><em>Having thousands of ceilings, updating the profiles would be a tedious task, fortunately this task is also potentially automatable. We will start with one ceiling and its room.<\/em>\n<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-16752\" style=\"margin-left: auto; margin-right: auto;\" src=\"https:\/\/www.modelical.com\/wp-content\/uploads\/CeilingCreator1.png\" alt=\"\" width=\"100%\" height=\"auto\" \/><\/p>\n<h3>Getting the perimeter of the room<\/h3>\n<p>The first thing we do is to get the room&#8217;s boundaries. To do this we can use the <a title=\"GetBoundarySegments\" href=\"https:\/\/www.revitapidocs.com\/2020\/8e0919af-6172-9d16-26d2-268e42f7e936.htm\">GetBoundarySegments<\/a> method from the <a title=\"SpatialElement\" href=\"https:\/\/www.revitapidocs.com\/2020\/e73594e8-23aa-899f-82fb-3490def8ece2.htm\">SpatialElement<\/a> class.<\/p>\n<p>This method returns a sublist of segment lists, being the first sublist the outer perimeter of the room and the following ones the inner loops.<\/p>\n<pre class=\"lang:c# decode:true\">Document currentDocument = ActiveUIDocument.Document;\r\n\r\nElementId roomId = new ElementId(207717);\r\n\r\nElement room = currentDocument.GetElement(roomId);\r\n\r\n\/\/get room boundary\r\nSpatialElementBoundaryOptions options = \r\n    new SpatialElementBoundaryOptions();\r\n\r\noptions.SpatialElementBoundaryLocation = \r\n    SpatialElementBoundaryLocation.Finish;\r\n            \r\nIList&lt;Ilist&lt;BoundarySegment&gt;&gt; roomBoundary = \r\n    (room as SpatialElement).GetBoundarySegments(options);<\/pre>\n<p>We can see that in this example the room has been located using its id (we will do the same with the ceiling), this is because in this exercise we do not intend to identify which ceiling corresponds to which room, we leave that to the reader.<\/p>\n<h3>Getting the sketch of the ceiling<\/h3>\n<p>Now we must get the sketch of the ceiling that we want to edit. In the Revit API we can achieve this in the following way:<\/p>\n<pre class=\"lang:c# decode:true\">ElementId ceilingId = new ElementId(210549);\r\n                \r\nElement ceiling = currentDocument.GetElement(ceilingId);\r\n            \r\n\/\/get ceiling sketch\r\nElementClassFilter filter = \r\n    new ElementClassFilter(typeof(Sketch));\r\n            \r\nElementId sketchId = \r\n    ceiling.GetDependentElements(filter).First();\r\n            \r\nSketch ceilingSketch = \r\n    currentDocument.GetElement(sketchId) as Sketch;\r\n            \r\nCurveArrArray ceilingProfile = ceilingSketch.Profile;\r\n<\/pre>\n<p>This instance of the <a title=\"CurveArrArray\" href=\"https:\/\/www.revitapidocs.com\/2020\/c9d071fe-9724-42ed-e280-57381cd44301.htm\">CurveArrArray<\/a> class is an array that contains subarrays that store the ceiling sketch lines, separated by loops, equivalent to the result obtained previously for the room.<\/p>\n<p>The problem is that the elements of this instance cannot be modified, Revit will launch an exception of the type <em>\u201cInvalidOperationException [\u2026] Collection is read-only\u201d if we try it.<\/em><\/p>\n<h3>Getting the editable lines<\/h3>\n<p>While the Revit API does not allow us to directly modify the sketch, there is one thing we can do, get the lines that form the ceiling and modify them.<\/p>\n<pre class=\"lang:c# decode:true\">filter = new ElementClassFilter(typeof(CurveElement));\r\n                \r\nIEnumerable curves = ceiling.GetDependentElements(filter)\r\n    .Select(id =&gt; currentDocument.GetElement(id));\r\n                \r\nIEnumerable modelLines = curves\r\n    .Where(e =&gt; e is ModelLine).Cast();\/\/target\r\n                \r\nif(curves.Count() != modelLines.Count())\r\n     throw new Exception(\"The ceiling contains\" +\r\n\t                     \" non straight lines\");\r\n<\/pre>\n<p>\nIn this case we have obtained a list of the lines that form the ceiling, without the loop structure.<\/p>\n<p>The question would be how to change the lines that make up the ceiling and not break it in the attempt. To do this we have to take into account two particular conditions:<\/p>\n<li>We can change one line for another and we can remove lines, but we cannot add lines.<\/li>\n<li>We can edit the internal loops and we can eliminate them, except when such changes would conflict with the first condition. We cannot add new loops either.<\/li>\n<p>This means that if the original ceiling had 7 edges on its outer perimeter, the new perimeter should have 7 or fewer edges. Also, the new ceiling may have the same or less number of inner loops and these inner loops may have the same or less edges than the original ones.<\/p>\n<p><b>In this example there is another limitation that can be solved by the user: the ceiling and the room must be formed by straight lines.<\/b><\/p>\n<p>At this point we can conclude that it may be interesting to preserve the structure of the ceiling sketch that we had achieved in the previous section, but using the model lines we have stored in the previous point. To do this we can do the following code:<\/p>\n<pre class=\"lang:c# decode:true\">IList&lt;IList&lt;ModelLine&gt;&gt; editableSketch = \r\n    new List&lt;IList&lt;ModelLine&gt;&gt;();\r\n            \r\nforeach (CurveArray loop in ceilingProfile) {\r\n     List&lt;ModelLine&gt; newLoop = new List&lt;ModelLine&gt;();\r\n\r\nforeach (Curve edge in loop) {\r\n                    \r\n          foreach (ModelLine modelLine in modelLines) {\r\n               \r\n               Curve currentLine = ((modelLine as ModelLine)\r\n                 .Location as LocationCurve).Curve;\r\n                        \r\n               if (currentLine.Intersect(edge) \r\n                    == SetComparisonResult.Equal){\r\n                    \r\n                    newLoop.Add(modelLine);\r\n                    break;\r\n               }\r\n                \r\n                editableSketch.Add(newLoop);\r\n          }\r\n     }\r\n}\r\n<\/pre>\n<p>This code is running through all the lines of all the loops of the ceiling sketch (variable ceilingProfile) and looking for the same line in our list of model lines (variable modelLine). When the code finds the line, stores it in a new structure (variable editableSketch) that follows the structure of the sketch, but storing the editable lines.<\/p>\n<h3>Preventing errors<\/h3>\n<p>To avoid exceptions the code should check that the conditions mentioned in the previous section are satisfied, before editing the ceiling.<\/p>\n<p>The following code is a simplification that:<\/p>\n<li>Sorts the room and ceiling boundaries, leaving the outer perimeter as the first element, and ordering the rest of the loops from more to less number of edges.<\/li>\n<li>Checks the number of loops and the number of edges of room and ceiling.<\/li>\n<pre class=\"lang:c# decode:true\">\/\/sort room boundary\r\nIList&lt;BoundarySegment&gt; roomPerimeter = roomBoundary[0];\r\n            \r\nroomBoundary = roomBoundary.Skip(1)\r\n   .OrderByDescending(s =&gt; s.Count()).ToList();\r\n            \r\nroomBoundary.Insert(0, roomPerimeter);\r\n\r\n\/\/sort ceiling boundary            \r\nIList&lt;ModelLine&gt; ceilingPerimeter = editableSketch[0];\r\n            \r\neditableSketch = editableSketch.Skip(1)\r\n   .OrderByDescending(s =&gt; s.Count()).ToList();\r\n\r\neditableSketch.Insert(0, ceilingPerimeter);\r\n\r\n\/\/compare the number of loops and edges\r\nif(roomBoundary.Count() &gt; editableSketch.Count()\r\n  || Enumerable.Range(0, Math.Min(roomBoundary.Count(),\r\n                                  editableSketch.Count()))\r\n  .Any(i =&gt; roomBoundary[].Count()&gt;editableSketch[].Count()))\r\n{\r\n     throw new Exception(\r\n        \"The ceiling's sketch cannot be \"\r\n\t\t+ \"adapted to the room's shape.\");\r\n}\r\n<\/pre>\n<h3>Editing the ceiling<\/h3>\n<p>We already have the original sketch of the ceiling and the shape of the room, which is what we want to obtain.<br \/>\nNow we modify the ceiling lines to match those of the room, using the <a title=\"ModelLine\" href=\"https:\/\/www.revitapidocs.com\/2020\/52b40d5e-8a43-0dd7-035b-ae9de12d024e.htm\">ModelLine<\/a> class as seen in the following code:<\/p>\n<pre class=\"lang:c# decode:true\">using (Transaction t = new Transaction(currentDocument, \r\n                                      \"Edit ceiling sketch\"))\r\n{\r\n   t.Start();\r\n                    \r\n   for(int i = 0; i &lt; editableSketch.Count(); i++)\r\n   {\r\n      IList&lt;ModelLine&gt; ceilingLoop = editableSketch[];\r\n                        \r\n      if(i &lt; roomBoundary.Count())\r\n      {\r\n         \/\/edit the current loop\r\n         IList&lt;BoundarySegment&gt; roomLoop = roomBoundary[];\r\n                            \r\n         for(int j = 0; j &lt ceilingLoop.Count(); j++)\r\n         {\r\n            ModelLine currentEdge = ceilingLoop[];\r\n                                \r\n            if(j &lt; roomLoop.Count())\r\n            {\r\n               \/\/edit the current edge\r\n               BoundarySegment roomEdge = roomLoop[];\r\n                                    \r\n               Curve newEdge = roomEdge.GetCurve().Clone();\r\n                                    \r\n               if(!(newEdge is Line))\r\n                  throw new Exception(\r\n                     \"The room contains non straight lines\");\r\n\r\n               (currentEdge.Location as LocationCurve).Curve =\r\n\t\t\t       newEdge;\r\n            }\r\n            else\r\n            {\r\n               \/\/remove the current edge\r\n               currentDocument.Delete(currentEdge.Id);\r\n            }\r\n         }\r\n      }\r\n      else\r\n      {\r\n         \/\/remove the current loop\r\n         foreach(ModelLine line in ceilingLoop)\r\n         {\r\n         currentDocument.Delete(line.Id);\r\n         }\r\n      }\r\n   }\r\n\r\n   t.Commit();\r\n}\r\n<\/pre>\n<p>It is important to insist on the use of the <a title=\"Clone\" href=\"https:\/\/www.revitapidocs.com\/2020\/071f6ca9-f243-4655-924c-7beb881b100f.htm\">Clone<\/a> method of the <a title=\"Curve\" href=\"https:\/\/www.revitapidocs.com\/2020\/071f6ca9-f243-4655-924c-7beb881b100f.htm\">Curve<\/a> class, used to replicate the line of the room. If it were not cloned, the line that defines the perimeter of the room would be internally linked to the line that delimits the ceiling, leading to errors when the user makes modifications to these elements from the Revit interface.<\/p>\n<p><p><b>As some readers will have already noticed, this code allows us to modify the sketch of more elements than the ceilings, however other categories do have their own methods to create and modify their geometry, we recommend consulting <a title=\"Revit API documentation\" href=\"https:\/\/www.revitapidocs.com\/\">Revit API documentation<\/a> to avoid falling into solutions that are more complex than necessary.<\/b><\/p>\n<p><h3>Conclusion<\/h3>\n<li>The Revit API doesn&#8217;t allow us to edit the ceiling sketch directly, but there are tricks to achieving this.<\/li>\n<p>It may seem that this example has too many limitations, however it is the basis on which we were able to develop in <a title=\"Modelical\" href=\"https:\/\/www.modelical.com\/en\/\">Modelical<\/a> an add-in like the one below:<\/p>\n<p><iframe src=\"https:\/\/www.youtube.com\/embed\/2zCCnIPyMqE\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<h3>References<\/h3>\n<p>We must thank <a title=\"Joe Ye\" href=\"https:\/\/adndevblog.typepad.com\/aec\/joe-ye.html\">Joe Ye<\/a> for his post <a title=\"Change the boundary of floors\/slabs\" href=\"https:\/\/adndevblog.typepad.com\/aec\/2013\/10\/change-the-boundary-of-floorsslabs.html\">Change the boundary of floors\/slabs<\/a>, which was the key to achieving our goal.\n<\/p>\n<p><b>Author:<\/b> <a title=\"Adri\u00e1n S\u00e1nz\" href=\"https:\/\/www.modelical.com\/en\/author\/adrian\/\" style=\"color:#4ea6dc;\">Adri\u00e1n S\u00e1nz<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>We show you how to do it using programming In many projects we will have to model the finishes, which can be a laborious task depending on the complexity of the project. Revit&#8217;s interface doesn&#8217;t have any tool that allows us to generate finishes automatically using the information of the rooms, however by programming we [&hellip;]<\/p>\n","protected":false},"author":50,"featured_media":26965,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[4],"tags":[411,410],"class_list":["post-17009","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guidelines","tag-technology-revit","tag-technology-revit-api"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Editing ceiling sketch with Revit API - Modelical<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Editing ceiling sketch with Revit API - Modelical\" \/>\n<meta property=\"og:description\" content=\"We show you how to do it using programming In many projects we will have to model the finishes, which can be a laborious task depending on the complexity of the project. Revit&#8217;s interface doesn&#8217;t have any tool that allows us to generate finishes automatically using the information of the rooms, however by programming we [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Modelical\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Modelical\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-12-09T15:50:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-03-30T12:22:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.modelical.com\/wp-content\/uploads\/Posts_11_EditingCeiling.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"375\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Adri\u00e1n Sanz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@modelical\" \/>\n<meta name=\"twitter:site\" content=\"@modelical\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Adri\u00e1n Sanz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/edit-ceilings-with-revit-api\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/edit-ceilings-with-revit-api\\\/\"},\"author\":{\"name\":\"Adri\u00e1n Sanz\",\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/#\\\/schema\\\/person\\\/c426792dfe0b43d9ba68321226666558\"},\"headline\":\"Editing ceiling sketch with Revit API\",\"datePublished\":\"2020-12-09T15:50:37+00:00\",\"dateModified\":\"2022-03-30T12:22:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/edit-ceilings-with-revit-api\\\/\"},\"wordCount\":1040,\"commentCount\":2,\"image\":{\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/edit-ceilings-with-revit-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.modelical.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/EditingCeiling-400x250-1.jpg\",\"keywords\":[\"Tec Revit\",\"Tec Revit Api\"],\"articleSection\":[\"Guidelines\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.modelical.com\\\/en\\\/edit-ceilings-with-revit-api\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/edit-ceilings-with-revit-api\\\/\",\"url\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/edit-ceilings-with-revit-api\\\/\",\"name\":\"Editing ceiling sketch with Revit API - Modelical\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/edit-ceilings-with-revit-api\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/edit-ceilings-with-revit-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.modelical.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/EditingCeiling-400x250-1.jpg\",\"datePublished\":\"2020-12-09T15:50:37+00:00\",\"dateModified\":\"2022-03-30T12:22:33+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/#\\\/schema\\\/person\\\/c426792dfe0b43d9ba68321226666558\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.modelical.com\\\/en\\\/edit-ceilings-with-revit-api\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/edit-ceilings-with-revit-api\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.modelical.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/EditingCeiling-400x250-1.jpg\",\"contentUrl\":\"https:\\\/\\\/www.modelical.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/EditingCeiling-400x250-1.jpg\",\"width\":400,\"height\":250,\"caption\":\"Ceiling sketch with Revit API\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/\",\"name\":\"Modelical\",\"description\":\"We build information\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/#\\\/schema\\\/person\\\/c426792dfe0b43d9ba68321226666558\",\"name\":\"Adri\u00e1n Sanz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ec31490ae263394daa1bce46a42c1971229edde7fa496c988991e320bd439e17?s=96&d=initials&r=g&initials=ad\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ec31490ae263394daa1bce46a42c1971229edde7fa496c988991e320bd439e17?s=96&d=initials&r=g&initials=ad\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ec31490ae263394daa1bce46a42c1971229edde7fa496c988991e320bd439e17?s=96&d=initials&r=g&initials=ad\",\"caption\":\"Adri\u00e1n Sanz\"},\"url\":\"https:\\\/\\\/www.modelical.com\\\/en\\\/author\\\/adrian\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Editing ceiling sketch with Revit API - Modelical","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/","og_locale":"en_US","og_type":"article","og_title":"Editing ceiling sketch with Revit API - Modelical","og_description":"We show you how to do it using programming In many projects we will have to model the finishes, which can be a laborious task depending on the complexity of the project. Revit&#8217;s interface doesn&#8217;t have any tool that allows us to generate finishes automatically using the information of the rooms, however by programming we [&hellip;]","og_url":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/","og_site_name":"Modelical","article_publisher":"https:\/\/www.facebook.com\/Modelical\/","article_published_time":"2020-12-09T15:50:37+00:00","article_modified_time":"2022-03-30T12:22:33+00:00","og_image":[{"width":600,"height":375,"url":"https:\/\/www.modelical.com\/wp-content\/uploads\/Posts_11_EditingCeiling.jpg","type":"image\/jpeg"}],"author":"Adri\u00e1n Sanz","twitter_card":"summary_large_image","twitter_creator":"@modelical","twitter_site":"@modelical","twitter_misc":{"Written by":"Adri\u00e1n Sanz","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/#article","isPartOf":{"@id":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/"},"author":{"name":"Adri\u00e1n Sanz","@id":"https:\/\/www.modelical.com\/en\/#\/schema\/person\/c426792dfe0b43d9ba68321226666558"},"headline":"Editing ceiling sketch with Revit API","datePublished":"2020-12-09T15:50:37+00:00","dateModified":"2022-03-30T12:22:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/"},"wordCount":1040,"commentCount":2,"image":{"@id":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/#primaryimage"},"thumbnailUrl":"https:\/\/www.modelical.com\/wp-content\/uploads\/2020\/12\/EditingCeiling-400x250-1.jpg","keywords":["Tec Revit","Tec Revit Api"],"articleSection":["Guidelines"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/","url":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/","name":"Editing ceiling sketch with Revit API - Modelical","isPartOf":{"@id":"https:\/\/www.modelical.com\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/#primaryimage"},"image":{"@id":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/#primaryimage"},"thumbnailUrl":"https:\/\/www.modelical.com\/wp-content\/uploads\/2020\/12\/EditingCeiling-400x250-1.jpg","datePublished":"2020-12-09T15:50:37+00:00","dateModified":"2022-03-30T12:22:33+00:00","author":{"@id":"https:\/\/www.modelical.com\/en\/#\/schema\/person\/c426792dfe0b43d9ba68321226666558"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.modelical.com\/en\/edit-ceilings-with-revit-api\/#primaryimage","url":"https:\/\/www.modelical.com\/wp-content\/uploads\/2020\/12\/EditingCeiling-400x250-1.jpg","contentUrl":"https:\/\/www.modelical.com\/wp-content\/uploads\/2020\/12\/EditingCeiling-400x250-1.jpg","width":400,"height":250,"caption":"Ceiling sketch with Revit API"},{"@type":"WebSite","@id":"https:\/\/www.modelical.com\/en\/#website","url":"https:\/\/www.modelical.com\/en\/","name":"Modelical","description":"We build information","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.modelical.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.modelical.com\/en\/#\/schema\/person\/c426792dfe0b43d9ba68321226666558","name":"Adri\u00e1n Sanz","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ec31490ae263394daa1bce46a42c1971229edde7fa496c988991e320bd439e17?s=96&d=initials&r=g&initials=ad","url":"https:\/\/secure.gravatar.com\/avatar\/ec31490ae263394daa1bce46a42c1971229edde7fa496c988991e320bd439e17?s=96&d=initials&r=g&initials=ad","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ec31490ae263394daa1bce46a42c1971229edde7fa496c988991e320bd439e17?s=96&d=initials&r=g&initials=ad","caption":"Adri\u00e1n Sanz"},"url":"https:\/\/www.modelical.com\/en\/author\/adrian\/"}]}},"_links":{"self":[{"href":"https:\/\/www.modelical.com\/en\/wp-json\/wp\/v2\/posts\/17009","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.modelical.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.modelical.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.modelical.com\/en\/wp-json\/wp\/v2\/users\/50"}],"replies":[{"embeddable":true,"href":"https:\/\/www.modelical.com\/en\/wp-json\/wp\/v2\/comments?post=17009"}],"version-history":[{"count":0,"href":"https:\/\/www.modelical.com\/en\/wp-json\/wp\/v2\/posts\/17009\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.modelical.com\/en\/wp-json\/wp\/v2\/media\/26965"}],"wp:attachment":[{"href":"https:\/\/www.modelical.com\/en\/wp-json\/wp\/v2\/media?parent=17009"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.modelical.com\/en\/wp-json\/wp\/v2\/categories?post=17009"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.modelical.com\/en\/wp-json\/wp\/v2\/tags?post=17009"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}