Ejemplo de script de importación de TLS (Cintoo Connect CLI)

Este artículo contiene un ejemplo de script de Python, con comentarios, que permite aprovechar la funcionalidad de Cintoo Connect CLI para importar datos de escaneo terrestre.


Se proporciona un ejemplo de script en el archivo adjunto.


Este script es un ejemplo de cómo automatizar la importación de un escaneo a una zona de trabajo específica. No requiere un URI, pero es necesario especificar algunos ID.
Llama al comando import-static en la función "import_file", que puede modificarse según sea necesario.


A continuación se presenta el script con comentarios sobre cada parte.

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}"}

Importación de bibliotecas. Obtención del token y de los encabezados. Para más detalles: Guía de la API de Cintoo Connect CLI.



<WORKZONE_ID>/data
ACCOUNT_ID: Final[str] = ""
PROJECT_ID: Final[str] = ""
WORKZONE_ID: Final[str] = ""
  • ID de la cuenta que aloja el proyecto de destino
  • ID del proyecto correspondiente al proyecto de destino donde se encuentra la zona de trabajo de destino
  • ID de la zona de trabajo correspondiente a la zona de trabajo de destino

Pueden obtenerse mediante solicitudes HTTPS o desde la URL de la aplicación web dentro de una zona de trabajo.

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

Instrucciones más detalladas: Guía de la API de Cintoo Connect CLI.



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

La URL predeterminada puede ser aec.cintoo.com o us.cintoo.com, o [company].cintoo.com si la organización dispone de un dominio dedicado, según la configuración.



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

Búsqueda y ejecución del ejecutable de Cintoo Connect CLI. El ejecutable se encuentra en la misma ubicación en la que está instalado Cintoo Connect. De forma predeterminada, debería estar en:

  • Users/"YourUserName"/AppData/Local /Programs/Cintoo
  • ProgramFiles/Cintoo si se instaló con derechos de administrador



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)

Envío de información a un servidor y obtención de una verificación de la respuesta del servidor.



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")

Validación del inicio de sesión.



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

Obtención del URI de Cintoo a partir de los componentes de cuenta, proyecto y zona de trabajo definidos anteriormente.



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}"])

Ejecución del proceso de importación con el ejecutable 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)

Importación de todos los archivos del directorio definido.



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])

Ejecución de la función principal.

¿Le fue útil este artículo?

¡Qué bueno!

Gracias por sus comentarios

¡Sentimos mucho no haber sido de ayuda!

Gracias por sus comentarios

¡Díganos cómo podemos mejorar este artículo!

Seleccione al menos una de las razones
La verificación de CAPTCHA es obligatoria.

Comentarios enviados

Agradecemos su iniciativa, e intentaremos corregir el artículo