import * as Core from "@intelligentgraphics/ig.gfx.core";
import { ComponentId, MathTypes } from "@intelligentgraphics/ig.gfx.core";
import { Placement } from "./Placement";
/** Class for deciding which placement should be applied to the passed component */
export default class PlacementDecision {
    private insertedId;
    private selectedRoots;
    private otherObjects;
    static bestPlacement(placements: Placement[], componentId: string, selection: string[]): Core.Transformation;
    /**
     * The constructor for the decision
     * @param insertedId
     * @param selection
     */
    constructor(insertedId: Core.ComponentId, selection?: ComponentId[]);
    /**
     * Gets the initial placement that should be used for the newly inserted object.
     * This will always be valid, i.e. there will be no collision with walls or other objects.
     * The order in which the this... methods are called, will be the order of priority for that method of placement.
     * If no placement is found, return a position to the right of the scene (guaranteed to be free of collision).
     * @returns {Transformation}
     */
    getTransformation(): MathTypes.Transformation;
    /**
     * Loop through the placements and find the first valid transformation provided by them.
     * @param placements
     * @param componentId
     * @param selection
     * @returns {Core.Transformation}
     */
    private static firstValidTransformation;
    /**
     * Add the placements responsible for positions to the right of selected items.
     */
    private nextToSelection;
    /**
     * Add the placements responsible for placement to objects that have strong snap points with the inserted id.
     */
    private snap;
    /**
     * Add the placement responsible for the insertion in the middle of the room.
     */
    private middleOfRoom;
    /**
     * Add the placements responsible for snapping to parents.
     */
    private child;
    /**
     * Adds the placements responsible for placing objects close to walls.
     * For this, we traverse the wall in incremental steps.
     */
    private atWall;
}
