docs: implement Antigravity global rules
This commit is contained in:
@@ -1,144 +1,144 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Conversor AUTOMÁTICO de CSVs para JavaScript
|
||||
Lê TODAS as colunas automaticamente de cada CSV
|
||||
"""
|
||||
|
||||
import csv
|
||||
import json
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
# Lista de arquivos CSV para processar
|
||||
CSV_FILES = {
|
||||
'cantoneiras': 'BD/perfis/cantoneiras_brasil_completo.csv',
|
||||
'barras_redondas': 'BD/perfis/barras_brasil_completo.csv',
|
||||
'tubos_circulares': 'BD/perfis/tubos_circulares_brasil_completo.csv',
|
||||
'perfis_i': 'BD/perfis/perfis_i_brasil_completo.csv',
|
||||
'perfis_w': 'BD/perfis/perfis_w_brasil_completo.csv',
|
||||
'tubos_rhs': 'BD/perfis/tubos_rhs_brasil_completo.csv',
|
||||
'chapas': 'BD/perfis/chapas_brasil_completo.csv',
|
||||
'perfis_hp': 'BD/perfis/perfis_hp_brasil_completo.csv',
|
||||
'barras_roscadas': 'BD/perfis/barras_roscadas_brasil_completo.csv',
|
||||
'barras_chatas': 'BD/perfis/barras_chatas_brasil_completo.csv'
|
||||
}
|
||||
|
||||
def converter_valor(valor, coluna):
|
||||
"""Converte valor para o tipo correto"""
|
||||
valor = str(valor).strip().strip('"')
|
||||
|
||||
# Colunas numéricas
|
||||
if any(x in coluna for x in ['_mm', '_kg', '_cm', '_m2', '_mpa', '_pol']):
|
||||
try:
|
||||
return float(valor)
|
||||
except:
|
||||
return 0
|
||||
|
||||
return valor
|
||||
|
||||
def ler_csv_automatico(arquivo):
|
||||
"""Lê CSV automaticamente detectando todas as colunas"""
|
||||
dados = []
|
||||
|
||||
if not os.path.exists(arquivo):
|
||||
print(f"⚠️ Arquivo não encontrado: {arquivo}")
|
||||
return dados, []
|
||||
|
||||
try:
|
||||
with open(arquivo, 'r', encoding='utf-8') as f:
|
||||
reader = csv.DictReader(f)
|
||||
colunas = reader.fieldnames
|
||||
|
||||
for row in reader:
|
||||
item = {}
|
||||
for col in colunas:
|
||||
item[col] = converter_valor(row[col], col)
|
||||
dados.append(item)
|
||||
|
||||
print(f"✅ {arquivo}: {len(dados)} itens, {len(colunas)} colunas")
|
||||
return dados, colunas
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Erro ao ler {arquivo}: {e}")
|
||||
return dados, []
|
||||
|
||||
def gerar_javascript(dados_todos):
|
||||
"""Gera arquivo JavaScript com todos os dados"""
|
||||
|
||||
timestamp = datetime.now().timestamp()
|
||||
|
||||
js_content = f'''/**
|
||||
* BANCO DE DADOS COMPLETO - Todos os Perfis
|
||||
* Dados embutidos em JavaScript para funcionamento autônomo
|
||||
* Gerado automaticamente a partir dos CSVs
|
||||
*
|
||||
* @version 2.0.0
|
||||
* @date {timestamp}
|
||||
*/
|
||||
|
||||
const BANCO_DADOS_PERFIS = {json.dumps(dados_todos, indent=2, ensure_ascii=False)};
|
||||
|
||||
// Exportar para uso global
|
||||
if (typeof window !== 'undefined') {{
|
||||
window.BANCO_DADOS_PERFIS = BANCO_DADOS_PERFIS;
|
||||
}}
|
||||
|
||||
console.log('✅ Banco de dados carregado:', Object.keys(BANCO_DADOS_PERFIS).length, 'tipos');
|
||||
'''
|
||||
|
||||
return js_content
|
||||
|
||||
def main():
|
||||
print("╔════════════════════════════════════════════════════════════╗")
|
||||
print("║ Conversor AUTOMÁTICO de CSVs para JavaScript ║")
|
||||
print("╠════════════════════════════════════════════════════════════╣")
|
||||
print("║ Lê TODAS as colunas automaticamente de cada CSV ║")
|
||||
print("╚════════════════════════════════════════════════════════════╝")
|
||||
print()
|
||||
|
||||
dados_todos = {}
|
||||
total_itens = 0
|
||||
|
||||
for tipo, arquivo in CSV_FILES.items():
|
||||
print(f"📊 Processando {tipo}...")
|
||||
dados, colunas = ler_csv_automatico(arquivo)
|
||||
|
||||
if dados:
|
||||
dados_todos[tipo] = dados
|
||||
total_itens += len(dados)
|
||||
print(f" Colunas: {', '.join(colunas[:5])}...")
|
||||
print()
|
||||
|
||||
if not dados_todos:
|
||||
print("❌ Nenhum dado foi processado!")
|
||||
return
|
||||
|
||||
print("🔧 Gerando arquivo JavaScript...")
|
||||
js_content = gerar_javascript(dados_todos)
|
||||
|
||||
# Salvar arquivo
|
||||
output_file = 'js/database/banco-dados-completo.js'
|
||||
os.makedirs(os.path.dirname(output_file), exist_ok=True)
|
||||
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(js_content)
|
||||
|
||||
file_size = os.path.getsize(output_file)
|
||||
|
||||
print(f"✅ Arquivo gerado: {output_file}")
|
||||
print(f"📊 Total de itens: {total_itens}")
|
||||
print(f"📁 Tamanho: {file_size} bytes (~{file_size//1024}KB)")
|
||||
print()
|
||||
print("╔════════════════════════════════════════════════════════════╗")
|
||||
print("║ ✅ CONVERSÃO CONCLUÍDA ║")
|
||||
print("╠════════════════════════════════════════════════════════════╣")
|
||||
print(f"║ Arquivo gerado: {output_file:40s} ║")
|
||||
print("║ ║")
|
||||
print("║ Próximos passos: ║")
|
||||
print("║ 1. Testar aplicação ║")
|
||||
print("║ 2. Verificar carregamento dos dados ║")
|
||||
print("║ 3. Fazer deploy ║")
|
||||
print("╚════════════════════════════════════════════════════════════╝")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Conversor AUTOMÁTICO de CSVs para JavaScript
|
||||
Lê TODAS as colunas automaticamente de cada CSV
|
||||
"""
|
||||
|
||||
import csv
|
||||
import json
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
# Lista de arquivos CSV para processar
|
||||
CSV_FILES = {
|
||||
'cantoneiras': 'BD/perfis/cantoneiras_brasil_completo.csv',
|
||||
'barras_redondas': 'BD/perfis/barras_brasil_completo.csv',
|
||||
'tubos_circulares': 'BD/perfis/tubos_circulares_brasil_completo.csv',
|
||||
'perfis_i': 'BD/perfis/perfis_i_brasil_completo.csv',
|
||||
'perfis_w': 'BD/perfis/perfis_w_brasil_completo.csv',
|
||||
'tubos_rhs': 'BD/perfis/tubos_rhs_brasil_completo.csv',
|
||||
'chapas': 'BD/perfis/chapas_brasil_completo.csv',
|
||||
'perfis_hp': 'BD/perfis/perfis_hp_brasil_completo.csv',
|
||||
'barras_roscadas': 'BD/perfis/barras_roscadas_brasil_completo.csv',
|
||||
'barras_chatas': 'BD/perfis/barras_chatas_brasil_completo.csv'
|
||||
}
|
||||
|
||||
def converter_valor(valor, coluna):
|
||||
"""Converte valor para o tipo correto"""
|
||||
valor = str(valor).strip().strip('"')
|
||||
|
||||
# Colunas numéricas
|
||||
if any(x in coluna for x in ['_mm', '_kg', '_cm', '_m2', '_mpa', '_pol']):
|
||||
try:
|
||||
return float(valor)
|
||||
except:
|
||||
return 0
|
||||
|
||||
return valor
|
||||
|
||||
def ler_csv_automatico(arquivo):
|
||||
"""Lê CSV automaticamente detectando todas as colunas"""
|
||||
dados = []
|
||||
|
||||
if not os.path.exists(arquivo):
|
||||
print(f"⚠️ Arquivo não encontrado: {arquivo}")
|
||||
return dados, []
|
||||
|
||||
try:
|
||||
with open(arquivo, 'r', encoding='utf-8') as f:
|
||||
reader = csv.DictReader(f)
|
||||
colunas = reader.fieldnames
|
||||
|
||||
for row in reader:
|
||||
item = {}
|
||||
for col in colunas:
|
||||
item[col] = converter_valor(row[col], col)
|
||||
dados.append(item)
|
||||
|
||||
print(f"✅ {arquivo}: {len(dados)} itens, {len(colunas)} colunas")
|
||||
return dados, colunas
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Erro ao ler {arquivo}: {e}")
|
||||
return dados, []
|
||||
|
||||
def gerar_javascript(dados_todos):
|
||||
"""Gera arquivo JavaScript com todos os dados"""
|
||||
|
||||
timestamp = datetime.now().timestamp()
|
||||
|
||||
js_content = f'''/**
|
||||
* BANCO DE DADOS COMPLETO - Todos os Perfis
|
||||
* Dados embutidos em JavaScript para funcionamento autônomo
|
||||
* Gerado automaticamente a partir dos CSVs
|
||||
*
|
||||
* @version 2.0.0
|
||||
* @date {timestamp}
|
||||
*/
|
||||
|
||||
const BANCO_DADOS_PERFIS = {json.dumps(dados_todos, indent=2, ensure_ascii=False)};
|
||||
|
||||
// Exportar para uso global
|
||||
if (typeof window !== 'undefined') {{
|
||||
window.BANCO_DADOS_PERFIS = BANCO_DADOS_PERFIS;
|
||||
}}
|
||||
|
||||
console.log('✅ Banco de dados carregado:', Object.keys(BANCO_DADOS_PERFIS).length, 'tipos');
|
||||
'''
|
||||
|
||||
return js_content
|
||||
|
||||
def main():
|
||||
print("╔════════════════════════════════════════════════════════════╗")
|
||||
print("║ Conversor AUTOMÁTICO de CSVs para JavaScript ║")
|
||||
print("╠════════════════════════════════════════════════════════════╣")
|
||||
print("║ Lê TODAS as colunas automaticamente de cada CSV ║")
|
||||
print("╚════════════════════════════════════════════════════════════╝")
|
||||
print()
|
||||
|
||||
dados_todos = {}
|
||||
total_itens = 0
|
||||
|
||||
for tipo, arquivo in CSV_FILES.items():
|
||||
print(f"📊 Processando {tipo}...")
|
||||
dados, colunas = ler_csv_automatico(arquivo)
|
||||
|
||||
if dados:
|
||||
dados_todos[tipo] = dados
|
||||
total_itens += len(dados)
|
||||
print(f" Colunas: {', '.join(colunas[:5])}...")
|
||||
print()
|
||||
|
||||
if not dados_todos:
|
||||
print("❌ Nenhum dado foi processado!")
|
||||
return
|
||||
|
||||
print("🔧 Gerando arquivo JavaScript...")
|
||||
js_content = gerar_javascript(dados_todos)
|
||||
|
||||
# Salvar arquivo
|
||||
output_file = 'js/database/banco-dados-completo.js'
|
||||
os.makedirs(os.path.dirname(output_file), exist_ok=True)
|
||||
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(js_content)
|
||||
|
||||
file_size = os.path.getsize(output_file)
|
||||
|
||||
print(f"✅ Arquivo gerado: {output_file}")
|
||||
print(f"📊 Total de itens: {total_itens}")
|
||||
print(f"📁 Tamanho: {file_size} bytes (~{file_size//1024}KB)")
|
||||
print()
|
||||
print("╔════════════════════════════════════════════════════════════╗")
|
||||
print("║ ✅ CONVERSÃO CONCLUÍDA ║")
|
||||
print("╠════════════════════════════════════════════════════════════╣")
|
||||
print(f"║ Arquivo gerado: {output_file:40s} ║")
|
||||
print("║ ║")
|
||||
print("║ Próximos passos: ║")
|
||||
print("║ 1. Testar aplicação ║")
|
||||
print("║ 2. Verificar carregamento dos dados ║")
|
||||
print("║ 3. Fazer deploy ║")
|
||||
print("╚════════════════════════════════════════════════════════════╝")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
@@ -1,172 +1,172 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Conversor de CSVs para JavaScript
|
||||
Converte todos os CSVs da pasta BD/perfis/ em um arquivo JavaScript
|
||||
"""
|
||||
|
||||
import csv
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# Configuração dos arquivos CSV
|
||||
CSV_CONFIG = {
|
||||
'cantoneiras': {
|
||||
'arquivo': 'BD/perfis/cantoneiras_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'lado_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'momento_inercia_cm4', 'raio_giracao_cm', 'tipo']
|
||||
},
|
||||
'barras_redondas': {
|
||||
'arquivo': 'BD/perfis/barras_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'diametro_mm', 'peso_kg_m', 'area_cm2', 'momento_inercia_cm4', 'raio_giracao_cm', 'aplicacao', 'tipo']
|
||||
},
|
||||
'tubos_circulares': {
|
||||
'arquivo': 'BD/perfis/tubos_circulares_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'diametro_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'momento_inercia_cm4', 'raio_giracao_cm', 'aplicacao', 'tipo']
|
||||
},
|
||||
'perfis_i': {
|
||||
'arquivo': 'BD/perfis/perfis_i_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'altura_mm', 'largura_mm', 'espessura_alma_mm', 'espessura_mesa_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
},
|
||||
'perfis_w': {
|
||||
'arquivo': 'BD/perfis/perfis_w_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'altura_mm', 'largura_mm', 'espessura_alma_mm', 'espessura_mesa_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
},
|
||||
'tubos_rhs': {
|
||||
'arquivo': 'BD/perfis/tubos_rhs_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'largura_mm', 'altura_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
},
|
||||
'chapas': {
|
||||
'arquivo': 'BD/perfis/chapas_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'espessura_mm', 'peso_kg_m2', 'tipo']
|
||||
},
|
||||
'perfis_hp': {
|
||||
'arquivo': 'BD/perfis/perfis_hp_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'altura_mm', 'largura_mm', 'espessura_alma_mm', 'espessura_mesa_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
},
|
||||
'barras_roscadas': {
|
||||
'arquivo': 'BD/perfis/barras_roscadas_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'diametro_mm', 'passo_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
},
|
||||
'barras_chatas': {
|
||||
'arquivo': 'BD/perfis/barras_chatas_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'largura_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
}
|
||||
}
|
||||
|
||||
def converter_valor(valor, coluna):
|
||||
"""Converte valor para o tipo correto"""
|
||||
valor = valor.strip().strip('"')
|
||||
|
||||
# Colunas numéricas
|
||||
if any(x in coluna for x in ['_mm', '_kg', '_cm', '_m2']):
|
||||
try:
|
||||
return float(valor)
|
||||
except:
|
||||
return 0
|
||||
|
||||
return valor
|
||||
|
||||
def ler_csv(arquivo, colunas):
|
||||
"""Lê um arquivo CSV e retorna lista de dicionários"""
|
||||
dados = []
|
||||
|
||||
if not os.path.exists(arquivo):
|
||||
print(f"⚠️ Arquivo não encontrado: {arquivo}")
|
||||
return dados
|
||||
|
||||
try:
|
||||
with open(arquivo, 'r', encoding='utf-8') as f:
|
||||
reader = csv.DictReader(f)
|
||||
for row in reader:
|
||||
item = {}
|
||||
for col in colunas:
|
||||
if col in row:
|
||||
item[col] = converter_valor(row[col], col)
|
||||
else:
|
||||
item[col] = ''
|
||||
dados.append(item)
|
||||
|
||||
print(f"✅ {arquivo}: {len(dados)} itens")
|
||||
return dados
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Erro ao ler {arquivo}: {e}")
|
||||
return dados
|
||||
|
||||
def gerar_javascript(dados_todos):
|
||||
"""Gera arquivo JavaScript com todos os dados"""
|
||||
|
||||
js_content = '''/**
|
||||
* BANCO DE DADOS COMPLETO - Todos os Perfis
|
||||
* Dados embutidos em JavaScript para funcionamento autônomo
|
||||
* Gerado automaticamente a partir dos CSVs
|
||||
*
|
||||
* @version 1.0.0
|
||||
* @date ''' + str(Path(__file__).stat().st_mtime) + '''
|
||||
*/
|
||||
|
||||
const BANCO_DADOS_PERFIS = '''
|
||||
|
||||
js_content += json.dumps(dados_todos, indent=2, ensure_ascii=False)
|
||||
|
||||
js_content += ''';
|
||||
|
||||
// Exportar para uso global
|
||||
window.BANCO_DADOS_PERFIS = BANCO_DADOS_PERFIS;
|
||||
|
||||
console.log('✅ Banco de dados completo carregado');
|
||||
console.log('📊 Tipos disponíveis:', Object.keys(BANCO_DADOS_PERFIS));
|
||||
Object.entries(BANCO_DADOS_PERFIS).forEach(([tipo, dados]) => {
|
||||
console.log(` - ${tipo}: ${dados.length} itens`);
|
||||
});
|
||||
'''
|
||||
|
||||
return js_content
|
||||
|
||||
def main():
|
||||
print("""
|
||||
╔════════════════════════════════════════════════════════════╗
|
||||
║ Conversor de CSVs para JavaScript ║
|
||||
╠════════════════════════════════════════════════════════════╣
|
||||
║ Converte todos os CSVs em um arquivo JavaScript único ║
|
||||
╚════════════════════════════════════════════════════════════╝
|
||||
""")
|
||||
|
||||
dados_todos = {}
|
||||
total_itens = 0
|
||||
|
||||
# Processar cada CSV
|
||||
for tipo, config in CSV_CONFIG.items():
|
||||
print(f"\n📊 Processando {tipo}...")
|
||||
dados = ler_csv(config['arquivo'], config['colunas'])
|
||||
dados_todos[tipo] = dados
|
||||
total_itens += len(dados)
|
||||
|
||||
# Gerar arquivo JavaScript
|
||||
print(f"\n🔧 Gerando arquivo JavaScript...")
|
||||
js_content = gerar_javascript(dados_todos)
|
||||
|
||||
# Salvar arquivo
|
||||
output_file = 'js/database/banco-dados-completo.js'
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(js_content)
|
||||
|
||||
print(f"\n✅ Arquivo gerado: {output_file}")
|
||||
print(f"📊 Total de itens: {total_itens}")
|
||||
print(f"📁 Tamanho: {len(js_content)} bytes (~{len(js_content)//1024}KB)")
|
||||
|
||||
print("""
|
||||
╔════════════════════════════════════════════════════════════╗
|
||||
║ ✅ CONVERSÃO CONCLUÍDA ║
|
||||
╠════════════════════════════════════════════════════════════╣
|
||||
║ Arquivo gerado: js/database/banco-dados-completo.js ║
|
||||
║ ║
|
||||
║ Próximos passos: ║
|
||||
║ 1. Adicionar script no index.html ║
|
||||
║ 2. Testar aplicação ║
|
||||
║ 3. Fazer deploy ║
|
||||
╚════════════════════════════════════════════════════════════╝
|
||||
""")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Conversor de CSVs para JavaScript
|
||||
Converte todos os CSVs da pasta BD/perfis/ em um arquivo JavaScript
|
||||
"""
|
||||
|
||||
import csv
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# Configuração dos arquivos CSV
|
||||
CSV_CONFIG = {
|
||||
'cantoneiras': {
|
||||
'arquivo': 'BD/perfis/cantoneiras_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'lado_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'momento_inercia_cm4', 'raio_giracao_cm', 'tipo']
|
||||
},
|
||||
'barras_redondas': {
|
||||
'arquivo': 'BD/perfis/barras_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'diametro_mm', 'peso_kg_m', 'area_cm2', 'momento_inercia_cm4', 'raio_giracao_cm', 'aplicacao', 'tipo']
|
||||
},
|
||||
'tubos_circulares': {
|
||||
'arquivo': 'BD/perfis/tubos_circulares_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'diametro_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'momento_inercia_cm4', 'raio_giracao_cm', 'aplicacao', 'tipo']
|
||||
},
|
||||
'perfis_i': {
|
||||
'arquivo': 'BD/perfis/perfis_i_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'altura_mm', 'largura_mm', 'espessura_alma_mm', 'espessura_mesa_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
},
|
||||
'perfis_w': {
|
||||
'arquivo': 'BD/perfis/perfis_w_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'altura_mm', 'largura_mm', 'espessura_alma_mm', 'espessura_mesa_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
},
|
||||
'tubos_rhs': {
|
||||
'arquivo': 'BD/perfis/tubos_rhs_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'largura_mm', 'altura_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
},
|
||||
'chapas': {
|
||||
'arquivo': 'BD/perfis/chapas_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'espessura_mm', 'peso_kg_m2', 'tipo']
|
||||
},
|
||||
'perfis_hp': {
|
||||
'arquivo': 'BD/perfis/perfis_hp_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'altura_mm', 'largura_mm', 'espessura_alma_mm', 'espessura_mesa_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
},
|
||||
'barras_roscadas': {
|
||||
'arquivo': 'BD/perfis/barras_roscadas_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'diametro_mm', 'passo_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
},
|
||||
'barras_chatas': {
|
||||
'arquivo': 'BD/perfis/barras_chatas_brasil_completo.csv',
|
||||
'colunas': ['id', 'nome', 'largura_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'tipo']
|
||||
}
|
||||
}
|
||||
|
||||
def converter_valor(valor, coluna):
|
||||
"""Converte valor para o tipo correto"""
|
||||
valor = valor.strip().strip('"')
|
||||
|
||||
# Colunas numéricas
|
||||
if any(x in coluna for x in ['_mm', '_kg', '_cm', '_m2']):
|
||||
try:
|
||||
return float(valor)
|
||||
except:
|
||||
return 0
|
||||
|
||||
return valor
|
||||
|
||||
def ler_csv(arquivo, colunas):
|
||||
"""Lê um arquivo CSV e retorna lista de dicionários"""
|
||||
dados = []
|
||||
|
||||
if not os.path.exists(arquivo):
|
||||
print(f"⚠️ Arquivo não encontrado: {arquivo}")
|
||||
return dados
|
||||
|
||||
try:
|
||||
with open(arquivo, 'r', encoding='utf-8') as f:
|
||||
reader = csv.DictReader(f)
|
||||
for row in reader:
|
||||
item = {}
|
||||
for col in colunas:
|
||||
if col in row:
|
||||
item[col] = converter_valor(row[col], col)
|
||||
else:
|
||||
item[col] = ''
|
||||
dados.append(item)
|
||||
|
||||
print(f"✅ {arquivo}: {len(dados)} itens")
|
||||
return dados
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Erro ao ler {arquivo}: {e}")
|
||||
return dados
|
||||
|
||||
def gerar_javascript(dados_todos):
|
||||
"""Gera arquivo JavaScript com todos os dados"""
|
||||
|
||||
js_content = '''/**
|
||||
* BANCO DE DADOS COMPLETO - Todos os Perfis
|
||||
* Dados embutidos em JavaScript para funcionamento autônomo
|
||||
* Gerado automaticamente a partir dos CSVs
|
||||
*
|
||||
* @version 1.0.0
|
||||
* @date ''' + str(Path(__file__).stat().st_mtime) + '''
|
||||
*/
|
||||
|
||||
const BANCO_DADOS_PERFIS = '''
|
||||
|
||||
js_content += json.dumps(dados_todos, indent=2, ensure_ascii=False)
|
||||
|
||||
js_content += ''';
|
||||
|
||||
// Exportar para uso global
|
||||
window.BANCO_DADOS_PERFIS = BANCO_DADOS_PERFIS;
|
||||
|
||||
console.log('✅ Banco de dados completo carregado');
|
||||
console.log('📊 Tipos disponíveis:', Object.keys(BANCO_DADOS_PERFIS));
|
||||
Object.entries(BANCO_DADOS_PERFIS).forEach(([tipo, dados]) => {
|
||||
console.log(` - ${tipo}: ${dados.length} itens`);
|
||||
});
|
||||
'''
|
||||
|
||||
return js_content
|
||||
|
||||
def main():
|
||||
print("""
|
||||
╔════════════════════════════════════════════════════════════╗
|
||||
║ Conversor de CSVs para JavaScript ║
|
||||
╠════════════════════════════════════════════════════════════╣
|
||||
║ Converte todos os CSVs em um arquivo JavaScript único ║
|
||||
╚════════════════════════════════════════════════════════════╝
|
||||
""")
|
||||
|
||||
dados_todos = {}
|
||||
total_itens = 0
|
||||
|
||||
# Processar cada CSV
|
||||
for tipo, config in CSV_CONFIG.items():
|
||||
print(f"\n📊 Processando {tipo}...")
|
||||
dados = ler_csv(config['arquivo'], config['colunas'])
|
||||
dados_todos[tipo] = dados
|
||||
total_itens += len(dados)
|
||||
|
||||
# Gerar arquivo JavaScript
|
||||
print(f"\n🔧 Gerando arquivo JavaScript...")
|
||||
js_content = gerar_javascript(dados_todos)
|
||||
|
||||
# Salvar arquivo
|
||||
output_file = 'js/database/banco-dados-completo.js'
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(js_content)
|
||||
|
||||
print(f"\n✅ Arquivo gerado: {output_file}")
|
||||
print(f"📊 Total de itens: {total_itens}")
|
||||
print(f"📁 Tamanho: {len(js_content)} bytes (~{len(js_content)//1024}KB)")
|
||||
|
||||
print("""
|
||||
╔════════════════════════════════════════════════════════════╗
|
||||
║ ✅ CONVERSÃO CONCLUÍDA ║
|
||||
╠════════════════════════════════════════════════════════════╣
|
||||
║ Arquivo gerado: js/database/banco-dados-completo.js ║
|
||||
║ ║
|
||||
║ Próximos passos: ║
|
||||
║ 1. Adicionar script no index.html ║
|
||||
║ 2. Testar aplicação ║
|
||||
║ 3. Fazer deploy ║
|
||||
╚════════════════════════════════════════════════════════════╝
|
||||
""")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
@echo off
|
||||
echo.
|
||||
echo ╔════════════════════════════════════════════════════════════╗
|
||||
echo ║ AÇO CALC PRO - Iniciando Servidor ║
|
||||
echo ╚════════════════════════════════════════════════════════════╝
|
||||
echo.
|
||||
|
||||
REM Verificar se Python está instalado
|
||||
python --version >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo ❌ Python não encontrado!
|
||||
echo.
|
||||
echo Por favor, instale Python 3:
|
||||
echo https://www.python.org/downloads/
|
||||
echo.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo ✅ Python encontrado
|
||||
echo.
|
||||
echo 🚀 Iniciando servidor...
|
||||
echo.
|
||||
|
||||
python server.py
|
||||
|
||||
pause
|
||||
@echo off
|
||||
echo.
|
||||
echo ╔════════════════════════════════════════════════════════════╗
|
||||
echo ║ AÇO CALC PRO - Iniciando Servidor ║
|
||||
echo ╚════════════════════════════════════════════════════════════╝
|
||||
echo.
|
||||
|
||||
REM Verificar se Python está instalado
|
||||
python --version >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo ❌ Python não encontrado!
|
||||
echo.
|
||||
echo Por favor, instale Python 3:
|
||||
echo https://www.python.org/downloads/
|
||||
echo.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo ✅ Python encontrado
|
||||
echo.
|
||||
echo 🚀 Iniciando servidor...
|
||||
echo.
|
||||
|
||||
python server.py
|
||||
|
||||
pause
|
||||
|
||||
@@ -1,66 +1,66 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Servidor HTTP simples para SteelBase
|
||||
Execute: python server.py
|
||||
Acesse: http://localhost:8000
|
||||
"""
|
||||
|
||||
import http.server
|
||||
import socketserver
|
||||
import os
|
||||
import webbrowser
|
||||
import threading
|
||||
|
||||
PORT = 8000
|
||||
|
||||
class MyHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
|
||||
def end_headers(self):
|
||||
# Adicionar headers CORS
|
||||
self.send_header('Access-Control-Allow-Origin', '*')
|
||||
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
|
||||
self.send_header('Access-Control-Allow-Headers', 'Content-Type')
|
||||
self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate')
|
||||
super().end_headers()
|
||||
|
||||
def do_GET(self):
|
||||
# Se acessar a raiz, redirecionar para index.html
|
||||
if self.path == '/':
|
||||
self.path = '/index.html'
|
||||
return super().do_GET()
|
||||
|
||||
def open_browser():
|
||||
"""Abre o navegador automaticamente após 1 segundo"""
|
||||
import time
|
||||
time.sleep(1)
|
||||
webbrowser.open(f'http://localhost:{PORT}/index.html')
|
||||
|
||||
if __name__ == '__main__':
|
||||
os.chdir(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
with socketserver.TCPServer(("", PORT), MyHTTPRequestHandler) as httpd:
|
||||
print(f"""
|
||||
╔════════════════════════════════════════════════════════════╗
|
||||
║ SteelBase - Servidor ║
|
||||
╠════════════════════════════════════════════════════════════╣
|
||||
║ ║
|
||||
║ ✅ Servidor iniciado com sucesso! ║
|
||||
║ ║
|
||||
║ 🌐 Acesse: http://localhost:{PORT}/index.html ║
|
||||
║ ║
|
||||
║ 📁 Servindo: {os.getcwd()[:45]}... ║
|
||||
║ ║
|
||||
║ 🚀 Abrindo navegador automaticamente... ║
|
||||
║ ║
|
||||
║ ⚠️ Pressione Ctrl+C para parar o servidor ║
|
||||
║ ║
|
||||
╚════════════════════════════════════════════════════════════╝
|
||||
""")
|
||||
|
||||
# Abrir navegador em thread separada
|
||||
threading.Thread(target=open_browser, daemon=True).start()
|
||||
|
||||
try:
|
||||
httpd.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
print("\n\n🛑 Servidor parado pelo usuário")
|
||||
print("✅ Até logo!")
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Servidor HTTP simples para SteelBase
|
||||
Execute: python server.py
|
||||
Acesse: http://localhost:8000
|
||||
"""
|
||||
|
||||
import http.server
|
||||
import socketserver
|
||||
import os
|
||||
import webbrowser
|
||||
import threading
|
||||
|
||||
PORT = 8000
|
||||
|
||||
class MyHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
|
||||
def end_headers(self):
|
||||
# Adicionar headers CORS
|
||||
self.send_header('Access-Control-Allow-Origin', '*')
|
||||
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
|
||||
self.send_header('Access-Control-Allow-Headers', 'Content-Type')
|
||||
self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate')
|
||||
super().end_headers()
|
||||
|
||||
def do_GET(self):
|
||||
# Se acessar a raiz, redirecionar para index.html
|
||||
if self.path == '/':
|
||||
self.path = '/index.html'
|
||||
return super().do_GET()
|
||||
|
||||
def open_browser():
|
||||
"""Abre o navegador automaticamente após 1 segundo"""
|
||||
import time
|
||||
time.sleep(1)
|
||||
webbrowser.open(f'http://localhost:{PORT}/index.html')
|
||||
|
||||
if __name__ == '__main__':
|
||||
os.chdir(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
with socketserver.TCPServer(("", PORT), MyHTTPRequestHandler) as httpd:
|
||||
print(f"""
|
||||
╔════════════════════════════════════════════════════════════╗
|
||||
║ SteelBase - Servidor ║
|
||||
╠════════════════════════════════════════════════════════════╣
|
||||
║ ║
|
||||
║ ✅ Servidor iniciado com sucesso! ║
|
||||
║ ║
|
||||
║ 🌐 Acesse: http://localhost:{PORT}/index.html ║
|
||||
║ ║
|
||||
║ 📁 Servindo: {os.getcwd()[:45]}... ║
|
||||
║ ║
|
||||
║ 🚀 Abrindo navegador automaticamente... ║
|
||||
║ ║
|
||||
║ ⚠️ Pressione Ctrl+C para parar o servidor ║
|
||||
║ ║
|
||||
╚════════════════════════════════════════════════════════════╝
|
||||
""")
|
||||
|
||||
# Abrir navegador em thread separada
|
||||
threading.Thread(target=open_browser, daemon=True).start()
|
||||
|
||||
try:
|
||||
httpd.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
print("\n\n🛑 Servidor parado pelo usuário")
|
||||
print("✅ Até logo!")
|
||||
|
||||
Reference in New Issue
Block a user