29 sept. 2020

[Dynamo += Python] Conversion de Coordonnées

 




Vous avez des coordonnées, vous voulez les convertir vers un autre système de coordonnées, voici quelques exemples...





  • Pour convertir des coordonnées Topographique en coordonnées Interne (relative)

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

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

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

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

toList = lambda x : x if hasattr(x, '__iter__') else [x]

lst_DSPt = toList(IN[0])
out = []

for pt in lst_DSPt:
	pt = pt.ToXyz()
	#translate point from Shared coordinates to Internal
	translatedpointB = doc.ActiveProjectLocation.GetTotalTransform().OfPoint(pt)
	out.append(translatedpointB.ToPoint())
OUT = out


  • Pour convertir des coordonnées Interne (relative) en coordonnées Topographique 
import sys
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

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

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

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

toList = lambda x : x if hasattr(x, '__iter__') else [x]

lst_DSPt = toList(IN[0])
out = []

for pt in lst_DSPt:
	pt = pt.ToXyz()
	#translate point from  Internal to Shared coordinates
	translatedpointB = doc.ActiveProjectLocation.GetTotalTransform().Inverse.OfPoint(pt)
	out.append(translatedpointB.ToPoint())
OUT = out


  • Pour convertir des coordonnées de Projet en coordonnées Topographique (avec un Offset)


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

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

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

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

pt = IN[0].ToXyz()

# get Offset beetween internal and Base Project Point
basePt = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_ProjectBasePoint).FirstElement()
ele = basePt.get_Parameter(BuiltInParameter.BASEPOINT_ELEVATION_PARAM).AsDouble()
baseTranslatedPt = XYZ(0,0,ele) - doc.ActiveProjectLocation.GetTotalTransform().Inverse.OfPoint(XYZ.Zero)
# calculation
translatedpointA = doc.ActiveProjectLocation.GetTotalTransform().Inverse.OfPoint(pt) + baseTranslatedPt
OUT = translatedpointA.ToPoint(), "Offset BasePoint/Internal : {}".format(baseTranslatedPt.ToPoint().Z)

  • Pour convertir des coordonnées Topographique en coordonnées de Projet 
  
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

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

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

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

toList = lambda x : x if hasattr(x, '__iter__') else [x]

lst_DSPt = toList(IN[0])
out = []

basePt = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_ProjectBasePoint).FirstElement()
ew = basePt.get_Parameter(BuiltInParameter.BASEPOINT_EASTWEST_PARAM).AsDouble()
ns = basePt.get_Parameter(BuiltInParameter.BASEPOINT_NORTHSOUTH_PARAM).AsDouble()
ele = basePt.get_Parameter(BuiltInParameter.BASEPOINT_ELEVATION_PARAM).AsDouble()
rot = basePt.get_Parameter(BuiltInParameter.BASEPOINT_ANGLETON_PARAM).AsDouble()
locBasePoint = XYZ(ew, ns, ele)
# alternative
# locBasePoint = basePt.get_BoundingBox(None).Min
#
pos = doc.ActiveProjectLocation.GetProjectPosition( XYZ.Zero )
posPt = XYZ( pos.EastWest,  pos.NorthSouth , pos.Elevation )
vect = locBasePoint - posPt
#get Transform Survey
transfSurvey = doc.ActiveProjectLocation.GetTotalTransform()

for pt in lst_DSPt:
	pt = pt.ToXyz()
	out.append(transfSurvey.OfPoint(pt).Subtract(vect).ToPoint())
OUT = out
  • Pour convertir des coordonnées Interne (relative) en coordonnées Projet
    
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

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

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

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

toList = lambda x : x if hasattr(x, '__iter__') else [x]

lst_DSPt = toList(IN[0])
out = []

projectPoint = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_ProjectBasePoint).FirstElement()
projectXyz = projectPoint.get_BoundingBox(None).Min

for pt in lst_DSPt:
	pt = pt.ToXyz()
	out.append(pt.Subtract(projectXyz).ToPoint() )
OUT = out 



  • Obtenir les informations sur les sites d'un modèle
   
sites = FilteredElementCollector(doc).OfClass(ProjectLocation)
for site in sites:
	pos = site.GetProjectPosition( XYZ.Zero )
	posPt = XYZ( pos.EastWest,  pos.NorthSouth , pos.Elevation )
	siteLocation = site.GetSiteLocation()

Et puisque l'on parle de coordonnées de projet, j'en profite pour rappeler que depuis Revit 2020.2 le trombone a été retiré sur le point de base de Projet, donc si vous déplacer le réticule associé vous ne déplacez plus les éléments du modèle.
Pour cela il faut désormais utiliser le bouton "Replacer le Projet".






2 commentaires:

  1. Bonjour, super présentation. Merci
    Serait possible que dans le code python, il puisse reconnaitre des coordonnées provenant d'une liste de coordonnées ? j'ai essayé j'ai l'impression que ca ne fonctionne pas.

    RépondreSupprimer
    Réponses
    1. Ok, je vais rajouter un exemple pour les listes en entrées

      Supprimer