Forum

Author Topic: line shape between two markers  (Read 4198 times)

Iluvathar

  • Newbie
  • *
  • Posts: 37
    • View Profile
line shape between two markers
« on: November 12, 2024, 06:15:10 PM »
hello
i'm trying to build a script to create à line between two markers to have exact location for profile calculation i'm using the bouding box to place the markers (working) but the shape does not appear at the right place
here is the script :
import Metashape

def place_corner_markers(chunk):
    """Place des marqueurs aux coins de la bounding box pour les coins supérieurs avant."""
    region = chunk.region
    T = chunk.transform.matrix

    # Taille, centre et rotation de la bounding box
    size = region.size
    center = region.center
    R = region.rot

    # Coordonnées locales pour les coins supérieurs avant de la bounding box
    front_top_left_local = Metashape.Vector([-0.5 * size.x, 0.5 * size.y, 0.5 * size.z])
    front_top_right_local = Metashape.Vector([0.5 * size.x, 0.5 * size.y, 0.5 * size.z])

    # Transformations en coordonnées globales
    front_top_left_global = T.mulp(center + R * front_top_left_local)
    front_top_right_global = T.mulp(center + R * front_top_right_local)

    # Ajout des marqueurs pour chaque coin
    marker_left = chunk.addMarker()
    marker_left.reference.location = front_top_left_global
    marker_left.label = "Front Top Left"

    marker_right = chunk.addMarker()
    marker_right.reference.location = front_top_right_global
    marker_right.label = "Front Top Right"

    print("Marqueurs ajoutés aux coins supérieurs avant de la bounding box.")
    return marker_left, marker_right

def create_line_from_markers(chunk, marker_left, marker_right):
    """Créer une polyligne en utilisant les positions exactes des marqueurs spécifiés."""
    # Utiliser les positions globales exactes des marqueurs
    point1 = marker_left.reference.location
    point2 = marker_right.reference.location

    # Création de la ligne entre les deux marqueurs
    if not chunk.shapes:
        chunk.shapes = Metashape.Shapes()
        chunk.shapes.crs = chunk.crs  # Définit le système de coordonnées des shapes sur celui du chunk

    group = chunk.shapes.addGroup()
    group.label = "Front Top Edge"

    # Créer la polyligne en utilisant les coordonnées globales des marqueurs
    shape = chunk.shapes.addShape()
    shape.geometry = Metashape.Geometry.LineString([point1, point2])
    shape.label = "Front Top Edge Line"
    shape.group = group

    print("La polyligne alignée sur les marqueurs a été créée avec succès.")

# Exécution des fonctions
doc = Metashape.app.document
chunk = doc.chunk
if chunk:
    marker_left, marker_right = place_corner_markers(chunk)
    create_line_from_markers(chunk, marker_left, marker_right)
else:
    print("Aucun chunk trouvé dans le document.")


any solution ?

Paulo

  • Hero Member
  • *****
  • Posts: 1498
    • View Profile
Re: line shape between two markers
« Reply #1 on: November 12, 2024, 07:31:52 PM »
Bonjour lluvathar,

I think your global coordinates are defined in the geocentric CS and not chunk CS, So you must apply chunk.crs,project function to these 2 lines:

    front_top_left_global = chunk.crs.project(T.mulp(center + R * front_top_left_local))
    front_top_right_global = chunk.crs.project(T.mulp(center + R * front_top_right_local))

Hope this works for you
« Last Edit: November 12, 2024, 08:19:17 PM by Paulo »
Best Regards,
Paul Pelletier,
Surveyor

Iluvathar

  • Newbie
  • *
  • Posts: 37
    • View Profile
Re: line shape between two markers
« Reply #2 on: November 12, 2024, 08:19:32 PM »
i changed the code to match with your suggestion

here is the full code

import Metashape

def place_corner_markers(chunk):
    """Place des marqueurs aux coins de la bounding box pour les coins supérieurs avant."""
    region = chunk.region
    T = chunk.transform.matrix

    # Taille, centre et rotation de la bounding box
    size = region.size
    center = region.center
    R = region.rot

    # Coordonnées locales pour les coins supérieurs avant de la bounding box
    front_top_left_local = Metashape.Vector([-0.5 * size.x, 0.5 * size.y, 0.5 * size.z])
    front_top_right_local = Metashape.Vector([0.5 * size.x, 0.5 * size.y, 0.5 * size.z])

    # Transformation en coordonnées globales (géocentriques) puis projection en CRS du chunk
    front_top_left_global = chunk.crs.project(T.mulp(center + R * front_top_left_local))
    front_top_right_global = chunk.crs.project(T.mulp(center + R * front_top_right_local))

    # Ajout des marqueurs pour chaque coin en utilisant les coordonnées projetées
    marker_left = chunk.addMarker()
    marker_left.reference.location = front_top_left_global
    marker_left.label = "Front Top Left"

    marker_right = chunk.addMarker()
    marker_right.reference.location = front_top_right_global
    marker_right.label = "Front Top Right"

    print("Marqueurs ajoutés aux coins supérieurs avant de la bounding box (en CRS).")
    return marker_left, marker_right

def create_line_from_markers(chunk, marker_left, marker_right):
    """Créer une polyligne en utilisant les positions exactes des marqueurs spécifiés."""
    # Utiliser les positions exactes des marqueurs projetées en CRS
    point1 = marker_left.reference.location
    point2 = marker_right.reference.location

    # Vérifier et initialiser les shapes si nécessaire
    if not chunk.shapes:
        chunk.shapes = Metashape.Shapes()
        chunk.shapes.crs = chunk.crs  # Définit le système de coordonnées des shapes sur celui du chunk

    # Créer un groupe pour la ligne
    group = chunk.shapes.addGroup()
    group.label = "Front Top Edge"

    # Créer la polyligne en utilisant les coordonnées CRS des marqueurs
    shape = chunk.shapes.addShape()
    shape.geometry = Metashape.Geometry.LineString([point1, point2])
    shape.label = "Front Top Edge Line"
    shape.group = group

    print("La polyligne alignée sur les marqueurs a été créée avec succès.")

# Exécution des fonctions
doc = Metashape.app.document
chunk = doc.chunk
if chunk:
    marker_left, marker_right = place_corner_markers(chunk)
    create_line_from_markers(chunk, marker_left, marker_right)
else:
    print("Aucun chunk trouvé dans le document.")


it's working by using this it is possible by resizing the bounding box to match multiple measured profiles thanks to the exact same start and end point, with a georeferenced project it's perfect and i tried with an other one in local projection it's not working.

Paulo

  • Hero Member
  • *****
  • Posts: 1498
    • View Profile
Re: line shape between two markers
« Reply #3 on: November 12, 2024, 08:56:28 PM »
Hi again,

it should work in local coordinate system as well...

see attachment where I run code on a chunk in  local CS....
Best Regards,
Paul Pelletier,
Surveyor

Iluvathar

  • Newbie
  • *
  • Posts: 37
    • View Profile
Re: line shape between two markers
« Reply #4 on: November 12, 2024, 09:06:29 PM »
i see, it should work on my project  :o

Iluvathar

  • Newbie
  • *
  • Posts: 37
    • View Profile
Re: line shape between two markers
« Reply #5 on: November 12, 2024, 09:23:10 PM »
I think i found why it's not working, opened my point cloud into a new chunk and it worked, mabe a conflict somewhere