Moving Speckle Objects with API

Yes, done it!!!
I need to store all transformations

// Définir le type de l'objet contenant TreeNode et Box3
type TypeRevitSpeckle = {
  node: TreeNode;
  currentCenter: Vector3;
  transformations: Vector3;
  batchObjects: BatchObject[]; // Liste des objets batch associés
};

Here is my definitive code :slightly_smiling_face:

//Function to Move current TreeNode
  function MoveTreeNode() {
    if (!_treeNodeSelected) return;
    const currentElementId = _treeNodeSelected.model.raw.elementId;
    if (!currentElementId) return;
    if (!typeRevitSpeckles) return;

    // Affichage des centres de chaque boîte englobante avec window.alert
    // Vérifier si SpecialityEquipmentNodes est vide ou null
    if (typeRevitSpeckles) {
      // Trouver le TypeRevitSpeckle correspondant à l'élément sélectionné
      const foundTypeRevitSpeckle = findTypeRevitSpeckleByElementId(
        typeRevitSpeckles,
        currentElementId
      );

      // Affichage des TreeNodes trouvés
      //console.log(`Number of filteredNode with elementId ${elementIdToSearch} is ${filteredNodes.length}`);
      if (foundTypeRevitSpeckle) {
        /*      
          node: TreeNode;
          currentCenter: Vector3;
          transformations: Vector3;
          batchObjects: BatchObject[]; // Liste des objets batch associés
        */
        const tn: TreeNode = foundTypeRevitSpeckle.node;
        const currentCenter = foundTypeRevitSpeckle.currentCenter;
        const lastTransformation = foundTypeRevitSpeckle.transformations;

        /*calcul du vecteur de déplacement par rapport à la position speckle
        de  l'objet sélectionné
        */
        const newPosition = new Vector3(
          REVIT_COORDINATES.x,
          REVIT_COORDINATES.y,
          REVIT_COORDINATES.z
        );

        const translation = new Vector3(
          REVIT_COORDINATES.x - currentCenter.x,
          REVIT_COORDINATES.y - currentCenter.y,
          REVIT_COORDINATES.z - currentCenter.z
        );

        if (isNaN(translation.x)) {
          translation.x = 0;
        }
        if (isNaN(translation.y)) {
          translation.y = 0;
        }
        if (isNaN(translation.z)) {
          translation.z = 0;
        }
        
        lastTransformation.add(translation);
        /*
          node: TreeNode;
          currentCenter: Vector3;
          transformations: Vector3;
          batchObjects: BatchObject[]; // Liste des objets batch associés
        */

        foundTypeRevitSpeckle.batchObjects.forEach(
          (batchObject: BatchObject) => {
            batchObject.transformTRS(
              lastTransformation,
              undefined,
              undefined,
              undefined
            );
          }
        );

        /*
        moveExtension.MoveTreeNode(
          _treeNodeSelected,
          translation,
          currentCenter
        );
        */

        viewer.requestRender();

        /*
        type TypeRevitSpeckle = {
          node: TreeNode;
          currentCenter: Vector3;
          transformations: Vector3;
          batchObjects: BatchObject[]; // Liste des objets batch associés
        };
        */
        const foundIndex = typeRevitSpeckles.findIndex(
          (item) => item.node.model.raw.elementId === currentElementId
        );
        if (foundIndex !== -1) {
          //MAJ du foundTypeRevitSpeckle
          typeRevitSpeckles[foundIndex].currentCenter = lastTransformation;
        }

        typeRevitSpeckles.forEach((item, index) => {
          if (item.node.model.raw.elementId != currentElementId) return;
          console.group("After moving :");
          console.log("Node elementid :", item.node.model.raw.elementId);
          console.log(
            "Current Center after translation is :",
            item.currentCenter
          );
          console.groupEnd();
        });
        
      } else {
        console.log(
          `No TypeRevitSpeckle found with elementId ${currentElementId}`
        );
      }
    }
  }
2 Likes