Cuál de tus restricciones sobra
De «tu croquis está mal» a «estas dos cotas se contradicen». KapyCAD 2 señalará las restricciones que sobran o chocan, y solo después de comprobarlo.

Séptima entrega de la serie «Por dentro de KapyCAD 2»; el diagnóstico que describimos formará parte de KapyCAD 2, que seguimos desarrollando. Cualquiera que haya usado un CAD paramétrico ha visto alguna vez este mensaje: croquis sobrerrestringido. Y debajo, media pantalla en rojo. Sabes que algo sobra, o que algo choca, pero no sabes qué. Así que empiezas a borrar restricciones a ciegas hasta que el rojo se va, y muchas veces te llevas por delante alguna que sí hacía falta.
En las dos entregas anteriores contamos por qué escribimos nuestro propio solver de croquis y cómo haremos para arrastrar sin que el croquis salte. Queda la otra mitad del trabajo de un solver: explicarte qué le pasa a tu croquis con nombres concretos, como «estas dos cotas se contradicen» o «esta restricción repite lo que ya dicen otras dos».
Todo en rojo
Un solver numérico sabe resolver ecuaciones, pero no siempre sabe explicar por qué no puede. El solver actual de KapyCAD, PlaneGCS, saca su diagnóstico de una heurística: una regla aproximada que casi siempre acierta y se equivoca en los casos raros. Y en un croquis, los casos raros aparecen todos los días.
La lista completa de lo que nos duele está en la quinta entrega; aquí basta un ejemplo. Una placa puede pasar a «sobrerrestringida», con una docena de restricciones en rojo, después de arrastrar un punto un cuarto de milímetro y sin haber añadido nada.
Hoy filtramos esos falsos avisos con capas por encima del solver, pero son parches alrededor de un código que no es nuestro y cuyo diseño no encaja con lo que necesitamos. Con un solver propio, el diagnóstico pasa a ser parte del solver, y para KapyCAD 2 lo hemos rehecho desde cero con una idea: no decir nada que no se haya comprobado.
Grados de libertad de verdad
Antes de nada hay que contar bien. Los grados de libertad (GDL) son las formas independientes en que tu croquis todavía se puede mover. Un punto suelto tiene dos (izquierda-derecha y arriba-abajo); cada restricción que de verdad sujeta algo le quita uno o más. Cuando llegas a cero, el croquis está totalmente definido.
El problema está en ese «de verdad». Una restricción puede estar en la lista y no quitar nada, porque lo que dice ya lo dicen otras. Hay que contar solo las restricciones independientes, y KapyCAD 2 lo hará con una herramienta exacta del álgebra lineal, el rango, que explicamos al final. La idea intuitiva: el rango es el número de cosas distintas que dicen tus restricciones, y los GDL son lo que se puede mover menos eso.
El número de la versión actual a veces miente, y la tangencia en un extremo compartido lo muestra muy bien. Dibujas una línea y un arco que salen del mismo punto y les pides que la unión sea suave. La forma clásica de escribir una tangencia es «la distancia del centro del arco a la recta es igual al radio». Funciona en general, pero cuando el punto de contacto ya está sobre los dos elementos, esa ecuación se queda plana: si miras cómo cambia al mover un poquito la geometría, no cambia nada. Para el recuento, esa restricción no hace nada, y el croquis parece tener un grado de libertad más de los que tiene. Uno por cada unión de ese tipo: una ranura, con sus dos arcos unidos suavemente a dos rectas, dice tener 9 grados de libertad cuando tiene 5 (la posición de sus dos centros y el ancho).
En KapyCAD 2, una tangencia en un extremo compartido será una restricción propia: dirá directamente que las dos direcciones en ese punto coinciden. Esa ecuación mantiene su pendiente, así que el recuento la ve. Y cuando el rango no pueda saber algo con certeza, el estado lo dirá: un croquis con libertad desconocida se presentará como tal, nunca como «cero grados libres».
Cuándo sobra una restricción
Una restricción redundante es la que no añade nada: si la borras, el croquis sigue igual de definido. El ejemplo de libro son dos líneas horizontales con, además, una restricción de paralelas entre ellas. Si las dos son horizontales, ya son paralelas; la tercera sobra.
El rango sabe detectar esa situación, porque las ecuaciones de la paralela son una combinación de las otras. Pero hay un caso que se le parece mucho y es lo contrario. Coge una recta tangente a un círculo cuyo extremo, además, está sujeto sobre el propio círculo. En ese punto concreto la tangencia también se queda plana, y para el rango tiene la misma pinta que una restricción que sobra. Si la borras, sin embargo, la recta puede girar alrededor del punto de contacto. Está sujetando un giro que el rango, al mirar solo la primera aproximación, no puede ver.
Por eso, en la versión en desarrollo, una sospecha del rango no basta para decir «sobra». Cada candidata se comprueba moviendo el croquis: se empuja un poco en las direcciones en las que todavía se puede mover, se vuelve a cumplir todo lo demás menos la candidata, y se mira si ella se sigue cumpliendo sola.
- Si se cumple tras cada empujón, se deduce de las demás: es redundante, y se marcará en ámbar con «se puede borrar sin riesgo».
- Si se rompe, solo lo parecía en esa posición. Queda como parcialmente redundante (en índigo): especifica de más, pero sostiene algo, y no te vamos a decir que la borres.
- Aparte quedan las inertes (en gris): restricciones que no sujetan nada y tampoco se deducen de las demás.
Cada lista hace una promesa distinta, y la de «se puede borrar sin riesgo» solo incluye lo que hemos visto aguantar. Cuando una restricción sea redundante, además, el diagnóstico sabrá qué otras dicen ya lo mismo y te las podrá nombrar.
El conjunto mínimo en conflicto
Un conflicto es otra cosa: restricciones que se contradicen. Le pides a un agujero diámetro 20 y, en otra parte del croquis, radio 12. No hay círculo que cumpla las dos cosas, y lo que quieres oír es «estas dos».
Lo que suele pasar es que el solver no converge y todo lo que toca esa zona queda bajo sospecha: el agujero, las cotas que lo sitúan, las que lo relacionan con el borde. Doce restricciones, por decir un número. Todas están implicadas en el problema, pero solo dos lo causan.
Para pasar de doce a dos usamos un filtro de borrado. Con el ejemplo, los pasos son estos:
- Partimos de las doce sospechosas. El croquis con ellas no se resuelve.
- Apartamos un trozo, por ejemplo la mitad, y probamos a resolver sin él.
- Si sigue sin resolverse, el conflicto está en lo que queda: ese trozo era inocente y lo descartamos para siempre.
- Si ahora sí se resuelve, en ese trozo había algún culpable: se queda, y lo seguimos partiendo en trozos más pequeños.
- Repetimos hasta que no quede nada que se pueda quitar sin que el conflicto desaparezca.
Lo que queda al final es un conjunto mínimo: si quitas cualquiera de sus restricciones, el resto ya se puede cumplir. En el ejemplo, el diámetro 20 y el radio 12.
Cada intento es una resolución con un límite pequeño de pasos, así que el filtro cuesta unas pocas resoluciones por restricción sospechosa. Podemos permitírnoslo al confirmar un cambio, pero sería demasiado para cada fotograma de un arrastre. Por eso el diagnóstico completo (el rango, la comprobación por movimiento y este filtro) se calculará cuando sueltes; mientras arrastras, el solver solo resolverá.
En KapyCAD 2, ese conjunto mínimo parpadeará en rojo en el lienzo y el resto del croquis se quedará como estaba.
Antes de añadir, preguntar
Todo lo anterior diagnostica una restricción que ya está en el documento. Mejor aún es no tener que deshacer nada.
Cuando añadas a mano una restricción o una cota, KapyCAD 2 hará una pregunta antes de escribirla: resolverá el croquis con la candidata dentro, una sola vez, y leerá el diagnóstico. Si un conjunto mínimo en conflicto la contiene, te avisará de que choca y te dirá con qué; si había un conflicto que no la incluye, no es culpa suya y no se la echará. Si se deduce de las demás (se sigue cumpliendo cuando el croquis se mueve sin ella), te avisará de que sobra y te dirá qué restricciones dicen ya lo mismo. Y si sujeta aunque sea un grado de libertad, cumple una función y entrará sin más.
Así se resolverá también un caso que hoy sale mal. Fijas los dos extremos de una línea, añades una cota de longitud y la culpa se la lleva la cota que ya tenías, no la nueva, porque el solver actual elige a quién señalar con una regla de popularidad. Ya no hará falta comparar dos resoluciones y adivinar cuál es la nueva: se le preguntará a la candidata directamente.
El aviso traerá un botón «Añadir igualmente», porque a veces quieres una cota que sobra, por ejemplo una de referencia para tenerla a la vista.
El aviso tampoco saltará siempre. Si el croquis ya estaba en conflicto, cualquier restricción nueva parecería culpable, y lo que estás haciendo probablemente es arreglarlo. En un croquis enorme, de cientos de restricciones, la comprobación haría lento cada clic. Y mientras dibujas con una herramienta no hace falta: un rectángulo emite varias restricciones de golpe y son correctas por construcción.
Las restricciones que pone el ajuste automático (snap) mientras dibujas pasarán por la misma pregunta: si una inferida iba a sobrar o a chocar, se quedará fuera.
Hacia dónde se puede mover
El mismo análisis que cuenta los GDL sabe en qué direcciones puede moverse cada punto sin romper nada. En KapyCAD 2, cuando pases el ratón por encima de un punto que todavía tiene libertad, el editor dibujará esas direcciones como flechas. Un punto atado a una horizontal mostrará una flecha a lo largo de ella. El extremo de una línea de longitud fija mostrará la dirección en la que puede girar. Y uno totalmente sujeto no mostrará ninguna.
Será una forma rápida de responder a «¿qué me falta por acotar?»: pasas por encima de los puntos y miras dónde hay flechas.
Hay otra libertad que las flechas no enseñan: la de elegir rama, como una recta tangente que puede tocar el círculo por un lado o por el otro. De esa se encargará el botón «Invertir» de la quinta entrega.
Debajo: rango, SVD y espacio nulo
Nada de esta sección hace falta para usar el editor, pero así funciona por dentro, sin fórmulas pesadas.
Cada restricción se escribe como una o varias ecuaciones que valen cero cuando se cumple. Las incógnitas son las coordenadas de la geometría. Si miras cómo cambia cada ecuación cuando mueves un poquito cada coordenada, tienes una tabla de números con una fila por ecuación y una columna por coordenada: la matriz jacobiana.
El rango de la jacobiana es cuántas filas son realmente independientes, y los grados de libertad son las columnas menos el rango. Los movimientos que no cambian ninguna ecuación forman el espacio nulo; son las formas en que el croquis se puede mover sin romper nada, y de ahí salen las flechas. Las combinaciones de filas que se anulan forman el espacio nulo izquierdo: si una restricción participa en una de ellas, sus ecuaciones se pueden escribir con las de otras, así que es candidata a redundante, y esa combinación dice con cuáles.
Para calcular todo eso usamos la descomposición en valores singulares (SVD), la manera numéricamente fiable de obtener a la vez el rango y los dos espacios nulos. Antes escalamos la tabla para que un croquis de milímetros y uno de metros se juzguen igual, y la partimos en bloques independientes para analizar por separado lo que no está conectado. La SVD de un bloque grande cuesta unos pocos milisegundos.
El rango no basta para decir «redundante» porque la jacobiana es una aproximación de primer orden: mide la pendiente de cada ecuación. En la recta tangente sujeta sobre su círculo, la distancia que mide la tangencia cambia con el cuadrado del giro, así que su pendiente en ese punto es cero y el rango no la ve. Por eso empujamos el croquis lo suficiente como para que ese efecto de segundo orden se note, y por eso «se puede borrar sin riesgo» solo se dice después de comprobarlo.
Un último matiz sobre los conflictos. Algunos se pueden certificar de forma exacta: dos valores fijos que se contradicen, por ejemplo. Otros, no lineales, solo se detectan porque una resolución acotada no consigue cumplirlos; el ejemplo típico es un triángulo cuyos lados no cumplen la desigualdad triangular, que no deja ninguna fila dependiente que el rango pueda ver. Para esos, el filtro de borrado sigue encontrando el conjunto pequeño que no se resuelve, pero internamente lo tratamos como una sospecha, y un fallo numérico sin más pruebas nunca se convierte en un «sobrerrestringido».
En la última entrega cambiamos de tema: kapycode, tu modelo como texto.
Escrito por
Sergio
Building Kapy CAD — parametric 3D modelling for 3D printing, in the browser.


