import rhinoscriptsyntax as rs rs.DeleteObjects(rs.AllObjects()) def create_double_hanging_truss(): # Parameters for the roof structure roof_length = 30.0 roof_height = 6 roof_span = 16 truss_spacing = 4.0 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)) # Add vertical carrier hangers left_hanger_start = (x_offset, roof_span * 0.3, roof_height * 0.6) left_hanger_end = (x_offset, roof_span * 0.3, 0) right_hanger_start = (x_offset, roof_span * 0.7, roof_height * 0.6) 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) # Create 3D boxes along each line thickness = 0.2 # Adjust thickness as needed 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]) if __name__ == "__main__": create_double_hanging_truss()