tmontaigu / CloudCompare-PythonRuntime

Python plugin for CloudCompare
55 stars 15 forks source link

add vectors x y z #115

Closed Ellana17 closed 2 months ago

Ellana17 commented 3 months ago

Bonjour,

Je souhaiterai créer en python un petit programme qui affiche le point (0,0,0) ainsi que les vecteurs x,y et z partant de ce point. Dans CloudCompare, lors de l'import d'un fichier, Nx, Ny et Nz sont des "types de données" qui peuvent être choisit. Comment les choisir en python ?

Merci d'avance

tmontaigu commented 3 months ago

Lors de l'import d'un fichier (quel format) il est possible de specifier un point d'origine et les vecteur de bases ?

Ellana17 commented 3 months ago

J'utilise cloudcompare pour afficher plusieurs nuages de points avec la vibration comme valeurs pour l'échelle de couleur. Comme il n'est pas possible de définir une échelle globale (define a color scale #113 ) j'ai ajouté dans mon script python un calcul des valeurs min/max "générales" et j'ai ajouté à la fin de chaque fichier 2 lignes avec le min et le max aux coordonnées (0,0,0). Il y a donc p=2x"nb de nuages" points (0,0,0) qui se retrouvent "tout seuls" et j'aimerai rajouter des vecteurs X,Y,Z sur ces points pour qu'on comprennent qu'il ne s'agit pas d'usinage mais de l'origine de la pièce (les coordonnées des nuages de points étant selon la "position origine pièce").

La solution serait donc d'importer (ou de créer directement en python) le fichier csv suivant : image

Mais comment faire pour que lors de l'import/ l'utilisation des données dans python Nx,Ny et Nz soient considérés comme des vecteurs : image

et si possible que la case "Draw" soit cochée automatiquement image

Importé "à la main", le fichier donne ça (avec une modification de "length"): image

tmontaigu commented 3 months ago
import numpy as np
import pycc

cc = pycc.GetInstance()

x = np.array([0, 0, 0])
y = np.array([0, 0, 0])
z = np.array([0, 0, 0])

normals = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]])
print(normals[:, 0], normals[:, 1], normals[:, 2])

pc = pycc.ccPointCloud(x, y, z)
pc.reserveTheNormsTable()
pc.addNormals(normals[:, 0], normals[:, 1], normals[:, 2])
pc.setName("origin")
# pc.showNormalsAsLines(True) # Not yet possible
cc.addToDB(pc)
cc.updateUI()

Ce bout de code va creer un point cloud qui va creer un point a l'origine avec les normals comme vecteurs de base, avec la case draw coche. Mais le normales ne sont visible que l'lorsque l'on bouge la vue 🤔

Est ce que ca s'approche de ce qui est voulu ?

Ellana17 commented 3 months ago

Désolé de répondre si tard, j'étais en vacances. J'ai testé le programme et j'ai un problème : la case draw ne s'est pas cochée automatiquement. De plus j'aimerai modifier le "length" pour que les vecteurs soient plus visibles. Peut-on le faire directement en python ? Le problème des vecteurs qui n'apparaissent que quand on tourne la vue peut être due au "Near clipping depth" (ctrl+molette) qu'il faut ramener à 0.

tmontaigu commented 3 months ago

Le nouvelle version comprise dans l'installeur contient la fonction pour avoir la case draw choché en faisant pc.showNormalsAsLines(True)

Par contre je ne sais pas comment augmenter la talle des vecteurs