Importez vos propres modules avec le développement Python de Grasshopper

introduction

J'ai écrit un article Utilisation d'un éditeur externe pour le développement Python de Grasshopper, mais quand j'essaye de développer un programme Python sérieusement avec Grasshopper, un fichier Ensuite, le code ne rentrera pas, vous voudrez donc séparer vos propres fonctions, etc. dans un fichier séparé. De plus, lors de la lecture d'un fichier image ou CSV, ou lors de la création d'un plug-in, il est nécessaire de bien gérer la structure du fichier afin que le fichier puisse être référencé par un chemin relatif. Cette fois, je vais vous expliquer comment rendre votre code plus facile à gérer en utilisant vos propres modules et fichiers de configuration.

** Avantages de diviser le programme avec des modules personnalisés **

organisation des fichiers

Cette fois, je vais expliquer avec cette structure de fichier. Il y a gh_file.gh et `` function.py directement sous le dossier du projet, et pour appeler le module mod.py dans le dossier `` `` module Créez __ init __. Py ''. Aussi, créez radius_range.json``` dans le dossier `` data``` comme fichier de configuration.

.
├── module
│   └── __init__.py
│   └── mod.py
├── data
│   └── radius_range.json
└── function.py
└── gh_file.gh

Dans cet exemple de projet, le programme suivant sera utilisé comme exemple.

--Utilisez Pop2D avec GH pour générer plusieurs points à des endroits aléatoires

fichier de configuration

Le fichier de paramètres radius_range.json``` définit la "valeur minimale", la "valeur maximale" et le "pas" à inclure dans la fonction aléatoire.

radius_range.json


{
    "min": 1,
    "max": 10,
    "step": 1
}

module

Dans le module mod.py '', créez une fonction simple qui appelle json dans le fichier de configuration et renvoie un nombre aléatoire. Je voudrais appeler cette fonction appelée random_radius``` de `` function.py```.

mod.py


# -*- coding: utf-8 -*-
import json
from io import open
import random

def random_radius():
    #Chemin relatif du fichier json
    path = "./data/radius_range.json"
    #Ouvrez le fichier json
    with open(path, encoding='utf-8') as f:
        d = json.load(f)
    #Récupérer les paramètres du fichier de configuration
    min = d['min']
    max = d['max']
    step = d['step']
    #Renvoie un nombre aléatoire
    return random.randrange(min,max,step)

Paramètres de Grasshopper

Le fichier GH `` gh_file.gh '' est défini comme ceci.

Dans Lire le fichier, cliquez avec le bouton droit sur F → Sélectionnez un fichier existant pour fonctionner.Spécifiez py.


 Veuillez vous reporter à [Utilisation d'un éditeur externe pour le développement Python de Grasshopper](https://qiita.com/keiwatanabe/items/9eb6a7d6749f5e586f7f) pour le paramètre de lecture des fichiers externes.
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263714/1f8b46bc-c4e4-a41d-84e7-474c58cd383f.png)

# Répertoire des fichiers GHPython

 Maintenant, pour le sujet principal, essayons le code suivant dans function.py pour comprendre pourquoi nous écrivons cet article.


#### **`function.py`**
```python

import rhinoscriptsyntax as rs
from module import mod

a = mod.random_radius()

Ensuite, je pense qu'une telle erreur apparaîtra.

image.png

1. Solution exception:chemin'C:\Program Files\Rhino 6\System\data\radius_range.json'Certains d'entre eux n'ont pas été retrouvés.

Quand je lis le message d'erreur, il dit que radius_range.json '' ne peut pas être trouvé. Je peux appeler mod.py '' parce que je suis allé au point de rechercher le fichier json, mais il semble que le fichier json soit allé chercher Program Files ''. J'appelle function.py '' dans le même répertoire à partir d'un fichier GH dans le même répertoire, mais pour une raison quelconque, je fais référence à `` Program Files ''. ..

** Pourquoi ne puis-je pas me référer correctement à radius_range.json même si mod.py peut être lu correctement? ** **

Chemin de recherche du module et répertoire courant

Pour comprendre la cause, vous devez comprendre le ** chemin de recherche du module ** et le ** répertoire courant **.

Chemin de recherche du module

Il s'agit d'une liste de chemins que Python recherche lors de l'importation de bibliothèques standard ou externes. Pour vérifier cela, essayez le code ci-dessous dans le même fichier GH.

import sys
print(sys.path)

Ensuite, il sera retourné comme ça. Le Z: \ Projects \ demo-ghpython-package'``` au début de ceci est le répertoire où j'ai enregistré ce fichier de projet et l'emplacement où le fichier GH est stocké.

['Z:\\Projects\\demo-ghpython-package', 'C:\\Program Files\\Rhino 6\\Plug-ins\\IronPython\\Lib', 'C:\\Users\\[username]\\AppData\\Roaming\\McNeel\\Rhinoceros\\6.0\\Plug-ins\\IronPython (814d908a-e25c-493d-97e9-ee3861957f49)\\settings\\lib', 'C:\\Users\\[username]\\AppData\\Roaming\\McNeel\\Rhinoceros\\6.0\\scripts']

En d'autres termes, les modules du même répertoire que le fichier GH peuvent être importés en suivant ce chemin. Vous savez maintenant pourquoi `` mod.py '' peut être importé.

Répertoire actuel

Le répertoire actuel est celui où Python s'exécute. Pour vérifier cela, essayez le code ci-dessous dans le même fichier GH qu'avant.

import os
print(os.getcwd())

Ensuite, dans mon cas, le résultat est retourné comme suit.

C:\Program Files\Rhino 6\System

