LibreCAD
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
dimlinear.cpp
Go to the documentation of this file.
2 
3 using namespace lc;
4 using namespace entity;
5 
6 DimLinear::DimLinear(geo::Coordinate const& definitionPoint,
7  geo::Coordinate const& middleOfText,
8  TextConst::AttachmentPoint const& attachmentPoint,
9  double textAngle,
10  double const lineSpacingFactor,
11  TextConst::LineSpacingStyle const& lineSpacingStyle,
12  std::string const& explicitValue,
13  geo::Coordinate const& definitionPoint2,
14  geo::Coordinate const& definitionPoint3,
15  const double angle,
16  const double oblique,
17  const Layer_CSPtr layer,
18  const MetaInfo_CSPtr metaInfo,
19  const Block_CSPtr block) :
20  CADEntity(layer, metaInfo, block),
21  Dimension(definitionPoint, middleOfText, attachmentPoint, textAngle, lineSpacingFactor, lineSpacingStyle, explicitValue),
22  _angle(angle),
23  _oblique(oblique),
24  _definitionPoint2(definitionPoint2),
25  _definitionPoint3(definitionPoint3) {
26 
27 }
28 
29 
30 DimLinear::DimLinear(const DimLinear_CSPtr other, bool sameID) :
31  CADEntity(other, sameID),
32  Dimension(*other),
33  _angle(other->_angle),
34  _oblique(other->_oblique),
35  _definitionPoint2(other->_definitionPoint2),
36  _definitionPoint3(other->_definitionPoint3) {
37 }
38 
39 DimLinear_SPtr DimLinear::dimAuto(geo::Coordinate const& p1,
40  geo::Coordinate const& p2,
41  geo::Coordinate const &middleOfText,
42  std::string const& explicitValue,
43  const Layer_CSPtr layer,
44  const MetaInfo_CSPtr metaInfo,
45  const Block_CSPtr block) {
46  return std::make_shared<DimLinear>(p1,
48  TextConst::AttachmentPoint::Middle_center,
49  0.,
50  0.,
51  TextConst::LineSpacingStyle::AtLeast,
53  p1,
54  p2,
55  0.,
56  0.,
57  layer,
58  metaInfo,
59  block
60  );
61 }
62 
63 
64 
65 CADEntity_CSPtr DimLinear::move(const geo::Coordinate& offset) const {
66  auto newDimLinear = std::make_shared<DimLinear>(this->definitionPoint() + offset, this->middleOfText() + offset, this->attachmentPoint(), this->textAngle(), this->lineSpacingFactor(), this->lineSpacingStyle(), this->explicitValue(), this->_definitionPoint2 + offset, this->_definitionPoint3 + offset, this->_angle, this->_oblique, this->layer(), this->metaInfo());
67  newDimLinear->setID(this->id());
68  return newDimLinear;
69 }
70 
71 CADEntity_CSPtr DimLinear::copy(const geo::Coordinate& offset) const {
72  auto newDimLinear = std::make_shared<DimLinear>(this->definitionPoint() + offset, this->middleOfText() + offset, this->attachmentPoint(), this->textAngle(), this->lineSpacingFactor(), this->lineSpacingStyle(), this->explicitValue(), this->_definitionPoint2 + offset, this->_definitionPoint3 + offset, this->_angle, this->_oblique, this->layer(), this->metaInfo());
73  return newDimLinear;
74 }
75 
76 CADEntity_CSPtr DimLinear::rotate(const geo::Coordinate& rotation_center, const double rotation_angle) const {
77  auto newDimLinear = std::make_shared<DimLinear>(this->definitionPoint().rotate(rotation_center, rotation_angle),
78  this->middleOfText().rotate(rotation_center, rotation_angle), this->attachmentPoint(), this->textAngle(), this->lineSpacingFactor(), this->lineSpacingStyle(), this->explicitValue(), this->_definitionPoint2.rotate(rotation_center, rotation_angle), this->_definitionPoint3.rotate(rotation_center, rotation_angle), this->_angle, this->_oblique, this->layer(), this->metaInfo());
79  return newDimLinear;
80 }
81 
82 CADEntity_CSPtr DimLinear::scale(const geo::Coordinate& scale_center, const geo::Coordinate& scale_factor) const {
83  auto newDimLinear = std::make_shared<DimLinear>(this->definitionPoint().scale(scale_center, scale_factor),
84  this->middleOfText().scale(scale_center, scale_factor), this->attachmentPoint(), this->textAngle(), this->lineSpacingFactor(), this->lineSpacingStyle(), this->explicitValue(), this->_definitionPoint2.scale(scale_center, scale_factor), this->_definitionPoint3.scale(scale_center, scale_factor), this->_angle, this->_oblique, this->layer(), this->metaInfo());
85  return newDimLinear;
86 }
87 
89  // TODO create proper bounding box for DimLinear
90  return geo::Area(this->middleOfText(), 0., 0.);
91 }
92 
93 CADEntity_CSPtr DimLinear::modify(Layer_CSPtr layer, const MetaInfo_CSPtr metaInfo, Block_CSPtr block) const {
94  auto newDimLinear = std::make_shared<DimLinear>(
95  this->definitionPoint(),
96  this->middleOfText(),
97  this->attachmentPoint(),
98  this->textAngle(),
99  this->lineSpacingFactor(),
100  this->lineSpacingStyle(),
101  this->explicitValue(),
102  this->_definitionPoint2,
103  this->_definitionPoint3,
104  this->_angle,
105  this->_oblique,
106  layer,
107  metaInfo,
108  block
109  );
110 
111  return newDimLinear;
112 }
113 
114 double DimLinear::angle() const {
115  return _angle;
116 }
117 double DimLinear::oblique() const {
118  return _oblique;
119 }
120 
122  return _definitionPoint2;
123 }
125  return _definitionPoint3;
126 }
127 
128 std::map<unsigned int, geo::Coordinate> DimLinear::dragPoints() const {
129  std::map<unsigned int, geo::Coordinate> dragPoints;
130 
131  dragPoints[0] = definitionPoint();
132  dragPoints[1] = middleOfText();
133  dragPoints[2] = definitionPoint2();
134  dragPoints[3] = definitionPoint3();
135 
136  return dragPoints;
137 }
138 
139 
140 CADEntity_CSPtr DimLinear::setDragPoints(std::map<unsigned int, lc::geo::Coordinate> dragPoints) const {
141  try {
142  auto newEntity = std::make_shared<DimLinear>(dragPoints.at(0),
143  dragPoints.at(1),
144  attachmentPoint(),
145  textAngle(),
148  explicitValue(),
149  dragPoints.at(2),
150  dragPoints.at(3),
151  angle(),
152  oblique(),
153  layer(),
154  metaInfo());
155  newEntity->setID(id());
156  return newEntity;
157  }
158  catch(std::out_of_range& e) {
159  return shared_from_this();
160  }
161 }
virtual CADEntity_CSPtr move(const geo::Coordinate &offset) const override
move, moves by an offset
Definition: dimlinear.cpp:65
TextConst::LineSpacingStyle lineSpacingStyle() const
Definition: dimension.cpp:91
const geo::Coordinate & definitionPoint() const noexcept
move, moves by an offset
Definition: dimension.cpp:71
virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override
scale, scales the entity
Definition: dimlinear.cpp:82
std::string explicitValue() const
Definition: dimension.cpp:95
Layer_CSPtr layer() const
layer return the layer this entity is placed on
Definition: cadentity.cpp:29
virtual CADEntity_CSPtr setDragPoints(std::map< unsigned int, lc::geo::Coordinate > dragPoints) const override
Return modified entity.
Definition: dimlinear.cpp:140
double angle() const
Definition: dimlinear.cpp:114
Coordinate scale(const double &scale_factor) const
virtual CADEntity_CSPtr copy(const geo::Coordinate &offset) const override
copy, copies by an offset
Definition: dimlinear.cpp:71
MetaInfo_CSPtr metaInfo() const
Definition: cadentity.h:123
static DimLinear_SPtr dimAuto(geo::Coordinate const &p1, geo::Coordinate const &p2, geo::Coordinate const &middleOfText, std::string const &explicitValue, const Layer_CSPtr layer, const MetaInfo_CSPtr metaInfo=nullptr, const Block_CSPtr block=nullptr)
Definition: dimlinear.cpp:39
const geo::Coordinate & middleOfText() const noexcept
Definition: dimension.cpp:75
TextConst::AttachmentPoint const & attachmentPoint() const
Definition: dimension.cpp:83
Definition: cadentity.h:12
const double _angle
Definition: dimlinear.h:115
virtual CADEntity_CSPtr modify(Layer_CSPtr layer, const MetaInfo_CSPtr metaInfo, Block_CSPtr block) const override
modify Return a new entity with the same ID bit with possible modified metainfo and/pr layer informat...
Definition: dimlinear.cpp:93
const geo::Coordinate _definitionPoint3
Definition: dimlinear.h:118
Coordinate rotate(const Coordinate &angleVector) const
rotate around (0.,0.) with a given angle vector
const geo::Coordinate & definitionPoint3() const noexcept
Definition: dimlinear.cpp:124
double oblique() const
Definition: dimlinear.cpp:117
double lineSpacingFactor() const
Definition: dimension.cpp:87
Block_CSPtr block() const
Return the current entity block.
Definition: cadentity.cpp:33
DimLinear(geo::Coordinate const &definitionPoint, geo::Coordinate const &middleOfText, TextConst::AttachmentPoint const &attachmentPoint, double textAngle, double const lineSpacingFactor, TextConst::LineSpacingStyle const &lineSpacingStyle, std::string const &explicitValue, geo::Coordinate const &definitionPoint2, geo::Coordinate const &definitionPoint3, const double angle, const double oblique, const Layer_CSPtr layer, const MetaInfo_CSPtr metaInfo=nullptr, const Block_CSPtr block=nullptr)
DimLinear, DimLinear constructor with metatypes.
Definition: dimlinear.cpp:6
const geo::Coordinate _definitionPoint2
Definition: dimlinear.h:117
virtual std::map< unsigned int, lc::geo::Coordinate > dragPoints() const override
Get all points of the entity that can be dragged.
Definition: dimlinear.cpp:128
const double _oblique
Definition: dimlinear.h:116
virtual CADEntity_CSPtr rotate(const geo::Coordinate &rotation_center, const double rotation_angle) const override
rotate, rotate operation
Definition: dimlinear.cpp:76
double textAngle() const
Definition: dimension.cpp:79
const geo::Coordinate & definitionPoint2() const noexcept
Definition: dimlinear.cpp:121
virtual const geo::Area boundingBox() const override
boundingBox of the entity
Definition: dimlinear.cpp:88