CAD
Un comando pregunta «Centro:» y «Radio:», el usuario teclea números y solo ve el resultado al final. Funciona, pero da la sensación de estar en 1995. AutoCAD muestra con el comando CÍRCULO cómo hacerlo mejor: el círculo cuelga del ratón y crece con él. Esta vista previa se llama jig, y con la API .NET puede incorporarla a sus propios comandos.
Qué es un jig
En el taller, un jig es un dispositivo que guía la herramienta, por ejemplo una plantilla de taladrado. En AutoCAD, el jig no guía el taladro, sino el ratón: muestra un elemento tal como quedará si el usuario hace clic ahora. El espacio de nombres Autodesk.AutoCAD.EditorInput ofrece dos clases para ello. Un EntityJig arrastra exactamente un elemento, y AutoCAD lo dibuja por sí mismo. Un DrawJig dibuja tantos gráficos como se quiera, pero a cambio tiene que encargarse de todo él mismo. Ambos se inician con editor.Drag(jig).
¿Quién llama a quién?
Con Drag, su comando cede el control a AutoCAD. A partir de ese momento, AutoCAD le llama a usted: con cada movimiento del ratón y cada entrada llega el método Sampler. Si este notifica un valor nuevo, le sigue Update, y AutoCAD vuelve a dibujar el elemento. Esto continúa hasta que el usuario hace clic, teclea un valor, introduce una palabra clave o cancela. Solo entonces Drag regresa con un PromptResult.
Un jig de círculo en dos pasos
public class KreisJig : EntityJig
{
private Point3d _mittelpunkt;
private double _radius = double.NaN;
public KreisJig() : base(new Circle(Point3d.Origin, Vector3d.ZAxis, 10.0)) { }
public Circle Kreis => (Circle)Entity;
public bool RadiusSchritt { get; set; }
// AutoCAD llama a este método con cada movimiento del ratón
protected override SamplerStatus Sampler(JigPrompts prompts)
{
var status = SamplerStatus.Cancel;
if (!RadiusSchritt)
{
var ergebnis = prompts.AcquirePoint(new JigPromptPointOptions("\nMittelpunkt: "));
if (ergebnis.Status == PromptStatus.OK)
{
// Sin movimiento, sin redibujado
status = ergebnis.Value.IsEqualTo(_mittelpunkt)
? SamplerStatus.NoChange : SamplerStatus.OK;
_mittelpunkt = ergebnis.Value;
}
}
else
{
var optionen = new JigPromptDistanceOptions("\nRadius: ")
{
BasePoint = _mittelpunkt,
UseBasePoint = true,
UserInputControls = UserInputControls.NoZeroResponseAccepted
| UserInputControls.NoNegativeResponseAccepted
};
var ergebnis = prompts.AcquireDistance(optionen);
if (ergebnis.Status == PromptStatus.OK)
{
status = Math.Abs(ergebnis.Value - _radius) < 1e-9
? SamplerStatus.NoChange : SamplerStatus.OK;
_radius = ergebnis.Value;
}
}
return status;
}
// Transfiere los valores al círculo; después AutoCAD vuelve a dibujar
protected override bool Update()
{
Kreis.Center = _mittelpunkt;
if (RadiusSchritt)
{
Kreis.Radius = _radius;
}
return true;
}
}
Sampler obtiene la entrada a través de JigPrompts: AcquirePoint para puntos, AcquireDistance para distancias, además de AcquireAngle y AcquireString. Con BasePoint y UseBasePoint, AutoCAD mide el radio desde el centro y muestra una línea elástica. Los UserInputControls prohíben los valores cero y negativos. Así, AutoCAD rechaza por sí mismo un -5 tecleado, sin una sola línea de código propio. Update transfiere los valores y devuelve true si el elemento es válido. El comando llama a Drag una vez por cada paso:
[CommandMethod("MeinKreisJig")]
public void MeinKreisJig()
{
var dokument = Application.DocumentManager.MdiActiveDocument;
var jig = new KreisJig();
var ergebnis = dokument.Editor.Drag(jig); // Paso 1: centro
if (ergebnis.Status == PromptStatus.OK)
{
jig.RadiusSchritt = true;
ergebnis = dokument.Editor.Drag(jig); // Paso 2: radio
}
if (ergebnis.Status == PromptStatus.OK)
{
FuegeEin(dokument.Database, jig.Kreis); // AppendEntity, AddNewlyCreatedDBObject, Commit
dokument.Editor.WriteMessage(
$"\nKreis mit Radius {jig.Kreis.Radius} bei {jig.Kreis.Center} gezeichnet.");
}
else
{
jig.Kreis.Dispose(); // nunca llegó a la base de datos: liberarlo uno mismo
}
}
NoChange: el discreto valor de retorno
AutoCAD llama a Sampler con mucha frecuencia, no solo cuando realmente ha cambiado algo. Si el sampler devuelve siempre OK, cada vez le sigue Update con el correspondiente redibujado. La vista previa parpadea y el equipo tiene mucho trabajo. Por eso, el sampler compara el valor nuevo con el anterior y, si son iguales, devuelve NoChange. Los puntos los compara IsEqualTo con la tolerancia de AutoCAD; los números, una pequeña tolerancia propia.
Palabras clave y acotación dinámica
Como en CÍRCULO, un jig puede ofrecer opciones. Las palabras clave se añaden a las opciones de la solicitud, por ejemplo con optionen.Keywords.Add("Durchmesser"). AutoCAD escribe por sí mismo la lista entre corchetes detrás del texto. Si el usuario teclea la palabra, Drag regresa con PromptStatus.Keyword. El comando cambia de modo y vuelve a llamar a Drag: cambiar de modo es cosa del comando, no del sampler.
El jig proporciona una cota en el círculo mediante el método GetDynamicDimensionData. Este devuelve una DynamicDimensionDataCollection, por ejemplo con una AlignedDimension cuyo DynamicDimension está en true. El texto "Ø <>" antepone un símbolo de diámetro al valor medido. Dónde se sitúa la cota lo determina Update.
Más de un elemento: DrawJig
Si el usuario debe dibujar una tarta a la que le falta un trozo (un arco y una polilínea), no basta con un EntityJig. El DrawJig sobrescribe, en lugar de Update, el método WorldDraw y dibuja allí con draw.Geometry.Draw cualquier elemento que todavía no esté en la base de datos.
Probar sin ratón
En la consola de AutoCAD no hay ratón. Pero los valores tecleados llegan allí a través de los mismos métodos Acquire. Por eso, la lógica de un jig se puede comprobar automáticamente:
Befehl: MeinKreisJig
Mittelpunkt: 50,50
Radius: 20
Kreis mit Radius 20 bei (50,50,0) gezeichnet.
En cambio, cómo se ve la vista previa y con qué frecuencia se ejecuta el sampler al mover el ratón solo lo muestra el AutoCAD real.
Errores típicos
- Sin
NoChange: la vista previa parpadea y el equipo se calienta de tanto calcular. - Usar el valor antes de comprobar el estado. Con
CanceloKeywordno contiene nada utilizable. - No limpiar tras una cancelación. El elemento del jig solo llega a la base de datos si todo sale bien; si no, hay que liberarlo.
- Escribir uno mismo las palabras clave en el texto. AutoCAD añade la lista de todos modos.
- Capturar con
catchlos valores no válidos enUpdate, en lugar de excluirlos antes. - Esperar que el elemento arrastrado ya tenga un
ObjectId, un handle o Xdata. Polylinees ambiguo en cuanto se incluyeGraphicsInterface. Un alias lo aclara.- Utilizar un jig solo para mostrar algo. Para eso son mejores los gráficos transitorios o un overrule.
Cómo le ayudamos
- Formación: los comandos propios, las entradas y los jigs forman parte de la formación «AutoCAD .NET API con C#».
- Proyecto: desarrollamos add-ins con comandos que se sienten como el propio AutoCAD, o hacemos más cómodos los que ya tiene. Concierte una primera conversación.
- El libro: el jig de círculo con la opción de diámetro, la tarta como DrawJig y un ejercicio con una elipse se muestran en el libro técnico de Ebi F. Eilber «AutoCAD .NET API», cuya publicación está prevista para 2027.
Fuente: Ebi F. Eilber, AutoCAD .NET API (libro técnico, publicación prevista para 2027), capítulo «Jig»
