// ============================================ // Tapo Ceiling Mount - Assembly Preview // ============================================ // Non-printing preview of the whole system: // ceiling, upper clamps, exterior plate, connector collar, camera adapter, // approximate camera, Ethernet cable, DC cable. // // Modes: // assembly_mode = "assembled" full stack in place // = "exploded" parts spread along z // = "section" assembled, cut on the y=0 plane for the cables // // Colors show only in the interactive preview ($preview). Printable parts do // not depend on color. parameters_only = false; include ; use ; use ; use ; use ; /* [Assembly Preview] */ // Preview layout. assembly_mode = "assembled"; // [assembled, exploded, section] // Spread distance for the exploded view (mm). explode_gap = 26; // [10:1:60] // Structural, connector, adapter and camera colors for the preview. col_struct = [0.82, 0.82, 0.85]; col_connect = [0.20, 0.45, 0.90]; col_adapter = [0.95, 0.55, 0.15]; col_camera = [0.96, 0.96, 0.96]; e = (assembly_mode == "exploded") ? explode_gap : 0; clamp_z = plate_thickness + ceiling_thickness; module paint(c) { if ($preview) color(c) children(); else children(); } // Translucent false-ceiling panel with the existing hole. module ceiling_mock() { color([0.85, 0.85, 0.80, 0.30]) translate([0, 0, plate_thickness]) difference() { cylinder(d = outer_diameter + 40, h = ceiling_thickness); translate([0, 0, -1]) cylinder(d = ceiling_hole_diameter, h = ceiling_thickness + 2); } } // One M4 screw, head recess to captive nut. module m4_screw_model(len) { color("silver") { cylinder(d = screw_head_recess_d - 0.6, h = head_recess_depth); translate([0, 0, head_recess_depth]) cylinder(d = 4, h = len); } } // Approximate Tapo camera below the adapter. module camera_model(z_top) { paint(col_camera) translate([0, 0, z_top]) { translate([0, 0, -9]) cylinder(d = camera_base_diameter, h = 9); translate([0, 0, -9]) sphere(d = camera_base_diameter * 0.8); } } // Ethernet and DC cables through the open center. module cables() { color([0.15, 0.35, 0.85]) translate([0, 9, -40]) cylinder(d = 7, h = 90); color([0.10, 0.10, 0.10]) translate([0, -9, -40]) cylinder(d = 4, h = 90); } module full_assembly() { // Structural ceiling system (stays in place). paint(col_struct) tapo_outer_plate(); paint(col_struct) translate([0, 0, clamp_z + e]) tapo_inner_clamp_pair(); for (p = screw_positions) translate([p[0], p[1], 0]) m4_screw_model(recommended_screw_length); // Modular camera interface (spreads down when exploded). paint(col_connect) translate([0, 0, -e]) camera_connector(); paint(col_adapter) translate([0, 0, -2 * e]) tapo_camera_adapter_original_base(); camera_model(adapter_bot_z - 2 * e); if (assembly_mode != "exploded") cables(); ceiling_mock(); } if (assembly_mode == "section") difference() { full_assembly(); translate([-200, 0, -200]) cube([400, 200, 400]); } else full_assembly();