Archives par mot-clé : Tuto

[Revit API] Exemple simple d’interface non modale (External Event Handler) dans pyRevit

Article non traduit actuellement, demandez la ou essayer la version anglaise ici (outil de traduction disponible) : http://pythoncvc.net/?p=247

[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.