Arrastrar sin que el croquis salte
Arrastras un punto y el croquis se reorganiza o da la vuelta. En KapyCAD 2, el arrastre seguirá cuatro reglas de intención y nada saltará al soltar.

Sexta entrega de la serie «Por dentro de KapyCAD 2»; el arrastre que describimos es el de KapyCAD 2, que aún no ha salido. Arrastrar un punto es probablemente lo que más haces en un croquis. Coges una esquina, tiras, y esperas que la figura te siga con sentido común. Cuando no lo hace, se nota enseguida.
En la entrega anterior explicamos por qué escribimos nuestro propio solver de restricciones. Esta es su compañera: cómo usará ese solver el arrastre, que es donde más se nota lo que un solver hace por dentro.
El problema
Un croquis con libertad tiene, por definición, muchas formas de seguir al cursor. Si arrastras la esquina de un rectángulo que no tiene todas sus cotas, el solver puede alargar un lado, girar la figura entera, desplazarla… Todas esas respuestas cumplen las restricciones. Pero solo una suele ser la que esperabas.
Con el solver actual (PlaneGCS), el arrastre es una sucesión de resoluciones independientes con varias pasadas de rescate alrededor. En los peores casos, la figura se reorganiza de formas raras, porque la solución que el solver encuentra primero no es la más cercana a lo que tenías, y una tangencia o un ángulo cambia de lado a mitad del gesto sin que lo pidas. En croquis grandes, como medimos en la entrega anterior, el p95 de los fotogramas pasa del segundo. Y a veces, al soltar el ratón, la geometría da un último saltito hasta su posición «de verdad».
Hay incluso una paradoja: tirar de un punto que tus restricciones dejan quieto es el gesto más caro de todos. El solver no consigue acercarlo al cursor, así que agota todas sus pasadas de rescate antes de rendirse. No pasa nada en pantalla, y aun así es lo que más tarda.
En KapyCAD 2, la solución se apoyará en una sola idea: tratar el cursor como un deseo.
El cursor, un deseo
Como contamos en la entrega anterior, el solver nuevo separa las ecuaciones en duras, blandas y débiles. En un arrastre, tus restricciones son las duras, el cursor es una blanda («este punto, lo más cerca posible de aquí») y todo lo que no arrastras lleva una débil («quédate donde estabas»), así que, de todas las formas de seguir al cursor, el solver tomará la que menos mueve el resto del croquis.
Eso tiene una consecuencia práctica. Si tiras de un punto hacia un sitio al que no puede llegar (un punto sobre una circunferencia, arrastrado hacia el centro), la geometría se quedará lo más cerca posible del cursor, en vez de fallar o de quedarse congelada. Y si el punto está totalmente definido, no se moverá, porque no tiene hacia dónde.
Cuatro reglas de intención
«Mover lo mínimo» resuelve la mayoría de los casos, pero hay situaciones en las que dos respuestas mueven más o menos lo mismo y sin embargo una es claramente lo que querías. Para esas, el arrastre de la versión en desarrollo tiene cuatro reglas explícitas.
- Borde de un círculo: cambia el radio. Si tiras de un punto del borde de un círculo o de un arco, crece o encoge el radio y el centro se queda. Si el radio tiene una cota, entonces lo que se mueve es el círculo entero.
- Extremo de una línea de longitud fija: gira. La línea gira alrededor de su otro extremo antes que trasladarse.
- Arista: se desplaza en paralelo. Si arrastras una arista entera, se mueve paralela a sí misma y sus vecinas se estiran para seguirla.
- Bloque rígido: se traslada entero. Un grupo que ya no puede deformarse pero sí moverse se desplaza en bloque. Solo gira si trasladándolo no hay forma de llegar al cursor.
Detrás de estas reglas solo hay pesos: el centro de un círculo «se resiste» un poco más a moverse que su borde, y el extremo lejano de una línea se resiste más que el que arrastras. Con esos pesos, la respuesta de menor movimiento coincide con la que describe cada regla.
El bloque rígido tiene un truco extra. Cuando el solver detecta que un grupo de geometría es rígido, lo mueve con una transformación rígida exacta en lugar de iterar. Sale más barato, y el grupo no se va deformando poco a poco a base de redondeos.
Cruzar al otro lado, solo si lo pides
En la quinta entrega vimos que cada tangencia, paralela y perpendicular guardará su orientación, y el botón «Invertir» de su menú dará la otra rama. Durante un arrastre esa orientación se respetará. Si arrastras una recta tangente hacia su círculo, la recta se parará en el círculo en lugar de atravesarlo y aparecer al otro lado.
A veces, sin embargo, sí quieres que pase al otro lado, y también se podrá hacer arrastrando: bastará con pedirlo claramente.
En la versión en desarrollo, el solver resuelve cada fotograma respetando primero todas las orientaciones guardadas. Si con eso el punto que arrastras se queda muy lejos del cursor (a más de la mitad de la distancia que has movido el ratón), prueba a darle la vuelta a una o dos de las restricciones con dos ramas que tiene cerca. Si alguna de esas pruebas deja el punto al menos a la mitad de distancia, se queda con ella.
Eso es lo que en ingeniería se llama histéresis: una zona en la que no se cambia de estado aunque estés cerca de la frontera. Si dejas el cursor bailando sobre el límite, las dos ramas llegan casi igual de cerca y el croquis se queda con la que tenía, sin parpadear de un lado a otro.
Cuando sí cruza, el fotograma lo indica, y al soltar se guardará el lado nuevo junto con las posiciones, en el mismo paso de deshacer.
Lo que ves es lo que se guarda
Cada fotograma del arrastre se resolverá partiendo siempre del croquis guardado. Es una función pura: misma geometría guardada, misma posición del cursor, mismo resultado. No hay estado que se vaya acumulando a lo largo del gesto.
Al soltar, el núcleo del documento repetirá el último fotograma (mismo croquis, misma posición del cursor) y guardará eso, así que lo que veías antes de soltar será lo que se escriba.
Mientras arrastres, el documento no se tocará: nada aguas abajo (las extrusiones, los redondeos, el sólido) se regenerará en cada fotograma. Al soltar, se escribirán de una vez la geometría, las orientaciones que hayan cambiado y el diagnóstico completo del croquis, en una sola entrada de deshacer.
Lo comprobamos con la parte de arrastre del cuarto juez de cómo probamos un CAD: arrastra puntos y líneas de los 602 croquis del corpus, suelta y verifica que lo que quedó guardado coincide con el último fotograma dibujado, con una tolerancia de diez nanómetros.
Rápido
Todo lo anterior no serviría de nada si cada fotograma tardara un segundo. El objetivo que nos marcamos es que el 95 % de los fotogramas de arrastre respondan en 16 ms o menos, el tiempo de un refresco de pantalla a 60 Hz. Los picos también los vigilamos.
Los fotogramas los resolverá el ayudante de arrastre que presentamos en la cuarta entrega. Cada fotograma devuelve las posiciones y poco más: el diagnóstico completo, que en un croquis de unas 200 variables cuesta varios milisegundos, se deja para el momento de soltar.
La búsqueda de cruces también tiene límites. Probar a cruzar de rama cuesta resoluciones extra, así que está acotada a dos restricciones por fotograma como mucho y a unos pocos pasos por prueba. Una rama que el cursor pide claramente se alcanza enseguida; si una prueba necesita más, no era el caso claro. Durante el desarrollo, sin esos límites, el peor fotograma del test llegaba a 867 ms.
Ese mismo juez mide la velocidad del arrastre sobre todo el corpus: 602 croquis, 1685 gestos y algo más de diez mil fotogramas. El percentil 95 tiene que quedar por debajo de 16 ms, y en nuestras mediciones lo cumple, incluido el croquis de calibración que con el solver actual pasa del segundo. La rapidez al confirmar un cambio se mide aparte, como explicamos en la quinta entrega.
La séptima entrega cuenta cómo encontrará KapyCAD 2 la restricción que sobra en un croquis y cómo te la señalará.
Escrito por
Sergio
Building Kapy CAD — parametric 3D modelling for 3D printing, in the browser.


