Skip to content

Instantly share code, notes, and snippets.

@gustavorps
Created August 4, 2025 20:37
Show Gist options
  • Select an option

  • Save gustavorps/8ef0750c05f9f355ce1439d234f861f9 to your computer and use it in GitHub Desktop.

Select an option

Save gustavorps/8ef0750c05f9f355ce1439d234f861f9 to your computer and use it in GitHub Desktop.
import math
def analisar_viabilidade_icamento(dados_veiculo, dados_carga):
"""
Analisa a viabilidade de uma operação de içamento de carga para uma caçamba de pickup
usando um tripé pré-definido.
Args:
dados_veiculo (dict): Dicionário com as especificações do veículo.
dados_carga (dict): Dicionário com as especificações da carga.
Returns:
dict: Um dicionário contendo o resultado da análise de viabilidade e cálculos adicionais.
"""
# --- PARÂMETROS FIXOS DO EQUIPAMENTO (Baseado na Solução 2: Perfil de Aço U) ---
# Estes valores são baseados no projeto de engenharia do relatório anterior.
tripe = {
"capacidade_max_kg": 1000,
"altura_total_m": 3.0,
"raio_base_m": 1.5,
"comprimento_perna_m": 3.354,
"altura_util_gancho_m": 2.8, # Altura total - espaço para o cabeçote e gancho
"perfil_Iy_mm4": 302000, # Momento de Inércia mínimo (Iy) para o Perfil U 127x50
"material_E_MPa": 200000 # Módulo de Elasticidade do Aço ASTM A36
}
# --- INICIALIZAÇÃO DA ANÁLISE ---
analise = {
"viabilidade_geral": True,
"justificativas":
}
# --- CHECKLIST DE VIABILIDADE ---
# 1. Verificação de Capacidade de Carga do Tripé
if dados_carga["peso_kg"] > tripe["capacidade_max_kg"]:
analise["viabilidade_geral"] = False
analise["justificativas"].append(f"[FALHA] Peso da carga ({dados_carga['peso_kg']} kg) excede a capacidade do tripé ({tripe['capacidade_max_kg']} kg).")
else:
analise["justificativas"].append(f"[OK] Peso da carga ({dados_carga['peso_kg']} kg) é compatível com a capacidade do tripé ({tripe['capacidade_max_kg']} kg).")
# 2. Verificação de Capacidade de Carga do Veículo
if dados_carga["peso_kg"] > dados_veiculo["capacidade_carga_kg"]:
analise["viabilidade_geral"] = False
analise["justificativas"].append(f"[FALHA] Peso da carga ({dados_carga['peso_kg']} kg) excede a capacidade da pickup ({dados_veiculo['capacidade_carga_kg']} kg).")
else:
analise["justificativas"].append(f"[OK] Peso da carga ({dados_carga['peso_kg']} kg) é compatível com a capacidade da pickup ({dados_veiculo['capacidade_carga_kg']} kg).")
# 3. Verificação de Dimensões (Carga vs. Caçamba)
# Verifica se a carga cabe na caçamba em qualquer orientação (comprimento x largura ou largura x comprimento)
cargo_c = dados_carga["comprimento_m"]
cargo_l = dados_carga["largura_m"]
cacamba_c = dados_veiculo["cacamba_comprimento_m"]
cacamba_l = dados_veiculo["cacamba_largura_m"]
if not ((cargo_c <= cacamba_c and cargo_l <= cacamba_l) or \
(cargo_l <= cacamba_c and cargo_c <= cacamba_l)):
analise["viabilidade_geral"] = False
analise["justificativas"].append(f"[FALHA] Dimensões da carga ({cargo_c}m x {cargo_l}m) não cabem na caçamba ({cacamba_c}m x {cacamba_l}m).")
else:
analise["justificativas"].append(f"[OK] Dimensões da carga são compatíveis com o espaço da caçamba.")
# 4. Verificação Geométrica de Elevação (Altura)
if tripe["altura_util_gancho_m"] <= dados_veiculo["altura_piso_cacamba_m"]:
analise["viabilidade_geral"] = False
analise["justificativas"].append(f"[FALHA] Altura útil do gancho do tripé ({tripe['altura_util_gancho_m']}m) é insuficiente para superar a altura da caçamba ({dados_veiculo['altura_piso_cacamba_m']}m).")
else:
analise["justificativas"].append(f"[OK] Tripé possui altura suficiente para elevar a carga acima da caçamba.")
# 5. Verificação Geométrica de Posicionamento (Espaço Interno do Tripé)
# Calcula o raio da carga (distância do centro ao canto mais distante)
raio_carga_m = math.sqrt((dados_carga["comprimento_m"] / 2)**2 + (dados_carga["largura_m"] / 2)**2)
# Calcula o raio interno disponível do tripé na altura da caçamba
h_cacamba = dados_veiculo["altura_piso_cacamba_m"]
H_tripe = tripe["altura_total_m"]
R_base = tripe["raio_base_m"]
raio_disponivel_na_altura_cacamba = R_base * (H_tripe - h_cacamba) / H_tripe
if raio_carga_m >= raio_disponivel_na_altura_cacamba:
analise["viabilidade_geral"] = False
analise["justificativas"].append(f"[FALHA] A carga é muito larga (raio de {raio_carga_m:.2f}m) para passar entre as pernas do tripé na altura da caçamba (espaço de {raio_disponivel_na_altura_cacamba:.2f}m).")
else:
analise["justificativas"].append(f"[OK] A carga passa com segurança entre as pernas do tripé para ser posicionada na caçamba.")
# --- CÁLCULOS ADICIONAIS ---
# 1. Cálculo da Altura Máxima de Elevação da Carga
# Limitado pela altura do gancho ou pela geometria (quando a carga toca as pernas)
h_max_geometrica = H_tripe * (1 - raio_carga_m / R_base)
altura_maxima_elevacao = min(tripe["altura_util_gancho_m"], h_max_geometrica)
limitante = "altura do gancho" if altura_maxima_elevacao == tripe["altura_util_gancho_m"] else "geometria da carga (risco de colisão com as pernas)"
analise["altura_max_elevacao"] = f"{altura_maxima_elevacao:.2f} metros (limitado pela: {limitante})"
# 2. Cálculo da Abertura Máxima (Ângulo) Segura do Tripé
# Baseado na carga crítica de flambagem do perfil de aço
P_critica_N = (math.pi**2 * tripe["material_E_MPa"] * tripe["perfil_Iy_mm4"]) / (tripe["comprimento_perna_m"] * 1000)**2
# Força de projeto (Carga de trabalho * Fator de Segurança)
P_projeto_N = tripe["capacidade_max_kg"] * 9.81 * 4.0 # FS = 4.0
# A força de compressão na perna é C = P_projeto / (3 * cos(theta))
# Para segurança, C <= P_critica. Logo, cos(theta) >= P_projeto / (3 * P_critica)
if (3 * P_critica_N) > P_projeto_N:
cos_theta_min = P_projeto_N / (3 * P_critica_N)
theta_max_rad = math.acos(cos_theta_min)
theta_max_graus = math.degrees(theta_max_rad)
analise["abertura_max_graus"] = f"{theta_max_graus:.2f} graus (com a vertical)"
else:
analise["abertura_max_graus"] = "Inviável. A força de projeto excede a resistência à flambagem mesmo a 0 graus."
return analise
# --- DADOS DE ENTRADA PARA SIMULAÇÃO ---
# Altere estes valores para testar diferentes cenários
# Cenário 1: Operação Viável
veiculo_exemplo_1 = {
"modelo": "Pickup Média",
"capacidade_carga_kg": 1100,
"cacamba_comprimento_m": 1.5,
"cacamba_largura_m": 1.2,
"altura_piso_cacamba_m": 0.9
}
carga_exemplo_1 = {
"descricao": "Motor Industrial Pequeno",
"peso_kg": 750,
"comprimento_m": 1.0,
"largura_m": 0.8,
"altura_m": 0.9
}
# Cenário 2: Operação Não Viável (Carga muito pesada e larga)
veiculo_exemplo_2 = veiculo_exemplo_1
carga_exemplo_2 = {
"descricao": "Gerador Grande",
"peso_kg": 1200,
"comprimento_m": 1.4,
"largura_m": 1.4,
"altura_m": 1.1
}
# --- EXECUÇÃO E APRESENTAÇÃO DOS RESULTADOS ---
def imprimir_relatorio(cenario_nome, veiculo, carga):
resultado = analisar_viabilidade_icamento(veiculo, carga)
print("\n" + "="*60)
print(f"RELATÓRIO DE ANÁLISE DE IÇAMENTO - {cenario_nome.upper()}")
print("="*60)
print("\n--- PARÂMETROS DE ENTRADA ---")
print(f"Veículo: {veiculo['modelo']}")
print(f" - Capacidade: {veiculo['capacidade_carga_kg']} kg")
print(f" - Caçamba: {veiculo['cacamba_comprimento_m']}m x {veiculo['cacamba_largura_m']}m")
print(f" - Altura da Caçamba: {veiculo['altura_piso_cacamba_m']}m")
print(f"Carga: {carga['descricao']}")
print(f" - Peso: {carga['peso_kg']} kg")
print(f" - Dimensões: {carga['comprimento_m']}m x {carga['largura_m']}m x {carga['altura_m']}m")
print("\n--- RESULTADO DA ANÁLISE ---")
status = "VIÁVEL" if resultado["viabilidade_geral"] else "NÃO VIÁVEL"
print(f"Status Geral da Operação: {status}")
print("\n--- DETALHAMENTO (ENUMERADORES DE VIABILIDADE) ---")
for justificativa in resultado["justificativas"]:
print(f" - {justificativa}")
print("\n--- CÁLCULOS ADICIONAIS DE ENGENHARIA ---")
print(f"1. Altura Máxima Possível para Elevar a Carga: {resultado['altura_max_elevacao']}")
print(f"2. Abertura Máxima Segura do Tripé (Ângulo por Perna): {resultado['abertura_max_graus']}")
print("="*60)
# Executa e imprime os relatórios para os dois cenários
imprimir_relatorio("Cenário 1: Operação Viável", veiculo_exemplo_1, carga_exemplo_1)
imprimir_relatorio("Cenário 2: Operação Não Viável", veiculo_exemplo_2, carga_exemplo_2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment