Artgineer_기술 배우는 아티스트

파이썬(Python)으로 라이노3D 도구 만들기 -1 [자재 단가(견적) 산출하기] 본문

Rhino3D & Python 💻

파이썬(Python)으로 라이노3D 도구 만들기 -1 [자재 단가(견적) 산출하기]

인표몬 2024. 12. 5. 15:31
반응형

만들 도구: 자동 견적 툴.

 

1. 도구 실행

2. 견적 낼 개체를 사용자 지정.

3. 개체의 재질을 사용자가 선택.

4. 재질, 규격, 무게, 가격 등을 출력.

 

 

# -*- coding: utf-8 -*-
import rhinoscriptsyntax as rs

def calculate_plate_price():
    # 재질별 밀도와 가격 정의
    materials = {
        "SUS201": {"density": 7.93, "price_per_kg": 2800},
        "SUS304": {"density": 7.93, "price_per_kg": 5500},
        "STL": {"density": 7.85, "price_per_kg": 1500},
    }

    # 재질 선택 (리스트박스를 사용)
    material = rs.ListBox(["SUS201", "SUS304", "STL"], "재질을 선택하세요")
    if not material:
        return

    # 객체 선택 (철판)
    obj = rs.GetObject("철판 개체를 선택하세요")
    if obj is None:
        return

    # 객체가 Polysurface(닫힌 면을 가진 개체)인지 확인
    if not rs.IsPolysurface(obj):
        rs.MessageBox("선택한 개체는 Polysurface가 아닙니다. 닫힌 면을 가진 개체를 선택해 주세요.")
        return

 

SUS201, SUS304, STL 의 비중을 넣고 각각 kg당 단가를 입력.

kg당 단가를 사용자가 입력하도록 해도 되지만

단가 변동 주기가 짧은편은 아니어서 필요시 코드만 수정하면 되도록 결정했다.

 

 

 

 

   # 객체의 BoundingBox 구하기
    bounding_box = rs.BoundingBox(obj)
    if not bounding_box:
        rs.MessageBox("BoundingBox를 계산할 수 없습니다.")
        return

    # BoundingBox에서 x, y, z 값을 계산
    x_length = abs(bounding_box[0][0] - bounding_box[1][0])  # x 방향 길이
    y_length = abs(bounding_box[0][1] - bounding_box[3][1])  # y 방향 길이
    z_length = abs(bounding_box[0][2] - bounding_box[4][2])  # z 방향 길이

    # mm로 변환
    x_length_mm = x_length  # 이미 mm로 측정됩니다.
    y_length_mm = y_length  # 이미 mm로 측정됩니다.
    z_length_mm = z_length  # 이미 mm로 측정됩니다.

    # 부피 계산 (mm³)
    volume_mm3 = x_length_mm * y_length_mm * z_length_mm

    # 밀도 추출 (g/mm³로 변환)
    density = materials[material]["density"] / 1000  # g/mm³로 변환
    weight_kg = volume_mm3 * density / 1000  # kg

    # 가격 계산
    price_per_kg = materials[material]["price_per_kg"]
    price = weight_kg * price_per_kg  # 가격 (원)

 

일단 박스 형태의 철판을 테스트 할거기에 BoundingBox를 사용.

개체의 가로, 세로, 높이를 추출.

 

가장 넓은면의 면적과 높이만을 추출하여

면적(헤베)와 두께(t) 출력도 가능하나, 일단은 단순하게 진행.

 

 

 

   # 결과 출력
    rs.MessageBox("재질: {}\nX: {:.2f} mm\nY: {:.2f} mm\nZ: {:.2f} mm\n무게: {:.2f} kg\n가격: {:.2f} 원".format(
        material, x_length_mm, y_length_mm, z_length_mm, weight_kg, price))

if __name__ == "__main__":
    calculate_plate_price()

 

최종적으로,

 

재질

X

Y

Z

무게

가격(원)

 

이 출력되도록 하였다.

 

아래는 사용 예시 GIF.

 

 

SUS201 1200*2400*3t 철판 견적을 내는 모습이다.

 

 

 

728x90