BlockResearchGroup / compas_assembly

Assembly data structures for the COMPAS framework.
https://blockresearchgroup.github.io/compas_assembly
MIT License
9 stars 17 forks source link

Compas_assembly DEM Viewer division by zero error #13

Open filipejsbrandao opened 1 year ago

filipejsbrandao commented 1 year ago

Sorry for duplicating the issue, but I assumed the compas-assembly repo was part of the compas-dev.

*Describe the bug** The DEM Viewer throws an error when loading an assembly with null forces, with both CRA solvers.


Traceback (most recent call last):
  File "d:\10_DEV\CompasWorkshop\mcneel22\RandomWall\02_collectRHgeometry.py", line 88, in <module>
    viewer.add_assembly(assembly)
  File "C:\Users\Filipe\anaconda3\envs\mcneel22\lib\site-packages\compas_assembly\viewer\app.py", line 224, in add_assembly
    resultants += interface.resultantforce
  File "C:\Users\Filipe\anaconda3\envs\mcneel22\lib\site-packages\compas_assembly\datastructures\interface.py", line 176, in resultantforce
    position = Point(*centroid_points_weighted(self.points, normalcomponents))
  File "C:\Users\Filipe\anaconda3\envs\mcneel22\lib\site-packages\compas\geometry\_core\centroids.py", line 163, in centroid_points_weighted
    vector = scale_vector(sum_vectors(vectors), 1.0 / sum(weights))
ZeroDivisionError: float division by zero

To Reproduce Steps to reproduce the behavior:

  1. Creating a block assembly with horizontal interfaces between the blocks in the same row. The sample script assumes a pyramid with 6 bricks.

A sample script that reproduces the error:

import os
import compas
from compas.colors import Color
from compas.geometry import Translation
from compas.datastructures import Mesh
from compas_assembly.datastructures import Block
from compas_assembly.datastructures import Assembly
from compas_assembly.algorithms import assembly_interfaces
#from compas_view2.app import App
from compas_assembly.viewer import DEMViewer
from compas_cra.equilibrium import cra_solve

# =============================================================================
# Import
# =============================================================================

filepath = os.path.join(os.path.dirname(__file__), "test.json")

data = compas.json_load(filepath)

boxes = data["blocks"]

# =============================================================================
# Assembly
# =============================================================================

assembly = Assembly()

for box in boxes:
    assembly.add_block_from_mesh(Mesh.from_shape(box))

# =============================================================================
# Identify interfaces
# =============================================================================

# inputs = the assembly, maximum distance and minimum area
assembly_interfaces(assembly, tmax=0.001, amin=1e-4)

# =============================================================================
# Boundary conditions
# =============================================================================

assembly.unset_boundary_conditions()

nodes = sorted(assembly.nodes(), key=lambda node: assembly.node_point(node).z)
for node in nodes[:3]:
    assembly.set_boundary_condition(node)

# =============================================================================
# Equilibrium
# =============================================================================

cra_solve(assembly)

# =============================================================================
# Viz
# =============================================================================

viewer = DEMViewer()
viewer.view.camera.position = [0, -5, 5]
viewer.view.camera.look_at([0, 0, 3])

viewer.add_assembly(assembly)

viewer.run()
  1. Sample data
{
    "blocks": [
        {
            "dtype": "compas.geometry/Box",
            "value": {
                "ysize": 0.11,
                "xsize": 0.22500000000000001,
                "frame": {
                    "yaxis": [
                        0.0,
                        1.0,
                        0.0
                    ],
                    "xaxis": [
                        1.0,
                        0.0,
                        0.0
                    ],
                    "point": [
                        0.1125,
                        0.055,
                        0.040000000000000001
                    ]
                },
                "zsize": 0.080000000000000002
            },
            "guid": "4a5f13d4-b563-4aca-83d5-b29437820e82"
        },
        {
            "dtype": "compas.geometry/Box",
            "value": {
                "ysize": 0.11,
                "xsize": 0.22500000000000001,
                "frame": {
                    "yaxis": [
                        0.0,
                        1.0,
                        0.0
                    ],
                    "xaxis": [
                        1.0,
                        0.0,
                        0.0
                    ],
                    "point": [
                        0.33750000000000002,
                        0.055,
                        0.040000000000000001
                    ]
                },
                "zsize": 0.080000000000000002
            },
            "guid": "d47b2b74-b0b4-4fe0-8516-ffe9572554b3"
        },
        {
            "dtype": "compas.geometry/Box",
            "value": {
                "ysize": 0.11,
                "xsize": 0.22500000000000003,
                "frame": {
                    "yaxis": [
                        0.0,
                        1.0,
                        0.0
                    ],
                    "xaxis": [
                        1.0,
                        0.0,
                        0.0
                    ],
                    "point": [
                        0.22500000000000001,
                        0.055,
                        0.12
                    ]
                },
                "zsize": 0.080000000000000002
            },
            "guid": "6d213422-febb-4a1d-8b3d-4222198c3fe7"
        },
        {
            "dtype": "compas.geometry/Box",
            "value": {
                "ysize": 0.11,
                "xsize": 0.22500000000000003,
                "frame": {
                    "yaxis": [
                        0.0,
                        1.0,
                        0.0
                    ],
                    "xaxis": [
                        1.0,
                        0.0,
                        0.0
                    ],
                    "point": [
                        0.5625,
                        0.055,
                        0.040000000000000001
                    ]
                },
                "zsize": 0.080000000000000002
            },
            "guid": "0b1183b1-8490-494f-bc01-e7da073acdab"
        },
        {
            "dtype": "compas.geometry/Box",
            "value": {
                "ysize": 0.11,
                "xsize": 0.22500000000000001,
                "frame": {
                    "yaxis": [
                        0.0,
                        1.0,
                        0.0
                    ],
                    "xaxis": [
                        1.0,
                        0.0,
                        0.0
                    ],
                    "point": [
                        0.33750000000000002,
                        0.055,
                        0.20000000000000001
                    ]
                },
                "zsize": 0.079999999999999988
            },
            "guid": "744d59fa-0d83-4c0b-a973-64983f601bf4"
        },
        {
            "dtype": "compas.geometry/Box",
            "value": {
                "ysize": 0.11,
                "xsize": 0.22499999999999998,
                "frame": {
                    "yaxis": [
                        0.0,
                        1.0,
                        0.0
                    ],
                    "xaxis": [
                        1.0,
                        0.0,
                        0.0
                    ],
                    "point": [
                        0.45000000000000001,
                        0.055,
                        0.12000000000144742
                    ]
                },
                "zsize": 0.080000000000000016
            },
            "guid": "c37b7266-8459-4562-aa10-1e980b51bf4e"
        }
    ]
}

Expected behavior Zero forces should not be displayed

Screenshots If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):