Ich habe einen Artikel Verwenden eines externen Editors für die Python-Entwicklung von Grasshopper geschrieben, aber wenn ich versuche, ein Python-Programm ernsthaft mit Grasshopper zu entwickeln, eine Datei Dann passt der Code nicht, sodass Sie Ihre eigenen Funktionen usw. in einer separaten Datei trennen möchten. Außerdem ist es beim Lesen einer Bilddatei oder CSV oder beim Erstellen eines Plug-Ins erforderlich, die Dateistruktur fest zu verwalten, damit auf die Datei durch einen relativen Pfad verwiesen werden kann. Dieses Mal werde ich erklären, wie Sie die Verwaltung Ihres Codes mithilfe Ihrer eigenen Module und Konfigurationsdateien vereinfachen können.
Dieses Mal werde ich mit dieser Dateistruktur erklären.
Es gibt `gh_file.gh``` und`
function.py direkt unter dem Projektordner und um das Modul `` `mod.py
im Ordner`` module``` aufzurufen Erstellen Sie ``
__ init __. Py. Erstellen Sie außerdem `` `radius_range.json
im Ordner` `` data``` als Einstellungsdatei.
.
├── module
│ └── __init__.py
│ └── mod.py
├── data
│ └── radius_range.json
└── function.py
└── gh_file.gh
In diesem Beispielprojekt wird das folgende Programm als Beispiel verwendet.
--Verwenden Sie Pop2D mit GH, um mehrere Punkte an zufälligen Stellen zu generieren --Geben Sie eine Liste mit Punkten in function.py ein
Die Einstellungsdatei `` `radius_range.json``` definiert den" Minimalwert "," Maximalwert "und" Schritt ", die in die Zufallsfunktion aufgenommen werden sollen.
radius_range.json
{
"min": 1,
"max": 10,
"step": 1
}
Erstellen Sie im Modul `mod.py``` eine einfache Funktion, die json in der Konfigurationsdatei aufruft und eine Zufallszahl zurückgibt. Ich möchte diese Funktion namens
random_radius``` von
`` function.py``` aufrufen.
mod.py
# -*- coding: utf-8 -*-
import json
from io import open
import random
def random_radius():
#Relativer Pfad der JSON-Datei
path = "./data/radius_range.json"
#Öffnen Sie die JSON-Datei
with open(path, encoding='utf-8') as f:
d = json.load(f)
#Parameter aus Konfigurationsdatei abrufen
min = d['min']
max = d['max']
step = d['step']
#Gibt eine Zufallszahl zurück
return random.randrange(min,max,step)
Die GH-Datei `` `gh_file.gh``` ist wie folgt eingestellt.
Klicken Sie unter Datei lesen mit der rechten Maustaste auf F → Wählen Sie eine vorhandene Datei aus, die funktionieren soll.Geben Sie py an.
Informationen zum Lesen externer Dateien finden Sie unter [Verwenden eines externen Editors für die Python-Entwicklung von Grasshopper](https://qiita.com/keiwatanabe/items/9eb6a7d6749f5e586f7f).
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263714/1f8b46bc-c4e4-a41d-84e7-474c58cd383f.png)
# Verzeichnis der GHPython-Dateien
Versuchen wir nun für das Hauptthema den folgenden Code in function.py, um zu verstehen, warum wir diesen Artikel schreiben.
#### **`function.py`**
```python
import rhinoscriptsyntax as rs
from module import mod
a = mod.random_radius()
Dann denke ich, dass ein solcher Fehler auftreten wird.
1. Solution exception:Pfad'C:\Program Files\Rhino 6\System\data\radius_range.json'Einige von ihnen wurden nicht gefunden.
Wenn ich die Fehlermeldung lese, heißt es, dass `radius_range.json``` nicht gefunden werden kann. Ich kann
mod.py``` aufrufen, weil ich nach der json-Datei gesucht habe, aber es scheint, dass die json-Datei nach
Program Files``` gesucht hat. Ich rufe
function.py``` im selben Verzeichnis aus einer GH-Datei im selben Verzeichnis auf, aber aus irgendeinem Grund beziehe ich mich auf
`` Programme```. ..
** Warum kann ich nicht korrekt auf radius_range.json verweisen, obwohl mod.py korrekt gelesen werden kann? ** ** **
Um die Ursache zu verstehen, müssen Sie den ** Modul-Suchpfad ** und das ** aktuelle Verzeichnis ** verstehen.
Dies ist eine Liste von Pfaden, nach denen Python beim Importieren von Standard- oder externen Bibliotheken sucht. Um dies zu überprüfen, versuchen Sie den folgenden Code in derselben GH-Datei.
import sys
print(sys.path)
Dann wird es so zurückgegeben. Das `` `'Z: \ Projects \ demo-ghpython-package'``` am Anfang ist das Verzeichnis, in dem ich diese Projektdatei gespeichert habe, und der Speicherort, an dem die GH-Datei gespeichert ist.
['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']
Mit anderen Worten, Module im selben Verzeichnis wie die GH-Datei können über diesen Pfad importiert werden. Jetzt wissen Sie, warum `` `mod.py``` importiert werden konnte.
Im aktuellen Verzeichnis wird Python ausgeführt. Um dies zu überprüfen, versuchen Sie den folgenden Code in derselben GH-Datei wie zuvor.
import os
print(os.getcwd())
In meinem Fall wird das Ergebnis dann wie folgt zurückgegeben.
C:\Program Files\Rhino 6\System
Anscheinend lief der Python-Code für die GH-Datei in Rhino 6 in "Programme". Wenn auf die JSON-Datei verwiesen wird, wurde sie als ** relativer Pfad ** wie `` `. / Data / ~~ .json``` beschrieben. Suchen Sie daher im Datenverzeichnis im obigen Pfad nach der JSON-Datei. Ich sagte, es gibt keine solche Datei! Es scheint, dass ein Fehler aufgetreten ist.
Es gibt zwei Möglichkeiten.
Ich denke, es gibt Situationen, in denen es besser ist, mit einem absoluten Pfad anzugeben, aber es funktioniert, wenn die Daten wie diesmal in derselben Projektdatei gespeichert sind oder wenn die Möglichkeit besteht, dass derselbe Code auf einem anderen PC ausgeführt wird. Nein. Daher werden wir diesmal Methode 2 verwenden.
Wechseln Sie zu `` `function.py```, um das aktuelle Verzeichnis wie folgt zu verschieben.
function.py
import rhinoscriptsyntax as rs
from module import mod
import os
#Rufen Sie das Verzeichnis ab, das den Ordner GH file = project enthält
base_dir = os.path.dirname(ghdoc.Path)
#Verschieben Sie das aktuelle Verzeichnis in den Projektordner
os.chdir(base_dir)
a = mod.random_radius()
-- ghdoc.Path
gibt den Pfad der ausgeführten GH-Datei zurück. In diesem Fall ist der Verzeichnispfad dieses Pfads der Pfad des Projektordners. Setzen Sie ihn daher auf `base_dir``` Ich werde. --Ändern Sie das aktuelle Verzeichnis mit
os.chdir``` in
`` base_dir```.
Dann kam eine Zufallszahl von einem sicher zurück.
Ursprünglich wollte ich von einem Kreisobjekt ausgeben, also ändere den Code, um einen Kreis mit der zurückgegebenen Zufallszahl als Radius zu schreiben.
function.py
import rhinoscriptsyntax as rs
from module import mod
import os
#Rufen Sie das Verzeichnis ab, das den Ordner GH file = project enthält
base_dir = os.path.dirname(ghdoc.Path)
#Verschieben Sie das aktuelle Verzeichnis in den Projektordner
os.chdir(base_dir)
circles = []
for pt in pts:
#Definieren Sie eine Ebene, die einen Kreis zeichnet
plane = rs.MovePlane(rs.WorldXYPlane(), pt)
#Holen Sie sich einen zufälligen Radius
radius = mod.random_radius()
#Generieren Sie einen Kreis und fügen Sie ihn der Liste hinzu
circles.append(rs.AddCircle(plane,radius))
a = circles
Der Yen wird endlich zurückgegeben. Obwohl ich hart gearbeitet habe, ist das Ergebnis nüchtern lol
Diesmal war es ein einfaches Programm, das einen zufälligen Bereich in eine Einstellungsdatei schreibt, ihn mithilfe eines Moduls liest und an das Hauptprogramm übergibt. Es ist jedoch sehr effektiv beim Lesen von Bilddateien und einer großen Menge von CSV. Bitte beziehen Sie sich darauf, wenn Sie ein Plug-In mit Python erstellen.
https://note.nkmk.me/python-os-getcwd-chdir/
https://note.nkmk.me/python-import-module-search-path/
Recommended Posts