# -*- coding: utf-8 -*-
# Trazo para Rhino - captura la vista actual y la abre en Trazo.
#
# PRIMERA VEZ: ejecuta este archivo con _RunPythonScript.
#   Se instala solo: a partir de entonces basta con escribir
#     TRAZO      -> manda la vista a Trazo (tu eliges cuando generar)
#     TRAZOLIVE  -> manda la vista y Trazo GENERA al instante con tus ajustes
#   como comandos normales de Rhino (crea alias permanentes).
# Requiere la app de escritorio Trazo 2.1+ instalada (esquema trazo://).

import os
import shutil
import time
import webbrowser

try:  # py3 (Rhino 8) / py2 (Rhino 7 IronPython)
    from urllib.parse import quote
except ImportError:
    from urllib import quote

import rhinoscriptsyntax as rs
import scriptcontext as sc
import Rhino
import System


def instalar():
    """Se copia a la carpeta de scripts de Rhino y crea los alias TRAZO y TRAZOLIVE."""
    try:
        origen = __file__
    except NameError:
        return False
    try:
        ver = "%d.0" % Rhino.RhinoApp.Version.Major
        destino_dir = os.path.join(os.environ.get("APPDATA", ""), "McNeel", "Rhinoceros", ver, "scripts")
        if not os.path.isdir(destino_dir):
            os.makedirs(destino_dir)
        destino = os.path.join(destino_dir, "trazo_rhino.py")
        if os.path.abspath(origen) != os.path.abspath(destino):
            shutil.copyfile(origen, destino)
        # lanzador de TrazoLive: fija TRAZO_LIVE y ejecuta este mismo script
        vivo = os.path.join(destino_dir, "trazo_live.py")
        f = open(vivo, "w")
        f.write(
            "# -*- coding: utf-8 -*-\n# generado por trazo_rhino.py\n"
            "TRAZO_LIVE = True\n"
            "try:\n"
            "    execfile(%r)  # Rhino 7 (IronPython 2)\n"
            "except NameError:\n"
            "    exec(compile(open(%r).read(), %r, 'exec'))  # Rhino 8 (Python 3)\n"
            % (destino, destino, destino))
        f.close()
        # aviso tambien al ACTUALIZAR (p. ej. cuando TrazoLive es nuevo), no solo la primera vez
        nuevo = not (rs.IsAlias("Trazo") and rs.IsAlias("TrazoLive"))
        rs.AddAlias("Trazo", '! _-RunPythonScript "%s"' % destino)
        rs.AddAlias("TrazoLive", '! _-RunPythonScript "%s"' % vivo)
        return nuevo
    except Exception:
        return False


def capturar(vivo=False):
    vista = sc.doc.Views.ActiveView
    if vista is None:
        rs.MessageBox("Trazo: no hay una vista activa.")
        return
    t = vista.ActiveViewport.Size
    ancho = min(t.Width * 2, 3200)
    alto = min(t.Height * 2, 2400)

    # ViewCapture: respeta el modo de visualizacion (Sombreado/Renderizado)
    # a cualquier resolucion, sin rejilla ni ejes.
    bmp = None
    try:
        cap = Rhino.Display.ViewCapture()
        cap.Width = ancho
        cap.Height = alto
        cap.ScaleScreenItems = False
        cap.DrawAxes = False
        cap.DrawGrid = False
        cap.DrawGridAxes = False
        cap.TransparentBackground = False
        bmp = cap.CaptureToBitmap(vista)
    except Exception:
        bmp = None
    if bmp is None:  # respaldo: captura clasica al tamano del viewport
        bmp = vista.CaptureToBitmap(System.Drawing.Size(t.Width, t.Height))
    if bmp is None:
        rs.MessageBox("Trazo: no se pudo capturar la vista.")
        return

    ruta = os.path.join(os.environ.get("TEMP", "."), "trazo-captura-%d.png" % int(time.time()))
    bmp.Save(ruta)
    url = "trazo://importar?ruta=" + quote(ruta)
    if vivo:
        url = url + "&auto=1"
    webbrowser.open(url)


recien_instalado = instalar()
if recien_instalado:
    rs.MessageBox("Trazo instalado.\n\nA partir de ahora escribe en la linea de comandos de Rhino:\n\n  TRAZO      -> la vista actual se abre en la app Trazo\n  TRAZOLIVE  -> se abre y GENERA al instante con tus ajustes\n\n(no hace falta volver a ejecutar este script)")
capturar(bool(globals().get("TRAZO_LIVE", False)))
