From a507b6a0310757db5a99ecdd6a04c78ed6c1047d Mon Sep 17 00:00:00 2001 From: Licini Date: Fri, 25 Oct 2024 18:33:14 +0200 Subject: [PATCH] restructuring documentation --- docs/_images/architecture.jpg | Bin 0 -> 113110 bytes docs/architecture.rst | 58 ++++++- docs/examples.rst | 22 +++ .../Advanced.1_units.rst | 0 .../Advanced.2_sessions.rst | 0 .../Advanced.3_custom_extensions.rst | 0 .../Basics.1_overview.rst | 0 .../Basics.2_query_entities.rst | 0 .../Basics.3_spatial_hierarchy.rst | 0 .../Basics.4_element_info.rst | 0 .../Basics.5_visualization.rst | 0 .../Basics.6_edit_export.rst | 0 .../Basics.7_create_new.rst | 0 docs/index.rst | 3 +- docs/tutorials.rst | 144 +---------------- docs/tutorials/advanced.custom_extensions.rst | 8 + docs/tutorials/basics.hello_world.rst | 152 ++++++++++++++++++ .../intermediate.multi_story_building.rst | 7 + 18 files changed, 251 insertions(+), 143 deletions(-) create mode 100644 docs/_images/architecture.jpg create mode 100644 docs/examples.rst rename docs/{tutorials => examples}/Advanced.1_units.rst (100%) rename docs/{tutorials => examples}/Advanced.2_sessions.rst (100%) rename docs/{tutorials => examples}/Advanced.3_custom_extensions.rst (100%) rename docs/{tutorials => examples}/Basics.1_overview.rst (100%) rename docs/{tutorials => examples}/Basics.2_query_entities.rst (100%) rename docs/{tutorials => examples}/Basics.3_spatial_hierarchy.rst (100%) rename docs/{tutorials => examples}/Basics.4_element_info.rst (100%) rename docs/{tutorials => examples}/Basics.5_visualization.rst (100%) rename docs/{tutorials => examples}/Basics.6_edit_export.rst (100%) rename docs/{tutorials => examples}/Basics.7_create_new.rst (100%) create mode 100644 docs/tutorials/advanced.custom_extensions.rst create mode 100644 docs/tutorials/basics.hello_world.rst create mode 100644 docs/tutorials/intermediate.multi_story_building.rst diff --git a/docs/_images/architecture.jpg b/docs/_images/architecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1741fb3b9cbb42dcebf2448d7d24ee283e4a328a GIT binary patch literal 113110 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 section. + +Middle-layer +------------ + +The Middle-layer of COMPAS IFC provides a comprehensive suite of native Python classes for interacting with individual IFC entities and their properties. These classes are automatically generated from the official IFC schemas, ensuring a complete and up-to-date mapping of IFC classes and types. + +**Key features of the Middle-layer include:** + +1. **Strongly typed classes**: Each class is strongly typed, enabling modern IDEs (such as those using Pylance) to provide extensive type hints and analysis. This enhances the development experience by improving code completion, reducing development time, and minimizing the need for constant documentation lookups. + +2. **Robust extension mechanism**: COMPAS IFC includes a powerful extension mechanism that allows for the enhancement of key classes to simplify their usage and empowers users to create custom extensions for tailored functionality. For instance: + + - The ``IfcProduct`` class is extended with a ``geometry`` property that parses complex IFC geometric representations into COMPAS-based geometry. + - The ``IfcElement`` class is augmented with ``parent`` and ``children`` properties, simplifying navigation of the IFC spatial hierarchy. + +These features provide a powerful and flexible interface for working with IFC data at a granular level, suitable for advanced users who require detailed control over IFC entities and their properties. + +For more information on the extension mechanism, please refer to the `API: extensions `_ section. For a comprehensive overview of the class mapping, see the `API Reference: Full class mapping `_. + +Bottom-layer +------------ + +Lastly, in the Bottom-layer, COMPAS IFC interacts with the IfcOpenShell library to parse and manage IFC data. This layer is primarily of interest to contributors and advanced users who needs to modify the lower-level functionalities for tasks such as performance optimization, memory usage reduction, etc. diff --git a/docs/examples.rst b/docs/examples.rst new file mode 100644 index 0000000..df05232 --- /dev/null +++ b/docs/examples.rst @@ -0,0 +1,22 @@ +******************************************************************************** +Examples +******************************************************************************** + +In this section you will find full examples scripts on how to use the COMPAS IFC package. + + +.. toctree:: + :maxdepth: 1 + :titlesonly: + :glob: + + examples/Basics.1_overview.rst + examples/Basics.2_query_entities.rst + examples/Basics.3_spatial_hierarchy.rst + examples/Basics.4_element_info.rst + examples/Basics.5_visualization.rst + examples/Basics.6_edit_export.rst + examples/Basics.7_create_new.rst + examples/Advanced.1_units.rst + examples/Advanced.2_sessions.rst + examples/Advanced.3_custom_extensions.rst diff --git a/docs/tutorials/Advanced.1_units.rst b/docs/examples/Advanced.1_units.rst similarity index 100% rename from docs/tutorials/Advanced.1_units.rst rename to docs/examples/Advanced.1_units.rst diff --git a/docs/tutorials/Advanced.2_sessions.rst b/docs/examples/Advanced.2_sessions.rst similarity index 100% rename from docs/tutorials/Advanced.2_sessions.rst rename to docs/examples/Advanced.2_sessions.rst diff --git a/docs/tutorials/Advanced.3_custom_extensions.rst b/docs/examples/Advanced.3_custom_extensions.rst similarity index 100% rename from docs/tutorials/Advanced.3_custom_extensions.rst rename to docs/examples/Advanced.3_custom_extensions.rst diff --git a/docs/tutorials/Basics.1_overview.rst b/docs/examples/Basics.1_overview.rst similarity index 100% rename from docs/tutorials/Basics.1_overview.rst rename to docs/examples/Basics.1_overview.rst diff --git a/docs/tutorials/Basics.2_query_entities.rst b/docs/examples/Basics.2_query_entities.rst similarity index 100% rename from docs/tutorials/Basics.2_query_entities.rst rename to docs/examples/Basics.2_query_entities.rst diff --git a/docs/tutorials/Basics.3_spatial_hierarchy.rst b/docs/examples/Basics.3_spatial_hierarchy.rst similarity index 100% rename from docs/tutorials/Basics.3_spatial_hierarchy.rst rename to docs/examples/Basics.3_spatial_hierarchy.rst diff --git a/docs/tutorials/Basics.4_element_info.rst b/docs/examples/Basics.4_element_info.rst similarity index 100% rename from docs/tutorials/Basics.4_element_info.rst rename to docs/examples/Basics.4_element_info.rst diff --git a/docs/tutorials/Basics.5_visualization.rst b/docs/examples/Basics.5_visualization.rst similarity index 100% rename from docs/tutorials/Basics.5_visualization.rst rename to docs/examples/Basics.5_visualization.rst diff --git a/docs/tutorials/Basics.6_edit_export.rst b/docs/examples/Basics.6_edit_export.rst similarity index 100% rename from docs/tutorials/Basics.6_edit_export.rst rename to docs/examples/Basics.6_edit_export.rst diff --git a/docs/tutorials/Basics.7_create_new.rst b/docs/examples/Basics.7_create_new.rst similarity index 100% rename from docs/tutorials/Basics.7_create_new.rst rename to docs/examples/Basics.7_create_new.rst diff --git a/docs/index.rst b/docs/index.rst index 50fc1f2..a3d3082 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -71,5 +71,6 @@ Table of Contents Introduction Architecture Tutorials - api + Examples + API license diff --git a/docs/tutorials.rst b/docs/tutorials.rst index 12f7324..8f1e0c6 100644 --- a/docs/tutorials.rst +++ b/docs/tutorials.rst @@ -3,136 +3,7 @@ Tutorials ******************************************************************************** .. rst-class:: lead -This is a hello-world tutorial for the COMPAS IFC package. It shows how to load an IFC file and and inspect its contents. - -Installation -================================ - - -A minimal version of COMPAS IFC can be installed directly with pip. - -.. code-block:: bash - - pip install compas_ifc - -If you want to visualize the IFC model, install COMPAS Viewer as well. - -.. code-block:: bash - - pip install compas_viewer - -If you need to interact with IFC geometry using OCC Brep or CGAL for boolean operations, install COMPAS OCC and COMPAS CGAL througn conda-forge. - -.. code-block:: bash - - conda install compas_occ compas_occ -c conda-forge - - -Load IFC model -================================ - -:: - - >>> from compas_ifc.model import Model - >>> model = Model("data/wall-with-opening-and-window.ifc") - Opened file: d:\Github\compas_ifc\scripts\..\data\wall-with-opening-and-window.ifc - >>> print(model.schema) - - -Query entities -================================ - -With ``model.get_all_entities()`` function, you can get a list of all entities in the model. - -:: - - >>> all_entities = model.get_all_entities() - >>> print("Total number of entities: ", len(all_entities)) - Total number of entities: 133 - >>> for entity in all_entities[:5]: - >>> print(entity) - - - - - - -Use ``model.get_entities_by_type()`` function to get a list of entities of a specific type (including their inherent ones). - -:: - - >>> building_elements = model.get_entities_by_type("IfcBuildingElement") - >>> print("Total number of building elements: ", len(building_elements)) - Total number of building elements: 2 - >>> for entity in building_elements: - >>> print(entity) - - - -You can also use ``model.get_entities_by_name()`` function search elements with a specific name. - -:: - - >>> name = "Wall for Test Example" - >>> walls = model.get_entities_by_name(name) - >>> print("Found {} entities with the name: {}".format(len(walls), name)) - Found 1 entities with the name: Wall for Test Example - >>> print(walls) - [] - -Entity attributes -================================ - -You can access the attributes of an entity using the ``attributes`` property. - -:: - - >>> wall = walls[0] - >>> print(wall.attributes) - {'GlobalId': '3ZYW59sxj8lei475l7EhLU', 'OwnerHistory': , 'Name': 'Wall for Test Example', 'Description': 'Description of Wall', 'ObjectType': None, 'ObjectPlacement': , 'Representation': , 'Tag': None, 'PredefinedType': None} - -You can also inspect the spatial hierarchy of the model. For example, you can get the parent of an entity using the ``parent`` property, or get the children of an entity using the ``children`` property. - -:: - - >>> print("parent:", wall.parent) - parent: - >>> print("children", wall.children) - children: [] - -For geomtric information, you can use the ``geometry`` property of an entity, if you have ``compas_occ`` installed, the geometry will be in form of ``Brep``. - -:: - - >>> geometry = wall.geometry - >>> print(geometry) - - >>> print(geometry.is_solid) - True - >>> print(geometry.volume) - 1.8 - - - - -Visualisation -================================ - -If you have ``compas_viewer`` installed, you can visualize the model using the ``model.show()`` function. - -:: - - >>> model.show() - -.. image:: _images/visualisation.jpg - :width: 100% - - -More Examples -============= - -Below are more examples of how to use the COMPAS IFC package. -(Please note these are still under construction) +In this section you will find tutorials on how to use the COMPAS IFC package. .. toctree:: @@ -140,13 +11,6 @@ Below are more examples of how to use the COMPAS IFC package. :titlesonly: :glob: - tutorials/Basics.1_overview.rst - tutorials/Basics.2_query_entities.rst - tutorials/Basics.3_spatial_hierarchy.rst - tutorials/Basics.4_element_info.rst - tutorials/Basics.5_visualization.rst - tutorials/Basics.6_edit_export.rst - tutorials/Basics.7_create_new.rst - tutorials/Advanced.1_units.rst - tutorials/Advanced.2_sessions.rst - tutorials/Advanced.3_custom_extensions.rst + tutorials/basics.hello_world + tutorials/intermediate.multi_story_building + tutorials/advanced.custom_extensions diff --git a/docs/tutorials/advanced.custom_extensions.rst b/docs/tutorials/advanced.custom_extensions.rst new file mode 100644 index 0000000..b3b072f --- /dev/null +++ b/docs/tutorials/advanced.custom_extensions.rst @@ -0,0 +1,8 @@ +******************************************************************************** +Advanced - Custom extensions +******************************************************************************** + +.. rst-class:: lead + +This tutorial is for advanced users whom are familiar with IFC classes and attributes. +It shows how to create an custom extension to an existing IFC class which is also inherited by its subclasses. diff --git a/docs/tutorials/basics.hello_world.rst b/docs/tutorials/basics.hello_world.rst new file mode 100644 index 0000000..c5c0cb7 --- /dev/null +++ b/docs/tutorials/basics.hello_world.rst @@ -0,0 +1,152 @@ +******************************************************************************** +Basics - Hello World +******************************************************************************** + +.. rst-class:: lead +This is a hello-world tutorial for the COMPAS IFC package. It shows how to load an IFC file and and inspect its contents. + +Installation +================================ + + +A minimal version of COMPAS IFC can be installed directly with pip. + +.. code-block:: bash + + pip install compas_ifc + +If you want to visualize the IFC model, install COMPAS Viewer as well. + +.. code-block:: bash + + pip install compas_viewer + +If you need to interact with IFC geometry using OCC Brep or CGAL for boolean operations, install COMPAS OCC and COMPAS CGAL througn conda-forge. + +.. code-block:: bash + + conda install compas_occ compas_occ -c conda-forge + + +Load IFC model +================================ + +:: + + >>> from compas_ifc.model import Model + >>> model = Model("data/wall-with-opening-and-window.ifc") + Opened file: d:\Github\compas_ifc\scripts\..\data\wall-with-opening-and-window.ifc + >>> print(model.schema) + + +Query entities +================================ + +With ``model.get_all_entities()`` function, you can get a list of all entities in the model. + +:: + + >>> all_entities = model.get_all_entities() + >>> print("Total number of entities: ", len(all_entities)) + Total number of entities: 133 + >>> for entity in all_entities[:5]: + >>> print(entity) + + + + + + +Use ``model.get_entities_by_type()`` function to get a list of entities of a specific type (including their inherent ones). + +:: + + >>> building_elements = model.get_entities_by_type("IfcBuildingElement") + >>> print("Total number of building elements: ", len(building_elements)) + Total number of building elements: 2 + >>> for entity in building_elements: + >>> print(entity) + + + +You can also use ``model.get_entities_by_name()`` function search elements with a specific name. + +:: + + >>> name = "Wall for Test Example" + >>> walls = model.get_entities_by_name(name) + >>> print("Found {} entities with the name: {}".format(len(walls), name)) + Found 1 entities with the name: Wall for Test Example + >>> print(walls) + [] + +Entity attributes +================================ + +You can access the attributes of an entity using the ``attributes`` property. + +:: + + >>> wall = walls[0] + >>> print(wall.attributes) + {'GlobalId': '3ZYW59sxj8lei475l7EhLU', 'OwnerHistory': , 'Name': 'Wall for Test Example', 'Description': 'Description of Wall', 'ObjectType': None, 'ObjectPlacement': , 'Representation': , 'Tag': None, 'PredefinedType': None} + +You can also inspect the spatial hierarchy of the model. For example, you can get the parent of an entity using the ``parent`` property, or get the children of an entity using the ``children`` property. + +:: + + >>> print("parent:", wall.parent) + parent: + >>> print("children", wall.children) + children: [] + +For geomtric information, you can use the ``geometry`` property of an entity, if you have ``compas_occ`` installed, the geometry will be in form of ``Brep``. + +:: + + >>> geometry = wall.geometry + >>> print(geometry) + + >>> print(geometry.is_solid) + True + >>> print(geometry.volume) + 1.8 + + + + +Visualisation +================================ + +If you have ``compas_viewer`` installed, you can visualize the model using the ``model.show()`` function. + +:: + + >>> model.show() + +.. image:: _images/visualisation.jpg + :width: 100% + + +More Examples +============= + +Below are more examples of how to use the COMPAS IFC package. +(Please note these are still under construction) + + +.. toctree:: + :maxdepth: 1 + :titlesonly: + :glob: + + tutorials/Basics.1_overview.rst + tutorials/Basics.2_query_entities.rst + tutorials/Basics.3_spatial_hierarchy.rst + tutorials/Basics.4_element_info.rst + tutorials/Basics.5_visualization.rst + tutorials/Basics.6_edit_export.rst + tutorials/Basics.7_create_new.rst + tutorials/Advanced.1_units.rst + tutorials/Advanced.2_sessions.rst + tutorials/Advanced.3_custom_extensions.rst diff --git a/docs/tutorials/intermediate.multi_story_building.rst b/docs/tutorials/intermediate.multi_story_building.rst new file mode 100644 index 0000000..b17535c --- /dev/null +++ b/docs/tutorials/intermediate.multi_story_building.rst @@ -0,0 +1,7 @@ +******************************************************************************** +Intermediate - Multi-storey building +******************************************************************************** + +.. rst-class:: lead + +This tutorial shows how to paramtrically create a multi-storey building from scratch using COMPAS geometry types, as well adding custom properties to each relevant IFC entity.