3D-PDF Export

Der 3D-PDF-Export erstellt ein PDF-Dokument mit eingebetteter 3D-Grafik. Der Export ist insbesondere auf Tragwerksmodelle und Bewehrung ausgerichtet.

  1. Klicke auf die Registerkarte BiMTOOLS > Gruppe 3D-PDF Export > icon_3D_PDF_Export (Export)

    Der Einstellungsdialog wird angezeigt.

  2. Wähle die gewünschten Einstellungen und bestätige mit OK.

    Die PDF-Datei wird erstellt und im Projektordner gespeichert.

Tipp

Wenn die Option „Verwende aktuelle Ansicht“ aktiviert ist, exportiert das Programm die Geometrie, die die aktive Ansicht darstellt, unter Berücksichtigung von Schnittrahmen, Verschiebungen und anderen ansichtsabhängigen Merkmalen.

../_images/mainpic.png

Workflow

Der Prozess zur Erzeugung eines 3D-PDF-Datei mit SOFiSTiK 3D-PDF-Export erfolgt in drei Schritten:

  1. Ermitteln der geometrischen Daten aller Revit-Elemente und Organisieren als eine Sammlung von 3D-Objekten, die durch ein trianguliertes Netz gebildet werden.

  2. Erstellen einer U3D-Datei mit den zuvor gesammelten geometrischen Daten.

  3. Generieren einer Standard-PDF-Datei und Einbettung des 3D-Modells, das im U3D-Format gespeichert wurde, auf einer Seite.

Um diesen Workflow zu vervollständigen, werden zwei externe Bibliotheken implementiert. Erstens, um die erforderliche U3D-Datei zu erstellen, eine Open-Source-Bibliothek namens „Universal 3D Sample Software“; dieser ermöglicht das Schreiben, Lesen und Bearbeiten von Daten im angegebenen Format. Die vollständige Bibliothek und der Quellcode finden Sie auf der folgenden Webseite:

http://sourceforge.net/projects/u3d/develop

Andererseits wird die PDF-Datei mit Hilfe einer anderen externen Bibliothek erstellt, beispielsweise „libHaru“, einer kostenlosen, plattformübergreifenden Open-Source-Bibliothek zum Generieren von PDF-Dateien. libHaru kann verschiedene Arten von externen Objekten in ein PDF-Dokument einbinden, beispielsweise U3D-Dateien. Die Version 2.3.0 ist im SOFiSTiK-PDF-Export enthalten, ebenfalls sind zwei weitere Bibliotheken nach den Anforderungen von libHaru implementiert: zlib (v 1.2.5) und libpng (1.5.8). Die vollständige Bibliothek und der Quellcode finden Sie auf der folgenden Webseite:

http://libharu.org/

Zusammenfassend lässt sich der Workflow „SOFiSTiK 3D-PDF-Export“ wie folgt darstellen:

../_images/workflow.png

Java-Script-Support

JavaScript-Support erweitert die Möglichkeiten, 3D-Objekte und deren Aussehen programmgesteuert zu ändern.

Fügen Sie JavaScript-Dateien in das Projekt mit Einstellungen Dialog (Registerkarte Sonstige)

  1. Erstelle eine JavaScript-Datei mit deinem eigenen Code oder verwende das vorbereitete Beispiel

  2. Klicke auf die Registerkarte BiMTOOLS > Gruppe 3D-PDF Export > icon_Export (Export)

Der Einstellungsdialog wird angezeigt.

../_images/mpic_SettingsTab_Other1.png
  1. In Registerkarte Sonstige, aktiviere ‚JavaScript Datei einfügen‘ und wähle das Verzeichnis der richtigen JavaScript-Datei in ‚Speicherort‘.

  2. Überprüfe die sonstigen Einstellungen und klicke auf OK, um eine 3D-PDF-Datei zu erstellen.

Beispiel

Sie können den folgenden Code verwenden, um eine Java-Script-Datei zu erstellen.

  1. Erstelle und öffne eine neue „.txt“-Datei.

  2. Kopiere den gesamten Code, füge ihn in die „.txt“-Datei ein, speichere und schließen die Datei.

  3. Ändere die Dateiendung in „.js“

