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

    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éé dans le répertoire du projet.

Astuce

Si l’option “Utiliser les paramètres 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

Dialogue Paramètres Export 3D-PDF#

La boîte de dialogue Paramètres fournit des définitions générales telles que la qualité, l’apparence et les paramètres à exporter.

Onglet Général#

L’onglet Général fournit les principaux paramètres suivants pour l’export.

../_images/mpic_SettingsTab_General.png

Paramètres généraux#

  • Fichier PDF. Définit le répertoire dans lequel le fichier PDF sera créé. Par défaut, le répertoire du projet Revit est utilisé.

  • Dimension de page. Définit les dimensions de la page dans laquelle le modèle 3D sera intégré. Les options possibles sont : « A3 - 297 x 420 [mm] », « A4 - 210 x 297 [mm] », « A5 - 148 x 210 [mm] », « B4 - 250 x 353 [mm] », « B5 - 176 x 250 [mm] », « Letter - 8.5 x 11 [inches] » et « Legal - 8,5 x 14 [inches] ».

  • Orientation. Les options sont : Portrait ou Paysage.

Qualité et aspect#

  • Niveau de détail global. Ce paramètre contrôle la qualité du maillage qui sera généré pour représenter les éléments. La valeur doit être comprise dans l’intervalle [0, 1].

  • Niveau de détail des armatures. Comme pour le paramètre précédent, ceci contrôle la qualité du maillage représentant les éléments de ferraillage (barres d’armature, treillis soudés). La valeur doit être comprise dans l’intervalle [0, 1].

  • Couleur d’arrière-plan. Définit la couleur utilisée par défaut comme arrière-plan dans le document PDF.

  • Utiliser la géométrie de la vue active. Si cette case 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.

Prudence

Le niveau de détail (en particulier pour le ferraillage) influencera fortement la taille du fichier PDF.

Onglet Paramètres#

Dans l’onglet Paramètres, il est possible de choisir les paramètres à exporter individuellement pour chaque type d’élément.

../_images/mpic_SettingsTab_Parameters.png

Onglet Autre#

L’onglet Autre donne accès à des définitions supplémentaires tel que le support Java/U3D et l’ajout d’en-tête de page.

../_images/mpic_SettingsTab_Other.png

Support pour JavaScript#

  • Inclure le fichier JavaScript. Si cette option est cochée, il sera possible de sélectionner un fichier JavaScript à inclure dans le modèle 3D.

  • Emplacement du fichier JavaScript. Fichier JavaScript qui sera inclus dans le modèle 3D.

  • Exemple

U3D#

  • Supprimer U3D. Si cette option est cochée, le fichier U3D sera supprimé après la création du fichier PDF. Le fichier U3D peut être inclus manuellement dans d’autres fichiers PDF ou ouvert avec un visualiseur spécial, tel que MeshLab.

  • Optimiser la taille du fichier. Si cette case est cochée, 3D PDF Export créera un fichier avec une taille optimisée.

Autre#

  • Attacher l’URL ObjectType aux éléments. Si cette case est cochée, l’adresse URL associée sera ouverte par un double-clic sur l’élément.

Transférer les paramètres#

  • Export. Il est possible d’enregistrer les paramètres actuels sous forme de fichier (.dat) dans le répertoire choisi.

  • Import. Il est possible d’ouvrir un fichier de paramètres déjà existant et le charger dans le projet en cours.

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 Autre).

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

La boîte de dialogue Paramètres s’affiche.
../_images/mpic_SettingsTab_Other.png
  1. Dans l’onglet Autre, 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();