Archives de catégorie : Script

[PyRevitMEP] Shared Parameter Manager

Managing shared parameters is a pain. The standard Revit GUI makes hard to create/manage a lot of parameters. The first version of the shared parameter manager is pretty old but was not as handy to use. Making an easy to use one was a tough job.

In this script is used a WPF DataGrid which nicely displays objects data and is able to auto generate a column for each attribute of an object including drop-down menu (aka combo-box) for enumeration, checkbox for boolean, textbox for sub-objects which can be represented by a string. But for some reason you have to click once to select the row and a second time to edit (check a box, activate drop-down or text edition) which makes it pretty unusable for edition. To solve this you need manually generate all columns with a data template, add handler to make bidirectional communication between displayed data and data in the background really used, sorting etc…

Some subjects are more complex that expected like actually sorting. As often I found answers on stack overflow : https://stackoverflow.com/questions/16956251/sort-a-wpf-datagrid-programmatically

As always source code is available. You’ll find it on github : https://github.com/CyrilWaechter/pyRevitMEP

My first objective with this tool and other related tools is to be able to easily add IFC parameters to objects (families) and project in order to produce better IFC files thereby improving interoperability.

[Revit] Distribuer ses scripts et créer un installeur

OutilsPythonCVC

Grâce au livre électronique de Daren Thomas et à quelques recherches sur internet j’ai pu créer un installeur complet pour donner facilement des outils à des personnes intéressés mais qui n’ont jamais produit une ligne de code et/ou sans que Revit Python Shell (RPS) ait besoin d’être installé ! Voici les étapes du processus :

1- Créer ses scripts pour RPS. Dans cet exemple, je me servirais de mes petits scripts qui n’ont rien d’exceptionnel, pourraient grandement être améliorés et dont je me sers pourtant quasiment tous les jours quand je travaille sur mes modèles Revit (cf. articles précédents).

2- Créer un fichier Rps Addins tel que décrit au chapitre « Deploying RpsAddins ». Ce fichier est un xml qui indique le nombre de boutons à créer (PushButton) et leur script associé (src), le nom du ruban dans lequel ils se trouveront (RibbonPanel). Le chemin d’accès au script est toujours relatif à l’emplacement du fichier RpsAddin :

<?xml version="1.0" encoding="utf-8" ?>
<RpsAddin>
  <RibbonPanel text="PythonCVC.net">
    <!-- the script is always searched relative to the location of the RpsAddin xml file -->
    <PushButton text="Renommer la vue" src="Sources\renommer_vues.py"/>
    <PushButton text="Supprimer système" src="Sources\supprimer_système.py"/>
    <PushButton text="Rotation axe X" src="Sources\rotation_element.py"/>
    <PushButton text="Supprimer famille" src="Sources\supprimer_famille.py"/>
    <PushButton text="Supprimer type" src="Sources\supprimer_type.py"/>
  </RibbonPanel>
</RpsAddin>

3- Utiliser l’outil « Deploy RpsAddins » de RPS en pointant le fichier RpsAddins créé. Un message informe alors que que le déploiement est complété dans le dossier « Output_<Nom du xml> ».

4- Créer un fichier Revit .addin standard qui permet d’ajouter un addin à Revit. Le Champs <FullClassName> doit être le nom du fichier RpsAddins. Le chemin du champs <Assembly> est indiqué avec une variable « path » qui sera remplacer à l’installation par l’emplacement où l’utilisateur a choisi d’installer votre addin. Note importante : Ne copiez pas le champs <GUID> dans votre .addin, c’est un identifiant global unique (Global Unique Identifier) généré aléatoirement et comme son nom l’indique censé être unique. 2 addins avec le même GUID ne pourront pas être utilisés simultanément ou cela posera problème. Utilisez le générateur de GUID disponible dans Visual Studio, Inno Setup ou autre. Pour plus d’informations sur les champs disponibles/utiles (icônes etc…) consulter la documentation :

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
  <AddIn Type="Application">
    <Name>Outils pythoncvc.net</Name>
    <Assembly>path\pythoncvc.dll</Assembly>
    <AddInId>C12476B2-1BA6-4A44-8646-0A6619070956</AddInId>
    <FullClassName>pythoncvc</FullClassName>
    <VendorId>REGISTER_YOUR_VENDOR_ID</VendorId>
    <VendorDescription>Python CVC, pythoncvc.net</VendorDescription>
    <VisibilityMode>NotVisibleInFamily</VisibilityMode>
    <LongDescription>
    Cet addin regroupe les outils développés par pythoncvc.net, plus d'informations sur le site.
    </LongDescription>
  </AddIn>
</RevitAddIns>

5- Créer un installeur exécutable (et dés-installeur). Ce point n’est pas encore couvert dans le livre, j’ai choisi « Inno Setup » qui est libre, gratuit et permet de réaliser facilement un installeur à l’aide d’un assistant. Pour plus de fonctionnalités, on peut modifier le script qui créé l’installeur, l’inconvénient est qu’il faut utiliser le langage Pascal (recherche google et stackoverflow sont nos amis !). L’assistant permet de générer la majorité du script, il suffit de lui renseigner le nom de l’application, version, fichiers à installer, dossier de destination par défaut, fichier de licence etc. A la fin, l’assistant vous demande si vous voulez lancez le script, dîtes non, il faut procéder à quelques modifications avant :

Le fichier .addin ne doit pas être installé au même endroit que le reste, il doit être installé (Vista/Windows 7) dans « %ProgramData%\Autodesk\Revit\Addins\2015\ » ou « %AppData%\Autodesk\Revit\Addins\2015\ » pour être lu par Revit. Il faut donc modifier le « DestDir » du fichier .addin en utilisant de préférence les variables environnement ({%ProgramData}).

Source: "C:\Program Files (x86)\pythoncvc.net\pythoncvc.addin"; DestDir: "{%ProgramData}\Autodesk\Revit\Addins\2015\"; Flags: ignoreversion

Grâce à un sujet sur stackoverflow et à la documentation d’InnoSetup, j’ai pu généré un code permettant de modifier le .addin à la fin de l’installation pour qu’il pointe vers le dossier d’installation choisi par l’utilisateur. Il cherche et remplace dans le .addin le mot « path » (cf. point 4) par le chemin choisi par l’utilisateur (constante {app}) :

[Code]
procedure Update();
var
C: AnsiString;
CU: String;
Path: String;
begin
        LoadStringFromFile(ExpandConstant('{%ProgramData}\Autodesk\Revit\Addins\2015\pythoncvc.addin'), C);
        CU := C;
        Path := ExpandConstant('{app}')
        StringChangeEx(CU, 'path', Path, True);
        C := CU;
        SaveStringToFile(ExpandConstant('{%ProgramData}\Autodesk\Revit\Addins\2015\pythoncvc.addin'), C, False);          
end;

function GetCustomSetupExitCode: Integer;
begin
  Update;
result := 0;
end;

Démonstration vidéo :

Vous pouvez retrouver l’ensemble des fichiers (sources et produits) ici : https://github.com/Nahouhak/pythoncvc.net/tree/master/Cr%C3%A9er%20un%20installeur

En espérant que cela aidera d’autres personnes à distribuer leurs pythonneries.