Skip to content
Merged
9 changes: 9 additions & 0 deletions css/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -1263,6 +1263,15 @@ footer { text-align: center; padding: 20px 0; background-color: var(--header-bg-
opacity: 0.6;
padding: 20px;
}
.sky-sortable-th {
cursor: pointer;
user-select: none;
transition: background-color 0.15s;
}
.sky-sortable-th:hover {
background-color: var(--primary-color);
color: #fff;
}
#sky-preview {
flex: 1;
min-height: 200px;
Expand Down
32 changes: 19 additions & 13 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
<link rel="dns-prefetch" href="https://ipfs.io">

<link rel="stylesheet" href="css/styles.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" />
<link rel="icon" href="favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
Expand Down Expand Up @@ -429,10 +429,6 @@ <h2>Padrão de Feixe Simulado</h2>
<section class="export-container" aria-labelledby="export-heading">
<h2 id="export-heading">Exportação (Estrutura OSKAR)</h2>
<div class="export-fields">
<div class="export-field">
<label for="export-layout-wgs84">layout_wgs84.txt:</label>
<textarea id="export-layout-wgs84" readonly title="Coordenadas WGS84 das estações"></textarea>
</div>
<div class="export-field">
<label for="export-position">position.txt:</label>
<textarea id="export-position" readonly title="Coordenadas WGS84 fixas do BINGO"></textarea>
Expand All @@ -446,15 +442,20 @@ <h2 id="export-heading">Exportação (Estrutura OSKAR)</h2>
<textarea id="export-tile-layout" readonly title="Coordenadas XY relativas das 64 antenas no tile"></textarea>
</div>

<!-- Seletor de formato de coordenadas (ECEF vs ENU) -->
<!-- Seletor de formato de coordenadas (WGS84 / ECEF / ENU) -->
<div class="export-field coord-format-section">
<div class="coord-format-header">
<span class="coord-format-title">Formato alternativo de coordenadas:</span>
<span class="coord-help-icon" title="WGS84 (acima) é o formato padrão (lat,lon,alt). Aqui você pode escolher um formato alternativo para incluir na exportação.">&#9432;</span>
<span class="coord-help-icon" title="Selecione o formato de coordenadas para visualização e exportação. WGS84 é o formato padrão do OSKAR para layout_wgs84.txt.">&#9432;</span>
</div>
<div class="coord-format-selector" role="radiogroup" aria-label="Formato de coordenadas">
<label class="coord-radio-label">
<input type="radio" name="coord-format" value="ecef" checked>
<input type="radio" name="coord-format" value="wgs84" checked>
<span>WGS84</span>
<span class="coord-help-icon" title="WGS84 (lon, lat, alt): Sistema geodésico padrão. Formato nativo do OSKAR para layout_wgs84.txt. Ideal para interferômetros de longa baseline onde a curvatura da Terra é relevante.">&#9432;</span>
</label>
<label class="coord-radio-label">
<input type="radio" name="coord-format" value="ecef">
<span>ECEF</span>
<span class="coord-help-icon" title="ECEF (Earth-Centered Earth-Fixed): Coordenadas cartesianas geocêntricas (X,Y,Z em metros) com origem no centro da Terra. Usado pelo OSKAR para definir posições absolutas das estações no espaço 3D. Ideal quando se precisa de precisão absoluta na geometria do arranjo.">&#9432;</span>
</label>
Expand All @@ -464,7 +465,11 @@ <h2 id="export-heading">Exportação (Estrutura OSKAR)</h2>
<span class="coord-help-icon" title="ENU (East-North-Up): Coordenadas locais topocêntricas (Leste,Norte,Cima em metros) relativas ao centro do BINGO. Usado pelo OSKAR como sistema de referência local para layouts de estações. Ideal para visualizar e editar distâncias relativas entre estações.">&#9432;</span>
</label>
</div>
<div id="coord-format-ecef" class="coord-format-panel">
<div id="coord-format-wgs84" class="coord-format-panel">
<label for="export-layout-wgs84-alt">layout_wgs84.txt (Lon, Lat, Alt):</label>
<textarea id="export-layout-wgs84-alt" readonly title="Coordenadas WGS84 das estações (lon, lat, alt)"></textarea>
</div>
<div id="coord-format-ecef" class="coord-format-panel" style="display:none;">
<label for="export-layout-ecef">layout_ecef.txt:</label>
<textarea id="export-layout-ecef" readonly title="Coordenadas ECEF (Earth-Centered Earth-Fixed) das estações"></textarea>
</div>
Expand Down Expand Up @@ -493,8 +498,8 @@ <h2 id="export-heading">Exportação (Estrutura OSKAR)</h2>
<!-- === ABA 2: CONFIGURAÇÃO OSKAR (.ini) === -->
<div id="tab-oskar-config" class="tab-content" role="tabpanel">
<section class="ini-generator-section">
<h2><i class="fas fa-cogs"></i> Gerador de Arquivo de Observação (.ini)</h2>
<p class="section-description">Monte o arquivo <code>.ini</code> de configuração do OSKAR. Preencha os parâmetros abaixo — campos essenciais estão destacados. Todos os valores possuem tooltips com a documentação detalhada em PT-BR.</p>
<h2><i class="fas fa-cogs"></i> Gerador de Arquivo do Interferometer (.ini)</h2>
<p class="section-description">Monte o arquivo <code>.ini</code> de configuração do <strong>oskar_sim_interferometer</strong>. Preencha os parâmetros abaixo — campos essenciais estão destacados. Todos os valores possuem tooltips com a documentação detalhada em PT-BR.</p>
<div class="ini-layout">
<div class="ini-params-area">
<div class="ini-toolbar">
Expand Down Expand Up @@ -615,11 +620,12 @@ <h2><i class="fas fa-star"></i> Gerador de Modelo de Céu (Sky Model)</h2>
<th>Dec (°)</th>
<th>I (Jy)</th>
<th>Spix</th>
<th>Tipo</th>
<th>Freq₀ (Hz)</th>
</tr>
</thead>
<tbody>
<tr><td colspan="5" class="empty-msg">Nenhuma fonte adicionada</td></tr>
<tr><td colspan="6" class="empty-msg">Nenhuma fonte adicionada</td></tr>
</tbody>
</table>
</div>
Expand Down Expand Up @@ -700,7 +706,7 @@ <h3><i class="fas fa-crosshairs"></i> Resolução Angular</h3>
<p class="copyright">© 2026 Geovanni Fernandes Garcia. Código aberto sob licença MIT.</p>
</footer>

<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js"></script>
<script src="js/constants.js"></script>
Expand Down
25 changes: 14 additions & 11 deletions js/export.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,8 @@ class OskarLayoutExporter {
'export-station-layout',
'export-tile-layout',
'export-layout-ecef',
'export-layout-enu'
'export-layout-enu',
'export-layout-wgs84-alt'
];
textareaIds.forEach(id => this._addSingleCopyButtonToTextarea(id));
}
Expand Down Expand Up @@ -215,7 +216,7 @@ class OskarLayoutExporter {
}

