From 0b058d1e1aa90f56b6c2e283c21f3979dc42a814 Mon Sep 17 00:00:00 2001 From: KaratasD Date: Wed, 10 Nov 2021 11:02:24 +0100 Subject: [PATCH 1/3] model_check_added --- RFEM/Tools/ModelCheck.py | 111 +++++++++++++++++++++++++++++ RFEM/Tools/PlausibilityCheck.py | 37 ++++++++++ RFEM/enums.py | 18 +++++ UnitTests/test_ModelCheck.py | 88 +++++++++++++++++++++++ UnitTests/test_plausiblityCheck.py | 55 ++++++++++++++ 5 files changed, 309 insertions(+) create mode 100644 RFEM/Tools/ModelCheck.py create mode 100644 RFEM/Tools/PlausibilityCheck.py create mode 100644 UnitTests/test_ModelCheck.py create mode 100644 UnitTests/test_plausiblityCheck.py diff --git a/RFEM/Tools/ModelCheck.py b/RFEM/Tools/ModelCheck.py new file mode 100644 index 00000000..d5dcd73b --- /dev/null +++ b/RFEM/Tools/ModelCheck.py @@ -0,0 +1,111 @@ +from suds.wsdl import Message +from RFEM.BasicObjects.member import Member +from RFEM.initModel import * +from RFEM.enums import * + + +class ModelCheck(): + + def __init__(self): + pass + + def GetIdenticalNodes(self, tolerance): + """ + Args: + tolerance (float): Tolerance + Returns: + Identical Nodes Object Group + """ + + operation = ModelCheckGetOptionType.IDENTICAL_NODES.name + object_groups = clientModel.service.model_check__get_object_groups_operation(operation, tolerance) + + return object_groups + + def DeleteUnusedNodes(self, tolerance, object_groups): + """ + Args: + tolerance (float): Tolerance + object_groups (dict): Object Groups of Identical Nodes + """ + + process = ModelCheckProcessOptionType.DELETE_UNUSED_NODES.name + clientModel.service.model_check__process_object_groups_operation(process, tolerance, object_groups) + + def UniteNodes(self, tolerance, object_groups): + """ + Args: + tolerance (float): Tolerance + object_groups (dict): Object Groups of Identical Nodes + """ + + process = ModelCheckProcessOptionType.UNITE_NODES_AND_DELETE_UNUSED_NODES.name + clientModel.service.model_check__process_object_groups_operation(process, tolerance, object_groups) + + def GetNotConnectedLines(self, tolerance): + """ + Args: + tolerance (float): Tolerance + Returns: + Not Connected Lines Line Groups + """ + + operation = ModelCheckGetOptionType.CROSSING_LINES.name + line_groups = clientModel.service.model_check__get_object_groups_operation(operation, tolerance) + + return line_groups + + def CrossLines(self, tolerance, line_groups): + """ + Args: + tolerance (float): Tolerance + line_groups (dict): Line Groups of Not Connected Lines + """ + + process = ModelCheckProcessOptionType.CROSS_LINES.name + clientModel.service.model_check__process_object_groups_operation(process, tolerance, line_groups) + + def GetNotConnectedMembers(self, tolerance): + """ + Args: + tolerance (float): Tolerance + Returns: + Not Connected Members Member Groups + """ + + operation = ModelCheckGetOptionType.CROSSING_MEMBERS.name + member_groups = clientModel.service.model_check__get_object_groups_operation(operation, tolerance) + + return member_groups + + def CrossMembers(self, tolerance, member_groups): + """ + Args: + tolerance (float): Tolerance + member_groups (dict): Member Groups of Not Connected Members + """ + + process = ModelCheckProcessOptionType.CROSS_MEMBERS.name + clientModel.service.model_check__process_object_groups_operation(process, tolerance, member_groups) + + def GetOverlappingLines(self): + """ + Returns: + Overlapping Line Groups + """ + + operation = ModelCheckGetOptionType.OVERLAPPING_LINES.name + overlapping_lines = clientModel.service.model_check__get_object_groups_operation(operation) + + return overlapping_lines + + def GetOverlappingMembers(self): + """ + Returns: + Overlapping Member Groups + """ + + operation = ModelCheckGetOptionType.OVERLAPPING_MEMBERS.name + overlapping_members = clientModel.service.model_check__get_object_groups_operation(operation) + + return overlapping_members \ No newline at end of file diff --git a/RFEM/Tools/PlausibilityCheck.py b/RFEM/Tools/PlausibilityCheck.py new file mode 100644 index 00000000..9f05df63 --- /dev/null +++ b/RFEM/Tools/PlausibilityCheck.py @@ -0,0 +1,37 @@ +from suds.wsdl import Message +from RFEM.initModel import * +from RFEM.enums import * + +class PlausiblityCheck(): + + def __init__(self): + + response = clientModel.service.plausibility_check() + + if 'failed' in response: + self.checkresult = PlausibilityCheckResult.CHECK_FAILED + self.message = response.split("Messages received:", 1)[1] + self.errormessage = self.message.split('Result "false"', 1)[0] + else: + self.checkresult = PlausibilityCheckResult.CHECK_IS_OK + self.errormessage = "" + + def IsModelOK(self): + + if self.checkresult == PlausibilityCheckResult.CHECK_IS_OK: + return True + else: + return False + + def GetErrorMessage(self): + + return self.errormessage + + def GetModelCheckStatus(self): + + if self.checkresult == PlausibilityCheckResult.CHECK_IS_OK: + print("Plausibility check succeeded.\nModel is OK") + elif self.checkresult == PlausibilityCheckResult.CHECK_FAILED: + print("Plausibility check failed.\nModel is not OK") + else: + print("No plausibility check result.") \ No newline at end of file diff --git a/RFEM/enums.py b/RFEM/enums.py index 72b171b9..ccdae521 100644 --- a/RFEM/enums.py +++ b/RFEM/enums.py @@ -798,3 +798,21 @@ class CqsDampingRule(Enum): Spectal Analysis Settings Damping for CQC Rule ''' CONSTANT_FOR_EACH_MODE, DIFFERENT_FOR_EACH_MODE = range(2) + +class PlausibilityCheckResult(Enum): + ''' + Plausibility Check Result + ''' + CHECK_IS_OK, CHECK_FAILED = range(2) + +class ModelCheckGetOptionType(Enum): + ''' + Model Check Get Object Groups Option Type + ''' + CROSSING_LINES, CROSSING_MEMBERS, IDENTICAL_NODES, OVERLAPPING_LINES, OVERLAPPING_MEMBERS = range(5) + +class ModelCheckProcessOptionType(Enum): + ''' + Model Check Process Object Groups Option Type + ''' + CROSS_LINES, CROSS_MEMBERS, DELETE_UNUSED_NODES, UNITE_NODES_AND_DELETE_UNUSED_NODES = range(4) \ No newline at end of file diff --git a/UnitTests/test_ModelCheck.py b/UnitTests/test_ModelCheck.py new file mode 100644 index 00000000..0977c76a --- /dev/null +++ b/UnitTests/test_ModelCheck.py @@ -0,0 +1,88 @@ +import sys +from types import coroutine +sys.path.append(".") +from RFEM.Loads.surfaceLoad import * +from RFEM.Loads.memberLoad import * +from RFEM.Loads.nodalLoad import * +from RFEM.LoadCasesAndCombinations.loadCase import * +from RFEM.TypesForNodes.nodalSupport import * +from RFEM.BasicObjects.solidSet import * +from RFEM.BasicObjects.surfaceSet import * +from RFEM.BasicObjects.memberSet import * +from RFEM.BasicObjects.lineSet import * +from RFEM.BasicObjects.opening import * +from RFEM.BasicObjects.solid import * +from RFEM.BasicObjects.surface import * +from RFEM.BasicObjects.member import * +from RFEM.BasicObjects.line import * +from RFEM.BasicObjects.node import * +from RFEM.BasicObjects.thickness import * +from RFEM.BasicObjects.section import * +from RFEM.BasicObjects.material import * +from RFEM.initModel import * +from RFEM.dataTypes import * +from RFEM.enums import * +from RFEM.Tools.ModelCheck import ModelCheck + + +if __name__ == '__main__': + + clientModel.service.begin_modification() + + Material(1, 'S235') + Section(1, 'IPE 300', 1) + + Node(1, 0, 0, 0) + Node(2, 0, 0, 0) + Node(3, 1, 1, 1) + Node(4, 1, 1, 1) + + Node(5, 10, 0, 0) + Node(6, 10, 3, 0) + Node(7, 9, 2, 0) + Node(8, 11, 2, 0) + + Node(9, 13, 0, 0) + Node(10, 13, 3, 0) + Node(11, 12, 2, 0) + Node(12, 14, 2, 0) + + Node(13, 5, 0, 0) + Node(14, 5, 3, 0) + + Node(15, 7, 0, 0) + Node(16, 7, 3, 0) + + Line(1, '5 6') + Line(2, '7 8') + + Line(3, '13 14') + Line(4, '13 14') + + Member(1, MemberType.TYPE_BEAM, 9, 10, 0, 1, 1) + Member(2, MemberType.TYPE_BEAM, 11, 12, 0, 1, 1) + Member(3, MemberType.TYPE_BEAM, 15, 16, 0, 1, 1) + Member(4, MemberType.TYPE_BEAM, 15, 16, 0, 1, 1) + + print('Ready!') + + clientModel.service.finish_modification() + + + identical_nodes = ModelCheck.GetIdenticalNodes(0, 0.0005) + + ModelCheck.DeleteUnusedNodes(0, 0.0005, identical_nodes) + + crossing_lines = ModelCheck.GetNotConnectedLines(0, 0.0005) + + ModelCheck.CrossLines(0, 0.0005, crossing_lines) + + crossing_members = ModelCheck.GetNotConnectedMembers(0, 0.0005) + + overlapping_lines = ModelCheck.GetOverlappingLines(0) + + print(overlapping_lines) + + overlapping_members = ModelCheck.GetOverlappingMembers(0) + + print(overlapping_members) \ No newline at end of file diff --git a/UnitTests/test_plausiblityCheck.py b/UnitTests/test_plausiblityCheck.py new file mode 100644 index 00000000..b72f5d68 --- /dev/null +++ b/UnitTests/test_plausiblityCheck.py @@ -0,0 +1,55 @@ +import sys +sys.path.append(".") +from RFEM.Loads.surfaceLoad import * +from RFEM.Loads.memberLoad import * +from RFEM.Loads.nodalLoad import * +from RFEM.LoadCasesAndCombinations.loadCase import * +from RFEM.TypesForNodes.nodalSupport import * +from RFEM.BasicObjects.solidSet import * +from RFEM.BasicObjects.surfaceSet import * +from RFEM.BasicObjects.memberSet import * +from RFEM.BasicObjects.lineSet import * +from RFEM.BasicObjects.opening import * +from RFEM.BasicObjects.solid import * +from RFEM.BasicObjects.surface import * +from RFEM.BasicObjects.member import * +from RFEM.BasicObjects.line import * +from RFEM.BasicObjects.node import * +from RFEM.BasicObjects.thickness import * +from RFEM.BasicObjects.section import * +from RFEM.BasicObjects.material import * +from RFEM.initModel import * +from RFEM.dataTypes import * +from RFEM.enums import * +from RFEM.Tools.PlausibilityCheck import PlausiblityCheck + + +if __name__ == '__main__': + + # modal analysis not yet implemmented in released RFEM6 + clientModel.service.begin_modification() + + # Create Material + Material(1, 'S235') + + # Create Sections + Section(1, 'HEA 240', 1) + + # Create Nodes + Node(1, 0, 0, 0) + Node(2, 6, 0, 0) + + # Create Members + Member(1, MemberType.TYPE_BEAM, 1, 2, 0, 1, 1) + + + # Create Nodal Supports + NodalSupport(1, '1', NodalSupportType.FIXED) + + print('Ready!') + clientModel.service.finish_modification() + + check = PlausiblityCheck() + print(check.GetErrorMessage()) + + From e1b09a45dbac677e8c7c910ecaad1819f85b588b Mon Sep 17 00:00:00 2001 From: KaratasD Date: Wed, 8 Dec 2021 13:36:45 +0100 Subject: [PATCH 2/3] pylint_issues_solved --- RFEM/Tools/ModelCheck.py | 14 ++++++-------- RFEM/Tools/PlausibilityCheck.py | 13 +++++++------ UnitTests/test_ModelCheck.py | 10 +++++----- UnitTests/test_plausiblityCheck.py | 5 ++--- pylintrc | 1 + 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/RFEM/Tools/ModelCheck.py b/RFEM/Tools/ModelCheck.py index d5dcd73b..1c83a5ec 100644 --- a/RFEM/Tools/ModelCheck.py +++ b/RFEM/Tools/ModelCheck.py @@ -1,14 +1,12 @@ -from suds.wsdl import Message -from RFEM.BasicObjects.member import Member +#pylint: disable=W0614, W0401, W0622, C0103, C0114, C0115, C0116, C0301, C0413, R0913, R0914, R0915, C0305, C0411, W0102, W0702, E0602, E0401 from RFEM.initModel import * from RFEM.enums import * - class ModelCheck(): def __init__(self): pass - + def GetIdenticalNodes(self, tolerance): """ Args: @@ -16,7 +14,7 @@ def GetIdenticalNodes(self, tolerance): Returns: Identical Nodes Object Group """ - + operation = ModelCheckGetOptionType.IDENTICAL_NODES.name object_groups = clientModel.service.model_check__get_object_groups_operation(operation, tolerance) @@ -84,7 +82,7 @@ def CrossMembers(self, tolerance, member_groups): tolerance (float): Tolerance member_groups (dict): Member Groups of Not Connected Members """ - + process = ModelCheckProcessOptionType.CROSS_MEMBERS.name clientModel.service.model_check__process_object_groups_operation(process, tolerance, member_groups) @@ -98,7 +96,7 @@ def GetOverlappingLines(self): overlapping_lines = clientModel.service.model_check__get_object_groups_operation(operation) return overlapping_lines - + def GetOverlappingMembers(self): """ Returns: @@ -108,4 +106,4 @@ def GetOverlappingMembers(self): operation = ModelCheckGetOptionType.OVERLAPPING_MEMBERS.name overlapping_members = clientModel.service.model_check__get_object_groups_operation(operation) - return overlapping_members \ No newline at end of file + return overlapping_members diff --git a/RFEM/Tools/PlausibilityCheck.py b/RFEM/Tools/PlausibilityCheck.py index 9f05df63..16cffbab 100644 --- a/RFEM/Tools/PlausibilityCheck.py +++ b/RFEM/Tools/PlausibilityCheck.py @@ -1,4 +1,5 @@ -from suds.wsdl import Message +#pylint: disable=W0614, W0401, W0622, C0103, C0114, C0115, C0116, C0301, C0413, R0913, R0914, R0915, C0305, C0411, W0102, W0702, E0602, E0401 + from RFEM.initModel import * from RFEM.enums import * @@ -8,21 +9,21 @@ def __init__(self): response = clientModel.service.plausibility_check() - if 'failed' in response: + if "failed" in response: self.checkresult = PlausibilityCheckResult.CHECK_FAILED self.message = response.split("Messages received:", 1)[1] - self.errormessage = self.message.split('Result "false"', 1)[0] + self.errormessage = self.message.split("Result 'false'", 1)[0] else: self.checkresult = PlausibilityCheckResult.CHECK_IS_OK self.errormessage = "" def IsModelOK(self): - if self.checkresult == PlausibilityCheckResult.CHECK_IS_OK: + if self.checkresult == PlausibilityCheckResult.CHECK_FAILED: return True else: return False - + def GetErrorMessage(self): return self.errormessage @@ -34,4 +35,4 @@ def GetModelCheckStatus(self): elif self.checkresult == PlausibilityCheckResult.CHECK_FAILED: print("Plausibility check failed.\nModel is not OK") else: - print("No plausibility check result.") \ No newline at end of file + print("No plausibility check result.") diff --git a/UnitTests/test_ModelCheck.py b/UnitTests/test_ModelCheck.py index 0977c76a..b183014b 100644 --- a/UnitTests/test_ModelCheck.py +++ b/UnitTests/test_ModelCheck.py @@ -1,5 +1,5 @@ +#pylint: disable=W0614, W0401, W0622, C0103, C0114, C0115, C0116, C0301, C0413, R0913, R0914, R0915, C0305, C0411, W0102, W0702, E0602, E0401 import sys -from types import coroutine sys.path.append(".") from RFEM.Loads.surfaceLoad import * from RFEM.Loads.memberLoad import * @@ -22,7 +22,7 @@ from RFEM.initModel import * from RFEM.dataTypes import * from RFEM.enums import * -from RFEM.Tools.ModelCheck import ModelCheck +from RFEM.Tools.modelCheck import ModelCheck if __name__ == '__main__': @@ -36,7 +36,7 @@ Node(2, 0, 0, 0) Node(3, 1, 1, 1) Node(4, 1, 1, 1) - + Node(5, 10, 0, 0) Node(6, 10, 3, 0) Node(7, 9, 2, 0) @@ -52,7 +52,7 @@ Node(15, 7, 0, 0) Node(16, 7, 3, 0) - + Line(1, '5 6') Line(2, '7 8') @@ -85,4 +85,4 @@ overlapping_members = ModelCheck.GetOverlappingMembers(0) - print(overlapping_members) \ No newline at end of file + print(overlapping_members) diff --git a/UnitTests/test_plausiblityCheck.py b/UnitTests/test_plausiblityCheck.py index b72f5d68..0d0ca028 100644 --- a/UnitTests/test_plausiblityCheck.py +++ b/UnitTests/test_plausiblityCheck.py @@ -1,3 +1,4 @@ +#pylint: disable=W0614, W0401, W0622, C0103, C0114, C0115, C0116, C0301, C0413, R0913, R0914, R0915, C0305, C0411, W0102, W0702, E0602, E0401 import sys sys.path.append(".") from RFEM.Loads.surfaceLoad import * @@ -21,7 +22,7 @@ from RFEM.initModel import * from RFEM.dataTypes import * from RFEM.enums import * -from RFEM.Tools.PlausibilityCheck import PlausiblityCheck +from RFEM.Tools.plausibilityCheck import PlausiblityCheck if __name__ == '__main__': @@ -51,5 +52,3 @@ check = PlausiblityCheck() print(check.GetErrorMessage()) - - diff --git a/pylintrc b/pylintrc index c20cfe65..26307ced 100644 --- a/pylintrc +++ b/pylintrc @@ -148,6 +148,7 @@ disable=abstract-method, wrong-import-order, xrange-builtin, zip-builtin-not-iterating, + [REPORTS] From 64e133ec3833c5eb5ea56a99e76fa97581d9c672 Mon Sep 17 00:00:00 2001 From: MichalO Date: Wed, 2 Feb 2022 13:23:53 +0100 Subject: [PATCH 3/3] plausibility test updated PlausibilityCheck() updated --- RFEM/Tools/PlausibilityCheck.py | 20 +++--------- UnitTests/test_plausiblityCheck.py | 52 ++++++++++++------------------ 2 files changed, 26 insertions(+), 46 deletions(-) diff --git a/RFEM/Tools/PlausibilityCheck.py b/RFEM/Tools/PlausibilityCheck.py index dce20fd6..27cf03ee 100644 --- a/RFEM/Tools/PlausibilityCheck.py +++ b/RFEM/Tools/PlausibilityCheck.py @@ -3,9 +3,10 @@ class PlausiblityCheck(): - def __init__(self): + def __init__(self, + skip_warnings:bool = False): - response = Model.clientModel.service.plausibility_check() + response = Model.clientModel.service.plausibility_check(skip_warnings) if "failed" in response: self.checkresult = PlausibilityCheckResult.CHECK_FAILED @@ -13,24 +14,13 @@ def __init__(self): self.errormessage = self.message.split("Result 'false'", 1)[0] else: self.checkresult = PlausibilityCheckResult.CHECK_IS_OK + self.message = 'Success' self.errormessage = "" def IsModelOK(self): - if self.checkresult == PlausibilityCheckResult.CHECK_IS_OK: - return True - else: - return False + return self.checkresult == PlausibilityCheckResult.CHECK_IS_OK def GetErrorMessage(self): return self.errormessage - - def GetModelCheckStatus(self): - - if self.checkresult == PlausibilityCheckResult.CHECK_IS_OK: - print("Plausibility check succeeded.\nModel is OK") - elif self.checkresult == PlausibilityCheckResult.CHECK_FAILED: - print("Plausibility check failed.\nModel is not OK") - else: - print("No plausibility check result.") diff --git a/UnitTests/test_plausiblityCheck.py b/UnitTests/test_plausiblityCheck.py index 8096b990..1724754e 100644 --- a/UnitTests/test_plausiblityCheck.py +++ b/UnitTests/test_plausiblityCheck.py @@ -1,34 +1,25 @@ -#pylint: disable=W0614, W0401, W0622, C0103, C0114, C0115, C0116, C0301, C0413, R0913, R0914, R0915, C0305, C0411, W0102, W0702, E0602, E0401 +import os import sys -sys.path.append(".") -from RFEM.Loads.surfaceLoad import * -from RFEM.Loads.memberLoad import * -from RFEM.Loads.nodalLoad import * -from RFEM.LoadCasesAndCombinations.loadCase import * -from RFEM.TypesForNodes.nodalSupport import * -from RFEM.BasicObjects.solidSet import * -from RFEM.BasicObjects.surfaceSet import * -from RFEM.BasicObjects.memberSet import * -from RFEM.BasicObjects.lineSet import * -from RFEM.BasicObjects.opening import * -from RFEM.BasicObjects.solid import * -from RFEM.BasicObjects.surface import * -from RFEM.BasicObjects.member import * -from RFEM.BasicObjects.line import * -from RFEM.BasicObjects.node import * -from RFEM.BasicObjects.thickness import * -from RFEM.BasicObjects.section import * -from RFEM.BasicObjects.material import * -from RFEM.initModel import * -from RFEM.dataTypes import * -from RFEM.enums import * +PROJECT_ROOT = os.path.abspath(os.path.join( + os.path.dirname(__file__), + os.pardir) +) +sys.path.append(PROJECT_ROOT) +from RFEM.TypesForNodes.nodalSupport import NodalSupport, NodalSupportType +from RFEM.BasicObjects.member import Member +from RFEM.BasicObjects.node import Node +from RFEM.BasicObjects.section import Section +from RFEM.BasicObjects.material import Material +from RFEM.initModel import Model from RFEM.Tools.PlausibilityCheck import PlausiblityCheck +if Model.clientModel is None: + Model() -if __name__ == '__main__': +def test_plausibility_check(): - # modal analysis not yet implemmented in released RFEM6 - clientModel.service.begin_modification() + Model.clientModel.service.delete_all() + Model.clientModel.service.begin_modification() # Create Material Material(1, 'S235') @@ -41,14 +32,13 @@ Node(2, 6, 0, 0) # Create Members - Member(1, MemberType.TYPE_BEAM, 1, 2, 0, 1, 1) - + Member(1, 1, 2, 0, 1, 1) # Create Nodal Supports NodalSupport(1, '1', NodalSupportType.FIXED) - print('Ready!') - clientModel.service.finish_modification() + Model.clientModel.service.finish_modification() check = PlausiblityCheck() - print(check.GetErrorMessage()) + assert check.message == 'Success' + assert check.errormessage == ''