Das folgende JavaScript-Beispiel ermöglicht es, die Farbe eines Elements temporär zu ändern, wenn der Cursor darauf zeigt.

function ModelPartObject()
{
        this.mouseEventHandler  = null;
        this.mesh               = null;
}
function MouseSelectionObject()
{
        owner = this;

        var DEFAULT_RENDER_MODE                 = "solid outline";
        var DEFAULT_MOUSE_OVER_RENDER_MODE  = "illustration";
        var DEFAULT_MOUSE_DOWN_RENDER_MODE  = "illustration";
        var DEFAULT_SELECTED_RENDER_MODE        = "illustration";

        var defaultRenderMode                   = DEFAULT_RENDER_MODE;
        var mouseOverRenderMode                 = DEFAULT_MOUSE_OVER_RENDER_MODE;
        var mouseDownRenderMode                 = DEFAULT_MOUSE_DOWN_RENDER_MODE;
        var selectedRenderMode                  = DEFAULT_SELECTED_RENDER_MODE;
        var mousePart = -1;
        var selectedPart = -1;
        var initialized = false;
        var numberOfModelParts = 0;
        var atLeastOnePartHasBeenCreated = false;
        var camera = this.scene.cameras.getByIndex( 0 );
        var generalMouseEventHandler = new MouseEventHandler();

        var maxNumModelParts = this.scene.meshes.count;
        var modelPart = new Array( maxNumModelParts );

        for (p=0; p<maxNumModelParts; p++)
        {
          modelPart[p] = new ModelPartObject();
        }
        generalMouseEventHandler.onMouseDown    = true;
        generalMouseEventHandler.onMouseMove    = true;
        generalMouseEventHandler.onMouseUp      = true;
        generalMouseEventHandler.onEvent = function( event )
        {
                if ( event.isMouseUp)
                {
                        if ( mousePart != -1 )
                        {
                                modelPart[ mousePart ].mesh.renderMode = defaultRenderMode;
                                mousePart = -1;
                        }
                }
        }

        runtime.addEventHandler( generalMouseEventHandler );
        this.myMouseHandlingFunction = function( event )
        {
                var m = 0;
                var lookingForMesh = true;
                while ( lookingForMesh )
                {
                        if ( this.target == modelPart[m].mesh )
                        {
                                lookingForMesh = false;
                                if ( event.isMouseOver )
                                {
                                        if ( ! event.leftButtonDown )
                                        {
                                                mousePart = m;
                                                modelPart[ m ].mesh.renderMode = mouseOverRenderMode;
                                        }
                                }

                                if ( event.isMouseOut )
                                {
                                        if (( ! event.leftButtonDown ))
                                        {
                                                mousePart = -1;
                                                modelPart[ m ].mesh.renderMode = defaultRenderMode;
                                        }
                                }
                                if ( event.isMouseDown )
                                {
                                        mousePart = m;
                                        modelPart[ m ].mesh.renderMode = mouseDownRenderMode;
                                }
                                if ( event.isMouseUp )
                                {
                                        if ( selectedPart != -1 )
                                                {modelPart[ selectedPart ].mesh.renderMode = defaultRenderMode; }

                                        selectedPart = m;
                                        mousePart = -1;
                                }
                        }

                        m ++;

                        if ( m > numberOfModelParts - 1 )
                                {lookingForMesh = false;}
                }
        }

        this.getMeshesFromModel = function()
        {
                numberOfModelParts = 0;

                for (p=0; p<this.scene.meshes.count; p++)
                {
                        var modelMesh = this.scene.meshes.getByIndex( p );
                        if ( modelMesh.material )
                        {
                                modelPart[ numberOfModelParts ].mesh = modelMesh;

                                if ( ! atLeastOnePartHasBeenCreated )
                                {atLeastOnePartHasBeenCreated = true;}
                                numberOfModelParts ++;
                        }
                }

        }

        this.initialize = function()
        {
                if ( ! initialized )
                {
                        owner.getMeshesFromModel();
                        for (var m=0; m<numberOfModelParts; m++)
                        {
                                modelPart[m].mouseEventHandler = new MouseEventHandler();
                                modelPart[m].mouseEventHandler.onMouseMove = true;
                                modelPart[m].mouseEventHandler.onMouseDown = true;
                                modelPart[m].mouseEventHandler.onMouseUp   = true;
                                modelPart[m].mouseEventHandler.onMouseOver = true;
                                modelPart[m].mouseEventHandler.onMouseOut  = true;
                                modelPart[m].mouseEventHandler.target      = modelPart[m].mesh;
                                modelPart[m].mouseEventHandler.onEvent     = owner.myMouseHandlingFunction;
                                runtime.addEventHandler( modelPart[m].mouseEventHandler );
                        }

                        for (p=0; p<this.scene.meshes.count; p++)
                        {
                                var mesh = this.scene.meshes.getByIndex(p);
                                if ( mesh.material )
                                {mesh.renderMode = defaultRenderMode;}
                        }
                        initialized = true;
                }

                return initialized;
        }

        this.setAllPartsToDefaultRenderMode = function()
        {
                for (var m=0; m<numberOfModelParts; m++)
                {modelPart[m].mesh.renderMode = defaultRenderMode;}
        }

        this.selectPart = function( partName )
        {owner.selectPartByIndex( getPartIndexFromName( partName ) );}

        this.unSelectPart = function( partName )
        {owner.unSelectPartByIndex( getPartIndexFromName( partName ) );}

        this.selectPartByIndex = function( partIndex )
        {
                selectedPart = partIndex;
                modelPart[ selectedPart ].mesh.renderMode = selectedRenderMode;
        }

        this.unSelectPartByIndex = function( partIndex )
        {
                if ( partIndex == selectedPart )
                {
                        modelPart[ selectedPart ].mesh.renderMode = defaultRenderMode;
                        selectedPart = -1;
                }
        }

        this.incrementSelectedPart = function()
        {
                if ( selectedPart == -1 )
                {owner.selectPartByIndex( 0 );}
                else
                {
                        var previouslySelectedPart = selectedPart;
                        owner.unSelectPartByIndex( selectedPart );
                        var nextPart = previouslySelectedPart + 1;

                        if ( nextPart >= numberOfModelParts )
                        {nextPart = 0;}

                        owner.selectPartByIndex( nextPart );
                }
        }

        this.decrementSelectedPart = function()
        {
                if ( selectedPart == -1 )
                {owner.selectPartByIndex( 0 );}
                else
                {
                        var previouslySelectedPart = selectedPart;
                        owner.unSelectPartByIndex( selectedPart );
                        var nextPart = previouslySelectedPart - 1;

                        if ( nextPart < 0 )
                        {nextPart = numberOfModelParts - 1;}

                        owner.selectPartByIndex( nextPart );
                }
        }

        this.getSelectedPartName = function()
        {
                result = "there is no selected part";
                if ( selectedPart != -1 )
                {result = modelPart[ selectedPart ].mesh.name; }
                return result;
        }

        this.unSelectSelectedPart = function()
        {owner.unSelectPartByIndex( selectedPart );}

        this.setDefaultRenderMode = function( renderMode )
        {
                defaultRenderMode = renderMode;
                owner.setAllPartsToDefaultRenderMode();
        }

        this.setMouseOverRenderMode = function( renderMode )
        {mouseOverRenderMode = renderMode;}

        this.setMouseDownRenderMode = function( renderMode )
        {mouseDownRenderMode = renderMode;}

        this.setSelectedRenderMode = function( renderMode )
        {selectedRenderMode = renderMode;}

        this.setAllMouseSelectionPartsToDefaultRenderMode = function()
        {setAllPartsToDefaultRenderMode();}

        this.getPartIndexFromName = function ( partName )
        {
                var index = -1;
                for (m=0; m<numberOfModelParts; m++)
                {
                        if ( partName == modelPart[m].mesh.name )
                        {index = m;}
                }

                return index;
        }

        owner.initialize();
        return this;
}

var mouseMoved=MouseSelectionObject();