Apparemment, le code Python du fichier GH fonctionnait dans Rhino 6 dans Program Files ''. Lorsque vous faites référence au fichier json, il a été décrit comme un ** chemin relatif ** comme. / Data / ~~ .json```, cherchez donc le fichier json dans le répertoire data dans le chemin ci-dessus. J'ai dit, il n'y a pas de tel fichier! Il semble qu'une erreur s'est produite.

Pour lire correctement les fichiers externes

Il y a deux manières.

  1. Spécifiez le fichier externe avec un chemin absolu
  2. Déplacer le répertoire actuel

Je pense qu'il y a des situations où il est préférable de spécifier avec un chemin absolu, mais cela fonctionne si les données sont stockées dans le même fichier de projet comme cette fois ou s'il y a une possibilité que le même code soit exécuté sur un autre PC. Non. Par conséquent, cette fois, nous utiliserons la méthode 2.

Déplacer le répertoire courant

Passez à function.py``` pour déplacer le répertoire actuel comme suit.

function.py


import rhinoscriptsyntax as rs
from module import mod
import os

#Obtenir le répertoire avec GH file = dossier de projet
base_dir = os.path.dirname(ghdoc.Path)
#Déplacer le répertoire actuel vers le dossier du projet
os.chdir(base_dir)

a = mod.random_radius()

-- ghdoc.Path renvoie le chemin du fichier GH en cours d'exécution, donc dans ce cas, le chemin du répertoire de ce chemin sera le chemin du dossier du projet, alors définissez-le sur base_dir Je vais. --Déplacez le répertoire courant vers `` `base_dir avec ʻos.chdir```.

Ensuite, un nombre aléatoire est revenu d'un fichier en toute sécurité.

image.png

Ajout d'un programme pour dessiner un cercle

À l'origine, je voulais sortir d'un objet cercle, alors changez le code pour écrire un cercle avec le nombre aléatoire renvoyé comme rayon.

function.py


import rhinoscriptsyntax as rs
from module import mod
import os

#Obtenir le répertoire avec GH file = dossier de projet
base_dir = os.path.dirname(ghdoc.Path)
#Déplacer le répertoire actuel vers le dossier du projet
os.chdir(base_dir)

circles = []
for pt in pts:
    #Définissez un plan qui dessine un cercle
    plane = rs.MovePlane(rs.WorldXYPlane(), pt)
    #Obtenez un rayon aléatoire
    radius = mod.random_radius()
    #Générez un cercle et ajoutez-le à la liste
    circles.append(rs.AddCircle(plane,radius))

a = circles

Le yen est enfin rendu. Bien que j'ai travaillé dur, le résultat est sobre lol image.png

à la fin

Cette fois, il s'agissait d'un programme simple qui écrit une plage aléatoire dans un fichier de paramètres, le lit à l'aide d'un module et le transmet au programme principal, mais il est très efficace lors de la lecture de fichiers image et d'une grande quantité de CSV. Veuillez vous y référer lors de la création d'un plug-in avec Python.

référence

https://note.nkmk.me/python-os-getcwd-chdir/

https://note.nkmk.me/python-import-module-search-path/

Recommended Posts

Importez vos propres modules avec le développement Python de Grasshopper
[Python] journalisation dans votre propre module
Créez vos propres commandes Linux en Python
[LLDB] Créez votre propre commande avec Python
Utilisez facilement vos propres fonctions en Python
[Python] Empaquetez et distribuez vos propres modules
Obtenez votre propre adresse IP en Python
Développement de framework avec Python
Environnement de développement en Python
Développement Slackbot en Python
Créez votre propre Big Data en Python pour validation
Créez votre propre stéréogramme aléatoire (RDS) en Python.
Essayez d'améliorer votre propre quiz d'introduction avec Python
Importez / rechargez dynamiquement les modules qui ont changé dans Python
Utilisez CASA Toolkit dans votre propre environnement Python
[Road to Intermediate Python] Définissez dans votre propre classe
Importer dynamiquement des scripts en Python
Organiser l'environnement de développement Python
Développement Python avec Visual Studio 2017
Développement Python avec Visual Studio
Essayez de trier vos propres objets avec des files d'attente prioritaires en Python
[Python] Lorsque vous souhaitez importer et utiliser votre propre package dans le répertoire supérieur
Travailler avec LibreOffice en Python: import
Préparez votre premier environnement de développement Python
Créez votre propre classe de structure graphique et son dessin avec python
Les modules et packages en Python sont des "espaces de noms"
[Python] Enregistrez votre propre bibliothèque dans PyPI
Jusqu'à ce que vous installiez votre propre bibliothèque Python
Pour importer votre propre module avec jupyter
Importez vos propres fonctions avec AWS Glue
Ecrire un module python dans fortran en utilisant f2py
Publiez votre propre bibliothèque Python sur Homebrew
Essayez de fouiller votre journal avec Python
Importation de modules et gestion des exceptions en python
Erreur d'importation: aucun module nommé "xxxxxx" dans Python3
Organisez les modules et les packages Python dans le désordre
[Python] Implémentez votre propre classe de type liste à l'aide de collections.UserList
Pièces jointes par e-mail à l'aide de votre compte gmail avec python.
Résumé de la façon d'importer des fichiers dans Python 3
Comment définir votre propre cible dans Sage
Créez rapidement votre propre module avec setuptools (python)
Créez un environnement de développement Python sur votre Mac
Utilisez Python dans votre environnement depuis Win Automation
N'utilisez pas readlines () dans votre instruction Python for!
Différence d'ID d'objet due à l'importation en Python
Importer cv2 ModuleNotFoundError: Aucun module nommé "cv2" dans python3
python: utilisez votre propre classe pour numpy ndarray
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Importer le module Python
Unittest en Python
Époque en Python