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.
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
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
}
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)
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.
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? ** **
Pour comprendre la cause, vous devez comprendre le ** chemin de recherche du module ** et le ** répertoire courant **.
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é.
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.
Il y a deux manières.
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.
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é.
À 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
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.
https://note.nkmk.me/python-os-getcwd-chdir/
https://note.nkmk.me/python-import-module-search-path/
Recommended Posts