🚀 Auto-deploy: BrainWind atualizado em 26/08/2026 10:50:25
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
import React from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import Warehouse3DViewer from '../components/Warehouse3D';
|
||||
import Heatmap2D from '../components/Heatmap2D';
|
||||
import LinearLoadsTable from '../components/LinearLoadsTable';
|
||||
import SceneCapturePanel from '../components/SceneCapturePanel';
|
||||
import FtoolExportCard from '../components/FtoolExportCard';
|
||||
@@ -12,9 +14,9 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@
|
||||
import { Badge } from '@/components/ui/badge';
|
||||
import { Separator } from '@/components/ui/separator';
|
||||
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
|
||||
import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs';
|
||||
import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { AlertCircle, Lightbulb, Box, Wind } from 'lucide-react';
|
||||
import { AlertCircle, Lightbulb, Box, Wind, Columns } from 'lucide-react';
|
||||
import ExportMenu from '../components/ExportMenu';
|
||||
import { EducationalManual } from '@/components/EducationalManual';
|
||||
import { PressureLegend } from '@/components/PressureLegend';
|
||||
@@ -65,18 +67,25 @@ const GalpaoModule: React.FC = () => {
|
||||
return (
|
||||
<div className="flex flex-col lg:flex-row h-full w-full gap-4 p-4 lg:p-6 bg-muted/30">
|
||||
{/* Coluna Esquerda: Controles */}
|
||||
<div className="w-full lg:w-80 shrink-0 flex flex-col gap-4 overflow-y-auto pb-8 lg:pb-0">
|
||||
<Card className="shadow-sm border-border">
|
||||
<CardHeader className="pb-3 flex flex-row items-start justify-between space-y-0 pr-6">
|
||||
<div>
|
||||
<CardTitle className="text-lg">Geometria</CardTitle>
|
||||
<CardDescription>Tabelas 4 e 5 — NBR 6123.</CardDescription>
|
||||
</div>
|
||||
<SaveModuleDialog
|
||||
moduleType="galpao"
|
||||
inputs={{ width, length, height, roofPitch }}
|
||||
/>
|
||||
</CardHeader>
|
||||
<div className="w-full lg:w-96 shrink-0 flex flex-col gap-4 overflow-y-auto pb-8 lg:pb-0">
|
||||
<Tabs defaultValue="geometria" className="w-full">
|
||||
<TabsList className="grid w-full grid-cols-2 mb-4">
|
||||
<TabsTrigger value="geometria">1. Geometria</TabsTrigger>
|
||||
<TabsTrigger value="permeabilidade">2. Permeabilidade</TabsTrigger>
|
||||
</TabsList>
|
||||
|
||||
<TabsContent value="geometria" className="space-y-4 m-0">
|
||||
<Card className="shadow-sm border-border">
|
||||
<CardHeader className="pb-3 flex flex-row items-start justify-between space-y-0 pr-6">
|
||||
<div>
|
||||
<CardTitle className="text-lg">Geometria e Vento</CardTitle>
|
||||
<CardDescription>Tabelas 4 e 5 — NBR 6123.</CardDescription>
|
||||
</div>
|
||||
<SaveModuleDialog
|
||||
moduleType="galpao"
|
||||
inputs={{ width, length, height, roofPitch }}
|
||||
/>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-6">
|
||||
<WindParametersSummary />
|
||||
|
||||
@@ -98,7 +107,7 @@ const GalpaoModule: React.FC = () => {
|
||||
<div className="flex gap-2">
|
||||
<AlertCircle className="w-4 h-4 text-amber-500 shrink-0 mt-0.5" />
|
||||
<p className="text-xs text-amber-600 dark:text-amber-400">
|
||||
A platibanda bloqueia o fluxo. Calcule os esforços sobre ela no módulo de <b>Muros/Placas</b>.
|
||||
A platibanda bloqueia o fluxo. Calcule os esforços nela no módulo de <b>Muros/Placas</b>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -243,55 +252,83 @@ const GalpaoModule: React.FC = () => {
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<CpiSettingsCard />
|
||||
</TabsContent>
|
||||
|
||||
<TabsContent value="permeabilidade" className="space-y-4 m-0">
|
||||
<CpiSettingsCard />
|
||||
</TabsContent>
|
||||
</Tabs>
|
||||
</div>
|
||||
|
||||
{/* Coluna Direita: Viewer 3D */}
|
||||
{/* Coluna Central: Viewer 3D e Heatmap (Tab) */}
|
||||
<div className="flex-1 flex flex-col min-h-[500px] lg:min-h-0 bg-background rounded-xl border border-border shadow-sm overflow-hidden relative">
|
||||
<div className="absolute top-4 left-4 right-4 z-10 flex flex-col sm:flex-row sm:justify-between gap-3 pointer-events-none">
|
||||
<div className="flex flex-wrap gap-2 pointer-events-auto">
|
||||
<Badge variant="secondary" className="bg-background/80 backdrop-blur-sm border-muted-foreground/20 text-foreground shadow-sm">
|
||||
Vento a {windAngle}°
|
||||
</Badge>
|
||||
<Badge variant="outline" className="bg-background/80 backdrop-blur-sm">
|
||||
Cpi = {cpi.toFixed(2)}
|
||||
</Badge>
|
||||
<Badge variant="outline" className="bg-background/80 backdrop-blur-sm">
|
||||
q = {q.toFixed(3)} kN/m²
|
||||
</Badge>
|
||||
</div>
|
||||
<div className="flex bg-background/80 backdrop-blur-sm rounded-md p-1 shadow-sm border border-border pointer-events-auto ml-auto">
|
||||
<Button
|
||||
variant={viewMode === 'solid' ? 'secondary' : 'ghost'}
|
||||
size="sm"
|
||||
className="h-7 px-3 text-xs"
|
||||
onClick={() => setViewMode('solid')}
|
||||
>
|
||||
<Box className="w-3.5 h-3.5 mr-1.5" />
|
||||
Sólido
|
||||
</Button>
|
||||
<Button
|
||||
variant={viewMode === 'airflow' ? 'secondary' : 'ghost'}
|
||||
size="sm"
|
||||
className="h-7 px-3 text-xs"
|
||||
onClick={() => setViewMode('airflow')}
|
||||
>
|
||||
<Wind className="w-3.5 h-3.5 mr-1.5" />
|
||||
Fluxo
|
||||
</Button>
|
||||
<Tabs defaultValue="3d" className="w-full h-full flex flex-col">
|
||||
<div className="absolute top-4 left-4 right-4 z-10 flex flex-col sm:flex-row sm:justify-between gap-3 pointer-events-none">
|
||||
<div className="flex flex-wrap gap-2 pointer-events-auto">
|
||||
<Badge variant="secondary" className="bg-background/80 backdrop-blur-sm border-muted-foreground/20 text-foreground shadow-sm">
|
||||
Vento a {windAngle}°
|
||||
</Badge>
|
||||
<Badge variant="outline" className="bg-background/80 backdrop-blur-sm">
|
||||
Cpi = {cpi.toFixed(2)}
|
||||
</Badge>
|
||||
<Badge variant="outline" className="bg-background/80 backdrop-blur-sm">
|
||||
q = {q.toFixed(3)} kN/m²
|
||||
</Badge>
|
||||
</div>
|
||||
|
||||
<div className="flex pointer-events-auto bg-background/80 backdrop-blur-sm rounded-md p-1 shadow-sm border border-border">
|
||||
<TabsList className="h-7 px-1">
|
||||
<TabsTrigger value="3d" className="text-xs h-6 px-3">Modelo 3D</TabsTrigger>
|
||||
<TabsTrigger value="heatmap" className="text-xs h-6 px-3">Heatmap 2D</TabsTrigger>
|
||||
</TabsList>
|
||||
</div>
|
||||
|
||||
<div className="flex pointer-events-auto ml-1">
|
||||
<Button asChild size="sm" variant="outline" className="h-7 px-2 text-xs bg-background/80 backdrop-blur-sm border-border shadow-sm">
|
||||
<Link to="/compare">
|
||||
<Columns className="w-3.5 h-3.5 mr-1.5" />
|
||||
Modo A/B
|
||||
</Link>
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-wrap gap-2 pointer-events-auto justify-start sm:justify-end ml-auto">
|
||||
<EducationalManual type="warehouse" params={{ windAngle, cpi }} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-wrap gap-2 pointer-events-auto justify-start sm:justify-end">
|
||||
<EducationalManual type="warehouse" params={{ windAngle, cpi }} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<PressureLegend />
|
||||
|
||||
<div className="w-full h-full cursor-grab active:cursor-grabbing bg-muted/20">
|
||||
<Warehouse3DViewer />
|
||||
</div>
|
||||
<TabsContent value="3d" className="flex-1 m-0 h-full w-full relative">
|
||||
<div className="absolute top-4 left-4 z-20 flex bg-background/80 backdrop-blur-sm rounded-md p-1 shadow-sm border border-border pointer-events-auto">
|
||||
<Button
|
||||
variant={viewMode === 'solid' ? 'secondary' : 'ghost'}
|
||||
size="sm"
|
||||
className="h-7 px-3 text-xs"
|
||||
onClick={() => setViewMode('solid')}
|
||||
>
|
||||
<Box className="w-3.5 h-3.5 mr-1.5" />
|
||||
Sólido
|
||||
</Button>
|
||||
<Button
|
||||
variant={viewMode === 'airflow' ? 'secondary' : 'ghost'}
|
||||
size="sm"
|
||||
className="h-7 px-3 text-xs"
|
||||
onClick={() => setViewMode('airflow')}
|
||||
>
|
||||
<Wind className="w-3.5 h-3.5 mr-1.5" />
|
||||
Fluxo
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
<PressureLegend />
|
||||
<div className="w-full h-full cursor-grab active:cursor-grabbing bg-muted/20">
|
||||
<Warehouse3DViewer />
|
||||
</div>
|
||||
</TabsContent>
|
||||
|
||||
<TabsContent value="heatmap" className="flex-1 m-0 h-full w-full bg-muted/10 overflow-auto flex items-center justify-center">
|
||||
<Heatmap2D />
|
||||
</TabsContent>
|
||||
</Tabs>
|
||||
</div>
|
||||
|
||||
{/* Coluna Direita-Inferior: Cargas Lineares (M9.2) */}
|
||||
|
||||
Reference in New Issue
Block a user