import { tContour, Contour, Transform2d, Transform3d, Segment1, Figure, tFigures, tVolume } from 'geometrix';

declare enum tJDir {
    eA = 0,
    eB = 1
}
declare enum tJSide {
    eABRight = 0,
    eABLeft = 1
}
interface tJunction {
    jName: string;
    jDir: tJDir;
    jSide: tJSide;
    jPosition: number;
}
/**
 * class `ContourJ`
 *
 */
declare class ContourJ extends Contour {
    /** @internal */
    pJuncs: tJunction[];
    lastPosition: number;
    facetIdx: number;
    ctrIdx: number;
    used: number;
    startJunction(jName: string, aNb: tJDir, abSide: tJSide): this;
    findIdx(jName: string): number;
    cloneJ(iCtr: Contour): ContourJ;
    generateRevertOrientation(): ContourJ;
    translate(ix: number, iy: number): ContourJ;
    translatePolar(ia: number, il: number): ContourJ;
    rotate(ix: number, iy: number, ia: number): ContourJ;
    setIdx(iFacetIdx: number, iCtrIdx: number): void;
    compareIdx(iFacetIdx: number, iCtrIdx: number): boolean;
    incrementUsed(): void;
    normOrientation(iOuterInner: boolean): ContourJ;
}
type tContourJ = tContour | ContourJ;
/**
 * class `Facet`
 *
 */
declare class Facet {
    /** @internal */
    attached: boolean;
    ax: number;
    ay: number;
    aa: number;
    juncIdx: number;
    outerInner: tContourJ[];
    constructor(iOuterInner: tContourJ[]);
    place(tm2: Transform2d): Facet;
    getContourPure(): tContour[];
    getContourJ(iFacetIdx: number): ContourJ[];
    getContourAll(): tContour[];
}
/**
 * Intanciate a ContourJ object
 * @internal
 *
 *  @param ix - x-coordiante of the starting point
 *  @param iy - y-coordiante of the starting point
 *  @param icolor - option color for displaying that contour
 *  @returns the ContourJ object
 */
declare function contourJ(ix: number, iy: number, icolor?: string): ContourJ;
/**
 * Intanciate a Facet object
 * @internal
 *
 *  @param iOuterInner - a list of CountourJ/Contour objects
 *  @returns the Facet object
 */
declare function facet(iOuterInner: tContourJ[]): Facet;
declare function contourJ2contour(iContoutJ: tContourJ): tContour;

interface tJunc {
    angle: number;
    radius: number;
    neutral: number;
    mark: number;
}
type tJuncs = Record<string, tJunc>;
interface tJunc2 {
    jName: string;
    angle: number;
    radius: number;
    neutral: number;
    mark: number;
    associated: number;
    a1FacetIdx: number;
    a1ContIdx: number;
    a1SegIdx: number;
    a1Dir: tJDir;
    a1Side: tJSide;
    a1x: number;
    a1y: number;
    a1Teta: number;
    a2FacetIdx: number;
    a2ContIdx: number;
    a2SegIdx: number;
    a2Dir: tJDir;
    a2Side: tJSide;
    a2x: number;
    a2y: number;
    a2Teta: number;
    jLength: number;
    jx: number;
    jy: number;
}
interface tJunc3 {
    jName: string;
    segPosition: number;
    jDir: tJDir;
}
type tHalfProfile = (string | number)[];
interface tOneProfile {
    x1: number;
    y1: number;
    a1: number;
    l1: number;
    ante: tHalfProfile;
    post: tHalfProfile;
}
/**
 * class `SheetFold`
 *
 */
declare class SheetFold {
    /** @internal */
    pThickness: number;
    pPartName: string;
    pSFMark: string;
    pFacets: Facet[];
    pJuncs: tJunc2[];
    pProfiles: tOneProfile[];
    constructor(iFacets: Facet[], iJuncs: tJuncs, iProfiles: tOneProfile[], iThickness: number, iPartName: string, iSFMark: string);
    /** @internal */
    printJuncs(): void;
    /** @internal */
    oneTetaLength(faIdx: number, coIdx: number, segIdx: number): [number, number, number, number, string];
    /** @internal */
    computeLength(): void;
    checkFacet(): void;
    /** @internal */
    getJuncIdx(jName: string): number;
    /** @internal */
    fromJunctionToAttach(iJunc: tJunc2): [number, number, number];
    positionF(iTm: Transform3d, iFacetIdx: number): Transform3d;
    positionJ(iTm: Transform3d, jIdx: number): Transform3d;
    positionJ2d(iFacetIdx: number): Transform2d;
    positionF2d(iFacetIdx: number): Transform2d;
    findCtrJ(iCtrsJ: ContourJ[], iFacetIdx: number, iCtrIdx: number): ContourJ;
    generateJunc3List(iCtrJ: ContourJ): tJunc3[];
    calcJuncList(iCtrJ: ContourJ, jName: string): tJunc3[];
    incrSegIdx(idx: number, delta: number, maxIdx: number): number;
    addSeg(iCtr: Contour, iSeg: Segment1): void;
    makePartialCtr(iCtrJ: ContourJ, iJuncList: tJunc3[], first: boolean, iCtrsJ: ContourJ[]): Contour;
    generateNewContours(iCtrsJ: ContourJ[]): tContour[];
    generateOneMarker(iJunc: tJunc2): tContour;
    generateMarkers(): tContour[];
    makePatternFigure(iCheck: boolean): Figure;
    /** @internal */
    nameFacePattern(): string;
    /** @internal */
    nameFace(idx: number): string;
    /** @internal */
    nameFaceJ(idx: number): string;
    /** @internal */
    nameFaceProfiles(): string;
    /** @internal */
    makeFacetFig(iFacetIdx: number, iFacet: Facet): Figure;
    /** @internal */
    drawJuncPositive(rE: number, rI: number, angle: number): [tContour, number, number];
    /** @internal */
    drawJuncNegative(rE: number, rI: number, angle: number): [tContour, number, number];
    /** @internal */
    makeJuncCtr(jName: string, jAngle: number, jRadius: number, jNeutral: number): [tContour, number, number];
    /** @internal */
    makeProfileFig(): Figure;
    makeFigures(iCheck?: boolean): tFigures;
    makeVolume(): tVolume;
}
declare function sheetFold(iFacets: Facet[], iJuncs: tJuncs, iProfiles: tOneProfile[], iThickness: number, iPartName: string, iSFMark?: string): SheetFold;
declare function facet2figure(iFacet: Facet): Figure;

export { ContourJ, Facet, SheetFold, contourJ, contourJ2contour, facet, facet2figure, sheetFold, type tContourJ, type tHalfProfile, tJDir, tJSide, type tJunc, type tJunc2, type tJunc3, type tJuncs, type tJunction, type tOneProfile };
