Code python Modification échelle d'une vue

Bonjour,

Afin de placer une vue 3D à la bonne échelle sur une feuille automatiquement à partir de Dynamo, j’aimerais créer un code python avec en
ENTREE [0]: la vue 3D
et en
ENTREE [1] : le cartouche de la feuille (A3 ou A2 ou A1 ou A0)

Ensuite j’aimerais écrire un script de ce genre :

While longueur cartouche > longueur vue and largeur cartouche > largeur vue :
** augmenter échelle de la vue**

Ainsi j’aimerais que ma vue 3D soi à l’échelle qui convient en fonction de la taille de la feuille.

Comment faire pour écrire ce script ??

Merci de votre aide
Pauline

Bonjour,
voici une version alternative qui calcule la taille de la fenêtre pour une liste d’échelle et la compare à la taille de la feuille (plutôt que changer l’échelle à chaque itération).

Test sur une feuille avec un cartouche vierge

import clr
import sys
import System
clr.AddReference('ProtoGeometry')
import Autodesk.DesignScript.Geometry as DS

#import Revit API
clr.AddReference('RevitAPI')
import Autodesk
import Autodesk.Revit.DB as DB

#import transactionManager and DocumentManager (RevitServices is specific to Dynamo)
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

blank_titleblock = UnwrapElement(IN[0])
viewport = UnwrapElement(IN[1])
lst_candidate_scale = list(IN[2])
lst_candidate_scale.sort()
final_good_scale = None

current_SheetView = doc.GetElement(blank_titleblock.OwnerViewId)
# get geometry from TitleBlock
bbx_tb = blank_titleblock.get_BoundingBox(current_SheetView)
width_tb = bbx_tb.Max.X - bbx_tb.Min.X
height_tb = bbx_tb.Max.Y - bbx_tb.Min.Y
center_Sheet = (bbx_tb.Max + bbx_tb.Min) * 0.5
#
view_Viewport = doc.GetElement(viewport.ViewId)
# get cropbox from View of Viewport
bbx_view = view_Viewport.CropBox
width_view = bbx_view.Max.X - bbx_view.Min.X
height_view = bbx_view.Max.Y - bbx_view.Min.Y
# find the bestmath of scale
for idx, scale in enumerate(lst_candidate_scale):
	# width of Viewport on the sheet
	width_viewport = width_view / scale
	# height of Viewport on the sheet
	height_viewport = height_view / scale
	if width_viewport < width_tb and height_viewport < height_tb:
		final_good_scale = scale
		break
	
if final_good_scale is not None:
	#Do some action in a Transaction
	TransactionManager.Instance.EnsureInTransaction(doc)
	view_Viewport.Scale = final_good_scale
	doc.Regenerate()
	viewport.SetBoxCenter(center_Sheet)
	TransactionManager.Instance.TransactionTaskDone()
	
OUT = final_good_scale

Note
le code est à modifier/améliorer pour une feuille avec cartouche A4

2 « J'aime »

@Cyril.P
J’ai essayer de reprendre votre code python et il m’indique cette erreur : Avertissement:IronPythonEvaluator.EvaluateIronPythonScript l’opération a échoué.
Traceback (most recent call last):
** File «  », line 32, in **
AttributeError: ‹ FamilySymbol › object has no attribute 'ViewId’

il s’agit de cette ligne là, sachant que j’ai relier les entrées comme suit :


test_vue3D.dyn (91,3 Ko)

Bonjour, vu que c’est écrit viewport.viewid
Il faut peut être lui envoyer une viewport
A la sortie du choix de ta famille de vue est ce bien une viewport
Comme toujours, jamais certain de ce que j’envoies comme information

Cordialement
Christian.stan

1 « J'aime »

L’exemple ci-dessus ne crée pas de feuille, il nécessite que la feuille soit créée et que la vue, soit placée sur la feuille (viewport).
Néanmoins, à partir du même principe, comme il est possible d’obtenir la ‹ BoundingBox › d’un ‹ TitleBock Type › cela semble envisageable de déterminer l’échelle de la vue (sauf si le cartouche est redimensionnable via des paramètres d’instances).

1 « J'aime »

Bon anniversaire M. @Cyril.P
:wink:

1 « J'aime »

Une solution sans passer par la création préalable d’une feuille

import clr
import sys
import System
clr.AddReference('ProtoGeometry')
import Autodesk.DesignScript.Geometry as DS

#import Revit API
clr.AddReference('RevitAPI')
import Autodesk
import Autodesk.Revit.DB as DB

#import transactionManager and DocumentManager (RevitServices is specific to Dynamo)
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

titleblock_type = UnwrapElement(IN[0])
view_ = UnwrapElement(IN[1])
lst_candidate_scale = list(IN[2])
lst_candidate_scale.sort()
final_good_scale = None

# get geometry from TitleBlock
bbx_tb = titleblock_type.get_BoundingBox(None)
width_tb = bbx_tb.Max.X - bbx_tb.Min.X
height_tb = bbx_tb.Max.Y - bbx_tb.Min.Y
#
# get cropbox from View of Viewport
bbx_view = view_.CropBox
width_view = bbx_view.Max.X - bbx_view.Min.X
height_view = bbx_view.Max.Y - bbx_view.Min.Y
# find the bestmath of scale
for idx, scale in enumerate(lst_candidate_scale):
	# width of View on the sheet
	width_view_sc = width_view / scale
	# height of View on the sheet
	height_view_sc = height_view / scale
	if width_view_sc < width_tb and height_view_sc < height_tb:
		final_good_scale = scale
		break
	
OUT = final_good_scale
2 « J'aime »

Bonjour,

La variable with_tb suit l’unité du projet?

Cordialement
Christian.stan

Bonjour,
le script fonctionne avec l’unité interne de Revit (pieds décimaux), indépendamment de l’unité de Projet

1 « J'aime »

Merci de l’info, sur votre premier script python, j’avais un souci sur code, en changeant (blank_titleblock) en (titleblock_type) aux endroits appropriés.
impeccable


merci à vous

cordialement
christian.stan

1 « J'aime »