mesh = geometry.create_mesh(mesh_sizes=[5, 20]) # create a CrossSection object - take care to list the materials in the same order as entered into # the MergedSection section = CrossSection(geometry, mesh, materials=[steel, timber]) section.display_mesh_info() # display the mesh information # plot the mesh with coloured materials and a line transparency of 0.5 section.plot_mesh(materials=True, alpha=0.5) # perform a geometric, warping and plastic analysis section.calculate_geometric_properties(time_info=True) section.calculate_warping_properties(time_info=True) section.calculate_plastic_properties(time_info=True, verbose=True) # perform a stress analysis with N = 100 kN, Mxx = 120 kN.m and Vy = 75 kN stress_post = section.calculate_stress(N=-100e3, Mxx=-120e6, Vy=-75e3, time_info=True) # print the results to the terminal section.display_results() # plot the centroids section.plot_centroids() stress_post.plot_stress_n_zz(pause=False) # plot the axial stress stress_post.plot_stress_m_zz(pause=False) # plot the bending stress stress_post.plot_stress_v_zxy() # plot the shear stress
def process_geometry(geometry, mesh_sizes, loadcases): # update this to receive the geometry, mesh info, material and loads # generate a finite element mesh mesh = geometry.create_mesh(mesh_sizes=mesh_sizes) # generate material - can be overwritten if needed --all in N and cm # create a CrossSection object for analysis section = CrossSection(geometry, mesh) # calculate various cross-section properties section.calculate_geometric_properties() section.calculate_warping_properties() section.calculate_plastic_properties() # Area area = section.get_area() sheararea = section.get_As() asx = sheararea[0] asy = sheararea[1] # Second Moment of Area about centroid (ixx, iyy, ixy) = section.get_ic() # Centroid (xg, yg) = section.get_c() # Radii of Gyration (rxx, ryy) = section.get_rc() # Principal bending axis angle phi = section.get_phi() # St. Venant torsion constant ipp = section.get_j() # Warping Constant cw = section.get_gamma() # Elastic Section Moduli (welx_top, welx_bottom, wely_top, wely_bottom) = section.get_z() # Plastic Section Moduli (wplx, wply) = section.get_s() # plot centroid to image section.plot_centroids(pause=False) buf = io.BytesIO() plt.savefig(buf, format='png', bbox_inches='tight') buf.seek(0) plot_centroid = base64.b64encode(buf.getvalue()).decode() plt.close() # calculate torsion resistance from stress and torque #from the below can also return torsional stress if wanted stress_post = section.calculate_stress(Mzz=10) unit_mzz_zxy = [] maxstress = [] for group in stress_post.material_groups: maxstress.append(max(group.stress_result.sig_zxy_mzz)) unit_mzz_zxy.append(group.stress_result.sig_zxy_mzz.tolist()) #there should be only one maxstress value therefore: wt = 10 / maxstress[0] #plot this image stress_post.plot_stress_mzz_zxy(pause=False) buf = io.BytesIO() plt.savefig(buf, format='png', bbox_inches='tight') buf.seek(0) plot_unittorsionstress = base64.b64encode(buf.getvalue()).decode() plt.close() #foreach load case submitted calculate vm stress state and create image vmStressImages = {} vmStressStates = {} for loadcase in loadcases: lc_name = loadcase[0] s_n = loadcase[1] s_vx = loadcase[2] s_vy = loadcase[3] s_mxx = loadcase[4] s_myy = loadcase[5] s_mzz = loadcase[6] stress_post = section.calculate_stress(N=s_n, Vx=s_vx, Vy=s_vy, Mxx=s_mxx, Myy=s_myy, Mzz=s_mzz) stress_state = [] for group in stress_post.material_groups: stress_state.append(group.stress_result.sig_vm.tolist()) vmStressStates['lc_' + str(lc_name) + '_vm_stress'] = stress_state #plot this image stress_post.plot_stress_vm(pause=False) buf = io.BytesIO() plt.savefig(buf, format='png', bbox_inches='tight') buf.seek(0) vmStressImages['lc_' + str(lc_name) + '_vm_stress'] = base64.b64encode( buf.getvalue()).decode() plt.close() # create rhino mesh rmesh = rhino_mesh_from_meshpy(mesh) # return send_file(path, as_attachment=True) # get some of the calculated section properties return_data = {} return_data['properties'] = { 'area': area, 'Avx': asx, 'Avy': asy, 'xg': xg, 'yg': yg, 'rxx': rxx, 'ryy': ryy, 'phi': phi, 'ixx': ixx, 'iyy': iyy, 'ipp': ipp, 'cw': cw, 'welx+': welx_top, 'welx-': welx_bottom, 'wely+': wely_top, 'wely-': wely_bottom, 'wplx': wplx, 'wply': wply, 'wt': wt, } return_data['geometry'] = { 'mesh': rhino.CommonObject.Encode(rmesh), } return_data['images'] = { 'centroids': plot_centroid, 'unittorsion_vxy_stress': plot_unittorsionstress, } return_data['images'].update(vmStressImages) return_data['stress_results'] = { 'unittorsion_vxy_stress': unit_mzz_zxy, } return_data['stress_results'].update(vmStressStates) return return_data