import rhinoscriptsyntax as rs rs.DeleteObjects(rs.AllObjects()) rs.EnableRedraw(False) # Parameters for the roof structure (roof_length should be devidable by truss_spacing) thickness = 0.24 # Adjust thickness as needed roof_length = 36 roof_height = 6 #keep it like this so we have a useable room height roof_span = 18 truss_spacing = 3 purlin_height=0.32 def create_double_hanging_truss(): if not all([roof_length, roof_height, roof_span, truss_spacing]): print("Invalid input parameters.") return # Proportional dimensions based on diagram num_trusses = int(roof_length / truss_spacing) + 1 trusses = [] for i in range(num_trusses): x_offset = i * truss_spacing # Bottom of the truss (lower chord) left_base = (x_offset, 0, 0) right_base = (x_offset, roof_span, 0) # Top of the truss (ridge point) ridge_point = (x_offset, roof_span / 2, roof_height) # Create the main triangular truss truss_lines = [ rs.AddLine(left_base, ridge_point), # Left rafter rs.AddLine(right_base, ridge_point), # Right rafter rs.AddLine(left_base, right_base), # Bottom chord ] # Add the collar tie (horizontal beam) collar_tie_start = (x_offset, roof_span * 0.3, roof_height * 0.5) collar_tie_end = (x_offset, roof_span * 0.7, roof_height * 0.5) truss_lines.append(rs.AddLine(collar_tie_start, collar_tie_end)) # Add vertical hangers (suspenders) """hanger_top = (x_offset, roof_span / 2, roof_height * 0.5) hanger_bottom = (x_offset, roof_span / 2, 0) truss_lines.append(rs.AddLine(hanger_top, hanger_bottom))""" corners=[(0,0,0),(thickness,0,0),(thickness,thickness,0),(0,thickness,0),(0,0,roof_height*0.515),(thickness,0,roof_height*0.515),(thickness,thickness,roof_height*0.515),(0,thickness,roof_height*0.515)] st=rs.AddBox(corners) st2=rs.AddBox(corners) h1 = rs.MoveObject(st, [x_offset - thickness/2, roof_span * 0.3, thickness/2]) h2 = rs.MoveObject(st2, [x_offset - thickness/2, roof_span * 0.7 - thickness, thickness/2]) """left_hanger_start = (x_offset, roof_span * 0.3, roof_height * 0.515) left_hanger_end = (x_offset, roof_span * 0.3, 0) right_hanger_start = (x_offset, roof_span * 0.7, roof_height * 0.515) right_hanger_end = (x_offset, roof_span * 0.7, 0) truss_lines.append(rs.AddLine(left_hanger_start, left_hanger_end)) truss_lines.append(rs.AddLine(right_hanger_start, right_hanger_end))""" # Add diagonal braces (struts) left_brace_start = (x_offset, roof_span * 0.3, roof_height * 0.5) left_brace_end = (x_offset, roof_span * 0.05, 0) right_brace_start = (x_offset, roof_span * 0.7, roof_height * 0.5) right_brace_end = (x_offset, roof_span * 0.95, 0) truss_lines.append(rs.AddLine(left_brace_start, left_brace_end)) truss_lines.append(rs.AddLine(right_brace_start, right_brace_end)) trusses.extend(truss_lines) #Add Purlins upper_purlin_corners=[(0,0,0),(0,thickness,0),(roof_length+thickness,thickness,0),(roof_length+thickness,0,0),(0,0,purlin_height),(0,thickness,purlin_height),(roof_length+thickness,thickness,purlin_height),(roof_length+thickness,0,purlin_height)] u_pu=rs.AddBox(upper_purlin_corners) p1=rs.MoveObject(u_pu,[-thickness/2,roof_span * 0.3,thickness/2+roof_height*0.515]) u_pu2=rs.AddBox(upper_purlin_corners) p2=rs.MoveObject(u_pu2,[-thickness/2,roof_span * 0.7-thickness,thickness/2+roof_height*0.515]) lower_purlin_corners=[(0,0,0),(0,0,thickness),(roof_length+thickness,0,thickness),(roof_length+thickness,0,0),(0,purlin_height,0),(0,purlin_height,thickness),(roof_length+thickness,purlin_height,thickness),(roof_length+thickness,purlin_height,0)] l_pu=rs.AddBox(lower_purlin_corners) lp=rs.MoveObject(l_pu,[-thickness/2,roof_span * 0.03,thickness/2]) l_pu2=rs.AddBox(lower_purlin_corners) lp2=rs.MoveObject(l_pu2,[-thickness/2,roof_span * 0.97-purlin_height,thickness/2]) # Create 3D boxes along each line for line in trusses: if rs.IsLine(line): start_point = rs.CurveStartPoint(line) end_point = rs.CurveEndPoint(line) vector = rs.VectorCreate(end_point, start_point) length = rs.VectorLength(vector) unit_vector = rs.VectorUnitize(vector) # Create a box perpendicular to the line perp_vector = rs.VectorCrossProduct(unit_vector, [0, 0, 1]) if not rs.VectorLength(perp_vector): # Handle vertical lines perp_vector = rs.VectorCreate([1, 0, 0], [0, 0, 0]) perp_vector = rs.VectorScale(perp_vector, thickness / 2) # Calculate corners of the box corner1 = rs.PointAdd(start_point, rs.VectorAdd(perp_vector, [0, 0, -thickness / 2])) corner2 = rs.PointAdd(start_point, rs.VectorAdd(-perp_vector, [0, 0, -thickness / 2])) corner3 = rs.PointAdd(end_point, rs.VectorAdd(-perp_vector, [0, 0, -thickness / 2])) corner4 = rs.PointAdd(end_point, rs.VectorAdd(perp_vector, [0, 0, -thickness / 2])) corner5 = rs.PointAdd(corner1, [0, 0, thickness]) corner6 = rs.PointAdd(corner2, [0, 0, thickness]) corner7 = rs.PointAdd(corner3, [0, 0, thickness]) corner8 = rs.PointAdd(corner4, [0, 0, thickness]) # Create the box rs.AddBox([corner1, corner2, corner3, corner4, corner5, corner6, corner7, corner8]) """corner_lefthanger_start1=left_hanger_start-perp_vector, [0, 0, -thickness / 2 corner_lefthanger_start2=left_hanger_start+perp_vector, [0, 0, -thickness / 2 corner_lefthanger_end1=left_hanger_end-perp_vector, [0, 0, -thickness / 2 corner_lefthanger_end2=left_hanger_end+perp_vector, [0, 0, -thickness / 2 rs.AddBox([left_hanger_start])""" if __name__ == "__main__": create_double_hanging_truss()