{"id":429,"date":"2023-09-26T18:57:06","date_gmt":"2023-09-26T16:57:06","guid":{"rendered":"https:\/\/easyrevitapi.com\/?p=429"},"modified":"2023-11-01T15:07:52","modified_gmt":"2023-11-01T14:07:52","slug":"towards-object-specific-coordinate-systems","status":"publish","type":"post","link":"https:\/\/easyrevitapi.com\/index.php\/2023\/09\/26\/towards-object-specific-coordinate-systems\/","title":{"rendered":"Towards element-specific coordinate systems"},"content":{"rendered":"\n<p>One of the challenges I encountered with the Revit API was about defining the spatial positions of a model&#8217;s elements in relation to each other. I had to consider this issue when automating the control of openings within a wall, as to ensure their positions complied with specific structural constraints.<\/p>\n\n\n\n<p>By default, the Revit API returns a point&#8217;s coordinates as related to the internal origin, considered to be the center of the model&#8217;s global coordinate system. In my case, however, I wanted the openings&#8217; coordinates to be related to a wall-specific coordinate system. This would make the structural verification algorithms easier to design and program.<\/p>\n\n\n\n<p>The following presents a methodology I have developed and been using to convert coordinates from the model coordinate system to an element-specific one. I will first present the steps of this methodology in terms of geometric operations, then will provide the related C# code.<\/p>\n\n\n\n<p>Before going further, you might want to understand more about Revit transformations. For more insights, please refer to the preceding article : <a href=\"https:\/\/easyrevitapi.com\/index.php\/2023\/08\/15\/revit-transformations-made-easy\/\" data-type=\"link\" data-id=\"https:\/\/easyrevitapi.com\/index.php\/2023\/08\/15\/revit-transformations-made-easy\/\"><span style=\"text-decoration: underline;\">Revit Transformations Made Easy<\/span><\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Coordinates conversion<\/h4>\n\n\n\n<p><br><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"734\" src=\"https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/1-2-1024x734.jpg\" alt=\"\" class=\"wp-image-531\" style=\"width:586px;height:420px\" srcset=\"https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/1-2-1024x734.jpg 1024w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/1-2-300x215.jpg 300w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/1-2-768x550.jpg 768w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/1-2-1536x1100.jpg 1536w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/1-2-2048x1467.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The example we will be using is that of a simple wall. We establish the local coordinate system for this wall using one of its lower corners, <strong>PointO<\/strong>, as the origin, with global coordinates of <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-palette-color-2-color\"><strong>(2, 4, 0)<\/strong><\/mark>. The local coordinate system&#8217;s axes align with the wall&#8217;s three edges meeting at this point.<\/p>\n\n\n\n<p><strong>PointA<\/strong> is where a horizontal line meets one of the wall&#8217;s faces, with global <em>(model)<\/em> coordinates of <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-palette-color-2-color\"><strong>(5, 6, 2)<\/strong><\/mark> and local <em>(wall)<\/em> coordinates of <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-palette-color-2-color\"><strong>(3.60 ,0 ,2)<\/strong><\/mark>. Our purpose is to understand how to convert <strong>PointA<\/strong>&#8216;s coordinates from the global to the local coordinate system.<\/p>\n\n\n\n<p><br><br><\/p>\n\n\n\n<h5 class=\"wp-block-heading has-text-align-center\"><strong>Step 1<\/strong><br><br><\/h5>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"734\" src=\"https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/2-2-1024x734.jpg\" alt=\"\" class=\"wp-image-532\" style=\"width:585px;height:421px\" srcset=\"https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/2-2-1024x734.jpg 1024w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/2-2-300x215.jpg 300w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/2-2-768x550.jpg 768w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/2-2-1536x1100.jpg 1536w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/2-2-2048x1467.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div class=\"centered-content\">\n    <p class=\"your-class-name\" style=\"width: 550px;\">We begin by defining a vector that starts at the model&#8217;s internal origin and extends towards <strong>Point O<\/strong>. We then define the opposite of this vector, and use it to translate <strong>PointA<\/strong>.<\/p>\n<\/div>\n\n\n\n<p><br><br><\/p>\n\n\n\n<h5 class=\"wp-block-heading has-text-align-center\"><strong>Step 2<\/strong><br><br><\/h5>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"734\" src=\"https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/3-3-1024x734.jpg\" alt=\"\" class=\"wp-image-533\" style=\"width:580px;height:415px\" srcset=\"https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/3-3-1024x734.jpg 1024w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/3-3-300x215.jpg 300w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/3-3-768x550.jpg 768w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/3-3-1536x1100.jpg 1536w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/3-3-2048x1467.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div class=\"centered-content\">\n    <p class=\"your-class-name\" style=\"width: 550px;\">We calculate <strong>\u03b1<\/strong> : the angle between the wall&#8217;s <strong> local x-axis<\/strong> and the model&#8217;s <strong>global  x-axis<\/strong>.<\/p>\n<\/div>\n\n\n\n<p><br><br><\/p>\n\n\n\n<h5 class=\"wp-block-heading has-text-align-center\"><strong>Step 3<\/strong><br><br><\/h5>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"734\" src=\"https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/4-4-1024x734.jpg\" alt=\"\" class=\"wp-image-535\" style=\"width:578px;height:414px\" srcset=\"https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/4-4-1024x734.jpg 1024w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/4-4-300x215.jpg 300w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/4-4-768x550.jpg 768w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/4-4-1536x1100.jpg 1536w, https:\/\/easyrevitapi.com\/wp-content\/uploads\/2023\/09\/4-4-2048x1467.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div class=\"centered-content\">\n    <p class=\"your-class-name\" style=\"width: 550px;\">We rotate the translated <strong>pointA<\/strong> around the model\u2019s internal origin by the angle <strong>\u03b1<\/strong>. The result is a point with global <i>(model)<\/i> coordinates of <span style=\"color: rgb(202, 37, 126);\"><strong>(3.60, 0, 2)<\/strong><\/span>. We notice that these coordinates actually match those of <strong>PointA<\/strong> when related to the local <i>(wall)<\/i> coordinate system. <\/p>\n<\/div>\n\n\n\n<p><br><\/p>\n\n\n\n<p>In summary, the process involves defining a local coordinate system related to an element and using transformations to convert global coordinates to local coordinates. Even if we have the freedom to define the origin of the local coordinate system and the orientation of its axes,  the logic for converting the coordinates remains consistent.<\/p>\n\n\n\n<p>This process could be expressed programmatically by the following C# code : <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#002B36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"public class CoordinatesConverter\n    {\n        public void ConvertCoordinates()\n        {\n            XYZ pointA = new XYZ(5, 6, 2);\n            XYZ pointB = new XYZ(8, 8, 0);\n            XYZ pointO = new XYZ(2, 4, 0);\n            XYZ rotationAxis = new XYZ(0, 0, 1);\n            XYZ translatedAndRotatedPointA;\n            XYZ translatedPointB;\n\n            Transform transform_Translation = Transform.CreateTranslation(pointO);\n            Transform transform_invertedTranslation = transform_Translation.Inverse;\n\n            \/\/ To calculte alphaAngle we first need to translate pointB. The resulting vector will have the same direction as the wall's x-axis.  \n            translatedPointB = transform_invertedTranslation.OfPoint(pointB);\n            double alphaAngle = translatedPointB.AngleTo(new XYZ(1, 0, 0));\n\n            \/\/ Since we want our rotation to be done clockwise, alphaAngle needs to be negative\n            Transform transform_Rotation = Transform.CreateRotation(rotationAxis, alphaAngle * -1);\n            Transform transform_TranslationPlusRotation = transform_Rotation.Multiply(transform_invertedTranslation);\n\n            translatedAndRotatedPointA = transform_TranslationPlusRotation.OfPoint(pointA);\n            \/\/ translatedAndRotatedPointA coordinates will be : 3.60, 0, 2\n        }\n    }\" style=\"color:#839496;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki solarized-dark\" style=\"background-color: #002B36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #93A1A1; font-weight: bold\">public<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #93A1A1; font-weight: bold\">class<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #CB4B16\">CoordinatesConverter<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">        <\/span><span style=\"color: #93A1A1; font-weight: bold\">public<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #859900\">void<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #268BD2\">ConvertCoordinates<\/span><span style=\"color: #839496\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #CB4B16\">XYZ<\/span><span style=\"color: #839496\"> pointA <\/span><span style=\"color: #859900\">=<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #859900\">new<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #CB4B16\">XYZ<\/span><span style=\"color: #839496\">(<\/span><span style=\"color: #D33682\">5<\/span><span style=\"color: #839496\">, <\/span><span style=\"color: #D33682\">6<\/span><span style=\"color: #839496\">, <\/span><span style=\"color: #D33682\">2<\/span><span style=\"color: #839496\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #CB4B16\">XYZ<\/span><span style=\"color: #839496\"> pointB <\/span><span style=\"color: #859900\">=<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #859900\">new<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #CB4B16\">XYZ<\/span><span style=\"color: #839496\">(<\/span><span style=\"color: #D33682\">8<\/span><span style=\"color: #839496\">, <\/span><span style=\"color: #D33682\">8<\/span><span style=\"color: #839496\">, <\/span><span style=\"color: #D33682\">0<\/span><span style=\"color: #839496\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #CB4B16\">XYZ<\/span><span style=\"color: #839496\"> pointO <\/span><span style=\"color: #859900\">=<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #859900\">new<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #CB4B16\">XYZ<\/span><span style=\"color: #839496\">(<\/span><span style=\"color: #D33682\">2<\/span><span style=\"color: #839496\">, <\/span><span style=\"color: #D33682\">4<\/span><span style=\"color: #839496\">, <\/span><span style=\"color: #D33682\">0<\/span><span style=\"color: #839496\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #CB4B16\">XYZ<\/span><span style=\"color: #839496\"> rotationAxis <\/span><span style=\"color: #859900\">=<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #859900\">new<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #CB4B16\">XYZ<\/span><span style=\"color: #839496\">(<\/span><span style=\"color: #D33682\">0<\/span><span style=\"color: #839496\">, <\/span><span style=\"color: #D33682\">0<\/span><span style=\"color: #839496\">, <\/span><span style=\"color: #D33682\">1<\/span><span style=\"color: #839496\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #CB4B16\">XYZ<\/span><span style=\"color: #839496\"> translatedAndRotatedPointA;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #CB4B16\">XYZ<\/span><span style=\"color: #839496\"> translatedPointB;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #CB4B16\">Transform<\/span><span style=\"color: #839496\"> transform_Translation <\/span><span style=\"color: #859900\">=<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #268BD2\">Transform<\/span><span style=\"color: #839496\">.<\/span><span style=\"color: #268BD2\">CreateTranslation<\/span><span style=\"color: #839496\">(<\/span><span style=\"color: #268BD2\">pointO<\/span><span style=\"color: #839496\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #CB4B16\">Transform<\/span><span style=\"color: #839496\"> transform_invertedTranslation <\/span><span style=\"color: #859900\">=<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #268BD2\">transform_Translation<\/span><span style=\"color: #839496\">.<\/span><span style=\"color: #268BD2\">Inverse<\/span><span style=\"color: #839496\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #586E75; font-style: italic\">            \/\/ To calculte alphaAngle we first need to translate pointB. The resulting vector will have the same direction as the wall&#39;s x-axis.  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #268BD2\">translatedPointB<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #859900\">=<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #268BD2\">transform_invertedTranslation<\/span><span style=\"color: #839496\">.<\/span><span style=\"color: #268BD2\">OfPoint<\/span><span style=\"color: #839496\">(<\/span><span style=\"color: #268BD2\">pointB<\/span><span style=\"color: #839496\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #859900\">double<\/span><span style=\"color: #839496\"> alphaAngle <\/span><span style=\"color: #859900\">=<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #268BD2\">translatedPointB<\/span><span style=\"color: #839496\">.<\/span><span style=\"color: #268BD2\">AngleTo<\/span><span style=\"color: #839496\">(<\/span><span style=\"color: #859900\">new<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #CB4B16\">XYZ<\/span><span style=\"color: #839496\">(<\/span><span style=\"color: #D33682\">1<\/span><span style=\"color: #839496\">, <\/span><span style=\"color: #D33682\">0<\/span><span style=\"color: #839496\">, <\/span><span style=\"color: #D33682\">0<\/span><span style=\"color: #839496\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #586E75; font-style: italic\">            \/\/ Since we want our rotation to be done clockwise, alphaAngle needs to be negative<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #CB4B16\">Transform<\/span><span style=\"color: #839496\"> transform_Rotation <\/span><span style=\"color: #859900\">=<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #268BD2\">Transform<\/span><span style=\"color: #839496\">.<\/span><span style=\"color: #268BD2\">CreateRotation<\/span><span style=\"color: #839496\">(<\/span><span style=\"color: #268BD2\">rotationAxis<\/span><span style=\"color: #839496\">, <\/span><span style=\"color: #268BD2\">alphaAngle<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #859900\">*<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #859900\">-<\/span><span style=\"color: #D33682\">1<\/span><span style=\"color: #839496\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #CB4B16\">Transform<\/span><span style=\"color: #839496\"> transform_TranslationPlusRotation <\/span><span style=\"color: #859900\">=<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #268BD2\">transform_Rotation<\/span><span style=\"color: #839496\">.<\/span><span style=\"color: #268BD2\">Multiply<\/span><span style=\"color: #839496\">(<\/span><span style=\"color: #268BD2\">transform_invertedTranslation<\/span><span style=\"color: #839496\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #839496\">            <\/span><span style=\"color: #268BD2\">translatedAndRotatedPointA<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #859900\">=<\/span><span style=\"color: #839496\"> <\/span><span style=\"color: #268BD2\">transform_TranslationPlusRotation<\/span><span style=\"color: #839496\">.<\/span><span style=\"color: #268BD2\">OfPoint<\/span><span style=\"color: #839496\">(<\/span><span style=\"color: #268BD2\">pointA<\/span><span style=\"color: #839496\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #586E75; font-style: italic\">            \/\/ translatedAndRotatedPointA coordinates will be : 3.60, 0, 2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #839496\">    }<\/span><\/span><\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>One of the challenges I encountered with the Revit API was about defining the spatial positions of a model&#8217;s elements in relation to each other. I had to consider this issue when automating the control of openings within a wall, as to ensure their positions complied with specific structural constraints. By default, the Revit API [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1030,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-429","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-geometry"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/easyrevitapi.com\/index.php\/wp-json\/wp\/v2\/posts\/429","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/easyrevitapi.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/easyrevitapi.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/easyrevitapi.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/easyrevitapi.com\/index.php\/wp-json\/wp\/v2\/comments?post=429"}],"version-history":[{"count":108,"href":"https:\/\/easyrevitapi.com\/index.php\/wp-json\/wp\/v2\/posts\/429\/revisions"}],"predecessor-version":[{"id":1571,"href":"https:\/\/easyrevitapi.com\/index.php\/wp-json\/wp\/v2\/posts\/429\/revisions\/1571"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/easyrevitapi.com\/index.php\/wp-json\/wp\/v2\/media\/1030"}],"wp:attachment":[{"href":"https:\/\/easyrevitapi.com\/index.php\/wp-json\/wp\/v2\/media?parent=429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/easyrevitapi.com\/index.php\/wp-json\/wp\/v2\/categories?post=429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/easyrevitapi.com\/index.php\/wp-json\/wp\/v2\/tags?post=429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}