// Chama os métodos para atualizar cada campo de exportação.
this.updateLayoutWgs84Field();
this.updateLayoutWgs84AltField();
// this.updateBingoPositionField(); // Já chamado no construtor, é fixo.
this.updateStationLayoutField();
// this.updateTileLayoutField(); // Já chamado no construtor e generateSingleTileLayout, é fixo.
Expand All @@ -228,23 +229,23 @@ class OskarLayoutExporter {
// --- Métodos específicos para cada arquivo de exportação ---

/**
* Atualiza o textarea para ../layout_wgs84.txt (Coordenadas WGS84 das estações).
* Atualiza o textarea para layout_wgs84.txt no painel de formato de coordenadas.
* Usa dados de `this.selectedStationsCoords` (do mapa).
*/
updateLayoutWgs84Field() {
const textarea = document.getElementById('export-layout-wgs84');
updateLayoutWgs84AltField() {
const textarea = document.getElementById('export-layout-wgs84-alt');
if (!textarea) return;

if (!this.selectedStationsCoords || this.selectedStationsCoords.length === 0) {
textarea.value = 'Nenhuma estação selecionada no mapa.\nClique no mapa ou escolha um arranjo pré-definido.';
return;
}
// Formato: latitude,longitude,altitude (separados por vírgula)
// Formato OSKAR layout_wgs84.txt: longitude,latitude,altitude (separados por vírgula)
textarea.value = this.selectedStationsCoords.map(station => {
const lat = station.lat || 0;
const lon = station.lon || 0;
const alt = station.alt || 0;
return `${lat.toFixed(7)},${lon.toFixed(7)},${alt.toFixed(1)}`;
return `${lon.toFixed(7)},${lat.toFixed(7)},${alt.toFixed(1)}`;
}).join('\n');
}

Expand All @@ -255,8 +256,8 @@ class OskarLayoutExporter {
updateBingoPositionField() {
const textarea = document.getElementById('export-position');
if (!textarea) return;
// Formato: latitude,longitude,altitude
textarea.value = `${BINGO_CENTRAL_LATITUDE.toFixed(7)},${BINGO_CENTRAL_LONGITUDE.toFixed(7)},${BINGO_CENTRAL_ALTITUDE.toFixed(1)}`;
// Formato OSKAR position.txt: longitude,latitude,altitude
textarea.value = `${BINGO_CENTRAL_LONGITUDE.toFixed(7)},${BINGO_CENTRAL_LATITUDE.toFixed(7)},${BINGO_CENTRAL_ALTITUDE.toFixed(1)}`;
}

/**
Expand Down Expand Up @@ -427,12 +428,14 @@ document.addEventListener('DOMContentLoaded', () => {
}
};

// --- Seletor de formato de coordenadas (ECEF / ENU) ---
// --- Seletor de formato de coordenadas (WGS84 / ECEF / ENU) ---
const coordRadios = document.querySelectorAll('input[name="coord-format"]');
const wgs84Panel = document.getElementById('coord-format-wgs84');
const ecefPanel = document.getElementById('coord-format-ecef');
const enuPanel = document.getElementById('coord-format-enu');
coordRadios.forEach(radio => {
radio.addEventListener('change', () => {
if (wgs84Panel) wgs84Panel.style.display = radio.value === 'wgs84' ? '' : 'none';
if (ecefPanel) ecefPanel.style.display = radio.value === 'ecef' ? '' : 'none';
if (enuPanel) enuPanel.style.display = radio.value === 'enu' ? '' : 'none';
});
Expand All @@ -457,7 +460,7 @@ document.addEventListener('DOMContentLoaded', () => {
try {
const zip = new JSZip();
// Obtém o conteúdo atual dos textareas.
const contentWGS84 = document.getElementById('export-layout-wgs84').value;
const contentWGS84 = document.getElementById('export-layout-wgs84-alt').value;
const contentPosition = document.getElementById('export-position').value;
const contentStationLayout = document.getElementById('export-station-layout').value;
const contentTileLayout = document.getElementById('export-tile-layout').value;
Expand Down
Loading
Loading