{"action":"created","comment":{"url":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/comments/219767705","pull_request_review_id":158017840,"id":219767705,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxOTc2NzcwNQ==","diff_hunk":"@@ -0,0 +1,968 @@\n+/*\n+ * Copyright (c) 2018, Association Scientifique pour la Geologie et ses\n+ * Applications (ASGA). All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *     * Redistributions of source code must retain the above copyright\n+ *       notice, this list of conditions and the following disclaimer.\n+ *     * Redistributions in binary form must reproduce the above copyright\n+ *       notice, this list of conditions and the following disclaimer in the\n+ *       documentation and/or other materials provided with the distribution.\n+ *     * Neither the name of ASGA nor the\n+ *       names of its contributors may be used to endorse or promote products\n+ *       derived from this software without specific prior written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ASGA BE LIABLE FOR ANY DIRECT,\n+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ *\n+ *     http://www.ring-team.org\n+ *\n+ *     RING Project\n+ *     Ecole Nationale Superieure de Geologie - GeoRessources\n+ *     2 Rue du Doyen Marcel Roubault - TSA 70605\n+ *     54518 VANDOEUVRE-LES-NANCY\n+ *     FRANCE\n+ */\n+\n+#include <geogram/basic/attributes.h>\n+#include <geogram/basic/logger.h>\n+\n+#include <ringmesh/basic/geometry.h>\n+#include <ringmesh/geomodel/core/geomodel.h>\n+#include <ringmesh/geomodel/core/geomodel_api.h>\n+#include <ringmesh/geomodel/core/geomodel_geological_entity.h>\n+#include <ringmesh/geomodel/core/geomodel_mesh_entity.h>\n+#include <ringmesh/geomodel/core/stratigraphic_column.h>\n+\n+#include <ringmesh/io/geomodel_builder_resqml.h>\n+\n+#include <ringmesh/mesh/mesh_index.h>\n+\n+#include <ringmesh/mesh/surface_mesh.h>\n+#include <ringmesh/mesh/volume_mesh.h>\n+\n+#include <ringmesh/mesh/mesh_builder.h>\n+\n+#include <fesapi/common/EpcDocument.h>\n+#include <fesapi/common/HdfProxy.h>\n+#include <fesapi/resqml2/AbstractFeatureInterpretation.h>\n+#include <fesapi/resqml2_0_1/ContinuousProperty.h>\n+#include <fesapi/resqml2_0_1/DiscreteProperty.h>\n+#include <fesapi/resqml2_0_1/FrontierFeature.h>\n+#include <fesapi/resqml2_0_1/GeneticBoundaryFeature.h>\n+#include <fesapi/resqml2_0_1/Horizon.h>\n+#include <fesapi/resqml2_0_1/LocalDepth3dCrs.h>\n+#include <fesapi/resqml2_0_1/LocalTime3dCrs.h>\n+#include <fesapi/resqml2_0_1/PropertyKind.h>\n+#include <fesapi/resqml2_0_1/PropertyKindMapper.h>\n+#include <fesapi/resqml2_0_1/StratigraphicColumn.h>\n+#include <fesapi/resqml2_0_1/StratigraphicColumnRankInterpretation.h>\n+#include <fesapi/resqml2_0_1/StratigraphicUnitInterpretation.h>\n+#include <fesapi/resqml2_0_1/TectonicBoundaryFeature.h>\n+#include <fesapi/resqml2_0_1/TriangulatedSetRepresentation.h>\n+#include <fesapi/resqml2_0_1/UnstructuredGridRepresentation.h>\n+\n+/*!\n+ * @brief Implementation of the class to build GeoModel from input\n+ * RESQML2 .epc file\n+ * @author Wan-Chiu Li\n+ */\n+\n+namespace RINGMesh\n+{\n+    using namespace RESQML2_0_1_NS;\n+    using namespace RESQML2_NS;\n+    using namespace COMMON_NS;\n+    using GMGE = GeoModelGeologicalEntity< 3 >;\n+\n+    namespace\n+    {\n+        void showAllMetadata(\n+            AbstractObject* obj, const std::string& prefix = \"\" )\n+        {\n+            std::cout << prefix << \"Title is : \" << obj->getTitle()\n+                      << std::endl;\n+            std::cout << prefix << \"Guid is : \" << obj->getUuid() << std::endl;\n+            if( !obj->isPartial() )\n+            {\n+                for( unsigned int i = 0; i < obj->getAliasCount(); ++i )\n+                {\n+                    std::cout\n+                        << prefix\n+                        << \"Alias is : \" << obj->getAliasAuthorityAtIndex( i )\n+                        << \":\" << obj->getAliasTitleAtIndex( i ) << std::endl;\n+                }\n+                for( unsigned int i = 0; i < obj->getExtraMetadataCount(); ++i )\n+                {\n+                    std::cout << prefix << \"Extrametadata is : \"\n+                              << obj->getExtraMetadataKeyAtIndex( i ) << \":\"\n+                              << obj->getExtraMetadataStringValueAtIndex( i )\n+                              << std::endl;\n+                }\n+            }\n+            else\n+            {\n+                std::cout << prefix << \"IS PARTIAL!\" << std::endl;\n+            }\n+            std::cout << prefix\n+                      << \"--------------------------------------------------\"\n+                      << std::endl;\n+        }\n+\n+    } // anonymous namespace\n+\n+    /****************************************************************************/\n+    struct UnitInfo\n+    {\n+        UnitInfo()\n+            : relation_top_( RELATION::CONFORMABLE ),\n+              relation_base_( RELATION::CONFORMABLE )\n+        {\n+        }\n+\n+        gmge_id interface_top_;\n+        gmge_id interface_base_;\n+        gmge_id layer_;\n+        RELATION relation_top_;\n+        RELATION relation_base_;\n+        std::string name_;\n+    };\n+\n+    class GeoModelBuilderRESQMLImpl\n+    {\n+    public:\n+        GeoModelBuilderRESQMLImpl(\n+            GeoModelBuilderRESQML& builder, GeoModel3D& geomodel );\n+        ~GeoModelBuilderRESQMLImpl() = default;\n+\n+        bool load_file();\n+\n+        void deserialize( EpcDocument& pck );\n+        void read_strati_column( EpcDocument& pck );\n+        bool read_surfaces( const EpcDocument& pck );\n+        bool read_volumes( const EpcDocument& pck );\n+\n+    protected:\n+        gmge_id find_layer( const Region3D& region ) const;\n+\n+    private:\n+        GeoModelBuilderRESQML& builder_;\n+        GeoModel3D& geomodel_;\n+\n+        std::map< AbstractFeatureInterpretation*, gmge_id >\n+            interp_2_geo_entity_;\n+        std::map< AbstractFeatureInterpretation*, UnitInfo > unit_2_info_;\n+    };\n+\n+    GeoModelBuilderRESQMLImpl::GeoModelBuilderRESQMLImpl(\n+        GeoModelBuilderRESQML& builder, GeoModel3D& geomodel )\n+        : builder_( builder ), geomodel_( geomodel )\n+    {\n+    }\n+\n+    void GeoModelBuilderRESQMLImpl::deserialize( EpcDocument& pck )\n+    {\n+        std::string resqmlResult = pck.deserialize();\n+        if( !resqmlResult.empty() )\n+        {\n+            std::cerr << resqmlResult << std::endl;\n+            std::cout << \"Press enter to continue...\" << std::endl;\n+            std::cin.get();\n+        }\n+\n+        std::cout << \"EpcDocument name \" << pck.getName() << \" in \"\n+                  << ( pck.getStorageDirectory().empty()\n+                             ? \"working directory.\"\n+                             : pck.getStorageDirectory() )\n+                  << std::endl;\n+\n+        unsigned int hdfProxyCount = pck.getHdfProxyCount();\n+        std::cout << \"There are \" << pck.getHdfProxyCount()\n+                  << \" hdf files associated to this epc document.\" << std::endl;\n+        for( unsigned int hdfProxyIndex = 0; hdfProxyIndex < hdfProxyCount;\n+             ++hdfProxyIndex )\n+        {\n+            std::cout << \"Hdf file relative path : \"\n+                      << pck.getHdfProxy( hdfProxyIndex )->getRelativePath()\n+                      << std::endl;\n+        }\n+        for( size_t warningIndex = 0; warningIndex < pck.getWarnings().size();\n+             ++warningIndex )\n+        {\n+            std::cout << \"Warning #\" << warningIndex << \" : \"\n+                      << pck.getWarnings()[warningIndex] << std::endl;\n+        }\n+    }\n+\n+    namespace\n+    {\n+        RELATION get_contact_mode(\n+            gsoap_resqml2_0_1::resqml2__ContactMode mode )\n+        {\n+            switch( mode )\n+            {\n+            case gsoap_resqml2_0_1::resqml2__ContactMode__baselap:\n+                return RELATION::BASELAP;\n+            case gsoap_resqml2_0_1::resqml2__ContactMode__erosion:\n+                return RELATION::ERODED;\n+            case gsoap_resqml2_0_1::resqml2__ContactMode__proportional:\n+                return RELATION::CONFORMABLE;\n+            default:\n+                ringmesh_assert_not_reached;\n+                return RELATION::CONFORMABLE;\n+            }\n+        }\n+    } // namespace\n+\n+    gmge_id GeoModelBuilderRESQMLImpl::find_layer(\n+        const Region3D& region ) const\n+    {\n+        std::set< const Interface3D* > horizons;\n+        for( auto b : range( region.nb_boundaries() ) )\n+        {\n+            const Surface3D& surface = region.boundary( b );\n+            const Interface3D& interface = static_cast< const Interface3D& >(\n+                surface.parent( Interface3D::type_name_static() ) );\n+            if( GMGE::is_stratigraphic_limit( interface.geological_feature() ) )\n+            {\n+                horizons.insert( &interface );\n+            }\n+        }\n+\n+        if( horizons.size() >= 1 && horizons.size() <= 2 )\n+        {\n+            // TODO the following detection is not working if the region doesn't\n+            // contain a single face of one or even both horizons\n+            std::vector< gmge_id > horizons_list;\n+            for( auto h : horizons )\n+            {\n+                horizons_list.push_back( h->gmge() );\n+            }\n+            std::sort( horizons_list.begin(), horizons_list.end() );\n+            for( auto& unit : unit_2_info_ )\n+            {\n+                std::vector< gmge_id > cur_horizons_list;\n+                if( unit.second.interface_top_.is_defined() )\n+                {\n+                    cur_horizons_list.push_back( unit.second.interface_top_ );\n+                }\n+                if( unit.second.interface_base_.is_defined() )\n+                {\n+                    cur_horizons_list.push_back( unit.second.interface_base_ );\n+                }\n+                std::sort( cur_horizons_list.begin(), cur_horizons_list.end() );\n+\n+                if( cur_horizons_list.size() != horizons_list.size() )\n+                {\n+                    continue;\n+                }\n+                std::vector< gmge_id > result;\n+                std::set_intersection( horizons_list.begin(),\n+                    horizons_list.end(), cur_horizons_list.begin(),\n+                    cur_horizons_list.end(), std::back_inserter( result ) );\n+                if( result.size() == horizons_list.size() )\n+                {\n+                    auto id = interp_2_geo_entity_.find( unit.first );\n+                    ringmesh_assert( id != interp_2_geo_entity_.end() );\n+                    return id->second;\n+                }\n+            }\n+        }\n+        return gmge_id();\n+    }\n+\n+    void GeoModelBuilderRESQMLImpl::read_strati_column( EpcDocument& pck )\n+    {\n+        const std::vector< RESQML2_0_1_NS::StratigraphicColumn* >\n+            stratiColumnSet = pck.getStratigraphicColumnSet();\n+        // TODO only one column for the moment\n+        ringmesh_assert( stratiColumnSet.size() <= 1 );\n+\n+        for( auto column : stratiColumnSet )\n+        {\n+            showAllMetadata( column );\n+\n+            // TODO now we read only rank 0\n+            ringmesh_assert(\n+                column->getStratigraphicColumnRankInterpretationSet().size()\n+                == 1 );\n+\n+            for( auto rank_interp :\n+                column->getStratigraphicColumnRankInterpretationSet() )\n+            {\n+                showAllMetadata( rank_interp );\n+                // TODO only chronostrati\n+                ringmesh_assert( rank_interp->isAChronoStratiRank() );\n+\n+                for( auto unit :\n+                    rank_interp->getStratigraphicUnitInterpretationSet() )\n+                {\n+                    const gmge_id layer =\n+                        builder_.geology.create_geological_entity(\n+                            Layer3D::type_name_static() );\n+\n+                    builder_.geology.set_geological_entity_geol_feature(\n+                        layer, GMGE::GEOL_FEATURE::STRATI_UNIT );\n+\n+                    interp_2_geo_entity_[unit] = layer;\n+\n+                    unit_2_info_[unit].layer_ = layer;\n+                    if( unit->getInterpretedFeature() != nullptr )\n+                    {\n+                        const Layer3D& layer3d = static_cast< const Layer3D& >(\n+                            geomodel_.geological_entity(\n+                                GeologicalEntityType( \"Layer\" ),\n+                                layer.index() ) );\n+                        const_cast< Layer3D& >( layer3d ).set_name(\n+                            unit->getInterpretedFeature()->getTitle() );\n+                        unit_2_info_[unit].name_ =\n+                            unit->getInterpretedFeature()->getTitle();\n+                    }\n+                }\n+\n+                for( auto contactIndex :\n+                    range( rank_interp->getContactCount() ) )\n+                {\n+                    unit_2_info_[rank_interp->getSubjectOfContact(\n+                                     contactIndex )]\n+                        .relation_base_ = get_contact_mode(\n+                        rank_interp->getSubjectContactModeOfContact(\n+                            contactIndex ) );\n+                    unit_2_info_[rank_interp->getSubjectOfContact(\n+                                     contactIndex )]\n+                        .interface_base_ = interp_2_geo_entity_\n+                        [(AbstractFeatureInterpretation*)\n+                                rank_interp->getHorizonInterpretationOfContact(\n+                                    contactIndex )];\n+\n+                    unit_2_info_[rank_interp->getDirectObjectOfContact(\n+                                     contactIndex )]\n+                        .relation_top_ = get_contact_mode(\n+                        rank_interp->getDirectObjectContactModeOfContact(\n+                            contactIndex ) );\n+                    unit_2_info_[rank_interp->getDirectObjectOfContact(\n+                                     contactIndex )]\n+                        .interface_top_ = interp_2_geo_entity_\n+                        [(AbstractFeatureInterpretation*)\n+                                rank_interp->getHorizonInterpretationOfContact(\n+                                    contactIndex )];\n+                }\n+\n+                // assign regions to layers\n+                // TODO this is a workaround until the","path":"src/ringmesh/io/geomodel_builder_resqml.cpp","position":361,"original_position":361,"commit_id":"a3a32786d6fbabaa7330954cd3132490d6666db3","original_commit_id":"a3a32786d6fbabaa7330954cd3132490d6666db3","user":{"login":"BotellaA","id":3213882,"node_id":"MDQ6VXNlcjMyMTM4ODI=","avatar_url":"https://avatars1.githubusercontent.com/u/3213882?v=4","gravatar_id":"","url":"https://api.github.com/users/BotellaA","html_url":"https://github.com/BotellaA","followers_url":"https://api.github.com/users/BotellaA/followers","following_url":"https://api.github.com/users/BotellaA/following{/other_user}","gists_url":"https://api.github.com/users/BotellaA/gists{/gist_id}","starred_url":"https://api.github.com/users/BotellaA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BotellaA/subscriptions","organizations_url":"https://api.github.com/users/BotellaA/orgs","repos_url":"https://api.github.com/users/BotellaA/repos","events_url":"https://api.github.com/users/BotellaA/events{/privacy}","received_events_url":"https://api.github.com/users/BotellaA/received_events","type":"User","site_admin":false},"body":"![INFO](https://sonarsource.github.io/sonar-github/severity-info.png 'Severity: INFO') Complete the task associated to this \"TODO\" comment. [![rule](https://sonarsource.github.io/sonar-github/rule.png)](https://sonarcloud.io/coding_rules#rule_key=cpp%3AS1135)\n","created_at":"2018-09-24T08:59:08Z","updated_at":"2018-09-24T08:59:08Z","html_url":"https://github.com/ringmesh/RINGMesh/pull/191#discussion_r219767705","pull_request_url":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/191","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/comments/219767705"},"html":{"href":"https://github.com/ringmesh/RINGMesh/pull/191#discussion_r219767705"},"pull_request":{"href":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/191"}}},"pull_request":{"url":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/191","id":217584051,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE3NTg0MDUx","html_url":"https://github.com/ringmesh/RINGMesh/pull/191","diff_url":"https://github.com/ringmesh/RINGMesh/pull/191.diff","patch_url":"https://github.com/ringmesh/RINGMesh/pull/191.patch","issue_url":"https://api.github.com/repos/ringmesh/RINGMesh/issues/191","number":191,"state":"open","locked":false,"title":"Resqml2","user":{"login":"wanchiuli","id":38442571,"node_id":"MDQ6VXNlcjM4NDQyNTcx","avatar_url":"https://avatars1.githubusercontent.com/u/38442571?v=4","gravatar_id":"","url":"https://api.github.com/users/wanchiuli","html_url":"https://github.com/wanchiuli","followers_url":"https://api.github.com/users/wanchiuli/followers","following_url":"https://api.github.com/users/wanchiuli/following{/other_user}","gists_url":"https://api.github.com/users/wanchiuli/gists{/gist_id}","starred_url":"https://api.github.com/users/wanchiuli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wanchiuli/subscriptions","organizations_url":"https://api.github.com/users/wanchiuli/orgs","repos_url":"https://api.github.com/users/wanchiuli/repos","events_url":"https://api.github.com/users/wanchiuli/events{/privacy}","received_events_url":"https://api.github.com/users/wanchiuli/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-09-24T08:27:20Z","updated_at":"2018-09-24T08:59:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5b0a439e326143336569e59031514dc0666dbc4d","assignee":null,"assignees":[],"requested_reviewers":[{"login":"francoisbonneau","id":24669995,"node_id":"MDQ6VXNlcjI0NjY5OTk1","avatar_url":"https://avatars0.githubusercontent.com/u/24669995?v=4","gravatar_id":"","url":"https://api.github.com/users/francoisbonneau","html_url":"https://github.com/francoisbonneau","followers_url":"https://api.github.com/users/francoisbonneau/followers","following_url":"https://api.github.com/users/francoisbonneau/following{/other_user}","gists_url":"https://api.github.com/users/francoisbonneau/gists{/gist_id}","starred_url":"https://api.github.com/users/francoisbonneau/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/francoisbonneau/subscriptions","organizations_url":"https://api.github.com/users/francoisbonneau/orgs","repos_url":"https://api.github.com/users/francoisbonneau/repos","events_url":"https://api.github.com/users/francoisbonneau/events{/privacy}","received_events_url":"https://api.github.com/users/francoisbonneau/received_events","type":"User","site_admin":false},{"login":"panquez","id":32702237,"node_id":"MDQ6VXNlcjMyNzAyMjM3","avatar_url":"https://avatars2.githubusercontent.com/u/32702237?v=4","gravatar_id":"","url":"https://api.github.com/users/panquez","html_url":"https://github.com/panquez","followers_url":"https://api.github.com/users/panquez/followers","following_url":"https://api.github.com/users/panquez/following{/other_user}","gists_url":"https://api.github.com/users/panquez/gists{/gist_id}","starred_url":"https://api.github.com/users/panquez/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/panquez/subscriptions","organizations_url":"https://api.github.com/users/panquez/orgs","repos_url":"https://api.github.com/users/panquez/repos","events_url":"https://api.github.com/users/panquez/events{/privacy}","received_events_url":"https://api.github.com/users/panquez/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/191/commits","review_comments_url":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/191/comments","review_comment_url":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ringmesh/RINGMesh/issues/191/comments","statuses_url":"https://api.github.com/repos/ringmesh/RINGMesh/statuses/a3a32786d6fbabaa7330954cd3132490d6666db3","head":{"label":"ringmesh:resqml2","ref":"resqml2","sha":"a3a32786d6fbabaa7330954cd3132490d6666db3","user":{"login":"ringmesh","id":33122992,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMzMTIyOTky","avatar_url":"https://avatars3.githubusercontent.com/u/33122992?v=4","gravatar_id":"","url":"https://api.github.com/users/ringmesh","html_url":"https://github.com/ringmesh","followers_url":"https://api.github.com/users/ringmesh/followers","following_url":"https://api.github.com/users/ringmesh/following{/other_user}","gists_url":"https://api.github.com/users/ringmesh/gists{/gist_id}","starred_url":"https://api.github.com/users/ringmesh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ringmesh/subscriptions","organizations_url":"https://api.github.com/users/ringmesh/orgs","repos_url":"https://api.github.com/users/ringmesh/repos","events_url":"https://api.github.com/users/ringmesh/events{/privacy}","received_events_url":"https://api.github.com/users/ringmesh/received_events","type":"Organization","site_admin":false},"repo":{"id":108415296,"node_id":"MDEwOlJlcG9zaXRvcnkxMDg0MTUyOTY=","name":"RINGMesh","full_name":"ringmesh/RINGMesh","private":false,"owner":{"login":"ringmesh","id":33122992,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMzMTIyOTky","avatar_url":"https://avatars3.githubusercontent.com/u/33122992?v=4","gravatar_id":"","url":"https://api.github.com/users/ringmesh","html_url":"https://github.com/ringmesh","followers_url":"https://api.github.com/users/ringmesh/followers","following_url":"https://api.github.com/users/ringmesh/following{/other_user}","gists_url":"https://api.github.com/users/ringmesh/gists{/gist_id}","starred_url":"https://api.github.com/users/ringmesh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ringmesh/subscriptions","organizations_url":"https://api.github.com/users/ringmesh/orgs","repos_url":"https://api.github.com/users/ringmesh/repos","events_url":"https://api.github.com/users/ringmesh/events{/privacy}","received_events_url":"https://api.github.com/users/ringmesh/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/ringmesh/RINGMesh","description":"RINGMesh is a C++ open-source platform for manipulating meshes of geological models.","fork":false,"url":"https://api.github.com/repos/ringmesh/RINGMesh","forks_url":"https://api.github.com/repos/ringmesh/RINGMesh/forks","keys_url":"https://api.github.com/repos/ringmesh/RINGMesh/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ringmesh/RINGMesh/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ringmesh/RINGMesh/teams","hooks_url":"https://api.github.com/repos/ringmesh/RINGMesh/hooks","issue_events_url":"https://api.github.com/repos/ringmesh/RINGMesh/issues/events{/number}","events_url":"https://api.github.com/repos/ringmesh/RINGMesh/events","assignees_url":"https://api.github.com/repos/ringmesh/RINGMesh/assignees{/user}","branches_url":"https://api.github.com/repos/ringmesh/RINGMesh/branches{/branch}","tags_url":"https://api.github.com/repos/ringmesh/RINGMesh/tags","blobs_url":"https://api.github.com/repos/ringmesh/RINGMesh/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ringmesh/RINGMesh/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ringmesh/RINGMesh/git/refs{/sha}","trees_url":"https://api.github.com/repos/ringmesh/RINGMesh/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ringmesh/RINGMesh/statuses/{sha}","languages_url":"https://api.github.com/repos/ringmesh/RINGMesh/languages","stargazers_url":"https://api.github.com/repos/ringmesh/RINGMesh/stargazers","contributors_url":"https://api.github.com/repos/ringmesh/RINGMesh/contributors","subscribers_url":"https://api.github.com/repos/ringmesh/RINGMesh/subscribers","subscription_url":"https://api.github.com/repos/ringmesh/RINGMesh/subscription","commits_url":"https://api.github.com/repos/ringmesh/RINGMesh/commits{/sha}","git_commits_url":"https://api.github.com/repos/ringmesh/RINGMesh/git/commits{/sha}","comments_url":"https://api.github.com/repos/ringmesh/RINGMesh/comments{/number}","issue_comment_url":"https://api.github.com/repos/ringmesh/RINGMesh/issues/comments{/number}","contents_url":"https://api.github.com/repos/ringmesh/RINGMesh/contents/{+path}","compare_url":"https://api.github.com/repos/ringmesh/RINGMesh/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ringmesh/RINGMesh/merges","archive_url":"https://api.github.com/repos/ringmesh/RINGMesh/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ringmesh/RINGMesh/downloads","issues_url":"https://api.github.com/repos/ringmesh/RINGMesh/issues{/number}","pulls_url":"https://api.github.com/repos/ringmesh/RINGMesh/pulls{/number}","milestones_url":"https://api.github.com/repos/ringmesh/RINGMesh/milestones{/number}","notifications_url":"https://api.github.com/repos/ringmesh/RINGMesh/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ringmesh/RINGMesh/labels{/name}","releases_url":"https://api.github.com/repos/ringmesh/RINGMesh/releases{/id}","deployments_url":"https://api.github.com/repos/ringmesh/RINGMesh/deployments","created_at":"2017-10-26T13:29:35Z","updated_at":"2018-08-31T08:07:00Z","pushed_at":"2018-09-24T08:27:20Z","git_url":"git://github.com/ringmesh/RINGMesh.git","ssh_url":"git@github.com:ringmesh/RINGMesh.git","clone_url":"https://github.com/ringmesh/RINGMesh.git","svn_url":"https://github.com/ringmesh/RINGMesh","homepage":"http://ringmesh.org","size":181741,"stargazers_count":30,"watchers_count":30,"language":"C++","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":7,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":2,"open_issues":7,"watchers":30,"default_branch":"master"}},"base":{"label":"ringmesh:master","ref":"master","sha":"0cd99d813038f50da6241107573d5cd63a29432b","user":{"login":"ringmesh","id":33122992,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMzMTIyOTky","avatar_url":"https://avatars3.githubusercontent.com/u/33122992?v=4","gravatar_id":"","url":"https://api.github.com/users/ringmesh","html_url":"https://github.com/ringmesh","followers_url":"https://api.github.com/users/ringmesh/followers","following_url":"https://api.github.com/users/ringmesh/following{/other_user}","gists_url":"https://api.github.com/users/ringmesh/gists{/gist_id}","starred_url":"https://api.github.com/users/ringmesh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ringmesh/subscriptions","organizations_url":"https://api.github.com/users/ringmesh/orgs","repos_url":"https://api.github.com/users/ringmesh/repos","events_url":"https://api.github.com/users/ringmesh/events{/privacy}","received_events_url":"https://api.github.com/users/ringmesh/received_events","type":"Organization","site_admin":false},"repo":{"id":108415296,"node_id":"MDEwOlJlcG9zaXRvcnkxMDg0MTUyOTY=","name":"RINGMesh","full_name":"ringmesh/RINGMesh","private":false,"owner":{"login":"ringmesh","id":33122992,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMzMTIyOTky","avatar_url":"https://avatars3.githubusercontent.com/u/33122992?v=4","gravatar_id":"","url":"https://api.github.com/users/ringmesh","html_url":"https://github.com/ringmesh","followers_url":"https://api.github.com/users/ringmesh/followers","following_url":"https://api.github.com/users/ringmesh/following{/other_user}","gists_url":"https://api.github.com/users/ringmesh/gists{/gist_id}","starred_url":"https://api.github.com/users/ringmesh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ringmesh/subscriptions","organizations_url":"https://api.github.com/users/ringmesh/orgs","repos_url":"https://api.github.com/users/ringmesh/repos","events_url":"https://api.github.com/users/ringmesh/events{/privacy}","received_events_url":"https://api.github.com/users/ringmesh/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/ringmesh/RINGMesh","description":"RINGMesh is a C++ open-source platform for manipulating meshes of geological models.","fork":false,"url":"https://api.github.com/repos/ringmesh/RINGMesh","forks_url":"https://api.github.com/repos/ringmesh/RINGMesh/forks","keys_url":"https://api.github.com/repos/ringmesh/RINGMesh/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ringmesh/RINGMesh/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ringmesh/RINGMesh/teams","hooks_url":"https://api.github.com/repos/ringmesh/RINGMesh/hooks","issue_events_url":"https://api.github.com/repos/ringmesh/RINGMesh/issues/events{/number}","events_url":"https://api.github.com/repos/ringmesh/RINGMesh/events","assignees_url":"https://api.github.com/repos/ringmesh/RINGMesh/assignees{/user}","branches_url":"https://api.github.com/repos/ringmesh/RINGMesh/branches{/branch}","tags_url":"https://api.github.com/repos/ringmesh/RINGMesh/tags","blobs_url":"https://api.github.com/repos/ringmesh/RINGMesh/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ringmesh/RINGMesh/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ringmesh/RINGMesh/git/refs{/sha}","trees_url":"https://api.github.com/repos/ringmesh/RINGMesh/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ringmesh/RINGMesh/statuses/{sha}","languages_url":"https://api.github.com/repos/ringmesh/RINGMesh/languages","stargazers_url":"https://api.github.com/repos/ringmesh/RINGMesh/stargazers","contributors_url":"https://api.github.com/repos/ringmesh/RINGMesh/contributors","subscribers_url":"https://api.github.com/repos/ringmesh/RINGMesh/subscribers","subscription_url":"https://api.github.com/repos/ringmesh/RINGMesh/subscription","commits_url":"https://api.github.com/repos/ringmesh/RINGMesh/commits{/sha}","git_commits_url":"https://api.github.com/repos/ringmesh/RINGMesh/git/commits{/sha}","comments_url":"https://api.github.com/repos/ringmesh/RINGMesh/comments{/number}","issue_comment_url":"https://api.github.com/repos/ringmesh/RINGMesh/issues/comments{/number}","contents_url":"https://api.github.com/repos/ringmesh/RINGMesh/contents/{+path}","compare_url":"https://api.github.com/repos/ringmesh/RINGMesh/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ringmesh/RINGMesh/merges","archive_url":"https://api.github.com/repos/ringmesh/RINGMesh/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ringmesh/RINGMesh/downloads","issues_url":"https://api.github.com/repos/ringmesh/RINGMesh/issues{/number}","pulls_url":"https://api.github.com/repos/ringmesh/RINGMesh/pulls{/number}","milestones_url":"https://api.github.com/repos/ringmesh/RINGMesh/milestones{/number}","notifications_url":"https://api.github.com/repos/ringmesh/RINGMesh/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ringmesh/RINGMesh/labels{/name}","releases_url":"https://api.github.com/repos/ringmesh/RINGMesh/releases{/id}","deployments_url":"https://api.github.com/repos/ringmesh/RINGMesh/deployments","created_at":"2017-10-26T13:29:35Z","updated_at":"2018-08-31T08:07:00Z","pushed_at":"2018-09-24T08:27:20Z","git_url":"git://github.com/ringmesh/RINGMesh.git","ssh_url":"git@github.com:ringmesh/RINGMesh.git","clone_url":"https://github.com/ringmesh/RINGMesh.git","svn_url":"https://github.com/ringmesh/RINGMesh","homepage":"http://ringmesh.org","size":181741,"stargazers_count":30,"watchers_count":30,"language":"C++","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":7,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":2,"open_issues":7,"watchers":30,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/191"},"html":{"href":"https://github.com/ringmesh/RINGMesh/pull/191"},"issue":{"href":"https://api.github.com/repos/ringmesh/RINGMesh/issues/191"},"comments":{"href":"https://api.github.com/repos/ringmesh/RINGMesh/issues/191/comments"},"review_comments":{"href":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/191/comments"},"review_comment":{"href":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ringmesh/RINGMesh/pulls/191/commits"},"statuses":{"href":"https://api.github.com/repos/ringmesh/RINGMesh/statuses/a3a32786d6fbabaa7330954cd3132490d6666db3"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"BotellaA"}}