Script Python pour Rhino 8 qui ajoute une pastille sur tous les objets d'un calque spécifique, y compris les blocks et objets à l'intérieur de blocks. Utile lorsque l'on a des objets intégrés dans des sucessions de blocks et que l'on n'arrive plus à les retrouver ...
Le script est adaptable également pour qui chercher à calculer les centres de tous les objets d'une scène, y compris ceux à l'intérieurs de blocks.
Où ce sont cachés les objets du calque rouge ?
#! python 3
import rhinoscriptsyntax as rs
import Rhino
def dotIt(obj,centroid):
objLayer = rs.ObjectLayer(obj)
if objLayer == targetLayer:
rs.AddTextDot("Here!",centroid)
def getBlockOrigin(block):
irefObj = rs.coercerhinoobject(block)
idef = irefObj.InstanceDefinition
blockOrigin = irefObj.InsertionPoint
return blockOrigin
def getCentroid(obj): #cannot be directly applied to a block
bb=rs.BoundingBox(obj)
if bb:
centroid = ((bb[0]+bb[6])/2)
return centroid
def loopBlock(block, origin):
blockOrigin = getBlockOrigin(block) + origin
blockCentroid = origin + getCentroid(block)
dotIt(block,blockCentroid)
objectsInBlock = rs.BlockObjects(rs.BlockInstanceName(block))
for obj in objectsInBlock:
if rs.ObjectType(obj) != 4096: #is not a block
objCentroid = blockOrigin + getCentroid(obj)
dotIt(obj,objCentroid)
else:
loopBlock(obj, blockOrigin)
targetLayer = rs.GetLayer()
objs = rs.AllObjects(include_lights=False, include_grips=False)
if objs:
for obj in objs:
if rs.ObjectType(obj) == 4096: #is a block
loopBlock(obj, Rhino.Geometry.Point3d.Origin)
else:
dotIt(obj,getCentroid(obj))
else:
print("Could not select all objects.")
rs.Redraw()
Démographie des régions européennes entre 1992 et 2022 en 9 familles
Qgis
6 déc 2023
Performance démographique relative des régions selon le classement de l'APR
Groupe
Rang
Delta
++++
1 à 7
7
+++
8 à 27
20
++
28 à 47
20
+
48 à 67
20
=
68 à 76
9
-
77 à 96
20
--
97 à 116
20
---
117 à 136
20
----
136 à 143
7
Evolution démographique des régions éuropéennes (NUTS2) par tranches de cinq années avec répartition en neuf groupes selon la performance relative sur la période. Le rouge foncé correspond aux régions en plus forte croissance sur la période, le vert foncé à celles avec la plus faible augmentation. Le jaune correspond aux régions dans la moyenne. Les données et le regroupement sont issus d'une note de l'APR.
Selon la notice :
La classification proposée est construite d’après le rang des régions, par symétrie par rapport à la médiane. Ainsi le
symbole ++++ correspond-il aux 7 régions les plus dynamiques (approximativement 5%), le suivant aux 20 régions
suivantes, etc. La zone médiane correspond aux 7 régions centrales.
Convertir une série d'image en vidéo (ici pour une série d'image en img001.jpg, img002.jpg, ... avec le %03d pour définir le nombre de chiffre dans le numérotage)
Télécharger un flux HLS. La première commande affiche la liste des programmes disponibles, la seconde télécharge un programme spécifique avec le paramètre p:1 (ici le second programme).
Les textures de tomettes en action (V-Ray Next 2 et Rhino)
Textures de tomettes provençales continue (seamless) avec trois couches : diffuse, bump et specular. La couche specular est à placer dans "Reflection color". Les textures sont prévues pour un pavage de 150 x 150 cm.
Sortie en PDF A4 résolution 150 ppp avec des marges blanches (80%). La résolution des images elles-mêmes est donc inférieure. Accepte tout type d'image.
Créer un dossier à la date du jour dans le menu contextuel
Windows
14 avr 2022
Pour ajouter une fonctionnalité "Créer un dossier à la date du jour" intégrée au menu contextuel (clic droit) de Windows.
Script à nommer makeDirToday.bat et placer dans le dossier C:\Program Files\ContextualScripts – ou ailleurs si l'on modifie également le chemin dans le fichier registre plus bas. Il est calibré pour les versions française ou allemande de Windows de format de date par défaut DD/MM/YYYY. Il faudra donc l'adapter sur un Windows anglais, par exemple.
@echo off
mkdir %date:~-4,4%"-"%date:~-7,2%"-"%date:~0,2%
Fichier registre .reg pour installer le script dans le menu contextuel. Double-clic dessous pour l'installer. À bien enregistrer avec encodage ANSI (Windows-1252) pour gérer les accents.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\Background\shell\makeDirToday]
@="&Créer un dossier à date"
"Icon"="%SystemRoot%\\System32\\shell32.dll,71"
[HKEY_CLASSES_ROOT\Directory\Background\shell\makeDirToday\command]
@="C:\\Program Files\\ContextualScripts\\makeDirToday.bat \"%V\""
import os
import pathlib
extensions = {}
for root, dirs, files in os.walk("./"):
for file in files:
extension = pathlib.Path(file).suffix
if extension not in extensions:
extensions[extension] = 1
else:
extensions[extension] += 1
sortedExtensions = dict(sorted(extensions.items(), key=lambda x: x[1], reverse=True))
print(sortedExtensions)
# End
input("Press Enter to close")
Script Python pour aspirer les documents numérisés de la Zentral- und Landesbibliothek de Berlin. Extrait les pages en JPG et assemble un PDF. Les URL soumis doivent être du type : https://digital.zlb.de/viewer/image/16054086_1911/12/, c'est à dire l'adresse quand vous lisez une page depuis la visionneuse.
import os
import re
from PIL import Image # "pip install Pillow" to install package
import requests # "pip install requests" to install package
import shutil
import mimetypes
from bs4 import BeautifulSoup # "pip install beautifulsoup4" to install package
headers = {'User-Agent': 'Mozilla/5.0'}
# functions
def downloadFile(url, fileName):
url = url.replace("\\","")
response = requests.get(url, stream=True)
content_type = response.headers['content-type']
extension = mimetypes.guess_extension(content_type)
fileName += extension
with open(fileName, 'wb') as out_file:
shutil.copyfileobj(response.raw, out_file)
del response
def getRecordName(url):
reg = re.match(r"https?:\/\/digital.zlb.de\/viewer\/image\/([A-Za-z0-9_]*)\/", url)
if reg:
return reg.group(1)
else:
print("Erreur : format d'URL incorrect. Exemple correct https://digital.zlb.de/viewer/image/16054086_1911/9/LOG_0006/")
return None
def getMaxPagesFromRecord(record):
url = "https://digital.zlb.de/viewer/image/"+record+"/"
response = requests.get(url, headers=headers)
if response:
reg = re.search(r"rft\.tpages=(\d+)&", str(response.text))
if reg:
return int(reg.group(1))
else:
print("Impossible de trouver le nombre maximal de page automatiquement.")
return int(input("Nombre de pages à extraire :"))
else:
print("Erreur : la page ZLB n'est pas chargeable.")
return None
def findImageFromUrl(url,resolution):
response = requests.get(url, headers=headers)
if response:
soup = BeautifulSoup(response.text,"html.parser")
metaImage = soup.findAll("meta", {"property" : "og:image"})
img = metaImage[0].get("content")
img = img.replace("/300,/","/"+str(resolution)+",/")
return img
else:
print("Erreur : la page ZLB n'est pas chargeable.")
#input
inputUrl = input("Adresse de la page ZLB à aspirer :")
resolution = int(input("Résolution (1300 recommandé) :"))
#get record infos
record = getRecordName(inputUrl)
if record:
maxPages = getMaxPagesFromRecord(record)
#download pages as JPG
if record and maxPages:
i = 1
while i < (maxPages+1):
print("Page",i,"sur",maxPages)
url = "https://digital.zlb.de/viewer/image/"+record+"/"+str(i)+"/"
img = findImageFromUrl(url,resolution)
downloadFile(img, record+"_"+str(i).zfill(8))
i += 1
#assemble PDF
filesInFolder = os.listdir()
imagesInFolder = []
imagesRGBInFolder = []
for file in filesInFolder:
ext = os.path.splitext(file)[1]
imageExtensions = [".jpg",".png",".gif",".jpeg",".svg"]
if ext in imageExtensions:
imagesInFolder.append(file)
img = Image.open(file)
if img.mode == "RGBA":
img = img.convert(RGB)
imagesRGBInFolder.append(img)
if imagesRGBInFolder:
imagesRGBInFolder[0].save(record+".pdf", save_all=True, quality=85, append_images=imagesRGBInFolder[1:])
#delete JPG
for file in imagesInFolder:
os.remove(file)
Pour éviter des erreurs de mémoire avec les documents de beaucoup de pages, il faut utiliser une installation 64bits de Python.