]> Shamusworld >> Repos - architektonas/blob - src/base/rs.h
Major refactoring of actions: Moved implementation from header files
[architektonas] / src / base / rs.h
1 #ifndef RS_H
2 #define RS_H
3
4 #include <QtGui>
5 #include <QPrinter>
6
7 #define RS_TEST
8
9 #ifdef RS_TEST
10 #include <assert.h>
11 #endif
12
13 // Windoze XP can't handle the original MAX/MINDOUBLE's
14 #define RS_MAXDOUBLE 1.0E+10
15 #define RS_MINDOUBLE -1.0E+10
16
17 /**
18  * Class namespace for various enums along with some simple
19  * wrapper methods for converting the enums to the Qt
20  * counterparts.
21  *
22  * @author Andrew Mustun
23  */
24 class RS2
25 {
26 public:
27
28     /**
29      * Flags.
30      */
31     enum Flags {
32         /** Flag for Undoables. */
33         FlagUndone      = 1 << 0,
34         /** Entity Visibility. */
35         FlagVisible     = 1 << 1,
36         /** Entity attribute (e.g. color) is defined by layer. */
37         FlagByLayer     = 1 << 2,
38         /** Entity attribute (e.g. color) defined by block. */
39         FlagByBlock     = 1 << 3,
40         /** Layer frozen. */
41         FlagFrozen      = 1 << 4,
42         /** Layer frozen by default. */
43         FlagDefFrozen   = 1 << 5,
44         /** Layer locked. */
45         FlagLocked      = 1 << 6,
46         /** Used for invalid pens. */
47         FlagInvalid     = 1 << 7,
48         /** Entity in current selection. */
49         FlagSelected    = 1 << 8,
50         /** Polyline closed? */
51         FlagClosed      = 1 << 9,
52         /** Flag for temporary entities (e.g. hatch) */
53         FlagTemp        = 1 << 10,
54         /** Flag for processed entities (optcontour) */
55         FlagProcessed   = 1 << 11,
56         /** Startpoint selected */
57         FlagSelected1   = 1 << 12,
58         /** Endpoint selected */
59         FlagSelected2   = 1 << 13,
60                 /** Entity is highlighted temporarily (as a user action feedback) */
61                 FlagHighlighted = 1 << 14
62     };
63
64     /**
65      * Variable types used by RS_VariableDict and RS_Variable.
66      */
67     enum VariableType {
68         VariableString,
69         VariableInt,
70         VariableDouble,
71         VariableVector,
72         VariableVoid
73     };
74
75     /**
76      * File types. Used by file dialogs. Note: the extension might not
77      * be enough to distinguish file types.
78      */
79     enum FormatType {
80         FormatUnknown,       /**< Unknown / unsupported format. */
81         FormatDXF1,          /**< QCad 1 compatibility DXF format. */
82         FormatDXF,           /**< DXF format. 2000. */
83         FormatDXF12,         /**< DXF format. R12. */
84         FormatCXF,           /**< CAM Expert Font format. */
85                 FormatCAM            /**< CAM Expert CAM format (NC, CNC, D, ..) */
86     };
87
88     /**
89      * Entity types returned by the rtti() method
90      */
91     enum EntityType {
92         EntityUnknown,      /**< Unknown */
93         EntityContainer,    /**< Container */
94         EntityBlock,        /**< Block (Group definition) */
95         EntityFontChar,     /**< Font character */
96         EntityInsert,       /**< Insert (Group instance) */
97         EntityGraphic,      /**< Graphic with layers */
98         EntityPoint,        /**< Point */
99         EntityLine,         /**< Line */
100         EntityPolyline,     /**< Polyline */
101         EntityVertex,       /**< Vertex (part of a polyline) */
102         EntityArc,          /**< Arc */
103         EntityCircle,       /**< Circle */
104         EntityEllipse,      /**< Ellipse */
105         EntitySolid,        /**< Ellipse */
106         EntityConstructionLine, /**< Construction line */
107         EntityText,         /**< Text */
108         EntityDimAligned,   /**< Aligned Dimension */
109         EntityDimLinear,    /**< Linear Dimension */
110         EntityDimRadial,    /**< Radial Dimension */
111         EntityDimDiametric, /**< Diametric Dimension */
112         EntityDimAngular,   /**< Angular Dimension */
113         EntityDimLeader,    /**< Leader Dimension */
114         EntityHatch,        /**< Hatch */
115         EntityImage,        /**< Image */
116         EntitySpline        /**< Spline */
117     };
118
119     /**
120      * Action types used by action factories.
121      */
122     enum ActionType {
123         ActionNone,        /**< Invalid action id. */
124
125         ActionDefault,
126
127         ActionFileNew,
128         ActionFileOpen,
129         ActionFileSave,
130         ActionFileSaveAs,
131         ActionFileExport,
132         ActionFileClose,
133         ActionFilePrint,
134         ActionFilePrintPreview,
135         ActionFileQuit,
136
137         ActionPrintPreview,
138
139         ActionEditUndo,
140         ActionEditRedo,
141         ActionEditCut,
142         ActionEditCutNoSelect,
143         ActionEditCopy,
144         ActionEditCopyNoSelect,
145         ActionEditPaste,
146
147         ActionViewStatusBar,
148         ActionViewLayerList,
149         ActionViewBlockList,
150         ActionViewCommandLine,
151         ActionViewOptionToolbar,
152         ActionViewGrid,
153         ActionViewDraft,
154
155         ActionZoomIn,
156         ActionZoomOut,
157         ActionZoomAuto,
158         ActionZoomWindow,
159         ActionZoomPan,
160         ActionZoomRedraw,
161         ActionZoomPrevious,
162
163         ActionSelectSingle,
164         ActionSelectContour,
165         ActionSelectWindow,
166         ActionDeselectWindow,
167         ActionSelectAll,
168         ActionDeselectAll,
169         ActionSelectIntersected,
170         ActionDeselectIntersected,
171         ActionSelectInvert,
172         ActionSelectLayer,
173         ActionSelectDouble,
174
175         ActionDrawArc,
176         ActionDrawArc3P,
177         ActionDrawArcParallel,
178         ActionDrawArcTangential,
179         ActionDrawCircle,
180         ActionDrawCircle2P,
181         ActionDrawCircle3P,
182         ActionDrawCircleCR,
183         ActionDrawCircleParallel,
184         ActionDrawEllipseArcAxis,
185         ActionDrawEllipseAxis,
186         ActionDrawHatch,
187         ActionDrawHatchNoSelect,
188         ActionDrawImage,
189         ActionDrawLine,
190         ActionDrawLineAngle,
191         ActionDrawLineBisector,
192         ActionDrawLineFree,
193         ActionDrawLineHorVert,
194         ActionDrawLineHorizontal,
195         ActionDrawLineOrthogonal,
196         ActionDrawLineParallel,
197         ActionDrawLineParallelThrough,
198         ActionDrawLinePolygon,
199         ActionDrawLinePolygon2,
200         ActionDrawLineRectangle,
201         ActionDrawLineRelAngle,
202         ActionDrawLineTangent1,
203         ActionDrawLineTangent2,
204         ActionDrawLineVertical,
205         ActionDrawPoint,
206         ActionDrawSpline,
207         ActionDrawPolyline,
208         ActionDrawText,
209
210                 ActionPolylineAdd,
211                 ActionPolylineAppend,
212                 ActionPolylineDel,
213                 ActionPolylineDelBetween,
214                 ActionPolylineTrim,
215
216         ActionDimAligned,
217         ActionDimLinear,
218         ActionDimLinearVer,
219         ActionDimLinearHor,
220         ActionDimRadial,
221         ActionDimDiametric,
222         ActionDimAngular,
223         ActionDimLeader,
224
225         ActionModifyAttributes,
226         ActionModifyAttributesNoSelect,
227         ActionModifyDelete,
228         ActionModifyDeleteNoSelect,
229         ActionModifyDeleteQuick,
230         ActionModifyDeleteFree,
231         ActionModifyMove,
232         ActionModifyMoveNoSelect,
233         ActionModifyRotate,
234         ActionModifyRotateNoSelect,
235         ActionModifyScale,
236         ActionModifyScaleNoSelect,
237         ActionModifyMirror,
238         ActionModifyMirrorNoSelect,
239         ActionModifyMoveRotate,
240         ActionModifyMoveRotateNoSelect,
241         ActionModifyRotate2,
242         ActionModifyRotate2NoSelect,
243         ActionModifyEntity,
244         ActionModifyTrim,
245         ActionModifyTrim2,
246         ActionModifyTrimAmount,
247         ActionModifyCut,
248         ActionModifyStretch,
249         ActionModifyBevel,
250         ActionModifyRound,
251
252         ActionSnapFree,
253         ActionSnapGrid,
254         ActionSnapEndpoint,
255         ActionSnapOnEntity,
256         ActionSnapCenter,
257         ActionSnapMiddle,
258         ActionSnapDist,
259         ActionSnapIntersection,
260         ActionSnapIntersectionManual,
261
262         ActionRestrictNothing,
263         ActionRestrictOrthogonal,
264         ActionRestrictHorizontal,
265         ActionRestrictVertical,
266
267         ActionSetRelativeZero,
268         ActionLockRelativeZero,
269         ActionUnlockRelativeZero,
270
271         ActionInfoInside,
272         ActionInfoDist,
273         ActionInfoDist2,
274         ActionInfoAngle,
275         ActionInfoTotalLength,
276         ActionInfoTotalLengthNoSelect,
277         ActionInfoArea,
278
279         ActionLayersDefreezeAll,
280         ActionLayersFreezeAll,
281         ActionLayersAdd,
282         ActionLayersRemove,
283         ActionLayersEdit,
284         ActionLayersToggleView,
285         ActionLayersToggleLock,
286
287         ActionBlocksDefreezeAll,
288         ActionBlocksFreezeAll,
289         ActionBlocksAdd,
290         ActionBlocksRemove,
291         ActionBlocksAttributes,
292         ActionBlocksEdit,
293         ActionBlocksInsert,
294         ActionBlocksToggleView,
295         ActionBlocksCreate,
296         ActionBlocksCreateNoSelect,
297         ActionBlocksExplode,
298         ActionBlocksExplodeNoSelect,
299
300         ActionModifyExplodeText,
301         ActionModifyExplodeTextNoSelect,
302
303         ActionLibraryInsert,
304
305         ActionOptionsGeneral,
306         ActionOptionsDrawing,
307
308                 ActionToolRegenerateDimensions,
309
310                 ActionScriptOpenIDE,
311                 ActionScriptRun,
312
313 #ifndef RS_NO_COMPLEX_ENTITIES
314                 ActionPARISDebugCreateContainer,
315 #endif
316
317 #ifdef RS_CAM
318                 ActionCamExportAuto,
319                 ActionCamReorder,
320 #endif
321
322         /** Needed to loop through all actions */
323         ActionLast
324     };
325
326     /**
327     * Entity ending. Used for returning which end of an entity is ment.
328      */
329     enum Ending {
330         EndingStart,    /**< Start point. */
331         EndingEnd,      /**< End point. */
332         EndingNone      /**< Neither. */
333     };
334
335     /**
336      * Update mode for non-atomic entities that need to be updated when
337      * they change. e.g. texts, inserts, ...
338      */
339     enum UpdateMode {
340         NoUpdate,       /**< No automatic updates. */
341         Update,         /**< Always update automatically when modified. */
342                 PreviewUpdate   /**< Update automatically but only for previews (quick update) */
343     };
344
345     /**
346      * Drawing mode.
347      */
348     enum DrawingMode {
349         ModeFull,       /**< Draw everything always detailed (default) */
350         ModeAuto,       /**< Draw details when reasonable */
351         ModePreview,    /**< Draw only in black/white without styles */
352         ModeXOR,        /**< XOR mode for moving previews */
353                 ModeBW          /**< Black/white. Can be used for printing. */
354     };
355
356     /**
357      * Undoable rtti.
358      */
359     enum UndoableType {
360         UndoableUnknown,    /**< Unknown undoable */
361         UndoableEntity,     /**< Entity */
362         UndoableLayer       /**< Layer */
363     };
364
365     /**
366      * Toolbar ID's.
367      */
368     enum ToolBarId {
369         ToolBarMain,        /**< Main (menu). */
370         ToolBarPoints,      /**< Points. */
371         ToolBarLines,       /**< Lines. */
372         ToolBarArcs,        /**< Arcs. */
373         ToolBarCircles,     /**< Circles. */
374         ToolBarEllipses,    /**< Ellipses. */
375         ToolBarSplines,     /**< Splines. */
376         ToolBarPolylines,   /**< Polylines. */
377         ToolBarText,        /**< Text. */
378         ToolBarDim,         /**< Dimensions. */
379         ToolBarSnap,        /**< Snap. */
380         ToolBarModify,      /**< Modify. */
381         ToolBarSelect,      /**< Select. */
382         ToolBarInfo         /**< Information */
383     };
384
385     /**
386      * Units.
387      */
388     enum Unit {
389         None = 0,               /**< No unit (unit from parent) */
390         Inch = 1,               /**< Inch */
391         Foot = 2,               /**< Foot: 12 Inches */
392         Mile = 3,               /**< Mile: 1760 Yards = 1609 m */
393         Millimeter = 4,         /**< Millimeter: 0.001m */
394         Centimeter = 5,         /**< Centimeter: 0.01m */
395         Meter = 6,              /**< Meter */
396         Kilometer = 7,          /**< Kilometer: 1000m */
397         Microinch = 8,          /**< Microinch: 0.000001 */
398         Mil = 9,                /**< Mil = 0.001 Inch*/
399         Yard = 10,              /**< Yard: 3 Feet */
400         Angstrom = 11,          /**< Angstrom: 10^-10m  */
401         Nanometer = 12,         /**< Nanometer: 10^-9m  */
402         Micron = 13,            /**< Micron: 10^-6m  */
403         Decimeter = 14,         /**< Decimeter: 0.1m */
404         Decameter = 15,         /**< Decameter: 10m */
405         Hectometer = 16,        /**< Hectometer: 100m */
406         Gigameter = 17,         /**< Gigameter: 1000000m */
407         Astro = 18,             /**< Astro: 149.6 x 10^9m */
408         Lightyear = 19,         /**< Lightyear: 9460731798 x 10^6m */
409         Parsec = 20,            /**< Parsec: 30857 x 10^12 */
410
411         LastUnit = 21           /**< Used to iterate through units */
412     };
413
414
415     /**
416      * Format for length values.
417      */
418     enum LinearFormat {
419         /** Scientific (e.g. 2.5E+05) */
420         Scientific,
421         /** Decimal (e.g. 9.5)*/
422         Decimal,
423         /** Engineering (e.g. 7' 11.5")*/
424         Engineering,
425         /** Architectural (e.g. 7'-9 1/8")*/
426         Architectural,
427         /** Fractional (e.g. 7 9 1/8) */
428         Fractional
429     };
430
431     /**
432      * Angle Units.
433      */
434     enum AngleUnit {
435         Deg,               /**< Degrees */
436         Rad,               /**< Radians */
437         Gra                /**< Gradians */
438     };
439
440     /**
441      * Display formats for angles.
442      */
443     enum AngleFormat {
444         /** Degrees with decimal point (e.g. 24.5°) */
445         DegreesDecimal,
446         /** Degrees, Minutes and Seconds (e.g. 24°30'5") */
447         DegreesMinutesSeconds,
448         /** Gradians with decimal point (e.g. 390.5)*/
449         Gradians,
450         /** Radians with decimal point (e.g. 1.57)*/
451         Radians,
452         /** Surveyor's units */
453         Surveyors
454     };
455
456     /**
457      * Enum of levels of resolving when iterating through an entity tree.
458      */
459     enum ResolveLevel {
460         /** Groups are not resolved */
461         ResolveNone,
462                 /**
463                  * Resolve all but not Inserts.
464                  */
465                 ResolveAllButInserts,
466         /**
467          * all Entity Containers are resolved
468          * (including Texts, Polylines, ...)
469          */
470         ResolveAll
471     };
472
473     /**
474      * Direction used for scrolling actions.
475      */
476     enum Direction {
477         Up, Left, Right, Down
478     };
479
480     /**
481      * Vertical alignments.
482      */
483     enum VAlign {
484         VAlignTop,      /**< Top. */
485         VAlignMiddle,   /**< Middle */
486         VAlignBottom    /**< Bottom */
487     };
488
489     /**
490      * Horizontal alignments.
491      */
492     enum HAlign {
493         HAlignLeft,     /**< Left */
494         HAlignCenter,   /**< Centered */
495         HAlignRight     /**< Right */
496     };
497
498     /**
499      * Text drawing direction.
500      */
501     enum TextDrawingDirection {
502         LeftToRight,     /**< Left to right */
503         TopToBottom,     /**< Top to bottom */
504         ByStyle          /**< Inherited from associated text style */
505     };
506
507     /**
508      * Line spacing style for texts.
509      */
510     enum TextLineSpacingStyle {
511         AtLeast,        /**< Taller characters will override */
512         Exact           /**< Taller characters will not override */
513     };
514
515     /**
516      * Leader path type.
517      */
518     enum LeaderPathType {
519         Straight,      /**< Straight line segments */
520         Spline         /**< Splines */
521     };
522
523     /**
524      * Direction for zooming actions.
525      */
526     enum ZoomDirection {
527         In, Out
528     };
529
530     /**
531      * Axis specification for zooming actions.
532      */
533     enum Axis {
534         OnlyX, OnlyY, Both
535     };
536
537     /**
538      * Snapping modes
539      */
540     enum SnapMode {
541         SnapFree,         /**< Free positioning */
542         SnapGrid,         /**< Snap to grid points */
543         SnapEndpoint,     /**< Snap to endpoints */
544         SnapMiddle,       /**< Snap to middle points */
545         SnapCenter,       /**< Snap to centers */
546         SnapOnEntity,     /**< Snap to the next point on an entity */
547         SnapDist,         /**< Snap to points with a distance to an endpoint */
548         SnapIntersection, /**< Snap to intersection */
549         SnapIntersectionManual  /**< Snap to intersection manually */
550     };
551
552     /**
553      * Snap restrictions
554      */
555     enum SnapRestriction {
556         RestrictNothing,        /**< No restriction to snap mode */
557         RestrictOrthogonal,     /**< Restrict to 90,180,270,0 degrees */
558         RestrictHorizontal,     /**< Restrict to 0,180 degrees */
559         RestrictVertical        /**< Restrict to 90,270 degrees */
560     };
561
562 #if 0
563 enum Qt::ButtonState_enum
564 Constant                        Value
565 Qt::ShiftButton         Qt::ShiftModifier
566 Qt::ControlButton       Qt::ControlModifier
567 Qt::AltButton           Qt::AltModifier
568 Qt::MetaButton          Qt::MetaModifier
569 Qt::Keypad                      Qt::KeypadModifier
570 Qt::KeyButtonMask       Qt::KeyboardModifierMask
571 #endif
572         /**
573          * Mouse button and keyboard state for mouse events.
574          */
575         enum ButtonState {
576                 NoButton        = Qt::NoButton,
577                 LeftButton      = Qt::LeftButton,
578                 RightButton     = Qt::RightButton,
579                 MidButton       = Qt::MidButton,
580                 MouseButtonMask = Qt::MouseButtonMask,
581                 ShiftButton     = Qt::ShiftModifier,
582                 ControlButton   = Qt::ControlModifier,
583                 AltButton       = Qt::AltModifier,
584                 MetaButton      = Qt::MetaModifier,
585                 KeyButtonMask   = Qt::KeyboardModifierMask,
586                 Keypad          = Qt::KeypadModifier
587         };
588
589 #if 1
590     /**
591      * Wrapper for Qt
592      */
593 //    static Qt::ButtonState rsToQtButtonState(RS2::ButtonState t) {
594 //        return (Qt::ButtonState)t;
595 //    }
596     static int rsToQtButtonState(RS2::ButtonState t) { return t; }
597
598     /**
599      * Wrapper for Qt
600      */
601 //    static RS2::ButtonState qtToRsButtonState(Qt::ButtonState t) {
602 //        return (RS2::ButtonState)t;
603 //    }
604     static RS2::ButtonState qtToRsButtonState(int t) { return (RS2::ButtonState)t; }
605 #endif
606
607     /**
608      * Enum of line styles:
609      */
610     enum LineType {
611         NoPen = 0,            /**< No line at all. */
612         SolidLine = 1,        /**< Normal line. */
613
614         DotLine = 2,          /**< Dotted line. */
615         DotLine2 = 3,         /**< Dotted line small. */
616         DotLineX2 = 4,        /**< Dotted line large. */
617
618         DashLine = 5,         /**< Dashed line. */
619         DashLine2 = 6,        /**< Dashed line small. */
620         DashLineX2 = 7,       /**< Dashed line large. */
621
622         DashDotLine = 8,      /**< Alternate dots and dashes. */
623         DashDotLine2 = 9,     /**< Alternate dots and dashes small. */
624         DashDotLineX2 = 10,   /**< Alternate dots and dashes large. */
625
626         DivideLine = 11,      /**< dash, dot, dot. */
627         DivideLine2 = 12,     /**< dash, dot, dot small. */
628         DivideLineX2 = 13,    /**< dash, dot, dot large. */
629
630         CenterLine = 14,      /**< dash, small dash. */
631         CenterLine2 = 15,     /**< dash, small dash small. */
632         CenterLineX2 = 16,    /**< dash, small dash large. */
633
634         BorderLine = 17,      /**< dash, dash, dot. */
635         BorderLine2 = 18,     /**< dash, dash, dot small. */
636         BorderLineX2 = 19,    /**< dash, dash, dot large. */
637
638         LineByLayer = -1,     /**< Line type defined by layer not entity */
639         LineByBlock = -2      /**< Line type defined by block not entity */
640     };
641
642     /**
643      * Wrapper for Qt
644      */
645     static Qt::PenStyle rsToQtLineType(RS2::LineType t) {
646         switch (t) {
647         case NoPen:
648             return Qt::NoPen;
649             break;
650         case SolidLine:
651             return Qt::SolidLine;
652             break;
653         case DotLine:
654         case DotLine2:
655         case DotLineX2:
656             return Qt::DotLine;
657             break;
658         case DashLine:
659         case DashLine2:
660         case DashLineX2:
661             return Qt::DashLine;
662             break;
663         case DashDotLine:
664         case DashDotLine2:
665         case DashDotLineX2:
666             return Qt::DashDotLine;
667             break;
668         case DivideLine:
669         case DivideLine2:
670         case DivideLineX2:
671             return Qt::DashDotDotLine;
672             break;
673         case CenterLine:
674         case CenterLine2:
675         case CenterLineX2:
676             return Qt::DashDotLine;
677             break;
678         case BorderLine:
679         case BorderLine2:
680         case BorderLineX2:
681             return Qt::DashDotLine;
682             break;
683         case LineByLayer:
684         case LineByBlock:
685         default:
686             return Qt::SolidLine;
687             break;
688         }
689         return Qt::SolidLine;
690     }
691
692     /**
693      * Wrapper for Qt.
694      */
695     static RS2::LineType qtToRsPenStyle(Qt::PenStyle s) {
696         switch (s) {
697         case Qt::NoPen:
698             return NoPen;
699         case Qt::SolidLine:
700             return SolidLine;
701             break;
702         case Qt::DashLine:
703             return DashLine;
704             break;
705         case Qt::DotLine:
706             return DotLine;
707             break;
708         case Qt::DashDotLine:
709             return DashDotLine;
710             break;
711         case Qt::DashDotDotLine:
712             return DivideLine;
713             break;
714         default:
715             return SolidLine;
716             break;
717         }
718         return SolidLine;
719     }
720
721     /**
722      * \brief Struct that stores a line type pattern (e.g. dash dot dot).
723      */
724     struct LineTypePatternStruct {
725         double* pattern;
726         int num;
727     }
728     LineTypePattern;
729
730     /**
731      * Enum of line widths:
732      */
733     enum LineWidth {
734         Width00 = 0,       /**< Width 1.  (0.00mm) */
735         Width01 = 5,       /**< Width 2.  (0.05mm) */
736         Width02 = 9,       /**< Width 3.  (0.09mm) */
737         Width03 = 13,      /**< Width 4.  (0.13mm) */
738         Width04 = 15,      /**< Width 5.  (0.15mm) */
739         Width05 = 18,      /**< Width 6.  (0.18mm) */
740         Width06 = 20,      /**< Width 7.  (0.20mm) */
741         Width07 = 25,      /**< Width 8.  (0.25mm) */
742         Width08 = 30,      /**< Width 9.  (0.30mm) */
743         Width09 = 35,      /**< Width 10. (0.35mm) */
744         Width10 = 40,      /**< Width 11. (0.40mm) */
745         Width11 = 50,      /**< Width 12. (0.50mm) */
746         Width12 = 53,      /**< Width 13. (0.53mm) */
747         Width13 = 60,      /**< Width 14. (0.60mm) */
748         Width14 = 70,      /**< Width 15. (0.70mm) */
749         Width15 = 80,      /**< Width 16. (0.80mm) */
750         Width16 = 90,      /**< Width 17. (0.90mm) */
751         Width17 = 100,     /**< Width 18. (1.00mm) */
752         Width18 = 106,     /**< Width 19. (1.06mm) */
753         Width19 = 120,     /**< Width 20. (1.20mm) */
754         Width20 = 140,     /**< Width 21. (1.40mm) */
755         Width21 = 158,     /**< Width 22. (1.58mm) */
756         Width22 = 200,     /**< Width 23. (2.00mm) */
757         Width23 = 211,     /**< Width 24. (2.11mm) */
758         WidthByLayer = -1, /**< Line width defined by layer not entity. */
759         WidthByBlock = -2, /**< Line width defined by block not entity. */
760         WidthDefault = -3  /**< Line width defaults to the predefined line width. */
761     };
762
763     /**
764      * Wrapper for Qt
765      */
766     /*
767        static int qw(RS2::LineWidth w) {
768            switch (w) {
769            case Width00:
770                return 1;  // 0 is more accurate but quite slow
771                break;
772            case WidthByLayer:
773            case WidthByBlock:
774            case WidthDefault:
775                return 1;
776                break;
777            case Width01:
778            case Width02:
779            case Width03:
780            case Width04:
781            case Width05:
782            case Width06:
783            case Width07:
784            case Width08:
785                return 1;
786                break;
787            case Width09:
788            case Width10:
789                return 3;
790                break;
791            case Width11:
792                return 4;
793                break;
794            case Width12:
795            case Width13:
796                return 5;
797                break;
798            case Width14:
799                return 6;
800                break;
801            case Width15:
802                return 7;
803                break;
804            case Width16:
805                return 8;
806                break;
807            case Width17:
808                return 9;
809                break;
810            case Width18:
811            case Width19:
812                return 10;
813                break;
814            case Width20:
815                return 12;
816                break;
817            case Width21:
818            case Width22:
819            case Width23:
820            //case Width24:
821                return 14;
822                break;
823            default:
824                return (int)w;
825                break;
826            }
827            return (int)w;
828        }
829     */
830
831     /**
832      * Wrapper for Qt
833      */
834     static LineWidth intToLineWidth(int w) {
835                 if (w==-3) {
836                         return WidthDefault;
837                 } else if (w==-2) {
838                         return WidthByBlock;
839                 } else if (w==-1) {
840                         return WidthByLayer;
841                 } else if (w<3) {
842                         return Width00;
843                 } else if (w<8) {
844                         return Width01;
845                 } else if (w<12) {
846                         return Width02;
847                 } else if (w<14) {
848                         return Width03;
849                 } else if (w<17) {
850                         return Width04;
851                 } else if (w<19) {
852                         return Width05;
853                 } else if (w<23) {
854                         return Width06;
855                 } else if (w<28) {
856                         return Width07;
857                 } else if (w<33) {
858                         return Width08;
859                 } else if (w<38) {
860                         return Width09;
861                 } else if (w<46) {
862                         return Width10;
863                 } else if (w<52) {
864                         return Width11;
865                 } else if (w<57) {
866                         return Width12;
867                 } else if (w<66) {
868                         return Width13;
869                 } else if (w<76) {
870                         return Width14;
871                 } else if (w<86) {
872                         return Width15;
873                 } else if (w<96) {
874                         return Width16;
875                 } else if (w<104) {
876                         return Width17;
877                 } else if (w<114) {
878                         return Width18;
879                 } else if (w<131) {
880                         return Width19;
881                 } else if (w<150) {
882                         return Width20;
883                 } else if (w<180) {
884                         return Width21;
885                 } else if (w<206) {
886                         return Width22;
887                 } else {
888                         return Width23;
889                 }
890     }
891
892     /**
893      * Enum of cursor types.
894      */
895     enum CursorType {
896         ArrowCursor,          /**< ArrowCursor - standard arrow cursor. */
897         UpArrowCursor,        /**< UpArrowCursor - upwards arrow. */
898         CrossCursor,          /**< CrossCursor - crosshair. */
899         WaitCursor,           /**< WaitCursor - hourglass/watch. */
900         IbeamCursor,          /**< IbeamCursor - ibeam/text entry. */
901         SizeVerCursor,        /**< SizeVerCursor - vertical resize. */
902         SizeHorCursor,        /**< SizeHorCursor - horizontal resize. */
903         SizeBDiagCursor,      /**< SizeBDiagCursor - diagonal resize (/). */
904         SizeFDiagCursor,      /**< SizeFDiagCursor - diagonal resize (\). */
905         SizeAllCursor,        /**< SizeAllCursor - all directions resize. */
906         BlankCursor,          /**< BlankCursor - blank/invisible cursor. */
907         SplitVCursor,         /**< SplitVCursor - vertical splitting. */
908         SplitHCursor,         /**< SplitHCursor - horziontal splitting. */
909         PointingHandCursor,   /**< PointingHandCursor - a pointing hand. */
910         ForbiddenCursor,      /**< ForbiddenCursor - a slashed circle. */
911         WhatsThisCursor,      /**< WhatsThisCursor - an arrow with a ?. */
912         CadCursor,            /**< CadCursor - a bigger cross. */
913         DelCursor,            /**< DelCursor - cursor for choosing entities */
914         SelectCursor,         /**< SelectCursor - for selecting single entities */
915         MagnifierCursor,      /**< MagnifierCursor - a magnifying glass. */
916         MovingHandCursor      /**< Moving hand - a little flat hand. */
917     };
918
919     /**
920      * Wrapper for Qt.
921      */
922     static Qt::CursorShape rsToQtCursorType(RS2::CursorType t) {
923         switch (t) {
924         case ArrowCursor:
925             return Qt::ArrowCursor;
926             break;
927         case UpArrowCursor:
928             return Qt::UpArrowCursor;
929             break;
930         case CrossCursor:
931             return Qt::CrossCursor;
932             break;
933         case WaitCursor:
934             return Qt::WaitCursor;
935             break;
936         case IbeamCursor:
937             return Qt::IBeamCursor;
938             break;
939         case SizeVerCursor:
940             return Qt::SizeVerCursor;
941             break;
942         case SizeHorCursor:
943             return Qt::SizeHorCursor;
944             break;
945         case SizeBDiagCursor:
946             return Qt::SizeBDiagCursor;
947             break;
948         case SizeFDiagCursor:
949             return Qt::SizeFDiagCursor;
950             break;
951         case SizeAllCursor:
952             return Qt::SizeAllCursor;
953             break;
954         case BlankCursor:
955             return Qt::BlankCursor;
956             break;
957         case SplitVCursor:
958             return Qt::SplitVCursor;
959             break;
960         case SplitHCursor:
961             return Qt::SplitHCursor;
962             break;
963         case PointingHandCursor:
964             return Qt::PointingHandCursor;
965             break;
966         case ForbiddenCursor:
967             return Qt::ForbiddenCursor;
968             break;
969         case WhatsThisCursor:
970             return Qt::WhatsThisCursor;
971             break;
972         default:
973             return Qt::ArrowCursor;
974             break;
975         }
976         return Qt::ArrowCursor;
977     }
978
979     /**
980      * Paper formats.
981      */
982     enum PaperFormat {
983         Custom,
984                 Letter,
985                 Legal,
986                 Executive,
987         A0,
988                 A1,
989                 A2,
990                 A3,
991                 A4,
992                 A5,
993                 A6,
994                 A7,
995                 A8,
996                 A9,
997         B0,
998                 B1,
999                 B2,
1000                 B3,
1001                 B4,
1002                 B5,
1003                 B6,
1004                 B7,
1005                 B8,
1006                 B9,
1007                 B10,
1008         C5E,
1009                 Comm10E,
1010         DLE,
1011                 Folio,
1012                 //Ledger,
1013                 Tabloid,
1014                 NPageSize
1015         };
1016
1017     /**
1018      * Wrapper for Qt.
1019      */
1020     static QPrinter::PageSize rsToQtPaperFormat(RS2::PaperFormat f) {
1021                 QPrinter::PageSize ret;
1022
1023                 switch (f) {
1024         case Custom:
1025                         ret = QPrinter::Custom;
1026                         break;
1027                 case Letter:
1028                         ret = QPrinter::Letter;
1029                         break;
1030                 case Legal:
1031                         ret = QPrinter::Legal;
1032                         break;
1033                 case Executive:
1034                         ret = QPrinter::Executive;
1035                         break;
1036         case A0:
1037                         ret = QPrinter::A0;
1038                         break;
1039                 case A1:
1040                         ret = QPrinter::A1;
1041                         break;
1042                 case A2:
1043                         ret = QPrinter::A2;
1044                         break;
1045                 case A3:
1046                         ret = QPrinter::A3;
1047                         break;
1048                 default:
1049                 case A4:
1050                         ret = QPrinter::A4;
1051                         break;
1052                 case A5:
1053                         ret = QPrinter::A5;
1054                         break;
1055                 case A6:
1056                         ret = QPrinter::A6;
1057                         break;
1058                 case A7:
1059                         ret = QPrinter::A7;
1060                         break;
1061                 case A8:
1062                         ret = QPrinter::A8;
1063                         break;
1064                 case A9:
1065                         ret = QPrinter::A9;
1066                         break;
1067                 case B0:
1068                         ret = QPrinter::B0;
1069                         break;
1070                 case B1:
1071                         ret = QPrinter::B1;
1072                         break;
1073                 case B2:
1074                         ret = QPrinter::B2;
1075                         break;
1076                 case B3:
1077                         ret = QPrinter::B3;
1078                         break;
1079                 case B4:
1080                         ret = QPrinter::B4;
1081                         break;
1082                 case B5:
1083                         ret = QPrinter::B5;
1084                         break;
1085                 case B6:
1086                         ret = QPrinter::B6;
1087                         break;
1088                 case B7:
1089                         ret = QPrinter::B7;
1090                         break;
1091                 case B8:
1092                         ret = QPrinter::B8;
1093                         break;
1094                 case B9:
1095                         ret = QPrinter::B9;
1096                         break;
1097                 case B10:
1098                         ret = QPrinter::B10;
1099                         break;
1100                 case C5E:
1101                         ret = QPrinter::C5E;
1102                         break;
1103                 case Comm10E:
1104                         ret = QPrinter::Comm10E;
1105                         break;
1106         case DLE:
1107                         ret = QPrinter::DLE;
1108                         break;
1109                 case Folio:
1110                         ret = QPrinter::Folio;
1111                         break;
1112                 //case Ledger:
1113                 //      ret = QPrinter::Ledger;
1114                 //      break;
1115                 case Tabloid:
1116                         ret = QPrinter::Tabloid;
1117                         break;
1118                 case NPageSize:
1119                         ret = QPrinter::NPageSize;
1120                         break;
1121                 }
1122
1123                 return ret;
1124         }
1125 };
1126
1127 #endif