Systém Jig
AutoCAD spoléhá na framework AcEdJig, který poskytuje vizuální zpětnou vazbu v reálném čase při získávání uživatelského vstupu. Ačkoli je tento systém výkonný, rozděluje vyzvání, vykreslování náhledu a vzorkování vstupu do několika přepsaných metod – logika se tak často rozprostírá do různých funkcí a fází životního cyklu. MLightCAD přetváří tento koncept pro web zavedením jednotného mechanismu jig řízeného TypeScriptem, který se bezproblémově integruje se vstupem výzev. Namísto správy drag smyček nebo stavových kódů vzorkovače mohou vývojáři připojit jig přímo k možnostem výzvy, čímž zůstává logika dynamického náhledu, uživatelský vstup a finální vytvoření entity pohromadě v jednom čitelném pracovním postupu.
Přehled
Systém Jig v MLightCAD umožňuje interaktivní náhledy a dynamické vytváření entit a nabízí pracovní postup podobný AcEdJig (ObjectARX) v AutoCADu. Jig spravuje dočasnou entitu náhledu, která se nepřetržitě aktualizuje podle pohybu kurzoru nebo přírůstkového uživatelského vstupu.
Mezi případy použití patří:
- interaktivní vytváření geometrie (bod, kružnice, polylinie atd.)
- měření vzdálenosti nebo úhlu v reálném čase
- úpravy existujících entit v reálném čase
MLightCAD však zavádí jednodušší, ucelenější a TypeScriptu bližší design, který snižuje strukturální složitost obvykle se vyskytující u jigů v AutoCADu.
Klíčový architektonický rozdíl
Jig se předává do možností výzvy
V AutoCADu jsou výzvy a jigy samostatné mechanismy. Spuštění jigu vyžaduje přepsání sampler(), worldDraw() a volání drag().
V MLightCAD mohou výzvy přímo nést instanci jigu:
const opts = new AcEdPromptDistanceOptions('Specify radius:')
opts.jig = new CircleJig(view, center)
const radius = await editor.getDistance(opts)Tento design:
- automaticky propojuje uživatelský vstup s živým náhledem
- odstraňuje ruční správu drag smyčky
➡️ Výsledek: méně boilerplate, více konzistence.
Kompletní logika dynamického vstupu zůstává pohromadě
Jak můžete vidět v AutoCAD AcEdJig Sample Code, AutoCAD rozděluje logiku vstupu pro vytvoření jedné elipsy na několik míst.
createEllipse()— získá střed elipsysampler()— získá koncový bod hlavní osy a vzdálenost od středu elipsy ke koncovému bodu vedlejší osy
V MLightCAD je celý pracovní postup dynamického vstupu vyjádřen sekvenčně takto.
const center = await editor.getPoint(pointOpts)
radiusOpts.jig = new CircleJig(view, center)
const radius = await editor.getDistance(radiusOpts)➡️ Uživatelský vstup, náhled jigu a finální geometrie jsou spravovány v témže bloku kódu.
Klíčové koncepty
Obecný jig (AcEdPreviewJig<T>)
AcEdPreviewJig<T> je třída založená na TypeScriptu, která spravuje přechodné entity náhledu:
| AutoCAD AcEdJig | Web CAD Jig (AcEdPreviewJig) |
|---|---|
sampler() | update(value: T) |
startJig() | setEntity() |
drag() | Ovládáno externě pomocí událostí JS |
Vlastnosti:
- Používá obecný typ
Tpro zpracování více typů vstupu (bod, vzdálenost, úhel atd.) - Integruje se s
AcEdBaseViewpro vykreslování přechodných entit - Podporuje entity náhledu implementující
onJigUpdate(value: T)pro dynamické aktualizace geometrie - Umožňuje čisté ukončení jigu pomocí
end()
Základní metody
update(value: T): void
Aktualizuje entitu náhledu podle uživatelského vstupu. Jedná se o ekvivalent sampler() v AutoCADu.
render(): void
Vykreslí entitu náhledu v přidruženém zobrazení, podobně jako worldDraw() v AutoCADu.
end(): void
Vymaže přechodnou entitu a ukončí relaci jigu.
entity: AcDbEntity | null
Getter pro aktuální entitu náhledu.
Použití jigů
Krok 1: Vytvoření třídy jigu
Pro konkrétní entitu je třeba vytvořit třídu dědící z AcEdPreviewJig<T>. Například vytvoření jigu kružnice:
import { AcDbCircle, AcGePoint3dLike } from '@mlightcad/data-model'
import { AcEdPreviewJig, AcEdBaseView } from '@mlightcad/cad-simple-viewer'
export class AcApCircleJig extends AcEdPreviewJig<number> {
private _circle: AcDbCircle
constructor(view: AcEdBaseView, center: AcGePoint3dLike) {
super(view)
this._circle = new AcDbCircle(center, 0)
}
get entity(): AcDbCircle {
return this._circle
}
update(radius: number) {
this._circle.radius = radius
}
}Vysvětlení:
- Jig spravuje přechodnou
AcDbCircle. - Metoda
updatedynamicky mění poloměr podle uživatelského vstupu.
Krok 2: Použití jigu v příkazu
Jig můžete integrovat do příkazu pro interaktivní vytvoření entity:
import { AcEdCommand, AcApDocManager, AcEdPromptPointOptions, AcEdPromptDistanceOptions } from '@mlightcad/cad-simple-viewer'
import { AcApCircleJig } from './AcApCircleJig'
export class AcApCircleCmd extends AcEdCommand {
async execute(context) {
// Step 2a: Acquire center point
const centerPrompt = new AcEdPromptPointOptions('Specify center of circle:')
const center = await AcApDocManager.instance.editor.getPoint(centerPrompt)
// Step 2b: Acquire radius using Jig
const radiusPrompt = new AcEdPromptDistanceOptions('Specify radius of circle:')
radiusPrompt.jig = new AcApCircleJig(context.view, center)
const radius = await AcApDocManager.instance.editor.getDistance(radiusPrompt)
// Step 2c: Add circle to database
const circle = new AcDbCircle(center, radius)
context.doc.database.tables.blockTable.modelSpace.appendEntity(circle)
}
}Pracovní postup:
- Vyzvěte uživatele k zadání středu kružnice.
- Vytvořte jig kružnice připojený ke středu.
- Vyzvěte uživatele k zadání poloměru s interaktivním náhledem.
- Potvrďte finální kružnici do databáze.
Uživatelský vstup
Kompletní a aktuální příručku k API pro vstup v AcEditor, možnostem výzev, pravidlům klíčových slov a zpracování výsledků výzev naleznete v části: