Line data Source code
1 : /*******************************************************************************
2 : * Project: libopencad
3 : * Purpose: OpenSource CAD formats support library
4 : * Author: Alexandr Borzykh, mush3d at gmail.com
5 : * Author: Dmitry Baryshnikov, bishop.dev@gmail.com
6 : * Language: C++
7 : *******************************************************************************
8 : * The MIT License (MIT)
9 : *
10 : * Copyright (c) 2016 Alexandr Borzykh
11 : * Copyright (c) 2016 NextGIS, <info@nextgis.com>
12 : *
13 : * SPDX-License-Identifier: MIT
14 : *******************************************************************************/
15 : #ifndef CADGEOMETRIES_H
16 : #define CADGEOMETRIES_H
17 :
18 : #include "cadobjects.h"
19 : #include "cadcolors.h"
20 :
21 : #include <array>
22 :
23 : class CADAttdef;
24 : class CADAttrib;
25 :
26 : /**
27 : * @brief The Matrix class
28 : */
29 : class Matrix
30 : {
31 : public:
32 0 : Matrix() = default;
33 : void translate( const CADVector& vector );
34 : void rotate( double rotation );
35 : void scale( const CADVector& vector );
36 : CADVector multiply( const CADVector& vector ) const;
37 : protected:
38 : std::array<double, 9> matrix = {{1.0, 0.0, 0.0,
39 : 0.0, 1.0, 0.0,
40 : 0.0, 0.0, 1.0}};
41 : };
42 :
43 : /**
44 : * @brief Base CAD geometry class
45 : */
46 : class OCAD_EXTERN CADGeometry
47 : {
48 : public:
49 : CADGeometry();
50 : virtual ~CADGeometry();
51 : /**
52 : * @brief The CAD geometry types enum
53 : */
54 : enum GeometryType
55 : {
56 : UNDEFINED = 0,
57 : POINT,
58 : CIRCLE,
59 : LWPOLYLINE,
60 : ELLIPSE,
61 : LINE,
62 : POLYLINE3D,
63 : TEXT,
64 : ARC,
65 : SPLINE,
66 : SOLID,
67 : RAY,
68 : HATCH, // NOT IMPLEMENTED
69 : IMAGE,
70 : MTEXT,
71 : MLINE,
72 : XLINE,
73 : FACE3D,
74 : POLYLINE_PFACE,
75 : ATTRIB,
76 : ATTDEF
77 : };
78 :
79 : enum GeometryType getType() const;
80 : double getThickness() const;
81 : void setThickness( double thickness );
82 : RGBColor getColor() const;
83 : void setColor( RGBColor color ); // TODO: In 2004+ ACI is not the only way to set the color.
84 :
85 : std::vector<CADAttrib> getBlockAttributes() const;
86 : void setBlockAttributes( const std::vector<CADAttrib>& value );
87 :
88 : std::vector<std::string> getEED() const;
89 : void setEED( const std::vector<std::string>& eed );
90 :
91 : virtual void print() const = 0;
92 : virtual void transform( const Matrix& matrix ) = 0;
93 : protected:
94 : std::vector<CADAttrib> blockAttributes; // Attributes of block reference this geometry is attached to.
95 :
96 : std::vector<std::string> asEED;
97 : enum GeometryType geometryType;
98 : double m_thickness;
99 : RGBColor geometry_color;
100 : };
101 :
102 : /**
103 : * @brief Geometry class which represents Unhandled geometry (means that library can't read it yet)
104 : */
105 : class CADUnknown : public CADGeometry
106 : {
107 : public:
108 : CADUnknown();
109 0 : virtual ~CADUnknown(){}
110 :
111 : virtual void print() const override;
112 : void transform( const Matrix& matrix ) override;
113 : };
114 :
115 : /**
116 : * @brief Geometry class which a single Point
117 : */
118 : class OCAD_EXTERN CADPoint3D : public CADGeometry
119 : {
120 : public:
121 : CADPoint3D();
122 : CADPoint3D( const CADVector& positionIn, double thicknessIn );
123 27 : virtual ~CADPoint3D(){}
124 : CADVector getPosition() const;
125 : void setPosition( const CADVector& value );
126 :
127 : CADVector getExtrusion() const;
128 : void setExtrusion( const CADVector& value );
129 :
130 : double getXAxisAng() const;
131 : void setXAxisAng( double value );
132 :
133 : virtual void print() const override;
134 : virtual void transform( const Matrix& matrix ) override;
135 : protected:
136 : CADVector position;
137 : CADVector extrusion;
138 : double xAxisAng;
139 : };
140 :
141 : /**
142 : * @brief Geometry class which represents a simple Line
143 : */
144 : class OCAD_EXTERN CADLine : public CADGeometry
145 : {
146 : public:
147 : CADLine();
148 : CADLine( const CADPoint3D& startIn, const CADPoint3D& endIn );
149 2 : virtual ~CADLine(){}
150 : CADPoint3D getStart() const;
151 : void setStart( const CADPoint3D& value );
152 :
153 : CADPoint3D getEnd() const;
154 : void setEnd( const CADPoint3D& value );
155 :
156 : virtual void print() const override;
157 : virtual void transform( const Matrix& matrix ) override;
158 : protected:
159 : CADPoint3D start;
160 : CADPoint3D end;
161 : };
162 :
163 : /**
164 : * @brief Geometry class which represents Polyline 3D
165 : */
166 : class OCAD_EXTERN CADPolyline3D : public CADGeometry
167 : {
168 : public:
169 : CADPolyline3D();
170 0 : virtual ~CADPolyline3D(){}
171 : void addVertex( const CADVector& vertex );
172 : size_t getVertexCount() const;
173 : CADVector& getVertex( size_t index );
174 :
175 : virtual void print() const override;
176 : virtual void transform( const Matrix& matrix ) override;
177 : protected:
178 : std::vector<CADVector> vertices;
179 : };
180 :
181 : /**
182 : * @brief Geometry class which represents LWPolyline
183 : */
184 :
185 : class OCAD_EXTERN CADLWPolyline : public CADPolyline3D
186 : {
187 : public:
188 : CADLWPolyline();
189 0 : virtual ~CADLWPolyline(){}
190 :
191 : double getConstWidth() const;
192 : void setConstWidth( double value );
193 :
194 : double getElevation() const;
195 : void setElevation( double value );
196 :
197 : CADVector getVectExtrusion() const;
198 : void setVectExtrusion( const CADVector& value );
199 :
200 : std::vector<std::pair<double, double> > getWidths() const;
201 : void setWidths( const std::vector<std::pair<double, double> >& value );
202 :
203 : std::vector<double> getBulges() const;
204 : void setBulges( const std::vector<double>& value );
205 :
206 : bool isClosed() const;
207 : void setClosed( bool state );
208 :
209 : virtual void print() const override;
210 : protected:
211 : bool bClosed;
212 : double constWidth;
213 : double elevation;
214 : CADVector vectExtrusion;
215 : std::vector<double> bulges;
216 : std::vector<std::pair<double, double> > widths; // Start & end.
217 : };
218 :
219 : /**
220 : * @brief Geometry class which represents Circle
221 : */
222 : class OCAD_EXTERN CADCircle : public CADPoint3D
223 : {
224 : public:
225 : CADCircle();
226 7 : virtual ~CADCircle(){}
227 :
228 : double getRadius() const;
229 : void setRadius( double value );
230 :
231 : virtual void print() const override;
232 : protected:
233 : double radius;
234 : };
235 :
236 : /**
237 : * @brief Geometry class which represents Text
238 : */
239 : class OCAD_EXTERN CADText : public CADPoint3D
240 : {
241 : public:
242 : CADText();
243 15 : virtual ~CADText(){}
244 :
245 : std::string getTextValue() const;
246 : void setTextValue( const std::string& value );
247 :
248 : double getHeight() const;
249 : void setHeight( double value );
250 :
251 : double getRotationAngle() const;
252 : void setRotationAngle( double value );
253 :
254 : double getObliqueAngle() const;
255 : void setObliqueAngle( double value );
256 :
257 : virtual void print() const override;
258 : protected:
259 : double obliqueAngle;
260 : double rotationAngle;
261 : double height;
262 : std::string textValue;
263 : };
264 :
265 : /**
266 : * @brief Geometry class which represents Arc
267 : */
268 : class OCAD_EXTERN CADArc : public CADCircle
269 : {
270 : public:
271 : CADArc();
272 1 : virtual ~CADArc(){}
273 :
274 : double getStartingAngle() const;
275 : void setStartingAngle( double value );
276 :
277 : double getEndingAngle() const;
278 : void setEndingAngle( double value );
279 :
280 : virtual void print() const override;
281 : protected:
282 : double startingAngle;
283 : double endingAngle;
284 : };
285 :
286 : /**
287 : * @brief Geometry class which represents Ellipse
288 : */
289 : class OCAD_EXTERN CADEllipse : public CADArc
290 : {
291 : public:
292 : CADEllipse();
293 2 : virtual ~CADEllipse(){}
294 :
295 : double getAxisRatio() const;
296 : void setAxisRatio( double value );
297 :
298 : CADVector getSMAxis();
299 : void setSMAxis( const CADVector& vectSMA );
300 :
301 : virtual void print() const override;
302 : protected:
303 : CADVector vectSMAxis;
304 : double axisRatio;
305 : };
306 :
307 : /**
308 : * @brief Geometry class which represents Spline
309 : */
310 : class OCAD_EXTERN CADSpline : public CADGeometry
311 : {
312 : public:
313 : CADSpline();
314 0 : virtual ~CADSpline(){}
315 :
316 : long getScenario() const;
317 : void setScenario( long value );
318 :
319 : bool isRational() const;
320 : void setRational( bool value );
321 :
322 : bool isClosed() const;
323 : void setClosed( bool value );
324 :
325 : std::vector<CADVector>& getControlPoints();
326 : std::vector<CADVector>& getFitPoints();
327 : std::vector<double> & getControlPointsWeights();
328 :
329 : void addControlPointsWeight( double p_weight );
330 : void addControlPoint( const CADVector& point );
331 : void addFitPoint( const CADVector& point );
332 :
333 : bool getWeight() const;
334 : void setWeight( bool value );
335 :
336 : double getFitTolerance() const;
337 : void setFitTolerance( double value );
338 :
339 : long getDegree() const;
340 : void setDegree( long value );
341 :
342 : virtual void print() const override;
343 : virtual void transform( const Matrix& matrix ) override;
344 : protected:
345 : long scenario;
346 : bool rational;
347 : bool closed;
348 : bool weight;
349 : double fitTolerance;
350 : long degree;
351 :
352 : std::vector<double> ctrlPointsWeight;
353 : std::vector<CADVector> avertCtrlPoints;
354 : std::vector<CADVector> averFitPoints;
355 : };
356 :
357 : /**
358 : * @brief Geometry class which represents Solid
359 : */
360 : class OCAD_EXTERN CADSolid : public CADPoint3D
361 : {
362 : public:
363 : CADSolid();
364 0 : virtual ~CADSolid(){}
365 :
366 : double getElevation() const;
367 : void setElevation( double value );
368 : void addCorner( const CADVector& corner );
369 : std::vector<CADVector> getCorners();
370 :
371 : virtual void print() const override;
372 : virtual void transform( const Matrix& matrix ) override;
373 : protected:
374 : double elevation;
375 : std::vector<CADVector> avertCorners;
376 : };
377 :
378 : /**
379 : * @brief Geometry class which represents Ray
380 : */
381 : class OCAD_EXTERN CADRay : public CADPoint3D
382 : {
383 : public:
384 : CADRay();
385 0 : virtual ~CADRay(){}
386 :
387 : CADVector getVectVector() const;
388 : void setVectVector( const CADVector& value );
389 :
390 : virtual void print() const override;
391 : };
392 :
393 : /**
394 : * @brief Geometry class which represents Hatch
395 : */
396 : class OCAD_EXTERN CADHatch : public CADGeometry
397 : {
398 : public:
399 : CADHatch();
400 : virtual ~CADHatch(){}
401 : };
402 :
403 : /**
404 : * @brief Geometry class which represents Image (Raster Image)
405 : */
406 : class OCAD_EXTERN CADImage : public CADGeometry
407 : {
408 : public:
409 : /**
410 : * @brief enum which describes in which units Image resolutions is present
411 : */
412 : enum ResolutionUnit
413 : {
414 : NONE = 0, CENTIMETER = 2, INCH = 5
415 : };
416 :
417 0 : static bool IsValidResolutionUnit(int nVal)
418 : {
419 0 : return nVal == ResolutionUnit::NONE ||
420 0 : nVal == ResolutionUnit::CENTIMETER ||
421 0 : nVal == ResolutionUnit::INCH;
422 : }
423 :
424 : CADImage();
425 0 : virtual ~CADImage(){}
426 :
427 : CADVector getVertInsertionPoint() const;
428 : void setVertInsertionPoint( const CADVector& value );
429 :
430 : CADVector getImageSize() const;
431 : void setImageSize( const CADVector& value );
432 :
433 : CADVector getImageSizeInPx() const;
434 : void setImageSizeInPx( const CADVector& value );
435 :
436 : CADVector getPixelSizeInACADUnits() const;
437 : void setPixelSizeInACADUnits( const CADVector& value );
438 :
439 : short getClippingBoundaryType() const;
440 : void setClippingBoundaryType( short value );
441 :
442 : enum ResolutionUnit getResolutionUnits() const;
443 : void setResolutionUnits( enum ResolutionUnit value );
444 :
445 : std::string getFilePath() const;
446 : void setFilePath( const std::string& value );
447 :
448 : void setOptions( bool transparency, bool clip, unsigned char brightness,
449 : unsigned char contrast );
450 :
451 : void addClippingPoint( const CADVector& pt );
452 :
453 : virtual void print() const override;
454 : virtual void transform( const Matrix& matrix ) override;
455 : protected:
456 : CADVector vertInsertionPoint;
457 : //CADVector vectUDirection;
458 : //CADVector vectVDirection;
459 : CADVector imageSize;
460 : //bool bShow;
461 : //bool bShowWhenNotAlignedWithScreen;
462 : //bool bUseClippingBoundary;
463 : bool bTransparency;
464 : bool bClipping;
465 : unsigned char dBrightness;
466 : unsigned char dContrast;
467 : //char dFade;
468 :
469 : CADVector imageSizeInPx;
470 : std::string filePath;
471 : //bool bIsLoaded;
472 : enum ResolutionUnit resolutionUnits;
473 : //unsigned char resolutionUnit; // 0 == none, 2 == centimeters, 5 == inches;
474 : CADVector pixelSizeInACADUnits;
475 :
476 : short clippingBoundaryType; // 1 == rect, 2 == polygon
477 : std::vector<CADVector> avertClippingPolygon;
478 : };
479 :
480 : /**
481 : * @brief Geometry class which represents MText
482 : */
483 : class OCAD_EXTERN CADMText : public CADText
484 : {
485 : public:
486 : CADMText();
487 4 : virtual ~CADMText(){}
488 :
489 : double getRectWidth() const;
490 : void setRectWidth( double value );
491 :
492 : double getExtents() const;
493 : void setExtents( double value );
494 :
495 : double getExtentsWidth() const;
496 : void setExtentsWidth( double value );
497 :
498 : virtual void print() const override;
499 : protected:
500 : double rectWidth;
501 : double extents;
502 : double extentsWidth;
503 : // TODO: do we need this here?
504 : //short dDrawingDir;
505 : //short dLineSpacingStyle;
506 : //short dLineSpacingFactor;
507 : //long dBackgroundFlags; // R2004+
508 : //long dBackgroundScaleFactor;
509 : //short dBackgroundColor;
510 : //long dBackgroundTransparency;
511 : };
512 :
513 : /**
514 : * @brief Geometry class which represents 3DFace
515 : */
516 : class OCAD_EXTERN CADFace3D : public CADGeometry
517 : {
518 : public:
519 : CADFace3D();
520 0 : virtual ~CADFace3D(){}
521 :
522 : void addCorner( const CADVector& corner );
523 : CADVector getCorner( size_t index );
524 :
525 : short getInvisFlags() const;
526 : void setInvisFlags( short value );
527 :
528 : virtual void print() const override;
529 : virtual void transform( const Matrix& matrix ) override;
530 : protected:
531 : std::vector<CADVector> avertCorners;
532 : short invisFlags;
533 : };
534 :
535 : /**
536 : * @brief Geometry class which represents Polyline (PFace)
537 : */
538 : class OCAD_EXTERN CADPolylinePFace : public CADGeometry
539 : {
540 : public:
541 : CADPolylinePFace();
542 0 : virtual ~CADPolylinePFace(){}
543 :
544 : void addVertex( const CADVector& vertex );
545 :
546 : virtual void print() const override;
547 : virtual void transform( const Matrix& matrix ) override;
548 : protected:
549 : std::vector<CADVector> vertices;
550 : };
551 :
552 : /**
553 : * @brief Geometry class which represents XLine
554 : */
555 : class OCAD_EXTERN CADXLine : public CADRay
556 : {
557 : public:
558 : CADXLine();
559 0 : virtual ~CADXLine(){}
560 :
561 : virtual void print() const override;
562 : };
563 :
564 : /**
565 : * @brief Geometry class which represents MLine
566 : */
567 : class OCAD_EXTERN CADMLine : public CADPoint3D
568 : {
569 : public:
570 : CADMLine();
571 0 : virtual ~CADMLine(){}
572 :
573 : double getScale() const;
574 : void setScale( double value );
575 :
576 : bool isOpened() const;
577 : void setOpened( bool value );
578 :
579 : void addVertex( const CADVector& vertex );
580 :
581 : virtual void print() const override;
582 : virtual void transform( const Matrix& matrix ) override;
583 : protected:
584 : double scale;
585 : //char dJust;
586 : bool opened; // 1 == open, 0 == close
587 : // TODO: do we need more properties here?
588 : std::vector<CADVector> avertVertices;
589 : };
590 :
591 : /**
592 : * @brief Geometry class which represents Attribute
593 : */
594 : class OCAD_EXTERN CADAttrib : public CADText
595 : {
596 : public:
597 : CADAttrib();
598 5 : virtual ~CADAttrib(){}
599 :
600 : double getElevation() const;
601 : void setElevation( double );
602 :
603 : std::string getTag() const;
604 : void setTag( const std::string& );
605 :
606 : CADVector getAlignmentPoint() const;
607 : void setAlignmentPoint( const CADVector& );
608 :
609 : bool isPositionLocked() const;
610 : void setPositionLocked( bool );
611 :
612 : virtual void print() const override;
613 : virtual void transform( const Matrix& matrix ) override;
614 : protected:
615 : CADVector vertAlignmentPoint;
616 : double dfElevation;
617 : std::string sTag;
618 : bool bLockPosition;
619 : };
620 :
621 : /**
622 : * @brief Geometry class which represents Attribute definition
623 : */
624 : class OCAD_EXTERN CADAttdef : public CADAttrib
625 : {
626 : public:
627 : CADAttdef();
628 10 : virtual ~CADAttdef(){}
629 :
630 : std::string getPrompt() const;
631 : void setPrompt( const std::string& );
632 :
633 : virtual void print() const override;
634 : protected:
635 : std::string sPrompt;
636 : };
637 :
638 : //class EXTERN LineType
639 : //{
640 : //public:
641 : // std::string sEntryName;
642 : // std::string sDescription;
643 : // double dfPatternLen;
644 : // char dAlignment;
645 : // char nNumDashes;
646 : // struct Dash
647 : // {
648 : // double dfLength;
649 : // short dComplexShapecode;
650 : // double dfXOffset;
651 : // double dfYOffset;
652 : // double dfScale;
653 : // double dfRotation;
654 : // short dShapeflag;
655 : // };
656 : // std::vector < char > abyTextArea; // TODO: what is it?
657 : // std::vector < CADHandle > hShapefiles; // TODO: one for each dash?
658 : //};
659 :
660 : //class EXTERN Block
661 : //{
662 : //public:
663 : // Block(CADFile * pCADFile)
664 : // {
665 : // pstCADFile_m = pCADFile;
666 : // }
667 : //
668 : // std::string sBlockName;
669 : //
670 : // CADFile * pstCADFile_m;
671 : //
672 : // std::vector < std::pair < long long, short > > astAttachedGeometries;
673 : //};
674 :
675 :
676 : #endif // CADGEOMETRIES_H
|