New feature to calculate the radius of a polygonal circle

This commit is contained in:
Dion Moult
2021-10-21 12:43:16 +11:00
parent d2e9194636
commit 456adf453d
14 changed files with 200 additions and 6 deletions
@@ -169,7 +169,9 @@ class SplitWall(bpy.types.Operator):
bl_idname = "bim.split_wall"
bl_label = "Split Wall"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Split selected wall into two walls in correspondence of Blender cursor. The cursor must be in the wall volume"
bl_description = (
"Split selected wall into two walls in correspondence of Blender cursor. The cursor must be in the wall volume"
)
@classmethod
def poll(cls, context):
@@ -20,6 +20,7 @@ import bpy
from . import ui, prop, operator
classes = (
operator.CalculateCircleRadius,
operator.CalculateEdgeLengths,
operator.CalculateFaceAreas,
operator.CalculateObjectVolumes,
@@ -19,11 +19,27 @@
import bpy
import ifcopenshell
import ifcopenshell.api
import blenderbim.tool as tool
import blenderbim.core.qto as core
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.qto import helper
from ifcopenshell.api.pset.data import Data as PsetData
class CalculateCircleRadius(bpy.types.Operator):
bl_idname = "bim.calculate_circle_radius"
bl_label = "Calculate Circle Radius"
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
return context.active_object
def execute(self, context):
core.calculate_circle_radius(tool.Qto, obj=context.active_object)
return {"FINISHED"}
class CalculateEdgeLengths(bpy.types.Operator):
bl_idname = "bim.calculate_edge_lengths"
bl_label = "Calculate Edge Lengths"
@@ -34,6 +34,8 @@ class BIM_PT_qto_utilities(Panel):
row = layout.row()
row.prop(props, "qto_result", text="Results")
row = layout.row(align=True)
row.operator("bim.calculate_circle_radius")
row = layout.row(align=True)
row.operator("bim.calculate_edge_lengths")
row = layout.row(align=True)
+23
View File
@@ -0,0 +1,23 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2021 Dion Moult <dion@thinkmoult.com>
#
# This file is part of BlenderBIM Add-on.
#
# BlenderBIM Add-on 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.
#
# BlenderBIM Add-on 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 BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
def calculate_circle_radius(qto, obj=None):
result = qto.get_radius_of_selected_vertices(obj)
qto.set_qto_result(result)
return result
+6
View File
@@ -135,6 +135,12 @@ class Owner:
def set_user(cls, user): pass
@interface
class Qto:
def get_radius_of_selected_vertices(cls, obj): pass
def set_qto_result(cls, result): pass
@interface
class Root:
def add_dynamic_opening_voids(cls, element, obj): pass
@@ -25,6 +25,7 @@ from blenderbim.tool.ifc import Ifc
from blenderbim.tool.material import Material
from blenderbim.tool.misc import Misc
from blenderbim.tool.owner import Owner
from blenderbim.tool.qto import Qto
from blenderbim.tool.root import Root
from blenderbim.tool.spatial import Spatial
from blenderbim.tool.style import Style
+37
View File
@@ -0,0 +1,37 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2021 Dion Moult <dion@thinkmoult.com>
#
# This file is part of BlenderBIM Add-on.
#
# BlenderBIM Add-on 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.
#
# BlenderBIM Add-on 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 BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import bpy
import blenderbim.core.tool
import blenderbim.tool as tool
from mathutils import Vector
class Qto(blenderbim.core.tool.Qto):
@classmethod
def get_radius_of_selected_vertices(cls, obj):
selected_verts = [v.co for v in obj.data.vertices if v.select]
total = Vector()
for v in selected_verts:
total += v
circle_center = total / len(selected_verts)
return max([(v - circle_center).length for v in selected_verts])
@classmethod
def set_qto_result(cls, result):
bpy.context.scene.BIMQtoProperties.qto_result = str(round(result, 3))
+1
View File
@@ -9,6 +9,7 @@ markers =
patch
project
pset_template
qto
root
spatial
style
@@ -0,0 +1,30 @@
@qto
Feature: Qto
Scenario: Calculate circle radius
Given an empty Blender session
And I add a cube
And the object "Cube" is selected
When I press "bim.calculate_circle_radius"
Then "scene.BIMQtoProperties.qto_result" is "1.732"
Scenario: Calculate edge lengths
Given an empty Blender session
And I add a cube
And the object "Cube" is selected
When I press "bim.calculate_edge_lengths"
Then "scene.BIMQtoProperties.qto_result" is "24.0"
Scenario: Calculate face areas
Given an empty Blender session
And I add a cube
And the object "Cube" is selected
When I press "bim.calculate_face_areas"
Then "scene.BIMQtoProperties.qto_result" is "24.0"
Scenario: Calculate object volumes
Given an empty Blender session
And I add a cube
And the object "Cube" is selected
When I press "bim.calculate_object_volumes"
Then "scene.BIMQtoProperties.qto_result" is "8.0"
+1 -1
View File
@@ -358,7 +358,7 @@ def the_object_name_is_at_location(name, location):
@then(parsers.parse('the file "{name}" should contain "{value}"'))
def the_file_name_should_contain_value(name, value):
def the_file_name_should_contain_value(name, value):
name = replace_variables(name)
with open(name, "r") as f:
assert value in f.read()
+11 -4
View File
@@ -84,6 +84,13 @@ def owner():
prophet.verify()
@pytest.fixture
def qto():
prophet = Prophecy(blenderbim.core.tool.Qto)
yield prophet
prophet.verify()
@pytest.fixture
def root():
prophet = Prophecy(blenderbim.core.tool.Root)
@@ -127,15 +134,15 @@ def type():
@pytest.fixture
def voider():
prophet = Prophecy(blenderbim.core.tool.Voider)
def unit():
prophet = Prophecy(blenderbim.core.tool.Unit)
yield prophet
prophet.verify()
@pytest.fixture
def unit():
prophet = Prophecy(blenderbim.core.tool.Unit)
def voider():
prophet = Prophecy(blenderbim.core.tool.Voider)
yield prophet
prophet.verify()
+27
View File
@@ -0,0 +1,27 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2021 Dion Moult <dion@thinkmoult.com>
#
# This file is part of BlenderBIM Add-on.
#
# BlenderBIM Add-on 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.
#
# BlenderBIM Add-on 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 BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import blenderbim.core.qto as subject
from test.core.bootstrap import qto
class TestCalculateCircleRadius:
def test_run(self, qto):
qto.get_radius_of_selected_vertices("obj").should_be_called().will_return("radius")
qto.set_qto_result("radius").should_be_called()
assert subject.calculate_circle_radius(qto, obj="obj") == "radius"
+41
View File
@@ -0,0 +1,41 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2021 Dion Moult <dion@thinkmoult.com>
#
# This file is part of BlenderBIM Add-on.
#
# BlenderBIM Add-on 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.
#
# BlenderBIM Add-on 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 BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import bpy
import ifcopenshell
import test.bim.bootstrap
import blenderbim.core.tool
import blenderbim.tool as tool
from blenderbim.tool.qto import Qto as subject
class TestImplementsTool(test.bim.bootstrap.NewFile):
def test_run(self):
assert isinstance(subject(), blenderbim.core.tool.Qto)
class TestGetRadiusOfSelectedVertices(test.bim.bootstrap.NewFile):
def test_run(self):
bpy.ops.mesh.primitive_circle_add()
assert round(subject.get_radius_of_selected_vertices(bpy.data.objects.get("Circle")), 3) == 1
class TestSetQtoResult(test.bim.bootstrap.NewFile):
def test_run(self):
subject.set_qto_result(123.4567)
assert bpy.context.scene.BIMQtoProperties.qto_result == "123.457"