Exemple de script d'import TLS (Cintoo Connect CLI)

Cet article contient un exemple de script Python commenté qui permet d'exploiter les fonctionnalités de Cintoo Connect CLI pour importer des données de scan terrestre.


Un exemple de script est fourni en pièce jointe.


Ce script est un exemple d'automatisation de l'import d'un scan dans une zone de travail donnée. Il ne nécessite pas d'URI, mais certains ID doivent être spécifiés.
Il appelle la commande import-static dans la fonction « import_file », qui peut être modifiée selon les besoins.


Vous trouverez ci-dessous le script, avec des commentaires sur chaque partie.

from pathlib import Path
from typing import Final

import json
import logging
import os
import sys
import subprocess
import requests

TIMEOUT: Final[int] = 10

TOKEN: Final[str] = ""
GLOBAL_HEADERS: Final[dict] = {"Authorization": f"Bearer {TOKEN}"}

Import des bibliothèques. Obtention du jeton et des en-têtes. Pour plus de détails : Guide de l'API Cintoo Connect CLI.



<WORKZONE_ID>/data
ACCOUNT_ID: Final[str] = ""
PROJECT_ID: Final[str] = ""
WORKZONE_ID: Final[str] = ""
  • ID du compte hébergeant le projet ciblé
  • ID du projet correspondant au projet cible dans lequel se trouve la zone de travail ciblée
  • ID de la zone de travail correspondant à la zone de travail cible

Ils peuvent être récupérés au moyen de requêtes HTTPS ou depuis l'URL de l'application web, dans une zone de travail.

https://aec.cintoo.com/accounts/<ACCOUNT_ID>/projects/<PROJECT_ID>/workzones/

Guide plus détaillé : Guide de l'API Cintoo Connect CLI.



DEFAULT_URL: Final[str] = "https://aec.cintoo.com"

L'URL par défaut peut être aec.cintoo.com, us.cintoo.com ou [company].cintoo.com si l'organisation dispose d'un domaine dédié, selon la configuration.



def get_cintoo_cli_exe() -> str:
    path = Path(os.environ['LOCALAPPDATA']) / "Programs" / "Cintoo"
    if not path.exists():
        path = Path(os.environ['ProgramFiles']) / "Cintoo"
    if not path.exists():
        raise RuntimeError("Could not find Cintoo Connect's installation."
                           "\nIf you did not installed it in the default path,"
                           " please set this path variable to the right path")
    cli = path / "cintooconnect-cli.exe"
    if not cli.exists():
        raise RuntimeError("Could not find cintooconnect-cli.exe."
                           " Please install the latest version of Cintoo Connect: "
                           "https://aec.cintoo.com/download/cintooconnect-setup-latest.exe")
    return cli.as_posix()


CINTOO_CLI_EXE: Final[str] = get_cintoo_cli_exe()

Recherche et exécution de l'exécutable de Cintoo Connect CLI. L'exécutable se trouve à l'endroit où Cintoo Connect est installé. Par défaut, il doit se trouver dans :

  • Users/"YourUserName"/AppData/Local /Programs/Cintoo
  • ProgramFiles/Cintoo si l'installation a été effectuée avec des droits d'administrateur



def post_and_check_request(url: str,
                           headers: dict) -> dict:
    logging.info(f"Query: url={url}, headers={headers}")
    try:
        reply = requests.post(url, headers=headers, timeout=TIMEOUT)
        reply.raise_for_status()
        return reply.json()
    except json.JSONDecodeError as exception:
        message = f"Exception during decoding json when using token: {exception}"
    except requests.exceptions.RequestException as exception:
        message = f"Exception during validation of token: {exception}"
    except Exception as exception:
        message = f"Exception: {exception}"
    logging.error(message)
    raise RuntimeError(message)

Envoi d'informations à un serveur et obtention d'une vérification de la réponse du serveur.



def validate_login():
    url = f"{DEFAULT_URL}/api/isLogged"
    response = post_and_check_request(url, GLOBAL_HEADERS)
    if not response.get("success"):
        raise ValueError("Login required: unable to verify your login status.\n"
                         f"Details: {response}.\n"
                         "Please log in by following the instructions here:\n"
                         "https://aec.cintoo.com/api/#section/API-Specification/Authentication")

Validation de la connexion.



def get_cintoo_uri(account_id: str,
                   project_id: str,
                   workzone_id: str):
    url = 
'{DEFAULT_URL}/api/accounts/{account_id}/projects/{project_id}/workzones/{workzone_id}/imports'
    response = post_and_check_request(url, GLOBAL_HEADERS)
    cintoo_uri = response.get("url")
    if not cintoo_uri:
        raise KeyError(f"Could not find url in response: {response}")
    return cintoo_uri

Obtention de l'URI Cintoo à partir des composants de compte, de projet et de zone de travail définis précédemment.



def import_file(cintoo_uri: str,
                file_path: str):
    return subprocess.call([CINTOO_CLI_EXE, "import-static",
                            f"--cintoo-uri={cintoo_uri}",
                            f"--file-ref={file_path}"])

Exécution du processus d'import avec l'exécutable de Cintoo Connect CLI.



def import_files_in_dir(cintoo_uri: str,
                        root_dir_path: str):
    for (dirpath, _, filenames) in os.walk(root_dir_path):
        for filename in filenames:
            file_path = os.path.join(dirpath, filename)
            import_file(cintoo_uri, file_path)

Import de tous les fichiers du répertoire défini.



def main(path: str):
    assert TOKEN, "Token must be specified"
    assert ACCOUNT_ID and PROJECT_ID and WORKZONE_ID, "IDs must be specified"
    validate_login()
    cintoo_uri = get_cintoo_uri(ACCOUNT_ID, PROJECT_ID, WORKZONE_ID)
    if os.path.isfile(path):
        import_file(cintoo_uri, path)
    elif os.path.isdir(path):
        import_files_in_dir(cintoo_uri, path)

if __name__ == "__main__":
    arguments = sys.argv
    if len(arguments) != 2:
        raise RuntimeError("You need to pass the path to directory or file to import")
    main(arguments[1])

Exécution de la fonction principale.

Cet article a-t-il été utile ?

C'est super !

Merci pour votre commentaire

Désolé ! Nous n'avons pas pu vous être utile

Merci pour votre commentaire

Dites-nous comment nous pouvons améliorer cet article !

Sélectionner au moins l'une des raisons
La vérification CAPTCHA est requise.

Commentaires envoyés

Nous apprécions vos efforts et nous allons corriger l'article