# 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) ![Tipo di progetto ](image.png) 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 ![Import NPM](image-1.png) 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. ![Creazione cartella lib](image-1.png) Successivamente copiare l'intera cartella src fornita ed incollarla nella cartella lib precedentemente creata. ![Aggiunta libreria WebGl](image-2.png) ## ⚠️ 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
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); } } } ```