So I think this is just how transforms work, you have to do a rotation and translation.
Trying to put this all in one python node gave me the same problems, I had to run the code twice with commented out rotation/transaltion to make it work, but now i found the root of all evil:
The key to success is doc.Regenerate()
All working fine now! Thanks for the help!
import clr
import sys
sys.path.append('C:\Program Files (x86)\IronPython 2.7\Lib')
import System
from System import Array
from System.Collections.Generic import *
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
clr.AddReference("RevitAPI")
clr.AddReference("RevitAPIUI")
import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
doc = DocumentManager.Instance.CurrentDBDocument
def create_rotation_transform(sourceCS, targetCS):
sourceTransform = Transform.Identity
sourceTransform.Origin = XYZ(0,0,0)
sourceTransform.BasisX = sourceCS.XAxis.Normalized().ToXyz()
sourceTransform.BasisY = sourceCS.YAxis.Normalized().ToXyz()
sourceTransform.BasisZ = sourceCS.ZAxis.Normalized().ToXyz()
sourceTransformInverse = sourceTransform.Inverse
targetTransform = Transform.Identity
targetTransform.Origin = XYZ(0,0,0)
targetTransform.BasisX = targetCS.XAxis.Normalized().ToXyz()
targetTransform.BasisY = targetCS.YAxis.Normalized().ToXyz()
targetTransform.BasisZ = targetCS.ZAxis.Normalized().ToXyz()
return sourceTransformInverse.Multiply(targetTransform)
def create_translation_transform(sourcePoint, targetPoint):
return Transform.CreateTranslation(targetPoint - sourcePoint)
def apply_transform(famInst, transform):
try:
AdaptiveComponentInstanceUtils.MoveAdaptiveComponentInstance(famInst, transform, True)
except Exception as ex:
return str(ex)
adaptive_components = UnwrapElement(IN[0])
sourceCSs = UnwrapElement(IN[1])
targetCSs = UnwrapElement(IN[2])
for component, sourceCS, targetCS in zip(adaptive_components, sourceCSs, targetCSs):
# Rotation
componentLocation1 = component.Location.Point
rotationTransform = create_rotation_transform(sourceCS, targetCS)
TransactionManager.Instance.EnsureInTransaction(doc)
apply_transform(component, rotationTransform)
TransactionManager.Instance.TransactionTaskDone()
doc.Regenerate()
# Translation
componentLocation = component.Location.Point
translationTransform = create_translation_transform(componentLocation, targetCS.Origin.ToXyz())
TransactionManager.Instance.EnsureInTransaction(doc)
apply_transform(component, translationTransform)
TransactionManager.Instance.TransactionTaskDone()
componentLocation2 = component.Location.Point
OUT = adaptive_components