Comandi interattivi con i jig in AutoCAD .NET

CAD-Oberfläche mit 3D-Hausmodell, Menüband und Layerliste

CAD

Un comando chiede «Centro:» e «Raggio:», l'utente digita numeri e vede il risultato solo alla fine. Funziona, ma sembra di essere nel 1995. AutoCAD mostra con il comando CERCHIO come si può fare meglio: il cerchio è agganciato al mouse e cresce con esso. Questa anteprima si chiama jig – e con l'API .NET la integra nei Suoi comandi.

Che cos'è un jig

In officina un jig è un'attrezzatura che guida l'utensile, ad esempio una dima di foratura. In AutoCAD il jig non guida il trapano, ma il mouse: mostra un elemento così come apparirà se l'utente fa clic in quel momento. Il namespace Autodesk.AutoCAD.EditorInput offre a questo scopo due classi. Un EntityJig trascina esattamente un elemento, e AutoCAD lo disegna da sé. Un DrawJig disegna quanta grafica si vuole, ma deve occuparsi di tutto da solo. Entrambi si avviano con editor.Drag(jig).

Chi chiama chi?

Con Drag il Suo comando cede il controllo ad AutoCAD. Da quel momento è AutoCAD a chiamare Lei: a ogni movimento del mouse e a ogni input arriva il metodo Sampler. Se questo segnala un nuovo valore, segue Update, e AutoCAD ridisegna l'elemento. Ciò continua finché l'utente fa clic, digita un valore, immette una parola chiave o annulla. Solo allora Drag ritorna con un PromptResult.

Un jig per il cerchio in due passi

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 lo chiama a ogni movimento del mouse

    protected override SamplerStatus Sampler(JigPrompts prompts)

    {

        var status = SamplerStatus.Cancel;

        if (!RadiusSchritt)

        {

            var ergebnis = prompts.AcquirePoint(new JigPromptPointOptions("\nMittelpunkt: "));

            if (ergebnis.Status == PromptStatus.OK)

            {

                // Nessun movimento, nessun ridisegno

                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;

    }



    // Trasferisce i valori al cerchio, poi AutoCAD ridisegna

    protected override bool Update()

    {

        Kreis.Center = _mittelpunkt;

        if (RadiusSchritt)

        {

            Kreis.Radius = _radius;

        }

        return true;

    }

}

Sampler acquisisce l'input tramite JigPrompts: AcquirePoint per i punti, AcquireDistance per le distanze, inoltre AcquireAngle e AcquireString. Con BasePoint e UseBasePoint AutoCAD misura il raggio a partire dal centro e mostra una linea elastica. Gli UserInputControls vietano valori nulli e negativi. Un -5 digitato viene allora respinto da AutoCAD stesso, senza una riga di codice proprio. Update trasferisce i valori e restituisce true se l'elemento è valido. Il comando chiama Drag una volta per ogni passo:

[CommandMethod("MeinKreisJig")]

public void MeinKreisJig()

{

    var dokument = Application.DocumentManager.MdiActiveDocument;

    var jig = new KreisJig();

    var ergebnis = dokument.Editor.Drag(jig);          // Passo 1: centro

    if (ergebnis.Status == PromptStatus.OK)

    {

        jig.RadiusSchritt = true;

        ergebnis = dokument.Editor.Drag(jig);          // Passo 2: raggio

    }

    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();                           // mai nel database: rilasciarlo da sé

    }

}

NoChange: il valore di ritorno poco appariscente

AutoCAD chiama Sampler molto spesso, non solo quando qualcosa è davvero cambiato. Se il sampler restituisce ogni volta OK, ogni volta segue Update con relativo ridisegno. L'anteprima sfarfalla e il computer ha parecchio da fare. Per questo il sampler confronta il nuovo valore con quello vecchio e, in caso di uguaglianza, segnala NoChange. I punti li confronta IsEqualTo con la tolleranza di AutoCAD, i numeri una piccola tolleranza propria.

Parole chiave e quotatura dinamica

Come in CERCHIO, un jig può offrire opzioni. Le parole chiave sono legate alle opzioni della richiesta, ad esempio con optionen.Keywords.Add("Durchmesser"). L'elenco tra parentesi quadre AutoCAD lo scrive da sé dopo il testo. Se l'utente digita la parola, Drag ritorna con PromptStatus.Keyword. Il comando cambia modalità e chiama di nuovo Drag – cambiare modalità è compito del comando, non del sampler.

Una quota sul cerchio la fornisce il jig tramite il metodo GetDynamicDimensionData. Questo restituisce una DynamicDimensionDataCollection, ad esempio con una AlignedDimension la cui DynamicDimension è impostata su true. Il testo "Ø <>" antepone un simbolo di diametro al valore misurato. Dove si trova la quota lo stabilisce Update.

Più di un elemento: DrawJig

Se l'utente deve tracciare una torta con una fetta mancante – un arco e una polilinea –, un EntityJig non basta. Il DrawJig sovrascrive, invece di Update, il metodo WorldDraw e lì disegna con draw.Geometry.Draw elementi qualsiasi che non sono ancora nel database.

Testare senza mouse

Nella console di AutoCAD non c'è il mouse. I valori digitati però arrivano lì attraverso gli stessi metodi Acquire. La logica di un jig si può quindi verificare automaticamente:

Befehl: MeinKreisJig

Mittelpunkt: 50,50

Radius: 20

Kreis mit Radius 20 bei (50,50,0) gezeichnet.

Come appare l'anteprima e quanto spesso gira il sampler muovendo il mouse lo mostra invece solo il vero AutoCAD.

Errori tipici

  • Nessun NoChange: l'anteprima sfarfalla e il computer si surriscalda a forza di calcolare.
  • Usare il valore prima di aver verificato lo stato. In caso di Cancel o Keyword lì non c'è nulla di utilizzabile.
  • Non fare pulizia dopo un annullamento. L'elemento del jig entra nel database solo in caso di successo, altrimenti va rilasciato.
  • Scrivere da sé le parole chiave nel testo. AutoCAD aggiunge comunque l'elenco.
  • Intercettare con catch valori non validi in Update, invece di escluderli prima.
  • Aspettarsi che l'elemento trascinato abbia già un ObjectId, un handle o Xdata.
  • Polyline è ambiguo non appena è incluso GraphicsInterface. Un alias fa chiarezza.
  • Usare un jig solo per visualizzare. A questo scopo sono più adatti la grafica temporanea o un overrule.

Come La aiutiamo

  • Formazione: comandi propri, input e jig fanno parte del corso «AutoCAD .NET API con C#».
  • Progetto: sviluppiamo add-in con comandi che danno la sensazione di AutoCAD stesso, oppure rendiamo più comodi quelli esistenti. Fissi un primo colloquio.
  • Il libro: il jig per il cerchio con l'opzione diametro, la torta come DrawJig e un esercizio con l'ellisse si trovano nel libro tecnico di Ebi F. Eilber «AutoCAD .NET API», la cui uscita è prevista per il 2027.

Fonte: Ebi F. Eilber, AutoCAD .NET API (libro tecnico, uscita prevista nel 2027), capitolo «Jig»

CONTACT

Seleziona la tua lingua

Primo colloquiofissare oraPrimo colloquiofissare ora