# Chatrobot

> Pilotar o Autodesk Robot Structural Analysis Professional 2026 via MCP. Use quando o usuário pedir para modelar, analisar ou consultar resultados de uma estrutura — gatilhos incluem "Robot", "RSA", "estrutura", "estrutural", "análise", "analise", "pórtico", "treliça", "viga", "pilar", "coluna", "barra", "nó", "no", "laje", "painel", "apoio", "engaste", "rótula", "carga", "carregamento", "combinação", "combinacao", "caso de carga", "reação", "deslocamento", "momento", "cortante", "normal", "seção", "secao", "perfil", "material", "aço", "concreto", "dimensionar", "FEA", "beam", "column", "node", "panel", "slab", "load", "support", "analysis".

- Skill: `lucascorreia-blite/chatrobot` (Agent Skill)
- Install (CLI): `npx skillmds@latest add lucascorreia-blite/chatrobot`
- Raw SKILL.md: https://api.skillmd.com/api/skills/lucascorreia-blite/chatrobot/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: lucascorreia-blite (https://skillmd.com/u/lucascorreia-blite)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/lucascorreia-blite/chatrobot

---


# ChatRobot — Pilotar Autodesk Robot Structural Analysis 2026

Você está conectado a um Robot Structural Analysis local via servidor MCP `chatrobot`. Use as tools para modelar, rodar análise e consultar resultados direto no projeto aberto.

## Pré-requisitos

- Autodesk Robot Structural Analysis Professional **2026** aberto com um projeto ativo.
- Nenhum diálogo modal aberto. Se uma tool retornar "Call was rejected by callee" ou "não foi possível conectar", peça ao usuário para fechar diálogos e tirar foco de menus.

## Convenção de unidades (muito importante)

Toda entrada/saída numérica passa pelo MCP em unidades de engenharia:

- **Comprimentos**: metros (m)
- **Forças**: kN
- **Momentos**: kN·m
- **Pressões**: kPa (cargas de painel) / MPa (tensões)
- **Ângulos em tools**: graus
- **Rotações em resultados**: radianos (saem como estão do solver)

A GUI do Robot pode mostrar em outras unidades — **ignore o que aparece na tela**, a conversa sempre em kN/m/MPa/graus.

## Tools disponíveis (~45)

**Ciclo de vida**
- `new_project(structure_type)` — `frame_3d` (default), `frame_2d`, `truss_3d`, `truss_2d`, `grillage`, `shell`, `plate`
- `open_project(path)`, `save()`, `save_as(path)`, `project_info()`

**Estrutura global**
- `structure_summary()` — contagens, bbox em metros, status de cálculo
- `clear_structure(confirm=True)` — **destrutivo**: apaga tudo

**Materiais**
- `create_material_from_database(name, material_db_name)` — ex.: `("S355", "STEEL S355")`, `("C30", "CONCR C30/37")`
- `list_materials()`

**Seções de barra e espessuras de painel**
- `create_section_from_database(name, database?)` — perfis do banco: `"IPE 300"`, `"HEA 200"`, `"W14x22"`
- `create_rectangular_section(name, width_m, height_m, material_name?)` — concreto/madeira parametrica
- `create_panel_thickness_label(name, thickness_m, material_name)` — ex.: `("LAJE15", 0.15, "C30")`
- `list_sections()`, `list_panel_thicknesses()`

**Apoios**
- `create_support_label(name, ux,uy,uz,rx,ry,rz)` — True = restringido
  - engaste: tudo True (default)
  - rótula: uxyz True, rxyz False
  - rolete em Z: só uz True
- `list_supports()`

**Nós**
- `create_node(x, y, z, number?)` — coordenadas em metros
- `create_nodes_batch([[x,y,z], ...])` — **preferível** pra múltiplos (menos round-trips COM)
- `list_nodes(limit?, offset?)`, `get_node_info(number)`, `delete_node(number)`
- `apply_support(node_numbers, support_name)` — associa label já criado a vários nós

**Barras (vigas, pilares, tirantes)**
- `create_bar(node_start, node_end, section?, material?, number?)`
- `create_bars_batch([{node_start, node_end, section?, material?}, ...])`
- `list_bars(limit?, offset?)`, `get_bar_info(number)`, `delete_bar(number)`
- `assign_section(bar_numbers, section_name)` — trocar seção em lote

**Painéis e lajes**
- `create_panel(contour_node_numbers, thickness_name?, material_name?)` — contorno fechado (mín 3 nós)
- `list_panels()`, `get_panel_info(number)`, `delete_panel(number)`
- `assign_panel_thickness(panel_numbers, thickness_name)`

**Cargas e combinações**
- `create_load_case(name, nature)` — nature: `dead|live|wind|snow|seismic|accidental|temperature|other`
- `add_nodal_load(case, node_numbers, fx, fy, fz, mx, my, mz)` — forças em **kN**, momentos em **kN·m**
- `add_bar_uniform_load(case, bar_numbers, px, py, pz, local?)` — **kN/m**; `local=True` usa eixos locais da barra
- `add_panel_pressure(case, panel_numbers, pressure_kPa)` — kPa (= kN/m²), normal ao painel
- `list_load_cases()`
- `create_combination(name, components={case: factor}, combo_type)` — `uls|sls|accidental`

