Script python + application de graphismes via un slider

Articles liés à l’interopérabilité Dynamo avec Revit (éléments, plugins ou API).

Bonjour, quels sont les éléments que je dois ajouter en tête du script python pour pouvoir avoir une application sereine de celui-ci.

J’essaie d’expliquer ce que je cherche à faire (j’espère que cela est possible)
dans le script global (je me suis servi des connaissances que vous m’apportez (merci à toutes et tous))
Dans l’idée, matérialiser l’avancement sur une vue 3d via un slider, des éléments jour après jour.
le codeblock est un travail préparatoire

Dans le noeud Python:
Si slider = 0 (vue globale en fait) tous les propriétés graphiques sont représentées
J_01 à J_30 appliquées avec une séquence de 10 couleurs (J_01=couleur1, J_02 =couleur2, … J_10 = couleur10,J_11=couleur 2 … à J30)
Si slider = 1 (seule J_01= couleur1, les autres Jours non visibles)
.
.
.
Si Slider = 4 (J_01 à J_03 = couleur grise, J_04 =couleur4, les autres Jours non visibles)
.
.
.
Si Slider = 30 (J_01 à J29 = couleur grise, J_30=couleur10

Avancement base30j.dyn (165,6 Ko) Fichier joint
Je vous remercie par avance de vos conseils
Je pense qu’il me faudra créer les 10 couleurs
puis une variable n (celle du slider)
On ne peut avoir qu’un seul out?

cordialement
christian.stan

Bonjour,
J’arrive pour l’instant à créer le slider de l’avancement dynamique pour les J_01 à J_30, je n’arrive pas à gérer le jour J_00 uniquement.


Je cherche à créer une sorte de commutateur
Avec un nœud if je devrais y arriver avec votre aide (comment crée t’on une liste vide) pour remplacer la liste essai?

(Peut être peut-on activer ou désactiver les fils à la sortie d’un nœud de façon automatisé)

Je vous remercie par avance de l’aide apportée

cordialement
christian.stan

re
j’ai trouvé pour liste vide [null];


Il semble que le bloc true ou false du if n’accepte qu’une seule donnée d’entrée avec un adressage de type liste.

Pas possible du coup avec l’état de mes connaissances
je suis preneur si vous avez une solution merci

bonne journée
cordialement

christian.stan

Bonjour @christian_stan
le but est d’ajouter un filtre à chaque incrémentation du slider ou de remplacer le/les filtres existant(s) ?

Bonjour @Cyril.P
De remplacer le/les filtres existant(s)
j’ai réussi mais cela demande (vidéo) à être améliorer (Soit dans un codeblock ou dans un noeud python, je vais essayer, cela me permettra de m’améliorer, mais ton aide sera la bienvenue,merci)
j’ai diviser en 4 zones de travail la partie basse
Avant le Jour J affiché (Couleur Uniforme et visible)
Le jour J affiché (Couleur du J concerné)
Les jours après le J affiché (couleur on s’en moque et non appliqué)
Si le slider est positionné sur le Jour 00 (affichage global couleur en fonction des jours)
J’avais procédé de cette façon n’étant pas sur si l’on pouvait envoyer une liste avec des (true ou false) dans l’entrée hide du noeud View.SetFilterOverrides

cordialement
christian.stanVue avec slider etape 6b.dyn (230,1 Ko)

1 « J'aime »

Au lieu de recréer le filtrer sur chaque intervention pourquoi ne pas juste activer/désactiver?
Tout dépendra de la version de Revit bien sûr

Bonsoir,
Les 30 filtres de vues ne sont créés qu’une seule fois, ils sont réaffectés ensuite comme vous le mentionnez en fonction du jour de coulage (paramètre) piloter par le slider de 0 à 30
(le 0 pour tous les jours visibles avec affectation d’une couleur différente par jour dans une séquence de 10couleurs)
(Le 1 visible avec sa couleur, les 29 autres non visibles)
(Le 2 visible avec sa couleur, le jour 1 en couleur grisée, les 28 autres non visibles)
Et ainsi de suite jusque 30
J’ai réussi à faire une 1ere version assez usine à gaz
J’essaie d’en faire une seconde mieux retravailler

Merci @ vous
Bonne soirée
Cordialement
christian.stan

Ma proposition ne tiendra pas parce que le filtre précédent doit être modifier

Bonjour,
merci de m’avoir apporté un point de vue

cordialement
christian.stan

Merci par vos diverses messages (orientations, pistes ou solutions) ça et là dans les différents posts qui font progresser
Je suis content d’avoir réussi à améliorer
voici script si cela peut être utile aux membres du forum dans une situation analogue
Phasage global + avancement sur 30j.dyn (178,5 Ko)
cordialement
christian.stan

Une alternative sans filtre et en utilisant des dates définit en paramètre au format dd/mm/yyyy (texte).
L’ideal étant de définir une date de début et une date de fin

import sys
import clr
import re
import System
from System.Collections.Generic import List

clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
import Autodesk.Revit.DB as DB

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

pf_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86)
sys.path.append(pf_path + '\\IronPython 2.7\\Lib')
from datetime import datetime, date
import random

