{"action":"created","comment":{"url":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/comments/240436175","pull_request_review_id":183466841,"id":240436175,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MDQzNjE3NQ==","diff_hunk":"@@ -650,32 +610,119 @@ void TreeSupport::insertDroppedNode(std::unordered_set<Node*>& nodes_layer, Node\n     conflicting_node->support_roof_layers_below = std::max(conflicting_node->support_roof_layers_below, p_node->support_roof_layers_below);\n }\n \n-void TreeSupport::propagateCollisionAreas(const SliceDataStorage& storage, const std::vector<std::vector<Polygons>>& model_collision, std::vector<std::vector<Polygons>>& model_avoidance)\n+ModelVolumes::ModelVolumes(const SliceDataStorage& storage, Polygons machine_border, coord_t xy_distance,\n+                           coord_t max_move, coord_t radius_sample_resolution) :\n+    machine_border_{machine_border},\n+    xy_distance_{xy_distance},\n+    max_move_{max_move},\n+    radius_sample_resolution_{radius_sample_resolution}\n {\n-    model_avoidance.resize(model_collision.size());\n+    for (auto i = 0; i < static_cast<int>(storage.support.supportLayers.size()); ++i)\n+    {\n+        layer_outlines_.push_back(storage.getLayerOutlines(i, false));\n+    }\n+}\n \n-    const Settings& mesh_group_settings = Application::getInstance().current_slice->scene.current_mesh_group->settings;\n-    const coord_t layer_height = mesh_group_settings.get<coord_t>(\"layer_height\");\n-    const AngleRadians angle = mesh_group_settings.get<AngleRadians>(\"support_tree_angle\");\n-    const coord_t maximum_move_distance = (angle < TAU / 4) ? (coord_t)(tan(angle) * layer_height) : std::numeric_limits<coord_t>::max();\n-    size_t completed = 0; //To track progress in a multi-threaded environment.\n-#pragma omp parallel for shared(model_avoidance) schedule(dynamic)\n-    for (size_t radius_sample = 0; radius_sample < model_avoidance.size(); radius_sample++)\n+const Polygons& ModelVolumes::collision(coord_t radius, int layer) const\n+{\n+    radius = roundRadius(radius);\n+    RadiusLayerPair key{radius, layer};\n+    const auto it = collision_cache_.find(key);\n+    if (it != collision_cache_.end())\n     {\n-        model_avoidance[radius_sample].push_back(model_collision[radius_sample][0]);\n-        for (size_t layer_nr = 1; layer_nr < storage.support.supportLayers.size(); layer_nr++)\n-        {\n-            Polygons previous_layer = model_avoidance[radius_sample][layer_nr - 1].offset(-maximum_move_distance).smooth(5); //Inset previous layer with maximum_move_distance to allow some movement. Smooth to avoid micrometre-segments.\n-            previous_layer = previous_layer.unionPolygons(model_collision[radius_sample][layer_nr]);\n-            model_avoidance[radius_sample].push_back(previous_layer);\n-        }\n-#pragma omp atomic\n-        completed++;\n-#pragma omp critical (progress)\n-        {\n-            Progress::messageProgress(Progress::Stage::SUPPORT, ((model_collision.size() / 2) + (completed / 2)) * PROGRESS_WEIGHT_COLLISION, model_avoidance.size() * PROGRESS_WEIGHT_COLLISION + storage.support.supportLayers.size() * PROGRESS_WEIGHT_DROPDOWN + storage.support.supportLayers.size() * PROGRESS_WEIGHT_AREAS);\n-        }\n+        return it->second;\n+    }\n+    else\n+    {\n+        return calculateCollision(key);\n     }\n }\n \n+const Polygons& ModelVolumes::avoidance(coord_t radius, int layer) const\n+{\n+    radius = roundRadius(radius);\n+    RadiusLayerPair key{radius, layer};\n+    const auto it = avoidance_cache_.find(key);\n+    if (it != avoidance_cache_.end())\n+    {\n+        return it->second;\n+    }\n+    else\n+    {\n+        return calculateAvoidance(key);\n+    }\n+}\n+\n+const Polygons& ModelVolumes::internal_model(coord_t radius, int layer) const\n+{\n+    radius = roundRadius(radius);\n+    RadiusLayerPair key{radius, layer};\n+    const auto it = internal_model_cache_.find(key);\n+    if (it != internal_model_cache_.end())\n+    {\n+        return it->second;\n+    }\n+    else\n+    {\n+        return calculateInternalModel(key);\n+    }\n+}\n+coord_t ModelVolumes::roundRadius(coord_t radius) const\n+{\n+    const auto remainder = radius % radius_sample_resolution_;\n+    const auto delta = remainder != 0 ? radius_sample_resolution_- remainder : 0;\n+    return radius + delta;\n+}\n+\n+const Polygons& ModelVolumes::calculateCollision(const RadiusLayerPair& key) const\n+{\n+    const auto& radius = key.first;\n+    const auto& layer = key.second;\n+\n+    auto collision_areas = machine_border_;\n+    if (layer < static_cast<int>(layer_outlines_.size())) {\n+        collision_areas = collision_areas.unionPolygons(layer_outlines_[layer]);\n+    }\n+    collision_areas = collision_areas.offset(xy_distance_ + radius, ClipperLib::JoinType::jtRound);\n+    const auto ret = collision_cache_.insert({key, std::move(collision_areas)});\n+    assert(ret.second);\n+    return ret.first->second;\n+}\n+\n+const Polygons& ModelVolumes::calculateAvoidance(const RadiusLayerPair& key) const\n+{\n+    const auto& radius = key.first;\n+    const auto& layer = key.second;","path":"src/TreeSupport.cpp","position":null,"original_position":372,"commit_id":"e7158af92cd4f20a4c403825f8c76049b90e6b83","original_commit_id":"01275c056f5eb4e92d1e1ce5fee94c0fdf1efe91","user":{"login":"bjude","id":4530480,"node_id":"MDQ6VXNlcjQ1MzA0ODA=","avatar_url":"https://avatars2.githubusercontent.com/u/4530480?v=4","gravatar_id":"","url":"https://api.github.com/users/bjude","html_url":"https://github.com/bjude","followers_url":"https://api.github.com/users/bjude/followers","following_url":"https://api.github.com/users/bjude/following{/other_user}","gists_url":"https://api.github.com/users/bjude/gists{/gist_id}","starred_url":"https://api.github.com/users/bjude/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bjude/subscriptions","organizations_url":"https://api.github.com/users/bjude/orgs","repos_url":"https://api.github.com/users/bjude/repos","events_url":"https://api.github.com/users/bjude/events{/privacy}","received_events_url":"https://api.github.com/users/bjude/received_events","type":"User","site_admin":false},"body":"Variable name clarified. I've left auto for now since the variable name says enough IMO","created_at":"2018-12-11T00:41:07Z","updated_at":"2018-12-11T00:41:07Z","html_url":"https://github.com/Ultimaker/CuraEngine/pull/900#discussion_r240436175","pull_request_url":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/900","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/comments/240436175"},"html":{"href":"https://github.com/Ultimaker/CuraEngine/pull/900#discussion_r240436175"},"pull_request":{"href":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/900"}},"in_reply_to_id":239514801},"pull_request":{"url":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/900","id":228167320,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI4MTY3MzIw","html_url":"https://github.com/Ultimaker/CuraEngine/pull/900","diff_url":"https://github.com/Ultimaker/CuraEngine/pull/900.diff","patch_url":"https://github.com/Ultimaker/CuraEngine/pull/900.patch","issue_url":"https://api.github.com/repos/Ultimaker/CuraEngine/issues/900","number":900,"state":"open","locked":false,"title":"TreeSupport: Lazily calculate the collision, avoidance and internal model guide volumes","user":{"login":"bjude","id":4530480,"node_id":"MDQ6VXNlcjQ1MzA0ODA=","avatar_url":"https://avatars2.githubusercontent.com/u/4530480?v=4","gravatar_id":"","url":"https://api.github.com/users/bjude","html_url":"https://github.com/bjude","followers_url":"https://api.github.com/users/bjude/followers","following_url":"https://api.github.com/users/bjude/following{/other_user}","gists_url":"https://api.github.com/users/bjude/gists{/gist_id}","starred_url":"https://api.github.com/users/bjude/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bjude/subscriptions","organizations_url":"https://api.github.com/users/bjude/orgs","repos_url":"https://api.github.com/users/bjude/repos","events_url":"https://api.github.com/users/bjude/events{/privacy}","received_events_url":"https://api.github.com/users/bjude/received_events","type":"User","site_admin":false},"body":"The ModelVolumes object lazily calculates the volumes as required, singificantly reducing the amount of work done since most radius samples were never read in the old code.\r\nThe object is not thread-safe and we lose the parallelism of generating the volumes with OpenMP but this is still faster because only the required areas are genereated.\r\n\r\nThere is a slight change in behaviour due inconsistent behaviour in the old code regarding radius sample index calculation. The new code consistently uses ceiling when calculating the sample radius whereas the old code used ceiling for generating the volumes and rounding when accessing later on.","created_at":"2018-11-04T09:55:18Z","updated_at":"2018-12-11T00:41:07Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ae11114f45cd375dbaf08f2e8d0c310dda4727cb","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":766485081,"node_id":"MDU6TGFiZWw3NjY0ODUwODE=","url":"https://api.github.com/repos/Ultimaker/CuraEngine/labels/JIRA","name":"JIRA","color":"0e8a16","default":false},{"id":30576397,"node_id":"MDU6TGFiZWwzMDU3NjM5Nw==","url":"https://api.github.com/repos/Ultimaker/CuraEngine/labels/enhancement","name":"enhancement","color":"84b6eb","default":true}],"milestone":null,"commits_url":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/900/commits","review_comments_url":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/900/comments","review_comment_url":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Ultimaker/CuraEngine/issues/900/comments","statuses_url":"https://api.github.com/repos/Ultimaker/CuraEngine/statuses/e7158af92cd4f20a4c403825f8c76049b90e6b83","head":{"label":"bjude:lazy_tree_volumes","ref":"lazy_tree_volumes","sha":"e7158af92cd4f20a4c403825f8c76049b90e6b83","user":{"login":"bjude","id":4530480,"node_id":"MDQ6VXNlcjQ1MzA0ODA=","avatar_url":"https://avatars2.githubusercontent.com/u/4530480?v=4","gravatar_id":"","url":"https://api.github.com/users/bjude","html_url":"https://github.com/bjude","followers_url":"https://api.github.com/users/bjude/followers","following_url":"https://api.github.com/users/bjude/following{/other_user}","gists_url":"https://api.github.com/users/bjude/gists{/gist_id}","starred_url":"https://api.github.com/users/bjude/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bjude/subscriptions","organizations_url":"https://api.github.com/users/bjude/orgs","repos_url":"https://api.github.com/users/bjude/repos","events_url":"https://api.github.com/users/bjude/events{/privacy}","received_events_url":"https://api.github.com/users/bjude/received_events","type":"User","site_admin":false},"repo":{"id":144440360,"node_id":"MDEwOlJlcG9zaXRvcnkxNDQ0NDAzNjA=","name":"CuraEngine","full_name":"bjude/CuraEngine","private":false,"owner":{"login":"bjude","id":4530480,"node_id":"MDQ6VXNlcjQ1MzA0ODA=","avatar_url":"https://avatars2.githubusercontent.com/u/4530480?v=4","gravatar_id":"","url":"https://api.github.com/users/bjude","html_url":"https://github.com/bjude","followers_url":"https://api.github.com/users/bjude/followers","following_url":"https://api.github.com/users/bjude/following{/other_user}","gists_url":"https://api.github.com/users/bjude/gists{/gist_id}","starred_url":"https://api.github.com/users/bjude/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bjude/subscriptions","organizations_url":"https://api.github.com/users/bjude/orgs","repos_url":"https://api.github.com/users/bjude/repos","events_url":"https://api.github.com/users/bjude/events{/privacy}","received_events_url":"https://api.github.com/users/bjude/received_events","type":"User","site_admin":false},"html_url":"https://github.com/bjude/CuraEngine","description":"CuraEngine is a powerful, fast and robust engine for processing 3D models into 3D printing instruction for Ultimaker and other GCode based 3D printers. It is part of the larger open source project called \"Cura\".","fork":true,"url":"https://api.github.com/repos/bjude/CuraEngine","forks_url":"https://api.github.com/repos/bjude/CuraEngine/forks","keys_url":"https://api.github.com/repos/bjude/CuraEngine/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bjude/CuraEngine/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bjude/CuraEngine/teams","hooks_url":"https://api.github.com/repos/bjude/CuraEngine/hooks","issue_events_url":"https://api.github.com/repos/bjude/CuraEngine/issues/events{/number}","events_url":"https://api.github.com/repos/bjude/CuraEngine/events","assignees_url":"https://api.github.com/repos/bjude/CuraEngine/assignees{/user}","branches_url":"https://api.github.com/repos/bjude/CuraEngine/branches{/branch}","tags_url":"https://api.github.com/repos/bjude/CuraEngine/tags","blobs_url":"https://api.github.com/repos/bjude/CuraEngine/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bjude/CuraEngine/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bjude/CuraEngine/git/refs{/sha}","trees_url":"https://api.github.com/repos/bjude/CuraEngine/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bjude/CuraEngine/statuses/{sha}","languages_url":"https://api.github.com/repos/bjude/CuraEngine/languages","stargazers_url":"https://api.github.com/repos/bjude/CuraEngine/stargazers","contributors_url":"https://api.github.com/repos/bjude/CuraEngine/contributors","subscribers_url":"https://api.github.com/repos/bjude/CuraEngine/subscribers","subscription_url":"https://api.github.com/repos/bjude/CuraEngine/subscription","commits_url":"https://api.github.com/repos/bjude/CuraEngine/commits{/sha}","git_commits_url":"https://api.github.com/repos/bjude/CuraEngine/git/commits{/sha}","comments_url":"https://api.github.com/repos/bjude/CuraEngine/comments{/number}","issue_comment_url":"https://api.github.com/repos/bjude/CuraEngine/issues/comments{/number}","contents_url":"https://api.github.com/repos/bjude/CuraEngine/contents/{+path}","compare_url":"https://api.github.com/repos/bjude/CuraEngine/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bjude/CuraEngine/merges","archive_url":"https://api.github.com/repos/bjude/CuraEngine/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bjude/CuraEngine/downloads","issues_url":"https://api.github.com/repos/bjude/CuraEngine/issues{/number}","pulls_url":"https://api.github.com/repos/bjude/CuraEngine/pulls{/number}","milestones_url":"https://api.github.com/repos/bjude/CuraEngine/milestones{/number}","notifications_url":"https://api.github.com/repos/bjude/CuraEngine/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bjude/CuraEngine/labels{/name}","releases_url":"https://api.github.com/repos/bjude/CuraEngine/releases{/id}","deployments_url":"https://api.github.com/repos/bjude/CuraEngine/deployments","created_at":"2018-08-12T05:25:46Z","updated_at":"2018-12-10T04:16:32Z","pushed_at":"2018-12-10T04:16:27Z","git_url":"git://github.com/bjude/CuraEngine.git","ssh_url":"git@github.com:bjude/CuraEngine.git","clone_url":"https://github.com/bjude/CuraEngine.git","svn_url":"https://github.com/bjude/CuraEngine","homepage":"https://ultimaker.com/en/products/cura-software","size":48756,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"Ultimaker:master","ref":"master","sha":"256b91db9e1b6e76eba0eaf319bcff648a0ea17f","user":{"login":"Ultimaker","id":499557,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ5OTU1Nw==","avatar_url":"https://avatars1.githubusercontent.com/u/499557?v=4","gravatar_id":"","url":"https://api.github.com/users/Ultimaker","html_url":"https://github.com/Ultimaker","followers_url":"https://api.github.com/users/Ultimaker/followers","following_url":"https://api.github.com/users/Ultimaker/following{/other_user}","gists_url":"https://api.github.com/users/Ultimaker/gists{/gist_id}","starred_url":"https://api.github.com/users/Ultimaker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ultimaker/subscriptions","organizations_url":"https://api.github.com/users/Ultimaker/orgs","repos_url":"https://api.github.com/users/Ultimaker/repos","events_url":"https://api.github.com/users/Ultimaker/events{/privacy}","received_events_url":"https://api.github.com/users/Ultimaker/received_events","type":"Organization","site_admin":false},"repo":{"id":8556864,"node_id":"MDEwOlJlcG9zaXRvcnk4NTU2ODY0","name":"CuraEngine","full_name":"Ultimaker/CuraEngine","private":false,"owner":{"login":"Ultimaker","id":499557,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ5OTU1Nw==","avatar_url":"https://avatars1.githubusercontent.com/u/499557?v=4","gravatar_id":"","url":"https://api.github.com/users/Ultimaker","html_url":"https://github.com/Ultimaker","followers_url":"https://api.github.com/users/Ultimaker/followers","following_url":"https://api.github.com/users/Ultimaker/following{/other_user}","gists_url":"https://api.github.com/users/Ultimaker/gists{/gist_id}","starred_url":"https://api.github.com/users/Ultimaker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ultimaker/subscriptions","organizations_url":"https://api.github.com/users/Ultimaker/orgs","repos_url":"https://api.github.com/users/Ultimaker/repos","events_url":"https://api.github.com/users/Ultimaker/events{/privacy}","received_events_url":"https://api.github.com/users/Ultimaker/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/Ultimaker/CuraEngine","description":"CuraEngine is a powerful, fast and robust engine for processing 3D models into 3D printing instruction for Ultimaker and other GCode based 3D printers. It is part of the larger open source project called \"Cura\".","fork":false,"url":"https://api.github.com/repos/Ultimaker/CuraEngine","forks_url":"https://api.github.com/repos/Ultimaker/CuraEngine/forks","keys_url":"https://api.github.com/repos/Ultimaker/CuraEngine/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Ultimaker/CuraEngine/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Ultimaker/CuraEngine/teams","hooks_url":"https://api.github.com/repos/Ultimaker/CuraEngine/hooks","issue_events_url":"https://api.github.com/repos/Ultimaker/CuraEngine/issues/events{/number}","events_url":"https://api.github.com/repos/Ultimaker/CuraEngine/events","assignees_url":"https://api.github.com/repos/Ultimaker/CuraEngine/assignees{/user}","branches_url":"https://api.github.com/repos/Ultimaker/CuraEngine/branches{/branch}","tags_url":"https://api.github.com/repos/Ultimaker/CuraEngine/tags","blobs_url":"https://api.github.com/repos/Ultimaker/CuraEngine/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Ultimaker/CuraEngine/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Ultimaker/CuraEngine/git/refs{/sha}","trees_url":"https://api.github.com/repos/Ultimaker/CuraEngine/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Ultimaker/CuraEngine/statuses/{sha}","languages_url":"https://api.github.com/repos/Ultimaker/CuraEngine/languages","stargazers_url":"https://api.github.com/repos/Ultimaker/CuraEngine/stargazers","contributors_url":"https://api.github.com/repos/Ultimaker/CuraEngine/contributors","subscribers_url":"https://api.github.com/repos/Ultimaker/CuraEngine/subscribers","subscription_url":"https://api.github.com/repos/Ultimaker/CuraEngine/subscription","commits_url":"https://api.github.com/repos/Ultimaker/CuraEngine/commits{/sha}","git_commits_url":"https://api.github.com/repos/Ultimaker/CuraEngine/git/commits{/sha}","comments_url":"https://api.github.com/repos/Ultimaker/CuraEngine/comments{/number}","issue_comment_url":"https://api.github.com/repos/Ultimaker/CuraEngine/issues/comments{/number}","contents_url":"https://api.github.com/repos/Ultimaker/CuraEngine/contents/{+path}","compare_url":"https://api.github.com/repos/Ultimaker/CuraEngine/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Ultimaker/CuraEngine/merges","archive_url":"https://api.github.com/repos/Ultimaker/CuraEngine/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Ultimaker/CuraEngine/downloads","issues_url":"https://api.github.com/repos/Ultimaker/CuraEngine/issues{/number}","pulls_url":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls{/number}","milestones_url":"https://api.github.com/repos/Ultimaker/CuraEngine/milestones{/number}","notifications_url":"https://api.github.com/repos/Ultimaker/CuraEngine/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Ultimaker/CuraEngine/labels{/name}","releases_url":"https://api.github.com/repos/Ultimaker/CuraEngine/releases{/id}","deployments_url":"https://api.github.com/repos/Ultimaker/CuraEngine/deployments","created_at":"2013-03-04T14:12:08Z","updated_at":"2018-12-07T06:06:09Z","pushed_at":"2018-12-10T17:12:11Z","git_url":"git://github.com/Ultimaker/CuraEngine.git","ssh_url":"git@github.com:Ultimaker/CuraEngine.git","clone_url":"https://github.com/Ultimaker/CuraEngine.git","svn_url":"https://github.com/Ultimaker/CuraEngine","homepage":"https://ultimaker.com/en/products/cura-software","size":48815,"stargazers_count":784,"watchers_count":784,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":506,"mirror_url":null,"archived":false,"open_issues_count":98,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":506,"open_issues":98,"watchers":784,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/900"},"html":{"href":"https://github.com/Ultimaker/CuraEngine/pull/900"},"issue":{"href":"https://api.github.com/repos/Ultimaker/CuraEngine/issues/900"},"comments":{"href":"https://api.github.com/repos/Ultimaker/CuraEngine/issues/900/comments"},"review_comments":{"href":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/900/comments"},"review_comment":{"href":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Ultimaker/CuraEngine/pulls/900/commits"},"statuses":{"href":"https://api.github.com/repos/Ultimaker/CuraEngine/statuses/e7158af92cd4f20a4c403825f8c76049b90e6b83"}},"author_association":"NONE"}}
{"actor":{"display_login":"bjude"}}