Skip to main content

cad-cam

CAD/CAM fundamentals including geometric modeling, manufacturing automation, toolpath generation, CNC programming, and 3D printing

معلومات المصدر

المستودع
ffsshhttiikk/opencode-agents-skills
آخر نشاط في المصدر
٢٨ فبراير ٢٠٢٦ في ٢٢:٥١
لغة SKILL.md المكتشفة
الإنجليزية
النجوم
٣
التفرعات
٢

خيارات التثبيت

يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.

مراجعة ملفات المصدر

اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.

عرض SKILL.md

SKILL.md
تعليمات المصدر · معاينة للقراءة فقط
name
cad-cam
description
CAD/CAM fundamentals including geometric modeling, manufacturing automation, toolpath generation, CNC programming, and 3D printing
license
MIT
compatibility
opencode
metadata
{"audience":"engineers","category":"engineering"}
## What I do - Create 3D geometric models using CAD software - Generate CNC toolpaths for manufacturing - Program CNC machines using G-code and CAM software - Design for additive manufacturing (3D printing) - Perform toolpath simulation and verification - Optimize machining parameters for efficiency - Convert CAD models to manufacturing formats - Verify tool collision and machine limits ## When to use me When creating 3D models, generating CNC toolpaths, programming CNC machines, or designing parts for additive manufacturing. ## Core Concepts - Solid modeling (CSG, B-rep) - Surface modeling and NURBS - Feature-based modeling - Toolpath strategies (contour, pocketing, drilling) - CNC programming (G-code, M-code) - Feed and speed calculations - Tool geometry and compensation - Additive manufacturing processes (FDM, SLA, SLS) - Build orientation and support generation - Post-processing for different machine controllers ## Code Examples ### G-Code Generation ```python from dataclasses import dataclass from typing import List, Tuple import math @dataclass class GCodeCommand: code: str x: float = None y: float = None z: float = None f: float = None s: float = None def rapid_move(x: float, y: float, z: float) -> str: """Generate G0 rapid move command.""" return f"G0 X{x:.4f} Y{y:.4f} Z{z:.4f}" def linear_move(x: float, y: float, z: float, f: float) -> str: """Generate G1 linear move command.""" return f"G1 X{x:.4f} Y{y:.4f} Z{z:.4f} F{f:.1f}" def circular_move( i: float, j: float, x: float, y: float, direction: str = "clockwise", f: float = 100 ) -> str: """Generate G2/G3 circular move.""" g_code = "G2" if direction == "clockwise" else "G3" return f"{g_code} X{x:.4f} Y{y:.4f} I{i:.4f} J{j:.4f} F{f:.1f}" def drill_cycle( x: float, y: float, z_start: float, z_depth: float, z_retract: float, f_plunge: float, f_rapid: float ) -> List[str]: """Generate G81 drilling cycle.""" return [ rapid_move(x, y, z_start), f"G81 R{z_retract} Z{z_depth} F{f_plunge}", f"G80", rapid_move(x, y, z_retract) ] def canned_cycle( cycle: str, x: float, y: float, r: float, z: float, q: float = None, f: float = 100 ) -> str: """Generate canned cycle command.""" if q: return f"{cycle} R{r} Z{z} Q{q} F{f}" return f"{cycle} R{r} Z{z} F{f}" # Example: Simple part program gcode = [ "G90 G21 G40", # Absolute, mm, cancel compensation "G54", # Work coordinate system 1 "M6 T1", # Tool change to tool 1 "M3 S3000", # Spindle on clockwise 3000 RPM rapid_move(0, 0, 5), linear_move(10, 0, -2, 100), linear_move(10, 10, -2, 100), linear_move(0, 10, -2, 100), linear_move(0, 0, -2, 100), "M5", # Spindle off "M30" # Program end ] for line in gcode[:5]: print(line) ``` ### Toolpath Generation ```python from typing import List, Tuple import numpy as np def offset_polygon( vertices: List[Tuple[float, float]], offset: float, corner_style: str = "round" ) -> List[Tuple[float, float]]: """Generate offset contour for tool radius compensation.""" offset_vertices = [] n = len(vertices) for i in range(n): p1 = vertices[i] p2 = vertices[(i + 1) % n] p0 = vertices[(i - 1) % n] v1 = np.array(p2) - np.array(p1) v0 = np.array(p1) - np.array(p0) angle1 = math.atan2(v1[1], v1[0]) angle0 = math.atan2(v0[1], v0[0]) if corner_style == "round": radius = offset center = np.array(p1) + np.array([ radius * math.cos((angle0 + angle1) / 2), radius * math.sin((angle0 + angle1) / 2) ]) # Generate arc points for t in np.linspace(0, 1, 9): angle = angle0 + (angle1 - angle0) * t offset_vertices.append(( center[0] + radius * math.cos(angle + math.pi/2), center[1] + radius * math.sin(angle + math.pi/2) )) else: # Miter join bisector = (angle0 + angle1) / 2 offset_vertices.append(( p1[0] + offset * math.cos(bisector + math.pi/2), p1[1] + offset * math.sin(bisector + math.pi/2) )) return offset_vertices def raster_toolpath( bbox: Tuple[float, float, float, float], stepover: float, direction: str = "x" ) -> List[Tuple[float, float]]: """Generate raster (zigzag) toolpath.""" xmin, xmax, ymin, ymax = bbox path = [] if direction == "x": for y in np.arange(ymin, ymax, stepover): if (y - ymin) / stepover % 2 == 0: path.extend([(xmin, y), (xmax, y)]) else: path.extend([(xmax, y), (xmin, y)]) else: for x in np.arange(xmin, xmax, stepover): if (x - xmin) / stepover % 2 == 0: path.extend([(x, ymin), (x, ymax)]) else: path.extend([(x, ymax), (x, ymin)]) return path def spiral_toolpath( center: Tuple[float, float], start_radius: float, end_radius: float, angle_per_step: float = 0.1, z_feed: float = 0.01 ) -> List[Tuple[float, float, float]]: """Generate spiral toolpath for drilling/milling.""" path = [] r = start_radius theta = 0 while r <= end_radius: x = center[0] + r * math.cos(theta) y = center[1] + r * math.sin(theta) z = -r / end_radius * 5 # Example z-depth path.append((x, y, z)) r += 0.05 theta += angle_per_step return path def trochoidal_milling( center: Tuple[float, float], radius: float, slot_width: float, stepdown: float, total_depth: float ) -> List[Tuple[float, float, float]]: """Generate trochoidal milling toolpath.""" path = [] current_depth = 0 while current_depth < total_depth: current_depth += stepdown if current_depth > total_depth: current_depth = total_depth angle = 0 while angle < 2 * math.pi: x = center[0] + (radius + slot_width/2 * math.cos(angle)) * math.cos(angle/2) y = center[1] + (radius + slot_width/2 * math.cos(angle)) * math.sin(angle/2) z = -current_depth path.append((x, y, z)) angle += 0.2 return path # Example: Raster toolpath bbox = (0, 100, 0, 50) path = raster_toolpath(bbox, 10, "x") print(f"Generated {len(path)} path points") ``` ### Feeds and Speeds ```python @dataclass class ToolParameters: diameter: float # mm num_flutes: int material: str hardness: float # HRC @dataclass class MaterialProperties: name: str hardness: float # HB or HRC tensile_strength: float # MPa machinability_rating: float def calculate_spindle_speed( cutting_speed: float, tool_diameter: float ) -> float: """Calculate spindle RPM.""" return (1000 * cutting_speed) / (math.pi * tool_diameter) def calculate_feed_rate( spindle_speed: float, feed_per_tooth: float, num_flutes: int ) -> float: """Calculate feed rate mm/min.""" return spindle_speed * feed_per_tooth * num_flutes def calculate_material_removal_rate( width: float, depth: float, feed_rate: float ) -> float: """Calculate MRR mm³/min.""" return width * depth * feed_rate def calculate_power_requirement( mrr: float, specific_energy: float ) -> float: """Calculate cutting power kW.""" return mrr * specific_energy / 60000 def estimate_feeds_speeds( material: str, tool_diameter: float, num_flutes: int, operation: str ) -> dict: """Estimate feeds and speeds based on material and operation.""" material_data = { "aluminum": {"vc": 200, "fz": 0.08, "se": 600}, "steel": {"vc": 100, "fz": 0.04, "se": 1500}, "stainless": {"vc": 70, "fz": 0.03, "se": 1800}, "titanium": {"vc": 50, "fz": 0.02, "se": 2500} } modifiers = { "roughing": {"vc_mult": 1.2, "fz_mult": 1.2}, "finishing": {"vc_mult": 1.5, "fz_mult": 0.5}, "slotting": {"vc_mult": 0.6, "fz_mult": 0.8} } m = material_data.get(material, material_data["steel"]) op_mod = modifiers.get(operation, {"vc_mult": 1.0, "fz_mult": 1.0}) vc = m["vc"] * op_mod["vc_mult"] fz = m["fz"] * op_mod["fz_mult"] n = calculate_spindle_speed(vc) vf, tool_diameter = calculate_feed_rate(n, fz, num_flutes) return { "spindle_speed_rpm": n, "feed_rate_mm_min": vf, "chip_load_mm_tooth": fz } # Example: Feeds and speeds settings = estimate_feeds_speeds("aluminum", 10, 4, "roughing") print(f"Spindle speed: {settings['spindle_speed_rpm']:.0f} RPM") print(f"Feed rate: {settings['feed_rate_mm_min']:.1f} mm/min") ``` ### Additive Manufacturing ```python @dataclass class AMBuildSettings: layer_height: float # mm infill_percentage: float infill_pattern: str build_temperature: float # C bed_temperature: float # C print_speed: float # mm/s support_type: str def estimate_build_time( num_layers: int, layer_area: float, print_speed: float, travel_speed: float = 150, layer_change_time: float = 5 ) -> float: """Estimate total build time in hours.""" print_time = (num_layers * layer_area) / print_speed / 60 travel_factor = 0.3 layer_time = num_layers * layer_change_time / 60 return (print_time * (1 + travel_factor) + layer_time) / 60 def calculate_material_usage( volume_mm3: float, infill_percentage: float = 20, support_percentage: float = 10 ) -> float: """Calculate required material in grams.""" density = 1.24 # PLA g/cm³ volume_cm3 = volume_mm3 / 1000 total_volume = volume_cm3 * (1 + infill_percentage/100) * (1 + support_percentage/100) return total_volume * density def optimize_build_orientation( surface_area: float, build_volume: Tuple[float, float, float], min_surface_roughness: bool = True, max_strength: bool = False ) -> Tuple[float, float, float]: """Optimize part orientation for 3D printing.""" x, y, z = build_volume if min_surface_roughness: return (x, y, 0.1) # Largest flat surface down elif max_strength: return (0.1, y, z) # Layer lines perpendicular to load return (x, y, z) def generate_support_structure( overhang_angle_threshold: float = 45, support_density: float = 0.2 ) -> List[dict]: """Generate support structure parameters.""" return [{ "angle_threshold": overhang_angle_threshold, "density": support_density, "style": "tree" if support_density < 0.15 else "grid"
عرض على GitHub
ملف SKILL.md هذا كبير جدا، لذلك يعرض SkillsMP القسم الاول فقط هنا. عرض على GitHub