# Visualizzatore 3D Doors (Blazor)
- [Visualizzatore 3D Doors (Blazor)](#visualizzatore-3d-doors-blazor)
- [0️⃣ Prerequisiti](#0️⃣-prerequisiti)
- [1️⃣ Creare un'applicazione Web (Blazor server app)](#1️⃣-creare-unapplicazione-web-blazor-server-app)
- [⚠️ IMPORTANTE PER IL CORRETTO FUNZIONAMENTO DEL VISUALIZZATORE](#️-importante-per-il-corretto-funzionamento-del-visualizzatore)
- [2️⃣ Setup helper per la comunicazione](#2️⃣-setup-helper-per-la-comunicazione)
- [3️⃣ Aggiungere i riferimenti ai file `.js`](#3️⃣-aggiungere-i-riferimenti-ai-file-js)
- [4️⃣ Setup componente blazor per il render](#4️⃣-setup-componente-blazor-per-il-render)
- [5️⃣ Setup della chiamata alla funzione di render](#5️⃣-setup-della-chiamata-alla-funzione-di-render)
## 0️⃣ Prerequisiti
- .NET SDK installato
## 1️⃣ Creare un'applicazione Web (Blazor server app)

Una volta creata l'applicazione web creare nella cartella wwroot una sottocartella denominandola lib. Se si importa localmente inl pacchetto npm viene creata alla fase di definizione del path di destinazione

E' possibile importare il pacchetto npm che si traova sul nostro repository nexus (https://nexus.steamware.net/#browse/browse:npm-hosted:webgl-door-visualizer) con il comando seguente
npm install webgl-door-visualizer@1.2.240622.1216
Dove il numero versione va modificato di conseguenza a quanto voluto.

Successivamente copiare l'intera cartella src fornita ed incollarla nella cartella lib precedentemente creata.

## ⚠️ IMPORTANTE PER IL CORRETTO FUNZIONAMENTO DEL VISUALIZZATORE
Visual studio riconosce e permette l'utilizzo di alcuni tipi di file. L'estensione `.3dm` non rientra nella categoria perciò è importante ricordarsi di includere quest'ultima nella classe `Program.cs` le seguenti righe di codice:
```c#
var provider = new Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider();
provider.Mappings[".3dm"] = "model"; // aggiungere l'estensione desiderata e il suo tipo
app.UseStaticFiles(new StaticFileOptions
{
ContentTypeProvider = provider
});
```
inoltre ma aggiunta la configurazione per distribuire file 3dm dalla cartella appositamente prevista (ed esterna al programma epr "sopravvivere" agli update dello stesso)
```c#
string path3dm = configuration.GetValue("ServerConf:path3dm") ?? configuration.GetValue("OptConf:path3dm") ?? "";
if (!string.IsNullOrEmpty(path3dm))
{
// verifico esista folder disegni
if (Directory.Exists(path3dm))
{
// gestione cartella x PDF
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(path3dm),
RequestPath = "/3dm",
ContentTypeProvider = provider
});
}
}
```
## 2️⃣ Setup helper per la comunicazione
Nella cartella lib dovrebbe trovarsi il file `draw_call.js`. Questo sarà il file che farà da tramite tra chi gestisce il visualizzatore ( `WebGl` ) e chi mostrerà il visualizzatore ( `WebGlViewer` )
Il file conterrà le seguenti righe di codice :
```javascript
import { webgl_original } from './webgl_draw.js';
const WGL = new webgl_original();
const infoDiv = document.getElementById( "infoDiv") ;
const doorDiv = document.getElementById( "DoorRender") ;
const cubeDiv = document.getElementById( "Ref1Render") ;
infoDiv.style.display = "none";
var isAnimated = true;
var isRotating = true;
var showQuote = true;
var showGrid = true;
let options ={
modelPath: "https://iis01.egalware.com/Test3D/THREEJS_DOORS/Door_models",
fName: getUrlParameter("src")
}
// init controllo
WGL.initcall(options);
```
In questo caso sono presenti due funzioni :
- `initcall` permette di avviare i calcoli che permettono il render del visualizzatore 3D. I parametri richiesti :
- modelPath: path da dove vengono restituiti i file 3dm (da configurare nel program.cs come sopra);
- fName: nome del file ( con estensione `.3dm` ) del quale effettuare il render.
> **N.B.:** E' fondamentale caricare i propri modelli da visualizzare nella cartella sopra definita in program.cs.
>
## 3️⃣ Aggiungere i riferimenti ai file `.js`
Per far si che il codice scritto nel file di base della libreria e nel file **helper** è importante aggiungere le seguenti righe alla pagina
`Pages/_layout.cshtml` :
```html
```
Di seguito il risultato di come si presenterà la pagina :
```html
@RenderBody()
An error has occurred. This application may no longer respond until reloaded.
An unhandled exception has occurred. See browser dev tools for details.
Reload🗙
```
## 4️⃣ Setup componente blazor per il render
Successivamente creiamo un nuovo componente razor nella cartelle delle pagine `Pages/WebGlViewer`.
Nella nuova pagina inserire le seguenti righe di codice che permetteranno di effettuare il render del visualizzatore.
```html
@inject IJSRuntime JSRuntime
@page "/WebGlViewer"
Camera settings
Zoom Wheel-Scroll
Pan Drag Mouse-Wheel
Rotate CTRL + Drag Mouse-Wheel
Iso / Ortho
| key : O
Perspective
| key : P
AutoRotate
| key : R
Quotes
| key : Q
Grid
| key : G
Reset
| key: SpaceBar
Menu
| key : H
EgalWare
WebDoor 3D
Egalware |
```
`@inject IJSRuntime JSRuntime` permette di usufruire del servizio che si occupa di eseguire chiamate a funzioni javascript direttamente dal codice c#
## 5️⃣ Setup della chiamata alla funzione di render
... probabilmente non necessario con secondo modulo...
Nella pagina `Pages/WebGlViewer` aggiungere il seguente codice che, una folta effettuato il render della pagina procederà al disegno del visualizzatore.
```c#
@code {
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await Task.Delay(1);
if (firstRender)
{
var options = new
{
dimX = 960,
dimY = 540,
fileName = "Cubo.3mf",
_showCalcGrid = false
};
await JSRuntime.InvokeVoidAsync("setup", options);
}
}
}
```