CAD&BIM

반응형

Grasshopper에서

import rhinoscriptsyntax as rs
import Rhino
import System  # 🔴 꼭 필요!

def check_mesh_collisions(mesh_ids):
    collisions = []
    meshes = [rs.coercemesh(mid) for mid in mesh_ids]
    collided_indices = set()

    for i in range(len(meshes)):
        for j in range(i + 1, len(meshes)):
            result = Rhino.Geometry.Intersect.Intersection.MeshMeshAccurate(
                meshes[i], meshes[j], 0.001)
            if result:
                collisions.append((i, j))
                collided_indices.update([i, j])

    return collisions, list(collided_indices)

# 결과
collisions, collided_indices = check_mesh_collisions(meshes)

# 출력용: 색상 분리
colored_meshes = []
colors = []

for i, mesh in enumerate(meshes):
    colored_meshes.append(mesh)
    if i in collided_indices:
        # 분홍색
        colors.append(System.Drawing.Color.FromArgb(255, 255, 100, 200))
    else:
        # 기본 회색
        colors.append(System.Drawing.Color.FromArgb(255, 180, 180, 180))

a = colored_meshes
b = colors

 

 

Rhino에서 생성된 mesh 이용

import rhinoscriptsyntax as rs
import scriptcontext as sc
import Rhino

def check_and_color_collisions(mesh_ids):
    collisions = []
    meshes = []
    id_map = {}  # mesh 객체를 원래 ID로 역매핑

    # GUID → 실제 Mesh 객체로 변환
    for mid in mesh_ids:
        mesh = rs.coercemesh(mid)
        if mesh:
            meshes.append(mesh)
            id_map[mesh] = mid

    # 충돌 검출
    collided_ids = set()
    for i in range(len(meshes)):
        for j in range(i + 1, len(meshes)):
            result = Rhino.Geometry.Intersect.Intersection.MeshMeshAccurate(
                meshes[i], meshes[j], 0.001
            )
            if result:
                collisions.append((i, j))
                collided_ids.add(id_map[meshes[i]])
                collided_ids.add(id_map[meshes[j]])

    # 충돌된 메시를 분홍색으로 설정
    for cid in collided_ids:
        rh_obj = sc.doc.Objects.Find(cid)
        if rh_obj:
            attributes = rh_obj.Attributes
            attributes.ObjectColor = System.Drawing.Color.FromArgb(255, 200, 100, 200)  # 분홍색
            attributes.ColorSource = Rhino.DocObjects.ObjectColorSource.ColorFromObject
            sc.doc.Objects.ModifyAttributes(cid, attributes, True)

    sc.doc.Views.Redraw()
    return list(collided_ids), collisions


# 결과 출력
import System.Drawing
highlighted_ids, collision_pairs = check_and_color_collisions(meshes)

a = collision_pairs  # (index_i, index_j)
b = highlighted_ids  # 충돌된 메시의 GUID 리스트
반응형

'Grasshopper' 카테고리의 다른 글

grasshopper 기본  (0) 2025.04.23
MeshIntersect  (0) 2025.04.17
Brep Join in LunchBox  (0) 2025.04.12
How to create a tree trunk and branches  (0) 2025.03.28
Rotate Axis  (0) 2025.03.28

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band