**Análise**
- `run_analysis(analysis_type="static", timeout_s=120)` — bloqueia até o solver terminar
- `analysis_status()`

**Resultados (exigem `run_analysis` primeiro)**
- `get_node_reaction(node, case)` — em kN / kN·m
- `get_node_displacement(node, case)` — translações em m, rotações em rad
- `get_bar_forces(bar, case, n_points=5)` — N, Vy, Vz, Mt, My, Mz em kN/kN·m em estações relativas 0..1
- `get_panel_stresses(panel, case)` — σxx, σyy, σxy em MPa
- `max_results(case, quantity)` — `reaction_fz | displacement_uz | bar_axial | bar_moment_my`

**Visualização**
- `zoom_all()`, `set_view(view)` — `iso|top|front|side`
- `display_case(case)` — mostra carregamentos/resultados de um caso
- `screenshot(max_width?)` — PNG da janela do Robot

**Escape hatch**
- `send_raw_com(expression)` — Python com `robot/app/project/structure/labels/nodes/bars/objects/cases/results` em escopo. Use só se nenhuma tool cobrir.

## Workflows recomendados

1. **Ordem canônica de modelagem**: `new_project` → `create_material_*` → `create_section_*` (e/ou `create_panel_thickness_label`) → `create_support_label` → `create_nodes_batch` → `create_bars_batch` → `apply_support` → `create_load_case` → `add_*_load` → `run_analysis` → consulta de resultados.
2. **Batches sempre que possível**: criar 20 nós por `create_nodes_batch` é ordens de magnitude mais rápido que 20 `create_node`. COM round-trip é caro.
3. **Labels antes de atribuir**: seções, materiais, apoios e espessuras de painel são **labels**. Criar uma vez com nome; atribuir por nome em quantas barras/nós/painéis quiser.
4. **Depois de modelar**: `zoom_all()` + `screenshot()` pra conferência visual.
5. **Resultados só depois de rodar**: `get_*` dão erro se `analysis_status().calculated` for False.
6. **Painéis exigem malha**: após `create_panel`, o Robot gera malha FE ao rodar a análise. Tensões em painéis podem exigir solver de placas/shells.
7. **`clear_structure(confirm=True)` e `save_as` sobrescrevendo**: avise o usuário antes.

## Exemplos

- **"crie um pórtico 3D simples, 5x3m, com pilares IPE 300 e aço S355"**
  → `new_project("frame_3d")` → `create_material_from_database("S355","STEEL S355")` → `create_section_from_database("IPE 300")` → `create_nodes_batch([[0,0,0],[5,0,0],[5,0,3],[0,0,3]])` → `create_bars_batch([{"node_start":1,"node_end":4,"section":"IPE 300","material":"S355"}, ...])` → `create_support_label("fixed")` → `apply_support([1,2],"fixed")` → `screenshot()`

- **"adicione uma carga permanente de 10 kN/m nas vigas superiores"**
  → `create_load_case("DL","dead")` → `list_bars()` para identificar as superiores → `add_bar_uniform_load("DL", [3], pz=-10)`

- **"crie a combinação ELU 1.35·DL + 1.5·LL"**
  → `create_combination("ELU 1", {"DL":1.35, "LL":1.5}, combo_type="uls")`

- **"rode a análise e me dê a reação vertical máxima"**
  → `run_analysis()` → `max_results("DL", "reaction_fz")`

- **"adicione uma laje de concreto C30 com 15 cm nos 4 nós do topo"**
  → `create_material_from_database("C30","CONCR C30/37")` → `create_panel_thickness_label("LAJE15", 0.15, "C30")` → `create_panel([3,4,7,8], thickness_name="LAJE15", material_name="C30")`

- **"mostra como está a estrutura"**
  → `zoom_all()` → `screenshot()`

## Erros comuns

- **"Robot não está rodando"** → peça pro usuário abrir o Robot 2026 com um projeto.
- **"Call was rejected by callee"** → diálogo modal aberto ou análise rodando; peça ao usuário pra fechar.
- **"Label 'X' não encontrado"** → a tool já lista os disponíveis no erro. Crie primeiro com `create_section_from_database`/`create_material_from_database`.
- **"O modelo não está calculado"** → `run_analysis()` precisa ser chamado antes de `get_node_reaction`/`get_bar_forces`/etc.
- **Número de nó/barra existe mas falha**: o Robot reusa números de elementos apagados; confirme com `list_nodes`/`list_bars`.
- **Enum desconhecido**: se alguma tool falhar com erro de constante, use `send_raw_com` com o nome correto (RobotOM 2026 pode diferir da v0.1 em raros casos).

