This commit is contained in:
Andrej730
2024-09-16 10:56:19 +05:00
parent cf95c9151c
commit 0891df5d6c
3 changed files with 56 additions and 29 deletions
+44 -16
View File
@@ -1,16 +1,44 @@
def create_repo(ifcgit, ifc): # Bonsai - OpenBIM Blender Add-on
# Copyright (C) 2021 Dion Moult <dion@thinkmoult.com>
#
# This file is part of Bonsai.
#
# Bonsai is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Bonsai is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
import bonsai.tool as tool
import git
def create_repo(ifcgit: tool.IfcGit, ifc: tool.Ifc) -> None:
path_ifc = ifc.get_path() path_ifc = ifc.get_path()
path_dir = ifcgit.get_path_dir(path_ifc) path_dir = ifcgit.get_path_dir(path_ifc)
ifcgit.init_repo(path_dir) ifcgit.init_repo(path_dir)
def add_file(ifcgit, ifc): def add_file(ifcgit: tool.IfcGit, ifc: tool.Ifc) -> None:
path_ifc = ifc.get_path() path_ifc = ifc.get_path()
repo = ifcgit.repo_from_path(path_ifc) repo = ifcgit.repo_from_path(path_ifc)
ifcgit.add_file_to_repo(repo, path_ifc) ifcgit.add_file_to_repo(repo, path_ifc)
def clone_repo(ifcgit, remote_url, local_folder, operator): def clone_repo(ifcgit: tool.IfcGit, remote_url: str, local_folder: str, operator: bpy.types.Operator) -> None:
repo = ifcgit.clone_repo(remote_url, local_folder) repo = ifcgit.clone_repo(remote_url, local_folder)
if not repo: if not repo:
operator.report({"ERROR"}, "Clone failed") operator.report({"ERROR"}, "Clone failed")
@@ -19,14 +47,14 @@ def clone_repo(ifcgit, remote_url, local_folder, operator):
ifcgit.load_anyifc(repo) ifcgit.load_anyifc(repo)
def discard_uncommitted(ifcgit, ifc): def discard_uncommitted(ifcgit: tool.IfcGit, ifc: tool.Ifc) -> None:
path_ifc = ifc.get_path() path_ifc = ifc.get_path()
# NOTE this is calling the git binary in a subprocess # NOTE this is calling the git binary in a subprocess
ifcgit.git_checkout(path_ifc) ifcgit.git_checkout(path_ifc)
ifcgit.load_project(path_ifc) ifcgit.load_project(path_ifc)
def commit_changes(ifcgit, ifc, repo): def commit_changes(ifcgit: tool.IfcGit, ifc: tool.Ifc, repo: git.Repo) -> None:
"""Commit and create new branches as required""" """Commit and create new branches as required"""
path_ifc = ifc.get_path() path_ifc = ifc.get_path()
@@ -38,34 +66,34 @@ def commit_changes(ifcgit, ifc, repo):
ifcgit.git_commit(path_ifc) ifcgit.git_commit(path_ifc)
def add_tag(ifcgit, repo): def add_tag(ifcgit: tool.IfcGit, repo: git.Repo) -> None:
ifcgit.add_tag(repo) ifcgit.add_tag(repo)
def delete_tag(ifcgit, repo, tag_name): def delete_tag(ifcgit: tool.IfcGit, repo: git.Repo, tag_name: git.TagReference) -> None:
ifcgit.delete_tag(repo, tag_name) ifcgit.delete_tag(repo, tag_name)
def add_remote(ifcgit, repo): def add_remote(ifcgit: tool.IfcGit, repo: git.Repo) -> None:
ifcgit.add_remote(repo) ifcgit.add_remote(repo)
def delete_remote(ifcgit, repo): def delete_remote(ifcgit: tool.IfcGit, repo: git.Repo) -> None:
ifcgit.delete_remote(repo) ifcgit.delete_remote(repo)
def push(ifcgit, repo, remote_name, operator): def push(ifcgit: tool.IfcGit, repo: git.Repo, remote_name: str, operator: bpy.types.Operator) -> None:
error_message = ifcgit.push(repo, remote_name, repo.active_branch.name) error_message = ifcgit.push(repo, remote_name, repo.active_branch.name)
if error_message: if error_message:
operator.report({"ERROR"}, error_message) operator.report({"ERROR"}, error_message)
def refresh_revision_list(ifcgit, repo, ifc): def refresh_revision_list(ifcgit: tool.IfcGit, repo: git.Repo, ifc: tool.Ifc) -> None:
if repo.heads: if repo.heads:
ifcgit.refresh_revision_list(ifc.get_path()) ifcgit.refresh_revision_list(ifc.get_path())
def colourise_revision(ifcgit): def colourise_revision(ifcgit: tool.IfcGit) -> None:
step_ids = ifcgit.get_revisions_step_ids() step_ids = ifcgit.get_revisions_step_ids()
if not step_ids: if not step_ids:
@@ -75,13 +103,13 @@ def colourise_revision(ifcgit):
ifcgit.colourise(final_step_ids) ifcgit.colourise(final_step_ids)
def colourise_uncommitted(ifcgit, ifc, repo): def colourise_uncommitted(ifcgit: tool.IfcGit, ifc: tool.Ifc, repo: git.Repo) -> None:
path_ifc = ifc.get_path() path_ifc = ifc.get_path()
step_ids = ifcgit.ifc_diff_ids(repo, None, "HEAD", path_ifc) step_ids = ifcgit.ifc_diff_ids(repo, None, "HEAD", path_ifc)
ifcgit.colourise(step_ids) ifcgit.colourise(step_ids)
def switch_revision(ifcgit, ifc): def switch_revision(ifcgit: tool.IfcGit, ifc: tool.Ifc) -> None:
# FIXME bad things happen when switching to a revision that predates current project # FIXME bad things happen when switching to a revision that predates current project
path_ifc = ifc.get_path() path_ifc = ifc.get_path()
@@ -90,13 +118,13 @@ def switch_revision(ifcgit, ifc):
ifcgit.refresh_revision_list(path_ifc) ifcgit.refresh_revision_list(path_ifc)
def merge_branch(ifcgit, ifc, operator): def merge_branch(ifcgit: tool.IfcGit, ifc: tool.Ifc, operator: bpy.types.Operator) -> None:
path_ifc = ifc.get_path() path_ifc = ifc.get_path()
ifcgit.config_ifcmerge() ifcgit.config_ifcmerge()
ifcgit.execute_merge(path_ifc, operator) ifcgit.execute_merge(path_ifc, operator)
def entity_log(ifcgit, ifc, step_id, operator): def entity_log(ifcgit: tool.IfcGit, ifc: tool.Ifc, step_id: int, operator: bpy.types.Operator) -> None:
path_ifc = ifc.get_path() path_ifc = ifc.get_path()
log_text = ifcgit.entity_log(path_ifc, step_id) log_text = ifcgit.entity_log(path_ifc, step_id)
# ERROR is only way to display a multi-line message # ERROR is only way to display a multi-line message
+2 -1
View File
@@ -26,6 +26,7 @@ import bonsai.core.tool
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore from bonsai.bim.ifc import IfcStore
from mathutils import Vector from mathutils import Vector
from typing import Iterable
class Debug(bonsai.core.tool.Debug): class Debug(bonsai.core.tool.Debug):
@@ -66,7 +67,7 @@ class Debug(bonsai.core.tool.Debug):
ifcopenshell.util.element.remove_deep2(ifc_file, element) ifcopenshell.util.element.remove_deep2(ifc_file, element)
@classmethod @classmethod
def print_unused_elements_stats(cls, requested_ifc_class: str = "", ignore_classes: tuple[str] = tuple()) -> int: def print_unused_elements_stats(cls, requested_ifc_class: str = "", ignore_classes: Iterable[str] = tuple()) -> int:
ifc_file = tool.Ifc.get() ifc_file = tool.Ifc.get()
# get list of ifc classes used in model # get list of ifc classes used in model
@@ -53,13 +53,16 @@ Example:
for wall in walls: for wall in walls:
print(wall.Name) print(wall.Name)
""" """
from __future__ import annotations
import os import os
import sys import sys
import zipfile import zipfile
import tempfile import tempfile
from pathlib import Path from pathlib import Path
from typing import Optional, Union from typing import Optional, Union, TYPE_CHECKING, Any
if TYPE_CHECKING:
import ifcopenshell.express.schema_class
if hasattr(os, "uname"): if hasattr(os, "uname"):
@@ -161,20 +164,17 @@ def open(path: Union[os.PathLike, str], format: Optional[str] = None, should_str
return file(f) return file(f)
def create_entity(type, schema="IFC4", *args, **kwargs): def create_entity(type: str, schema: str = "IFC4", *args: Any, **kwargs: Any) -> entity_instance:
"""Creates a new IFC entity that does not belong to an IFC file object """Creates a new IFC entity that does not belong to an IFC file object
Note that it is more common to create entities within a existing file Note that it is more common to create entities within a existing file
object. See :meth:`ifcopenshell.file.create_entity`. object. See :meth:`ifcopenshell.file.create_entity`.
:param type: Case insensitive name of the IFC class :param type: Case insensitive name of the IFC class
:type type: string
:param schema: The IFC schema identifier :param schema: The IFC schema identifier
:type schema: string
:param args: The positional arguments of the IFC class :param args: The positional arguments of the IFC class
:param kwargs: The keyword arguments of the IFC class :param kwargs: The keyword arguments of the IFC class
:returns: An entity instance :returns: An entity instance
:rtype: ifcopenshell.entity_instance
Example: Example:
@@ -191,11 +191,10 @@ def create_entity(type, schema="IFC4", *args, **kwargs):
return e return e
def register_schema(schema): def register_schema(schema: ifcopenshell.express.schema_class.SchemaClass) -> None:
"""Registers a custom IFC schema """Registers a custom IFC schema
:param schema: A schema object :param schema: A schema object
:type schema: ifcopenshell.express.schema_class.SchemaClass
Example: Example:
@@ -212,13 +211,13 @@ def register_schema(schema):
def schema_by_name( def schema_by_name(
schema: Optional[str] = None, schema_version: Optional[tuple[int, ...]] = None schema: Optional[str] = None,
schema_version: Optional[tuple[int, ...]] = None,
) -> ifcopenshell_wrapper.schema_definition: ) -> ifcopenshell_wrapper.schema_definition:
"""Returns an object allowing you to query the IFC schema itself """Returns an object allowing you to query the IFC schema itself
:param schema: Which IFC schema to use, chosen from "IFC2X3", "IFC4", :param schema: Which IFC schema to use, chosen from "IFC2X3", "IFC4",
or "IFC4X3". These refer to the ISO approved versions of IFC. or "IFC4X3". These refer to the ISO approved versions of IFC.
:type schema: string, optional
:param schema_version: If you want to specify an exact version of IFC :param schema_version: If you want to specify an exact version of IFC
that may not be an ISO approved version, use this argument instead that may not be an ISO approved version, use this argument instead
of ``schema``. IFC versions on technical.buildingsmart.org are of ``schema``. IFC versions on technical.buildingsmart.org are
@@ -227,10 +226,9 @@ def schema_by_name(
ADD2 TC1, which is the official version approved by ISO when people ADD2 TC1, which is the official version approved by ISO when people
refer to "IFC4". Generally you should not use this argument unless refer to "IFC4". Generally you should not use this argument unless
you are testing non-ISO IFC releases. you are testing non-ISO IFC releases.
:type schema_version: tuple[int, ...], optional
:return: Schema definition object. :return: Schema definition object.
:rtype: ifocpenshell_wrapper.schema_definition
""" """
assert schema_version or schema, "Either schema or schema_version must be specified."
if schema_version: if schema_version:
prefixes = ("IFC", "X", "_ADD", "_TC") prefixes = ("IFC", "X", "_ADD", "_TC")
schema = "".join("".join(map(str, t)) if t[1] else "" for t in zip(prefixes, schema_version)) schema = "".join("".join(map(str, t)) if t[1] else "" for t in zip(prefixes, schema_version))