openmbvcppinterface  3.1.0
OpenMBV C++ Interface
arrow.h
1/*
2 OpenMBV - Open Multi Body Viewer.
3 Copyright (C) 2009 Markus Friedrich
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18*/
19
20#ifndef _OPENMBV_ARROW_H_
21#define _OPENMBV_ARROW_H_
22
23#include <openmbvcppinterface/dynamiccoloredbody.h>
24#include <hdf5serie/vectorserie.h>
25#include <stdexcept>
26
27namespace OpenMBV {
28
49 class Arrow : public DynamicColoredBody {
50 friend class ObjectFactory;
51 public:
52 enum Type {
53 line,
54 fromHead,
55 toHead,
56 bothHeads,
57 fromDoubleHead,
58 toDoubleHead,
59 bothDoubleHeads
60 };
61 enum Components {
62 vectorForm,
63 componentsInWorld,
64 componentsInLocal,
65 };
66 enum ReferencePoint {
67 toPoint,
68 fromPoint,
69 midPoint
70 };
71 protected:
72 std::string pathStr;
73 void createHDF5File() override;
74 void openHDF5File() override;
75 H5::VectorSerie<Float>* data{nullptr};
76 double headDiameter{0.5};
77 double headLength{0.75};
78 double diameter{0.25};
79 double scaleLength{1};
80 bool createLocalFrame {false};
81 Type type{toHead};
82 Components components{vectorForm};
83 int hdf5Size { -1 };
84 ReferencePoint referencePoint{toPoint};
85
86 Arrow();
87 ~Arrow() override;
88 public:
90 void setPath(bool p) { pathStr=(p)?"true":"false"; }
91
92 bool getPath() { return pathStr=="true"?true:false; }
93
95 template<typename T>
96 void append(const T& row) {
97 if(data==nullptr) throw std::runtime_error("can not append data to an environment object");
98
99 if(hdf5Size==-1) {
100 if( createLocalFrame && row.size()!=11)
101 throw std::runtime_error("Need the columns t,x,y,z,dx,dy,dz,c,alpha,beta,gamma, but got "+std::to_string(row.size())+" columns");
102 if(!createLocalFrame && row.size()!= 8)
103 throw std::runtime_error("Need the columns t,x,y,z,dx,dy,dz,c, but got "+std::to_string(row.size())+" columns");
104 hdf5Size = row.size();
105 }
106 else if(static_cast<int>(row.size())!=hdf5Size)
107 throw std::runtime_error("The dimension does not match: need "+std::to_string(hdf5Size)+" but got "+std::to_string(row.size()));
108
109 if(!std::isnan(dynamicColor))
110 {
111 std::vector<Float> tmprow(hdf5Size);
112 std::copy(&row[0], &row[hdf5Size], tmprow.begin());
113 tmprow[7]=dynamicColor;
114 data->append(tmprow);
115 }
116 else
117 data->append(row);
118 }
119
120 int getRows() override { return data?data->getRows():0; }
121 std::vector<Float> getRow(int i) override { return data?data->getRow(i):std::vector<Float>(11); }
122
124 void setArrowHead(double diameter, double length) {
125 headDiameter=diameter;
126 headLength=length;
127 }
128
130 void setHeadDiameter(double diameter) {
131 headDiameter=diameter;
132 }
133
134 double getHeadDiameter() { return headDiameter; }
135
137 void setHeadLength(double length) {
138 headLength=length;
139 }
140
141 double getHeadLength() { return headLength; }
142
144 void setDiameter(double diameter_) {
145 diameter=diameter_;
146 }
147
148 double getDiameter() { return diameter; }
149
159 void setType(Type type_) {
160 type=type_;
161 }
162
163 Type getType() { return type; }
164
165
174 void setComponents(Components components_) {
175 components=components_;
176 }
177
178 Components getComponents() { return components; }
179
186 void setReferencePoint(ReferencePoint referencePoint_) {
187 referencePoint=referencePoint_;
188 }
189
190 ReferencePoint getReferencePoint() { return referencePoint; }
191
193 void setScaleLength(double scale) {
194 scaleLength=scale;
195 }
196
197 double getScaleLength() { return scaleLength; }
198
200 void setCreateLocalFrame(bool l) {
201 createLocalFrame=l;
202 }
203
204 double getCreateLocalFrame() { return createLocalFrame; }
205
207 void initializeUsingXML(xercesc::DOMElement *element) override;
208
209 xercesc::DOMElement *writeXMLFile(xercesc::DOMNode *parent) override;
210 };
211
212}
213
214#endif
void getRow(int row, size_t size, T data[])
void append(const T data[], size_t size)
Definition: arrow.h:49
void setType(Type type_)
Definition: arrow.h:159
void setHeadDiameter(double diameter)
Definition: arrow.h:130
void setHeadLength(double length)
Definition: arrow.h:137
void setComponents(Components components_)
Definition: arrow.h:174
std::vector< Float > getRow(int i) override
Definition: arrow.h:121
void setDiameter(double diameter_)
Definition: arrow.h:144
int getRows() override
Definition: arrow.h:120
void setPath(bool p)
Definition: arrow.h:90
void append(const T &row)
Definition: arrow.h:96
void setCreateLocalFrame(bool l)
Definition: arrow.h:200
void setArrowHead(double diameter, double length)
Definition: arrow.h:124
void setScaleLength(double scale)
Definition: arrow.h:193
void setReferencePoint(ReferencePoint referencePoint_)
Definition: arrow.h:186
void initializeUsingXML(xercesc::DOMElement *element) override
Definition: arrow.cc:106
Definition: dynamiccoloredbody.h:28
Definition: objectfactory.h:38