A Discrete-Event Network Simulator
API
building.cc
Go to the documentation of this file.
1/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Authors: Marco Miozzo <marco.miozzo@cttc.es>
19 * Nicola Baldo <nbaldo@cttc.es>
20 *
21 */
22
23#include "building.h"
24#include "building-list.h"
25
26#include <ns3/enum.h>
27#include <ns3/uinteger.h>
28#include <ns3/log.h>
29#include <ns3/assert.h>
30#include <cmath>
31
32namespace ns3 {
33
34NS_LOG_COMPONENT_DEFINE ("Building");
35
37
38TypeId
40{
41 static TypeId tid = TypeId ("ns3::Building")
42 .SetParent<Object> ()
43 .AddConstructor<Building> ()
44 .SetGroupName ("Buildings")
45 .AddAttribute ("NRoomsX", "The number of rooms in the X axis.",
46 UintegerValue (1),
48 MakeUintegerChecker<uint32_t> ())
49 .AddAttribute ("NRoomsY", "The number of rooms in the Y axis.",
50 UintegerValue (1),
52 MakeUintegerChecker<uint32_t> ())
53 .AddAttribute ("NFloors", "The number of floors of this building.",
54 UintegerValue (1),
56 MakeUintegerChecker<uint32_t> ())
57 .AddAttribute ("Id", "The id (unique integer) of this Building.",
58 UintegerValue (0),
60 MakeUintegerChecker<uint32_t> ())
61 .AddAttribute ("Boundaries", "The boundaries of this Building as a value of type ns3::Box",
62 BoxValue (Box ()),
64 MakeBoxChecker ())
65 .AddAttribute ("Type",
66 "The type of building",
70 Building::Office, "Office",
71 Building::Commercial, "Commercial"))
72 .AddAttribute ("ExternalWallsType",
73 "The type of material of which the external walls are made",
77 Building::ConcreteWithWindows, "ConcreteWithWindows",
78 Building::ConcreteWithoutWindows, "ConcreteWithoutWindows",
79 Building::StoneBlocks, "StoneBlocks"))
80 ;
81 return tid;
82}
83
84Building::Building (double xMin,
85 double xMax,
86 double yMin,
87 double yMax,
88 double zMin,
89 double zMax)
90{
91 NS_FATAL_ERROR (std::endl << "this function is not supported any more:" << std::endl
92 << " Building::Building (double xMin, double xMax, double yMin, " << std::endl
93 << " double yMax, double zMin, double zMax)\n" << std::endl
94 << "so you can't do any more stuff like:" << std::endl
95 << "Ptr<Building> b = CreateObject<Building> ("
96 << xMin << ", "
97 << xMax << ", "
98 << yMin << ", "
99 << yMax << ", "
100 << zMin << ", "
101 << zMax << ")\n" << std::endl
102 << "Please use instead something like this:" << std::endl
103 << " Ptr<Building> b = CreateObject<Building> ();" << std::endl
104 << " b->SetBoundaries (Box ("
105 << xMin << ", "
106 << xMax << ", "
107 << yMin << ", "
108 << yMax << ", "
109 << zMin << ", "
110 << zMax << "));" << std::endl <<std::endl);
111}
112
113
115{
116 NS_LOG_FUNCTION (this);
118}
119
121{
122 NS_LOG_FUNCTION (this);
123}
124
125void
127{
128 NS_LOG_FUNCTION (this);
129}
130
132Building::GetId (void) const
133{
134 NS_LOG_FUNCTION (this);
135 return m_buildingId;
136}
137
138void
140{
141 NS_LOG_FUNCTION (this << boundaries);
142 m_buildingBounds = boundaries;
143}
144
145void
147{
148 NS_LOG_FUNCTION (this << t);
149 m_buildingType = t;
150}
151
152void
154{
155 NS_LOG_FUNCTION (this << t);
156 m_externalWalls = t;
157}
158
159void
160Building::SetNFloors (uint16_t nfloors)
161{
162 NS_LOG_FUNCTION (this << nfloors);
163 m_floors = nfloors;
164}
165
166void
167Building::SetNRoomsX (uint16_t nroomx)
168{
169 NS_LOG_FUNCTION (this << nroomx);
170 m_roomsX = nroomx;
171}
172
173void
174Building::SetNRoomsY (uint16_t nroomy)
175{
176 NS_LOG_FUNCTION (this << nroomy);
177 m_roomsY = nroomy;
178}
179
180Box
182{
183 NS_LOG_FUNCTION (this);
184 return m_buildingBounds;
185}
186
189{
190 return (m_buildingType);
191}
192
195{
196 return (m_externalWalls);
197}
198
199uint16_t
201{
202 return (m_floors);
203}
204
205uint16_t
207{
208 return (m_roomsX);
209}
210
211uint16_t
213{
214 return (m_roomsY);
215}
216
217bool
218Building::IsInside (Vector position) const
219{
220 return m_buildingBounds.IsInside (position);
221}
222
223
224uint16_t
225Building::GetRoomX (Vector position) const
226{
227 NS_ASSERT (IsInside (position));
228 uint16_t n;
229
230 if (position.x == m_buildingBounds.xMax)
231 {
232 n = m_roomsX;
233 }
234 else
235 {
236 double xLength = m_buildingBounds.xMax - m_buildingBounds.xMin;
237 double x = position.x - m_buildingBounds.xMin;
238 n = floor (m_roomsX * x/xLength) + 1;
239 NS_LOG_LOGIC ("xLength=" << xLength << ", x=" << x << ", m_roomsX=" << m_roomsX);
240 }
241 NS_LOG_LOGIC ("RoomX: " << n);
242 return n;
243}
244
245uint16_t
246Building::GetRoomY (Vector position) const
247{
248 NS_ASSERT (IsInside (position));
249 uint16_t n;
250
251 if (position.y == m_buildingBounds.yMax)
252 {
253 n = m_roomsY;
254 }
255 else
256 {
257 double yLength = m_buildingBounds.yMax - m_buildingBounds.yMin;
258 double y = position.y - m_buildingBounds.yMin;
259 n = floor (m_roomsY * y/yLength) + 1;
260 NS_LOG_LOGIC ("yLength=" << yLength << ", y=" << y << ", m_roomsY=" << m_roomsY);
261 }
262 NS_LOG_LOGIC ("RoomY: " << n);
263 return n;
264}
265
266uint16_t
267Building::GetFloor (Vector position) const
268{
269 NS_ASSERT (IsInside (position));
270 uint16_t n;
271
272 if (position.z == m_buildingBounds.zMax)
273 {
274 n = m_floors;
275 }
276 else
277 {
278 double zLength = m_buildingBounds.zMax - m_buildingBounds.zMin;
279 double z = position.z - m_buildingBounds.zMin;
280 n = floor (m_floors * z/zLength) + 1;
281 NS_LOG_LOGIC ("zLength=" << zLength << ", z=" << z << ", m_floors=" << m_floors);
282 }
283 NS_LOG_LOGIC ("floor: " << n);
284 return n;
285}
286
287bool
288Building::IsIntersect (const Vector &l1, const Vector &l2) const
289{
290 return m_buildingBounds.IsIntersect (l1, l2);
291}
292
293
294} // namespace ns3
a 3d box
Definition: box.h:35
double yMax
The y coordinate of the top bound of the box.
Definition: box.h:116
bool IsInside(const Vector &position) const
Definition: box.cc:54
double xMin
The x coordinate of the left bound of the box.
Definition: box.h:110
double yMin
The y coordinate of the bottom bound of the box.
Definition: box.h:114
double xMax
The x coordinate of the right bound of the box.
Definition: box.h:112
double zMin
The z coordinate of the down bound of the box.
Definition: box.h:118
bool IsIntersect(const Vector &l1, const Vector &l2) const
Checks if a line-segment between position l1 and position l2 intersects a box.
Definition: box.cc:147
double zMax
The z coordinate of the up bound of the box.
Definition: box.h:120
AttributeValue implementation for Box.
Building()
Create a zero-sized building located at coordinates (0.0,0.0,0.0) and with 1 floors and 1 room.
Definition: building.cc:114
uint16_t GetNRoomsY() const
Definition: building.cc:212
uint32_t m_buildingId
Building ID number.
Definition: building.h:236
BuildingType_t m_buildingType
Building type.
Definition: building.h:237
ExtWallsType_t GetExtWallsType() const
Definition: building.cc:194
ExtWallsType_t
External building wall type enum.
Definition: building.h:59
@ ConcreteWithWindows
Definition: building.h:60
@ ConcreteWithoutWindows
Definition: building.h:60
ExtWallsType_t m_externalWalls
External building wall type.
Definition: building.h:238
void SetBuildingType(Building::BuildingType_t t)
Definition: building.cc:146
uint32_t GetId(void) const
Definition: building.cc:132
uint16_t GetNFloors() const
Definition: building.cc:200
void SetBoundaries(Box box)
Set the boundaries of the building.
Definition: building.cc:139
BuildingType_t GetBuildingType() const
Definition: building.cc:188
void SetNRoomsX(uint16_t nroomx)
Definition: building.cc:167
virtual ~Building()
Destructor.
Definition: building.cc:120
bool IsIntersect(const Vector &l1, const Vector &l2) const
Checks if a line-segment between position l1 and position l2 intersects a building.
Definition: building.cc:288
uint16_t GetRoomY(Vector position) const
Definition: building.cc:246
void SetExtWallsType(Building::ExtWallsType_t t)
Definition: building.cc:153
uint16_t m_floors
number of floors, must be greater than 0, and 1 means only one floor (i.e., groundfloor)
Definition: building.h:232
void SetNRoomsY(uint16_t nroomy)
Definition: building.cc:174
Box GetBoundaries() const
Definition: building.cc:181
uint16_t m_roomsX
X Room coordinate.
Definition: building.h:233
uint16_t GetFloor(Vector position) const
Definition: building.cc:267
uint16_t GetNRoomsX() const
Definition: building.cc:206
uint16_t m_roomsY
Y Room coordinate.
Definition: building.h:234
static TypeId GetTypeId(void)
Get the type ID.
Definition: building.cc:39
bool IsInside(Vector position) const
Definition: building.cc:218
virtual void DoDispose()
Destructor implementation.
Definition: building.cc:126
void SetNFloors(uint16_t nfloors)
Definition: building.cc:160
Box m_buildingBounds
Building boundaries.
Definition: building.h:226
uint16_t GetRoomX(Vector position) const
Definition: building.cc:225
BuildingType_t
Building type enum.
Definition: building.h:52
static uint32_t Add(Ptr< Building > building)
Hold variables of type enum.
Definition: enum.h:55
A base class which provides memory management and object aggregation.
Definition: object.h:88
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
Hold an unsigned integer type.
Definition: uinteger.h:44
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Definition: enum.h:205
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Definition: uinteger.h:45
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeEnumChecker(int v, std::string n, Ts... args)
Make an EnumChecker pre-configured with a set of allowed values by name.
Definition: enum.h:162
list x
Random number samples.