@@ -2376,6 +2376,184 @@ module back_stiffener_plate() {
23762376 vertical_angle_iron_smart(plate_height, angle_size);
23772377}
23782378
2379+ // =============================================================================
2380+ // FRONT STIFFENER PLATE
2381+ // =============================================================================
2382+ // Vertical plate at the front of the frame, similar mounting to back plate
2383+ // Flush with front of motor mount plates
2384+ // Center section (between motor plates): 10" + bottom plate thickness
2385+ // Outer sections (motor plate to outer wall): 5" tall
2386+
2387+ module front_stiffener_plate() {
2388+ plate_width = TRACK_WIDTH + SANDWICH_SPACING;
2389+ plate_thickness = PLATE_1_4_INCH;
2390+ y_pos = BOTTOM_PLATE_Y_END; // Flush with front of motor mount plates
2391+
2392+ // Heights
2393+ center_height = 254.0 + PLATE_1_4_INCH; // 10" + bottom plate thickness
2394+ outer_height = 127.0 ; // 5" for outer sections
2395+
2396+ // Angle iron trim to avoid overlap with horizontal angles below
2397+ angle_trim = 57.15 ; // 2.25 inches
2398+ center_angle_height = center_height - angle_trim;
2399+ outer_angle_height = outer_height - angle_trim;
2400+ angle_z_offset = angle_trim; // Start angles higher to avoid overlap
2401+
2402+ z_start = FRAME_Z_OFFSET + BOTTOM_PLATE_INNER_TRIM - PLATE_1_4_INCH; // Start at bottom stiffener plate top
2403+
2404+ angle_size = [50.8 , 6.35 ];
2405+ leg = angle_size[0 ];
2406+ bolt_dia = 9.525 ;
2407+ hole_offset = leg * 0.6 ;
2408+
2409+ inner_offset = TRACK_WIDTH/2 - SANDWICH_SPACING/2 ;
2410+
2411+ // Center section plate (between motor plates)
2412+ difference () {
2413+ color ("Silver" )
2414+ translate ([- MOTOR_PLATE_X, y_pos, z_start])
2415+ cube ([2 * MOTOR_PLATE_X, plate_thickness, center_height]);
2416+
2417+ // Holes for motor plate angles
2418+ // Left motor plate - right side (Legs +X, -Y)
2419+ for (z = get_stiffener_holes_b(center_height)) {
2420+ translate ([- MOTOR_PLATE_X + MOTOR_PLATE_THICKNESS/2 + hole_offset, y_pos, z_start + z])
2421+ rotate ([90 , 0 , 0 ])
2422+ cylinder (d= bolt_dia, h= 20 , center= true , $ fn= 16 );
2423+ }
2424+
2425+ // Right motor plate - left side (Legs -X, -Y)
2426+ for (z = get_stiffener_holes_b(center_height)) {
2427+ translate ([MOTOR_PLATE_X - MOTOR_PLATE_THICKNESS/2 - hole_offset, y_pos, z_start + z])
2428+ rotate ([90 , 0 , 0 ])
2429+ cylinder (d= bolt_dia, h= 20 , center= true , $ fn= 16 );
2430+ }
2431+ }
2432+
2433+ // Left outer section plate (outer wall to motor plate)
2434+ difference () {
2435+ color ("Silver" )
2436+ translate ([- plate_width/2 , y_pos, z_start])
2437+ cube ([plate_width/2 - MOTOR_PLATE_X, plate_thickness, outer_height]);
2438+
2439+ // Holes for left outer wall angle
2440+ for (z = get_stiffener_holes_a(outer_height)) {
2441+ translate ([- plate_width/2 + hole_offset, y_pos, z_start + z])
2442+ rotate ([90 , 0 , 0 ])
2443+ cylinder (d= bolt_dia, h= 20 , center= true , $ fn= 16 );
2444+ }
2445+
2446+ // Holes for left inner wall - left side
2447+ for (z = get_stiffener_holes_b(outer_height)) {
2448+ translate ([- inner_offset - hole_offset, y_pos, z_start + z])
2449+ rotate ([90 , 0 , 0 ])
2450+ cylinder (d= bolt_dia, h= 20 , center= true , $ fn= 16 );
2451+ }
2452+
2453+ // Holes for left inner wall - right side
2454+ for (z = get_stiffener_holes_a(outer_height)) {
2455+ translate ([- inner_offset + PANEL_THICKNESS + hole_offset, y_pos, z_start + z])
2456+ rotate ([90 , 0 , 0 ])
2457+ cylinder (d= bolt_dia, h= 20 , center= true , $ fn= 16 );
2458+ }
2459+
2460+ // Holes for left motor plate - left side
2461+ for (z = get_stiffener_holes_b(outer_height)) {
2462+ translate ([- MOTOR_PLATE_X - MOTOR_PLATE_THICKNESS/2 - hole_offset, y_pos, z_start + z])
2463+ rotate ([90 , 0 , 0 ])
2464+ cylinder (d= bolt_dia, h= 20 , center= true , $ fn= 16 );
2465+ }
2466+ }
2467+
2468+ // Right outer section plate (motor plate to outer wall)
2469+ difference () {
2470+ color ("Silver" )
2471+ translate ([MOTOR_PLATE_X, y_pos, z_start])
2472+ cube ([plate_width/2 - MOTOR_PLATE_X, plate_thickness, outer_height]);
2473+
2474+ // Holes for right outer wall angle
2475+ for (z = get_stiffener_holes_b(outer_height)) {
2476+ translate ([plate_width/2 - hole_offset, y_pos, z_start + z])
2477+ rotate ([90 , 0 , 0 ])
2478+ cylinder (d= bolt_dia, h= 20 , center= true , $ fn= 16 );
2479+ }
2480+
2481+ // Holes for right inner wall - left side
2482+ for (z = get_stiffener_holes_b(outer_height)) {
2483+ translate ([inner_offset - PANEL_THICKNESS - hole_offset, y_pos, z_start + z])
2484+ rotate ([90 , 0 , 0 ])
2485+ cylinder (d= bolt_dia, h= 20 , center= true , $ fn= 16 );
2486+ }
2487+
2488+ // Holes for right inner wall - right side
2489+ for (z = get_stiffener_holes_a(outer_height)) {
2490+ translate ([inner_offset + hole_offset, y_pos, z_start + z])
2491+ rotate ([90 , 0 , 0 ])
2492+ cylinder (d= bolt_dia, h= 20 , center= true , $ fn= 16 );
2493+ }
2494+
2495+ // Holes for right motor plate - right side
2496+ for (z = get_stiffener_holes_a(outer_height)) {
2497+ translate ([MOTOR_PLATE_X + MOTOR_PLATE_THICKNESS/2 + hole_offset, y_pos, z_start + z])
2498+ rotate ([90 , 0 , 0 ])
2499+ cylinder (d= bolt_dia, h= 20 , center= true , $ fn= 16 );
2500+ }
2501+ }
2502+
2503+ // Angle Irons (shortened by 2.25" to avoid overlap with horizontal angles below)
2504+ // Left Outer wall (Legs +X, -Y) -> Rot Z -90
2505+ translate ([- plate_width/2 , y_pos, z_start + angle_z_offset])
2506+ rotate ([0 , 0 , - 90 ])
2507+ vertical_angle_iron_smart(outer_angle_height, angle_size);
2508+
2509+ // Right Outer wall (Legs -X, -Y) -> Rot Z 180
2510+ translate ([plate_width/2 , y_pos, z_start + angle_z_offset])
2511+ rotate ([0 , 0 , 180 ])
2512+ vertical_angle_iron_smart(outer_angle_height, angle_size);
2513+
2514+ // Left Inner Panel - left side (Legs -X, -Y) -> Rot Z 180
2515+ translate ([- inner_offset, y_pos, z_start + angle_z_offset])
2516+ rotate ([0 , 0 , 180 ])
2517+ vertical_angle_iron_smart(outer_angle_height, angle_size);
2518+
2519+ // Left Inner Panel - right side (Legs +X, -Y) -> Rot Z -90
2520+ translate ([- inner_offset + PANEL_THICKNESS, y_pos, z_start + angle_z_offset])
2521+ rotate ([0 , 0 , - 90 ])
2522+ vertical_angle_iron_smart(outer_angle_height, angle_size);
2523+
2524+ // Right Inner Panel - left side (Legs -X, -Y) -> Rot Z 180
2525+ translate ([inner_offset - PANEL_THICKNESS, y_pos, z_start + angle_z_offset])
2526+ rotate ([0 , 0 , 180 ])
2527+ vertical_angle_iron_smart(outer_angle_height, angle_size);
2528+
2529+ // Right Inner Panel - right side (Legs +X, -Y) -> Rot Z -90
2530+ translate ([inner_offset, y_pos, z_start + angle_z_offset])
2531+ rotate ([0 , 0 , - 90 ])
2532+ vertical_angle_iron_smart(outer_angle_height, angle_size);
2533+
2534+ // Motor plate angles (center section)
2535+ // Left motor plate - right side (Legs +X, -Y) -> Rot Z -90
2536+ translate ([- MOTOR_PLATE_X + MOTOR_PLATE_THICKNESS/2 , y_pos, z_start + angle_z_offset])
2537+ rotate ([0 , 0 , - 90 ])
2538+ vertical_angle_iron_smart(center_angle_height, angle_size);
2539+
2540+ // Right motor plate - left side (Legs -X, -Y) -> Rot Z 180
2541+ translate ([MOTOR_PLATE_X - MOTOR_PLATE_THICKNESS/2 , y_pos, z_start + angle_z_offset])
2542+ rotate ([0 , 0 , 180 ])
2543+ vertical_angle_iron_smart(center_angle_height, angle_size);
2544+
2545+ // Motor plate angles (outer sections)
2546+ // Left motor plate - left side (Legs -X, -Y) -> Rot Z 180
2547+ translate ([- MOTOR_PLATE_X - MOTOR_PLATE_THICKNESS/2 , y_pos, z_start + angle_z_offset])
2548+ rotate ([0 , 0 , 180 ])
2549+ vertical_angle_iron_smart(outer_angle_height, angle_size);
2550+
2551+ // Right motor plate - right side (Legs +X, -Y) -> Rot Z -90
2552+ translate ([MOTOR_PLATE_X + MOTOR_PLATE_THICKNESS/2 , y_pos, z_start + angle_z_offset])
2553+ rotate ([0 , 0 , - 90 ])
2554+ vertical_angle_iron_smart(outer_angle_height, angle_size);
2555+ }
2556+
23792557// =============================================================================
23802558// BOTTOM STIFFENER PLATE
23812559// =============================================================================
@@ -2520,6 +2698,25 @@ MOTOR_PLATE_THICKNESS = PLATE_1_4_INCH;
25202698// Motor plate is 6" inboard (toward center)
25212699MOTOR_PLATE_X = (TRACK_WIDTH/2 - SANDWICH_SPACING/2 ) - MOTOR_PLATE_INBOARD;
25222700
2701+ // Cutout shape for motor plates (in motor plate local coordinates)
2702+ // Motor plate local: Y = world Y, Z = world Z (relative to z_bottom)
2703+ // Uses CNC-friendly corner radius for manufacturability
2704+ module motor_plate_tube_cutout(y_pos, y_start, z_bottom) {
2705+ // In motor plate coords:
2706+ // Y position = world Y position of tube - y_start
2707+ // Z position = FRAME_TUBE_Z - z_bottom
2708+ local_y = y_pos - y_start;
2709+ local_z = FRAME_TUBE_Z - z_bottom;
2710+
2711+ translate ([- 5 , local_y, local_z])
2712+ rotate ([0 , 90 , 0 ])
2713+ rotate ([0 , 0 , 90 ])
2714+ linear_extrude(height= MOTOR_PLATE_THICKNESS + 10 )
2715+ offset(r= FRAME_TUBE_CNC_RADIUS)
2716+ offset(r=- FRAME_TUBE_CNC_RADIUS)
2717+ square([FRAME_TUBE_WIDTH, FRAME_TUBE_HEIGHT]);
2718+ }
2719+
25232720module motor_mounting_plate() {
25242721 plate_height = MOTOR_PLATE_HEIGHT;
25252722 plate_length = BOTTOM_PLATE_LENGTH; // Same as bottom stiffener plate
@@ -2532,20 +2729,112 @@ module motor_mounting_plate() {
25322729 leg = angle_size[0 ];
25332730 thick = angle_size[1 ];
25342731
2732+ // Frame tube angle iron parameters (same as frame_tube_angle_iron module)
2733+ angle_trim = 3.175 ; // 1/8" trimmed from each end
2734+ angle_len = FRAME_TUBE_HEIGHT - 2 * angle_trim; // 5.75" (146.05mm)
2735+ frame_bolt_dia = BOLT_DIA_1_2; // 1/2" bolts for frame tube angles
2736+ plate_bolt_offset = 50.8 ; // 2" from center (4" total spacing) for plate/wall side
2737+
2738+ // Local Y positions of frame tubes (relative to y_start)
2739+ front_tube_local_y = FRONT_FRAME_TUBE_Y - y_start;
2740+ rear_tube_local_y = REAR_FRAME_TUBE_Y - y_start;
2741+
2742+ // Z position of angle irons relative to plate bottom
2743+ angle_z_local = FRAME_TUBE_Z - z_bottom + angle_trim;
2744+
25352745 // Left motor plate (negative X side)
2536- // Plate is in YZ plane
2746+ // Plate is in YZ plane with 2x6 tube cutouts
25372747 color ("Silver" )
25382748 translate ([- MOTOR_PLATE_X - plate_thickness/2 , y_start, z_bottom])
2539- cube ([plate_thickness, plate_length, plate_height]);
2749+ difference () {
2750+ cube ([plate_thickness, plate_length, plate_height]);
2751+
2752+ // 2x6 cross tube cutouts (front and rear)
2753+ motor_plate_tube_cutout(FRONT_FRAME_TUBE_Y, y_start, z_bottom);
2754+ motor_plate_tube_cutout(REAR_FRAME_TUBE_Y, y_start, z_bottom);
2755+
2756+ // Frame tube angle iron bolt holes (same pattern as side wall plates)
2757+ // 2 holes per angle, spaced 4" apart (2" from center), 1/2" bolts
2758+ // FRONT TUBE - front face angle
2759+ translate ([plate_thickness/2 , front_tube_local_y + FRAME_TUBE_WIDTH + leg/2 , angle_z_local + angle_len/2 - plate_bolt_offset])
2760+ rotate ([0 , 90 , 0 ])
2761+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2762+ translate ([plate_thickness/2 , front_tube_local_y + FRAME_TUBE_WIDTH + leg/2 , angle_z_local + angle_len/2 + plate_bolt_offset])
2763+ rotate ([0 , 90 , 0 ])
2764+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2765+
2766+ // FRONT TUBE - rear face angle
2767+ translate ([plate_thickness/2 , front_tube_local_y - leg/2 , angle_z_local + angle_len/2 - plate_bolt_offset])
2768+ rotate ([0 , 90 , 0 ])
2769+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2770+ translate ([plate_thickness/2 , front_tube_local_y - leg/2 , angle_z_local + angle_len/2 + plate_bolt_offset])
2771+ rotate ([0 , 90 , 0 ])
2772+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2773+
2774+ // REAR TUBE - front face angle
2775+ translate ([plate_thickness/2 , rear_tube_local_y + FRAME_TUBE_WIDTH + leg/2 , angle_z_local + angle_len/2 - plate_bolt_offset])
2776+ rotate ([0 , 90 , 0 ])
2777+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2778+ translate ([plate_thickness/2 , rear_tube_local_y + FRAME_TUBE_WIDTH + leg/2 , angle_z_local + angle_len/2 + plate_bolt_offset])
2779+ rotate ([0 , 90 , 0 ])
2780+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2781+
2782+ // REAR TUBE - rear face angle
2783+ translate ([plate_thickness/2 , rear_tube_local_y - leg/2 , angle_z_local + angle_len/2 - plate_bolt_offset])
2784+ rotate ([0 , 90 , 0 ])
2785+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2786+ translate ([plate_thickness/2 , rear_tube_local_y - leg/2 , angle_z_local + angle_len/2 + plate_bolt_offset])
2787+ rotate ([0 , 90 , 0 ])
2788+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2789+ }
25402790
25412791 // Right motor plate (positive X side)
25422792 color ("Silver" )
25432793 translate ([MOTOR_PLATE_X - plate_thickness/2 , y_start, z_bottom])
2544- cube ([plate_thickness, plate_length, plate_height]);
2794+ difference () {
2795+ cube ([plate_thickness, plate_length, plate_height]);
2796+
2797+ // 2x6 cross tube cutouts (front and rear)
2798+ motor_plate_tube_cutout(FRONT_FRAME_TUBE_Y, y_start, z_bottom);
2799+ motor_plate_tube_cutout(REAR_FRAME_TUBE_Y, y_start, z_bottom);
2800+
2801+ // Frame tube angle iron bolt holes (same pattern as side wall plates)
2802+ // FRONT TUBE - front face angle
2803+ translate ([plate_thickness/2 , front_tube_local_y + FRAME_TUBE_WIDTH + leg/2 , angle_z_local + angle_len/2 - plate_bolt_offset])
2804+ rotate ([0 , 90 , 0 ])
2805+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2806+ translate ([plate_thickness/2 , front_tube_local_y + FRAME_TUBE_WIDTH + leg/2 , angle_z_local + angle_len/2 + plate_bolt_offset])
2807+ rotate ([0 , 90 , 0 ])
2808+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2809+
2810+ // FRONT TUBE - rear face angle
2811+ translate ([plate_thickness/2 , front_tube_local_y - leg/2 , angle_z_local + angle_len/2 - plate_bolt_offset])
2812+ rotate ([0 , 90 , 0 ])
2813+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2814+ translate ([plate_thickness/2 , front_tube_local_y - leg/2 , angle_z_local + angle_len/2 + plate_bolt_offset])
2815+ rotate ([0 , 90 , 0 ])
2816+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2817+
2818+ // REAR TUBE - front face angle
2819+ translate ([plate_thickness/2 , rear_tube_local_y + FRAME_TUBE_WIDTH + leg/2 , angle_z_local + angle_len/2 - plate_bolt_offset])
2820+ rotate ([0 , 90 , 0 ])
2821+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2822+ translate ([plate_thickness/2 , rear_tube_local_y + FRAME_TUBE_WIDTH + leg/2 , angle_z_local + angle_len/2 + plate_bolt_offset])
2823+ rotate ([0 , 90 , 0 ])
2824+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2825+
2826+ // REAR TUBE - rear face angle
2827+ translate ([plate_thickness/2 , rear_tube_local_y - leg/2 , angle_z_local + angle_len/2 - plate_bolt_offset])
2828+ rotate ([0 , 90 , 0 ])
2829+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2830+ translate ([plate_thickness/2 , rear_tube_local_y - leg/2 , angle_z_local + angle_len/2 + plate_bolt_offset])
2831+ rotate ([0 , 90 , 0 ])
2832+ cylinder (d= frame_bolt_dia, h= plate_thickness+ 4 , center= true , $ fn= 16 );
2833+ }
25452834
2546- // Angle irons connecting motor plates to bottom stiffener plate
2547- // These run along the bottom edge of the motor plates
2548- // Horizontal leg on bottom stiffener plate, vertical leg against motor plate
2835+ // ==========================================================================
2836+ // HORIZONTAL ANGLE IRONS - Bottom edge (connecting to bottom stiffener plate)
2837+ // ==========================================================================
25492838
25502839 // Left motor plate angles (2 angles - one on each side of plate)
25512840 // Left side of left motor plate (X-leg extends -X, away from center)
@@ -2566,6 +2855,54 @@ module motor_mounting_plate() {
25662855 // Right side of right motor plate (X-leg extends +X, away from center)
25672856 translate ([MOTOR_PLATE_X + plate_thickness/2 , y_start, z_bottom])
25682857 split_horizontal_angle_iron(angle_size);
2858+
2859+ // ==========================================================================
2860+ // VERTICAL ANGLE IRONS - At 2x6 frame tube locations (same as side wall plates)
2861+ // Uses frame_tube_angle_iron() module for matching size and bolt pattern
2862+ // ==========================================================================
2863+
2864+ // Z position - angle centered with tube (offset by 1/8" trim)
2865+ angle_z = FRAME_TUBE_Z + angle_trim;
2866+
2867+ // Left motor plate - horizontal leg extends toward +X (toward center)
2868+ // FRONT TUBE - front face angle
2869+ translate ([- MOTOR_PLATE_X + plate_thickness/2 , FRONT_FRAME_TUBE_Y + FRAME_TUBE_WIDTH, angle_z])
2870+ frame_tube_angle_iron();
2871+
2872+ // FRONT TUBE - rear face angle (mirrored in Y so vertical leg extends backward)
2873+ translate ([- MOTOR_PLATE_X + plate_thickness/2 , FRONT_FRAME_TUBE_Y, angle_z])
2874+ mirror ([0 , 1 , 0 ])
2875+ frame_tube_angle_iron();
2876+
2877+ // REAR TUBE - front face angle
2878+ translate ([- MOTOR_PLATE_X + plate_thickness/2 , REAR_FRAME_TUBE_Y + FRAME_TUBE_WIDTH, angle_z])
2879+ frame_tube_angle_iron();
2880+
2881+ // REAR TUBE - rear face angle
2882+ translate ([- MOTOR_PLATE_X + plate_thickness/2 , REAR_FRAME_TUBE_Y, angle_z])
2883+ mirror ([0 , 1 , 0 ])
2884+ frame_tube_angle_iron();
2885+
2886+ // Right motor plate - horizontal leg extends toward -X (toward center), so mirror X
2887+ // FRONT TUBE - front face angle
2888+ translate ([MOTOR_PLATE_X - plate_thickness/2 , FRONT_FRAME_TUBE_Y + FRAME_TUBE_WIDTH, angle_z])
2889+ mirror ([1 , 0 , 0 ])
2890+ frame_tube_angle_iron();
2891+
2892+ // FRONT TUBE - rear face angle (mirrored in both X and Y)
2893+ translate ([MOTOR_PLATE_X - plate_thickness/2 , FRONT_FRAME_TUBE_Y, angle_z])
2894+ mirror ([1 , 1 , 0 ])
2895+ frame_tube_angle_iron();
2896+
2897+ // REAR TUBE - front face angle
2898+ translate ([MOTOR_PLATE_X - plate_thickness/2 , REAR_FRAME_TUBE_Y + FRAME_TUBE_WIDTH, angle_z])
2899+ mirror ([1 , 0 , 0 ])
2900+ frame_tube_angle_iron();
2901+
2902+ // REAR TUBE - rear face angle
2903+ translate ([MOTOR_PLATE_X - plate_thickness/2 , REAR_FRAME_TUBE_Y, angle_z])
2904+ mirror ([1 , 1 , 0 ])
2905+ frame_tube_angle_iron();
25692906}
25702907
25712908// =============================================================================
@@ -2837,6 +3174,9 @@ module base_frame() {
28373174 // 2" from front, 6" from back of wall side plates
28383175 bottom_stiffener_plate();
28393176
3177+ // Front stiffener plate (vertical plate at front of motor mount area)
3178+ front_stiffener_plate();
3179+
28403180 // Motor mounting plates (vertical plates for engine mounting)
28413181 motor_mounting_plate();
28423182
0 commit comments