#ifndef TITAN_PCBCAM_UTIL_H
#define TITAN_PCBCAM_UTIL_H
#include "../titanpcbcamglobal.h"
#include <QRectF>
#include "./feature.h"
#include "./symbol.h"
#include "./job.h"
#include "./step.h"
#include "./layer.h"
#include "./common.h"
#include <QPainterPath>
#include <QPen>


class TITAN_PCBCAM_EXPORT PcbCamUtil
{
public:
    static QString formatNumber(double iNumber, int iPercision = 6);
    static QVariantMap calcPathArc(const QPointF &iPs, const QPointF &iPe, const QPointF &iPc, bool iCw);
    static QPainterPath arc2path(const QPointF &iPs, const QPointF &iPe, const QPointF &iPc, bool iCw);
    static QPainterPath line2path(const QLineF &iLine);

    static QPen sym2pen(PcbCamSymbol *iSymbol);

    static QTransform matrix(const QPointF &iPos, PcbCam::Orient iOrient);
    static QTransform matrix(const QPointF &iPos, const QPointF &iDatum, qreal iAngle, bool iMirror);

    static void drawFeatures(QPainter *painter,
                             const QList<PcbCamFeature*> &iFeatures,
                             PcbCam::Polarity iPolarity,
                             const QColor &iColor,
                             const QTransform &iMatrix,
                             const QRectF &iSceneRect,
                             PcbCam::DisplayOptions iDispOption = PcbCam::DisplayFill,
                             PcbCamJob *iJob = nullptr,
                             PcbCamStep *iStep = nullptr,
                             PcbCamLayer *iLayer = nullptr);


    static int orient2angle(PcbCam::Orient iOrient);
    static bool orient2mirror(PcbCam::Orient iOrient);

    static bool isFeatMatchFilter(PcbCamFeature *iFeat,
                                  PcbCam::FeatureTypes iTypes,
                                  PcbCam::Polarities iPolarities,
                                  bool iIsFilterProfile,
                                  PcbCam::ProfileRegions iProfileRegion,
                                  const QPainterPath &iProfilePath,
                                  bool iIsFilterIncludeSymbol,
                                  QSet<PcbCamSymbol *> iIncludeSymbols,
                                  bool iIsFilterExcludeSymbol,
                                  QSet<PcbCamSymbol *> iExcludeSymbols,
                                  bool iIsFilterIncludeAttr,
                                  QList<PcbCam::AttrCompareInfo> iIncludeAttrs,
                                  PcbCam::LogicOperator iIncludeAttrLogic,
                                  bool iIsFilterExcludeAttr,
                                  QList<PcbCam::AttrCompareInfo> iExcludeAttrs,
                                  PcbCam::LogicOperator iExcludeAttrLogic);

    //点到线段的最短距离
//    static double point2segDist(double x, double y, double x1, double y1, double x2, double y2);

    //点到多段线最短距离
//    static double point2polylineDist(const QPointF &p, const QPolygonF &polyline);

    //查找封闭的painterpath
    static QPainterPath findClosedPath(const QList<PcbCamFeature*> &iFeatures, double iTol = 0.0001);

    //查找polyline
    static QList<QPainterPath> findPolyline(const QList<PcbCamFeature*> &iFeatures, double iTol = 0.0001);

};

#endif // TITAN_PCBCAM_UTIL_H