Zpět

Angular & X3Dom

Ukázka #1 - Data-binding do 3D scény

  • 
    <div>
        <!-- X3Dom scéna -->
    	<x3d>
    		<scene>
    			<shape>
    				<appearance>
                        <!-- Materiál s data-bindingem pro barvy -->
    					<material [diffusecolor]="diffuseColor" [specularcolor]="specularColor"></material>
    				</appearance>
                    <!-- Text mesh s data-bindingem do atributu string -->
    				<text solid="false" [string]="text">
    					<fontstyle family="TYPEWRITER" justify="MIDDLE" quality="200" size="2"></fontstyle>
    				</text>
    			</shape>
    		</scene>
    	</x3d>
    </div>
    <div>
        <!-- Formulář pro ovládání scény -->
        <form>
            <div>
                <label>Text</label>
                <div>
                  <!-- Vstup pro text s obousměrným data-bindingem [(ngModel)] -->
                  <input name="text" type="text" [(ngModel)]="text" />
                </div>
            </div>
            <div>
                <div class="grid">
                    <div>
                        <label>Základní barva</label>
                        <div>
                            <input name="diffuse" type="color" [(ngModel)]="diffuseColor" />
                            <span [ngStyle]="{'color': diffuseColor }"> {{ diffuseColor }} </span>
                        </div>
                    </div>
                    <div>
                        <label>Barva lesku</label>
                        <div>
                            <input name="specular" type="color" [(ngModel)]="specularColor" />
                            <span [ngStyle]="{'color': specularColor }"> {{ specularColor }} </span>
                        </div>
                    </div>
                </div>
            </div>
        </form>
    </div>
    
  • 
    import { Component } from '@angular/core'; // import jádra Angularu
    
    @Component({ // decorator Angular komponentu
      selector: 'app1',
      templateUrl: './app1.component.html' // URL šablony
    })
    export class App1Component { // třída Angular komponentu
      text = 'Hello world';
      diffuseColor = '#dd3300';
      specularColor = '#ee9966';
    
      ngOnInit() { // přenačtení X3Dom při inicializaci komponentu
        if (window['x3dom']) { window['x3dom'].reload(); }
      }
    }
    
  • 
    import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
    import { BrowserModule } from '@angular/platform-browser';
    import { FormsModule } from '@angular/forms';
    
    import { App1Component } from './app1.component';
    
    @NgModule({
      imports:      [ BrowserModule, FormsModule ],
      declarations: [ App1Component ],
      bootstrap:    [ App1Component ],
      schemas:      [ NO_ERRORS_SCHEMA ]
    })
    export class AppModule { }
    
Načítání...

Ukázka #2 - Práce s polem

  • 
    <div>
        <!-- X3Dom scéna -->
        <x3d>
            <scene>
                <!-- Cyklus s využitím directivy *ngFor pro vykreslení všech kostek -->
                <group *ngFor="let item of items; index as index">
                    <!-- Pozicování kostky -->
                    <transform translation="{{ ((index - ((items.length - 1) / 2)) * 2) + ' 0 0' }}">
                        <transform translation="{{ item.position.x + ' ' + item.position.y + ' ' + item.position.z }}">
                            <!-- Vytvoření kostky s data-bindingem do jejího atributu size a atributu diffuseColor materiálu -->
                            <shape>
                                <appearance>
                                    <material [diffuseColor]="item.color"></material>
                                </appearance>
                                <box size="{{ item.size.x + ' ' + item.size.y + ' ' + item.size.z }}" useGeoCache="false"></box>
                            </shape>
                        </transform>
                    </transform>
                </group>
            </scene>
        </x3d>
    </div>
    <div>
        <!-- Formulář pro ovládání scény -->
        <form>
            <ul>
                <!-- Cyklus s využitím directivy *ngFor pro ovládací panely ke všem kostkám -->
                <li *ngFor="let item of items; index as index">
                    <div>
                        <div class="grid">
                            <div>
                                <label>Objekt #{{index + 1}}</label>
                                <div>
                                    <input type="color" [(ngModel)]="item.color" name="color {{ index }}" />
                                    <span [ngStyle]="{'color': item.color }"> {{ item.color }} </span>
                                </div>
                            </div>
                            <div>
                                <div class="grid">
                                    <div>
                                        <label>↔ W {{ item.size.x * 100 }}%</label>
                                        <input type="range" [(ngModel)]="item.size.x" min="0.1" max="2" step="0.1" name="w{{ index }}" />
                                    </div>
                                    <div>
                                        <label>↕ H {{ item.size.y * 100 }}%</label>
                                        <input type="range" [(ngModel)]="item.size.y" min="0.1" max="2" step="0.1" name="h{{ index }}" />
                                    </div>
                                    <div>
                                        <label>⤢ L {{ item.size.z * 100 }}%</label>
                                        <input type="range" [(ngModel)]="item.size.z" min="0.1" max="2" step="0.1" name="l{{ index }}" />
                                    </div>
                                    <div>
                                        <label>→ X {{ item.position.x }}</label>
                                         <input type="range" [(ngModel)]="item.position.x" min="-1" max="1" step="0.1" name="x{{ index }}" />
                                    </div>
                                    <div>
                                        <label>↑ Y {{ item.position.y }}</label>
                                        <input type="range" [(ngModel)]="item.position.y" min="-1" max="1" step="0.1" name="y{{ index }}" />
                                    </div>
                                    <div>
                                        <label>↗ Z {{ item.position.z }}</label>
                                        <input type="range" [(ngModel)]="item.position.z" min="-1" max="1" step="0.1" name="z{{ index }}" />
                                    </div>
                                </div>
                            </div>
                            <div>
                                <!-- Tlačítko napojené na metodu pro smazání kostky -->
                                <a (click)="remove(index)">Smazat</a>
                            </div>
                        </div>
                    </div>
                </li>
            </ul>
            <!-- Tlačítko napojené na metodu pro přidání kostky -->
            <a (click)="add()">Přidat nový objekt</a>
        </form>
    </div>
    
  • 
    import { Component } from '@angular/core'; // import jádra Angularu
    
    @Component({ // decorator Angular komponentu
      selector: 'app2',
      templateUrl: './app2.component.html'
    })
    export class App2Component { // třída Angular komponentu
      items = [];
    
      add() { // metoda pro přidání kostky
        this.items.push({
            size: { x: 1, y: 1, z: 1 },
            position: { x: 0, y: 0, z: 0 },
            color: "#ff9900" // nebo jiná náhodná barva
        });
      }
    
      remove(index) { // metoda pro smazání kostky
        this.items.splice(index, 1);
      }
    
      ngOnInit() { // metoda volaná při inicializaci
        this.add();
        this.add();
        if (window['x3dom']) { window['x3dom'].reload(); } // přenačtení X3Dom
      }
    }
    
  • 
    import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
    import { BrowserModule } from '@angular/platform-browser';
    import { FormsModule } from '@angular/forms';
    
    import { App2Component } from './app2.component';
    
    @NgModule({
      imports:      [ BrowserModule, FormsModule ],
      declarations: [ App2Component ],
      bootstrap:    [ App2Component ],
      schemas:      [ NO_ERRORS_SCHEMA ]
    })
    export class AppModule { }
    
Načítání...