3D-PDF Export

L’outil 3D-PDF Export crée un document PDF avec un graphique 3D intégré. Cet outil est particulièrement adapté aux modèles structurels et aux armatures.

  1. Cliquer sur l’onglet BiMTOOLS > Barre d’outil SOFiSTiK 3D-PDF Export > icon_Export (Export)

    La boîte de dialogue Paramètres s’affiche.

  2. Choisir les paramètres souhaités et confirmer avec OK.

    Le fichier PDF sera crée dans le répertoire du projet.

Astuce

Si l’option « Utiliser la géométrie de la vue active » est cochée, le programme exporte la géométrie représentée dans la vue active, en tenant compte des zones de sélections, des déplacements et d’autres caractéristiques dépendant de la vue.

../_images/mainpic.png

Workflow

Le processus de génération d’un document PDF 3D à l’aide de SOFiSTiK 3D-PDF Export peut être décomposés en les points suivants :

  1. Extraire la définition géométrique des éléments Revit et l’organiser comme un ensemble d’objets 3D formés par un maillage triangulaire.

  2. Créer un fichier U3D en utilisant les données géométriques collectées précédemment.

  3. Générer un document PDF standard et intégrer le modèle 3D, qui a été stocké au format U3D, sur l’une de ses pages.

Afin de compléter ce workflow, deux bibliothèques externes sont implémentées. Tout d’abord, pour créer le fichier U3D requis, une bibliothèque open source appelée « Universal 3D Sample Software » ; celle-ci permet d’écrire, de lire et d’éditer des données dans le format référencé. La bibliothèque complète et le code source se trouvent sur la page Web suivante :

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

D’autre part, le fichier PDF est créé au moyen d’une autre bibliothèque externe, à savoir « libHaru » qui est une bibliothèque gratuite, multiplateforme et open source pour la génération de fichiers PDF. Ainsi, libHaru est capable d’incorporer différents types d’objets externes dans un document PDF, tels que des fichiers U3D. La version 2.3.0 est incluse dans SOFiSTiK PDF Export, de même deux autres bibliothèques sont implémentées selon les exigences de libHaru : zlib (v 1.2.5) et libpng (1.5.8). La bibliothèque complète et le code source peuvent être trouvés dans la page web suivante :

http://libharu.org/

Le workflow « SOFiSTiK 3D-PDF Export » peut être résumé comme suit :

../_images/workflow.png

Support pour Java Script

Le support JavaScript étend les possibilités de modifier les objets 3D et leur apparence de manière par programmation.

Inclure les fichiers JavaScript dans le projet en utilisant le dialogue Paramètres (onglet Divers).

  1. Créer un fichier Java Script avec son propre code ou utiliser un exemple préparé .

  2. Cliquer sur l’onglet Extensions > Barre d’outil SOFiSTiK 3D-PDF Export > icon_Export (Export)

La boîte de dialogue Paramètres s’affiche.

../_images/mpic_SettingsTab_Other1.png
  1. Dans l’onglet Divers, cocher la case “Inclure le fichier JavaScript” et sélectionner le répertoire du fichier JavaScript approprié dans “Emplacement du fichier”.

  2. Vérifier les autres paramètres et cliquer sur OK pour créer un fichier 3D-PDF.

Exemple

Il est possible d’utiliser le code suivant pour créer un fichier Java Script.

  1. Créer et ouvrir un nouveau fichier « .txt ».

  2. Copier le code entier, le coller dans le fichier « .txt », l’enregistrer et fermer.

  3. Changer l’extension du fichier en « .js ».

L’exemple suivant de JavaScript permet de modifier temporairement la couleur d’un élément en maintenant un curseur sur celui-ci.

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();