# 용접 T이음 시험: 받침판(A)에 팔(B)이 용접으로 붙은 조립품
import sys, time
sys.path.insert(0, r'E:\도진팩토리\3D스캔및티칭시스템')
import numpy as np
import fea_server as fs


def box(x0, x1, y0, y1, z0, z1):
    c = [[x0, y0, z0], [x1, y0, z0], [x1, y1, z0], [x0, y1, z0],
         [x0, y0, z1], [x1, y0, z1], [x1, y1, z1], [x0, y1, z1]]
    o = []
    fs._emit_quad(o, c[0], c[3], c[2], c[1])   # z0 면 (법선 -z)
    fs._emit_quad(o, c[4], c[5], c[6], c[7])   # z1 면 (+z)
    fs._emit_quad(o, c[0], c[1], c[5], c[4])   # y0 면
    fs._emit_quad(o, c[1], c[2], c[6], c[5])   # x1 면
    fs._emit_quad(o, c[2], c[3], c[7], c[6])   # y1 면
    fs._emit_quad(o, c[3], c[0], c[4], c[7])   # x0 면
    return o


# A = 받침판 12t, 120x120 / B = 팔 300 x 60 x 8t
A = box(0, 12, -60, 60, -60, 60)
B = box(12, 312, -30, 30, -4, 4)
soup = A + B

V, F = fs.weld_mesh(soup)
comps = fs.split_components(V, F)
print('연결성분(부재) 수 :', len(comps))
for i, (Vc, Fc) in enumerate(comps):
    m = fs.mesh_metrics(Vc, Fc)
    print('  부재%d: 정점%d 삼각형%d 닫힘=%s 부피=%.0f 벽두께추정=%.2f'
          % (i + 1, len(Vc), len(Fc), m['closed'], m['volume_mm3'], m['wall_mm']))

Lb, bb, tb, P = 300., 60., 8., 1000.
I = bb * tb ** 3 / 12.
E = 205000.
print('\n팔(B) 외팔보 이론: I=%.0f mm^4, 처짐=%.3f mm, 근원응력=%.1f MPa'
      % (I, P * Lb ** 3 / (3 * E * I), 6 * P * Lb / (bb * tb ** 2)))

t0 = time.time()
r = fs.run_fea(soup, material='SS275',
               fix_points=[{'p': [6, -55, -55], 'r': 22}, {'p': [6, 55, -55], 'r': 22},
                           {'p': [6, -55, 55], 'r': 22}, {'p': [6, 55, 55], 'r': 22}],
               load_points=[{'p': [312, 0, 0], 'r': 22, 'dir': [0, 0, -1], 'N': P}],
               weld_mode='fillet', weld_throat=4.0)
print('전체 %.1f초' % (time.time() - t0))
print('\n방식      :', r['method_kr'])
print('메시      : %s %d개 / 절점 %d개 / 부재 %d개 / 용접접합 %d곳'
      % (r['mesh']['type'], r['mesh']['elements'], r['mesh']['nodes'],
         r['mesh'].get('parts', 1), r['mesh'].get('welds', 0)))
print('경계조건  : 고정절점 %d / 하중절점 %d (반경 %.1fmm)'
      % (r['bc']['fix_nodes'], r['bc']['load_nodes'], r['bc']['radius_mm']))
print('최대응력  : %.1f MPa (항복 대비 %.0f%%)'
      % (r['result']['max_vonmises_MPa'], r['result']['yield_ratio_pct']))
print('최대변위  : %.3f mm' % r['result']['max_disp_mm'])
print('취약점3곳 :')
for i, h in enumerate(r['result']['hotspots']):
    print('   %d) %.1f MPa (%.0f%%) @ %s' % (i + 1, h['MPa'], h['pct'],
          ', '.join('%.0f' % x for x in h['at'])))
print('용접부    :')
for w in r['welds']:
    print('   %s' % w['label'])
    print('      전달력 %.0f N → 전단 %.2f MPa / 허용 %.1f = %.0f%%'
          % (w['force_N'], w['tau_MPa'], w['allow_MPa'], w['pct']))
print('풀이 %.1f초' % r['solve_sec'])