def set_colorElems(elements, rvtcolor):
	global view
	global fillPatern
	ovs = OverrideGraphicSettings()
	ovs.SetSurfaceForegroundPatternColor(rvtcolor)
	ovs.SetSurfaceForegroundPatternId(fillPatern.Id)
	for e in elements:
		view.SetElementOverrides(e.Id, ovs)
	ovs.Dispose()

def set_halftoneElems(elements):
	global view
	ovs = OverrideGraphicSettings()
	ovs.SetHalftone(True)
	for e in elements:
		view.SetElementOverrides(e.Id, ovs)
	ovs.Dispose()
	
net_date = IN[0]
nameP = IN[1]
try:
	py_date_input = date(net_date.Year , net_date.Month , net_date.Day )
except:
	py_date_input = None
view = UnwrapElement(IN[2])
random.seed(33)

filterPara = System.Predicate[System.Object](lambda x : x.LookupParameter(nameP) is not None and not System.String.IsNullOrWhiteSpace(x.LookupParameter(nameP).AsString()))
cat_list = [BuiltInCategory.OST_Floors, BuiltInCategory.OST_StructuralColumns, BuiltInCategory.OST_Walls, BuiltInCategory.OST_StructuralFraming]
typed_list = List[BuiltInCategory](cat_list)
filtercat = ElementMulticategoryFilter(typed_list)
elems = List[DB.Element](FilteredElementCollector(doc).WherePasses(filtercat).WhereElementIsNotElementType().ToElements()).FindAll(filterPara)
#
filterPattern = System.Predicate[System.Object](lambda x : "solid" in x.Name)
fillPatern = List[DB.Element](FilteredElementCollector(doc).OfClass(DB.FillPatternElement).ToElements()).Find(filterPattern)

dict_date = {}
for e in elems:
	datestr = e.LookupParameter(nameP).AsString()
	dateobj = datetime.strptime(datestr, '%d/%m/%Y').date()
	if dateobj not in dict_date:
		dict_date[dateobj] = [e]
	else:
		dict_date[dateobj].append(e)
#Do some action in a Transaction
TransactionManager.Instance.EnsureInTransaction(doc)
for dateobj, lst_elems in dict_date.items():
	view.UnhideElements(List[ElementId]([x.Id for x in lst_elems]))
	doc.Regenerate()
	rvtcolor = DB.Color(random.randint(0,255), random.randint(0,255), random.randint(0,255))
	if py_date_input is None or  dateobj == py_date_input:
		set_colorElems(lst_elems, rvtcolor)
	elif dateobj < py_date_input:
		set_halftoneElems(lst_elems)
	else:
		view.HideElements(List[ElementId]([x.Id for x in lst_elems]))
TransactionManager.Instance.TransactionTaskDone()

OUT = elems
2 « J'aime »

Bonjour,
wouah, il y a du level chez vous , un grand merci pour votre travail
en plus, vous êtes conforme au titre du sujet (contrairement à moi qui suis parti sur Designscript)

Je vais regarder votre script python, dans les détails
et mieux relire dynamoprimer
Comment savez vous les classes (le terme que j’utilise n’est pas forcément le bon) que vous devez importer en 1er lieu
exemple:
clr.AddReference(‹ RevitServices ›)
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
Celui ci permet d’appliquer TransactionManager (ouvrir puis fermer)

Je pense que vous n’avez aucune restriction de catégories affectables du coup à 1ere lecture
et vous êtes sur base de 3 couleurs et pas de limites en terme de durée (si ce n’est que les dates de début et fin)

cordialement
christian.stan

… en anglais on dit un « understatement » :wink:
Non seulement @Cyril.P est très fort mai encore plus généreux de sont temps alors… « Je dirais plus mon cher Watson »

2 « J'aime »

l’import des Librairies/Modules/Espaces de Nommage se complètent et/ou se modifient pendant la rédaction.
Généralement au début de la rédaction, on part sur un modèle (template), durant la rédaction, on complète ou affine avec éventuellement d’autres imports nécessaires, puis à la fin, on fait une « revue » et on supprime tous les imports et les espace de nommage non nécessaires.

L’idéal est de ne pas avoir recours des imports implicite des Classes avec import *

  • Exemple de modèle avec des imports explicite et implicite

Code

import sys
import clr
import System
# Import ProtoGeometry
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Import RevitAPI
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *

# Import DocumentManager and TransactionManager
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application

# Import ToProtoType, ToRevitType geometry conversion extension methods
clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.ImportExtensions(Revit.Elements)

Quelques Ressources à étudier

https://ironpython.net/documentation/dotnet/dotnet.html#loading-net-assemblies
https://ironpython.net/documentation/dotnet/dotnet.html#importing-net-namespaces

3 « J'aime »

Bonjour,
Merci de votre retour d’expérience et savoirs. :+1:

cordialement
christian.stan

1 « J'aime »