Adaptive Family - Transform Troubles

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() :smiley:

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

3 Likes