23 #include "ns3/simulator.h"
24 #include "ns3/config.h"
25 #include "ns3/node-list.h"
26 #include "ns3/wifi-net-device.h"
27 #include "ns3/ppp-header.h"
28 #include "ns3/wifi-mac-header.h"
29 #include "ns3/ethernet-header.h"
31 #include "ns3/abort.h"
33 #include "visual-simulator-impl.h"
38 #define NUM_LAST_PACKETS 10
41 std::vector<std::string>
42 PathSplit (std::string str)
44 std::vector<std::string> results;
46 while ((cutAt = str.find_first_of (
'/')) != str.npos)
50 results.push_back (str.substr (0,cutAt));
52 str = str.substr (cutAt+1);
54 if (str.length () > 0)
56 results.push_back (str);
64 static PyViz* g_visualizer = NULL;
70 static TypeId GetTypeId (
void);
75 virtual void Print (std::ostream &os)
const;
83 PyVizPacketTag::GetTypeId (
void)
87 .AddConstructor<PyVizPacketTag> ()
114 os <<
"PacketId=" << m_packetId;
116 PyVizPacketTag::PyVizPacketTag ()
129 Config::Connect (
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/MacTx",
132 Config::Connect (
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/MacRx",
141 Config::Connect (
"/NodeList/*/DeviceList/*/$ns3::CsmaNetDevice/MacPromiscRx",
150 Config::Connect (
"/NodeList/*/DeviceList/*/$ns3::PointToPointNetDevice/MacTx",
151 MakeCallback (&PyViz::TraceNetDevTxPointToPoint,
this));
153 Config::Connect (
"/NodeList/*/DeviceList/*/$ns3::PointToPointNetDevice/MacRx",
154 MakeCallback (&PyViz::TraceNetDevRxPointToPoint,
this));
172 PyViz::RegisterCsmaLikeDevice (std::string
const &deviceTypeName)
176 std::ostringstream sstream;
177 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/MacTx";
181 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Rx";
185 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/PromiscRx";
190 PyViz::RegisterWifiLikeDevice (std::string
const &deviceTypeName)
194 std::ostringstream sstream;
195 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Tx";
199 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Rx";
204 PyViz::RegisterPointToPointLikeDevice (std::string
const &deviceTypeName)
208 std::ostringstream sstream;
209 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/TxQueue/Dequeue";
213 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Rx";
218 PyViz::SetPacketCaptureOptions (uint32_t nodeId, PacketCaptureOptions options)
221 <<
" PacketCaptureOptions (headers size = " << options.headers.size ()
222 <<
" mode = " << options.mode <<
" numLastPackets = " << options.numLastPackets
224 m_packetCaptureOptions[nodeId] = options;
228 PyViz::RegisterDropTracePath (std::string
const &tracePath)
241 void PyViz::DoPause (std::string
const &message)
243 m_pauseMessages.push_back (message);
246 << g_visualizer->m_pauseMessages.size () <<
" pause messages");
249 void PyViz::Pause (std::string
const &message)
252 g_visualizer->DoPause (message);
255 std::vector<std::string>
256 PyViz::GetPauseMessages ()
const
259 << g_visualizer->m_pauseMessages.size () <<
" pause messages");
260 return m_pauseMessages;
265 PyViz::CallbackStopSimulation ()
276 PyViz::SimulatorRunUntil (Time time)
280 m_pauseMessages.clear ();
281 m_transmissionSamples.clear ();
282 m_packetDrops.clear ();
287 for (std::map<TxRecordKey, TxRecordValue>::iterator iter = m_txRecords.begin ();
288 iter != m_txRecords.end ();)
290 if (iter->second.time < expirationTime)
292 m_txRecords.erase (iter++);
301 for (std::map<uint32_t, Time>::iterator iter = m_packetsOfInterest.begin ();
302 iter != m_packetsOfInterest.end ();)
304 if (iter->second < expirationTime)
306 m_packetsOfInterest.erase (iter++);
326 Ptr<SimulatorImpl> impl = Simulator::GetImplementation ();
327 Ptr<VisualSimulatorImpl> visualImpl = DynamicCast<VisualSimulatorImpl> (impl);
330 visualImpl->RunRealSimulator ();
338 bool PyViz::TransmissionSampleKey::operator < (PyViz::TransmissionSampleKey
const &other)
const
340 if (this->transmitter < other.transmitter)
344 if (this->transmitter != other.transmitter)
348 if (this->receiver < other.receiver)
352 if (this->receiver != other.receiver)
356 if (this->channel < other.channel)
366 bool PyViz::TransmissionSampleKey::operator == (PyViz::TransmissionSampleKey
const &other)
const
368 bool retval = (transmitter == other.transmitter) &&
369 (receiver == other.receiver) &&
370 (channel == other.channel);
375 PyViz::NetDeviceStatistics &
376 PyViz::FindNetDeviceStatistics (
int node,
int interface)
378 std::map<uint32_t, std::vector<NetDeviceStatistics> >::iterator nodeStatsIter = m_nodesStatistics.find (node);
379 std::vector<NetDeviceStatistics> *stats;
380 if (nodeStatsIter == m_nodesStatistics.end ())
382 stats = &m_nodesStatistics[node];
387 stats = &(nodeStatsIter->second);
389 NetDeviceStatistics &devStats = (*stats)[interface];
393 bool PyViz::GetPacketCaptureOptions (uint32_t nodeId,
const PacketCaptureOptions **outOptions)
const
395 std::map<uint32_t, PacketCaptureOptions>::const_iterator iter = m_packetCaptureOptions.find (nodeId);
396 if (iter == m_packetCaptureOptions.end ())
402 *outOptions = &iter->second;
407 bool PyViz::FilterPacket (Ptr<const Packet> packet,
const PacketCaptureOptions &options)
409 switch (options.mode)
411 case PACKET_CAPTURE_DISABLED:
414 case PACKET_CAPTURE_FILTER_HEADERS_OR:
416 PacketMetadata::ItemIterator metadataIterator = packet->BeginItem ();
417 while (metadataIterator.HasNext ())
419 PacketMetadata::Item item = metadataIterator.Next ();
420 if (options.headers.find (item.tid) != options.headers.end ())
428 case PACKET_CAPTURE_FILTER_HEADERS_AND:
430 std::set<TypeId> missingHeaders (options.headers);
431 PacketMetadata::ItemIterator metadataIterator = packet->BeginItem ();
432 while (metadataIterator.HasNext ())
434 PacketMetadata::Item item = metadataIterator.Next ();
435 std::set<TypeId>::iterator missingIter = missingHeaders.find (item.tid);
436 if (missingIter != missingHeaders.end ())
438 missingHeaders.erase (missingIter);
441 if (missingHeaders.size () == 0)
458 PyViz::TraceDevQueueDrop (std::string context, Ptr<const Packet> packet)
461 std::vector<std::string> splitPath = PathSplit (context);
462 int nodeIndex = std::atoi (splitPath[1].c_str ());
465 if (m_nodesOfInterest.find (nodeIndex) == m_nodesOfInterest.end ())
469 if (m_packetsOfInterest.find (packet->GetUid ()) == m_packetsOfInterest.end ())
471 NS_LOG_DEBUG (
"Packet " << packet->GetUid () <<
" is not of interest");
477 const PacketCaptureOptions *captureOptions;
478 if (GetPacketCaptureOptions (nodeIndex, &captureOptions) && FilterPacket (packet, *captureOptions))
480 LastPacketsSample &last = m_lastPackets[nodeIndex];
481 PacketSample lastPacket;
483 lastPacket.packet = packet->Copy ();
484 lastPacket.device = NULL;
485 last.lastDroppedPackets.push_back (lastPacket);
486 while (last.lastDroppedPackets.size () > captureOptions->numLastPackets)
488 last.lastDroppedPackets.erase (last.lastDroppedPackets.begin ());
492 std::map<Ptr<Node>, uint32_t>::iterator iter = m_packetDrops.find (node);
493 if (iter == m_packetDrops.end ())
495 m_packetDrops[node] = packet->GetSize ();
499 iter->second += packet->GetSize ();
504 PyViz::TraceIpv4Drop (std::string context,
ns3::Ipv4Header const &hdr, Ptr<const Packet> packet,
507 Ptr<Packet> packetCopy = packet->Copy ();
508 packetCopy->AddHeader (hdr);
509 TraceDevQueueDrop (context, packetCopy);
516 PyViz::TraceNetDevTxCommon (std::string
const &context, Ptr<const Packet> packet,
517 Mac48Address
const &destinationAddress)
521 std::vector<std::string> splitPath = PathSplit (context);
522 int nodeIndex = std::atoi (splitPath[1].c_str ());
523 int devIndex = std::atoi (splitPath[3].c_str ());
525 Ptr<NetDevice> device = node->GetDevice (devIndex);
528 NetDeviceStatistics &stats = FindNetDeviceStatistics (nodeIndex, devIndex);
529 ++stats.transmittedPackets;
530 stats.transmittedBytes += packet->GetSize ();
533 const PacketCaptureOptions *captureOptions;
534 if (GetPacketCaptureOptions (nodeIndex, &captureOptions) && FilterPacket (packet, *captureOptions))
536 LastPacketsSample &last = m_lastPackets[nodeIndex];
537 TxPacketSample lastPacket;
539 lastPacket.packet = packet->Copy ();
540 lastPacket.device = device;
541 lastPacket.to = destinationAddress;
542 last.lastTransmittedPackets.push_back (lastPacket);
543 while (last.lastTransmittedPackets.size () > captureOptions->numLastPackets)
545 last.lastTransmittedPackets.erase (last.lastTransmittedPackets.begin ());
551 if (m_nodesOfInterest.find (nodeIndex) == m_nodesOfInterest.end ())
555 if (m_packetsOfInterest.find (packet->GetUid ()) == m_packetsOfInterest.end ())
557 NS_LOG_DEBUG (
"Packet " << packet->GetUid () <<
" is not of interest");
568 if (destinationAddress == device->GetBroadcast ())
570 record.isBroadcast =
true;
573 m_txRecords[TxRecordKey (device->GetChannel (), packet->GetUid ())] = record;
577 tag.m_packetId = packet->GetUid ();
578 packet->AddByteTag (tag);
582 PyViz::TraceNetDevTxWifi (std::string context, Ptr<const Packet> packet)
596 Mac48Address destinationAddress;
597 if (hdr.IsToDs () && !hdr.IsFromDs ())
599 destinationAddress = hdr.GetAddr3 ();
601 else if (!hdr.IsToDs () && hdr.IsFromDs ())
603 destinationAddress = hdr.GetAddr1 ();
605 else if (!hdr.IsToDs () && !hdr.IsFromDs ())
607 destinationAddress = hdr.GetAddr1 ();
611 destinationAddress = hdr.GetAddr3 ();
613 TraceNetDevTxCommon (context, packet, destinationAddress);
618 PyViz::TraceNetDevTxCsma (std::string context, Ptr<const Packet> packet)
620 EthernetHeader ethernetHeader;
621 NS_ABORT_IF (packet->PeekHeader (ethernetHeader) == 0);
622 TraceNetDevTxCommon (context, packet, ethernetHeader.GetDestination ());
626 PyViz::TraceNetDevTxPointToPoint (std::string context, Ptr<const Packet> packet)
628 TraceNetDevTxCommon (context, packet, Mac48Address ());
637 PyViz::TraceNetDevRxCommon (std::string
const &context, Ptr<const Packet> packet, Mac48Address
const &from)
641 if (packet->FindFirstMatchingByteTag (tag))
643 uid = tag.m_packetId;
648 NS_LOG_WARN (
"Packet has no byte tag; wimax link?");
649 uid = packet->GetUid ();
653 std::vector<std::string> splitPath = PathSplit (context);
654 int nodeIndex = std::atoi (splitPath[1].c_str ());
655 int devIndex = std::atoi (splitPath[3].c_str ());
658 NetDeviceStatistics &stats = FindNetDeviceStatistics (nodeIndex, devIndex);
659 ++stats.receivedPackets;
660 stats.receivedBytes += packet->GetSize ();
663 Ptr<NetDevice> device = node->GetDevice (devIndex);
666 const PacketCaptureOptions *captureOptions;
667 if (GetPacketCaptureOptions (nodeIndex, &captureOptions) && FilterPacket (packet, *captureOptions))
669 LastPacketsSample &last = m_lastPackets[nodeIndex];
670 RxPacketSample lastPacket;
672 lastPacket.packet = packet->Copy ();
673 lastPacket.device = device;
674 lastPacket.from = from;
675 last.lastReceivedPackets.push_back (lastPacket);
676 while (last.lastReceivedPackets.size () > captureOptions->numLastPackets)
678 last.lastReceivedPackets.erase (last.lastReceivedPackets.begin ());
683 if (m_packetsOfInterest.find (uid) == m_packetsOfInterest.end ())
685 NS_LOG_DEBUG (
"RX Packet " << uid <<
" is not of interest");
689 Ptr<Channel> channel = device->GetChannel ();
691 std::map<TxRecordKey, TxRecordValue>::iterator recordIter =
692 m_txRecords.find (TxRecordKey (channel, uid));
694 if (recordIter == m_txRecords.end ())
696 NS_LOG_DEBUG (
"RX Packet " << uid <<
" was not transmitted?!");
700 TxRecordValue &record = recordIter->second;
702 if (record.srcNode == node)
704 NS_LOG_WARN (
"Node " << node->GetId () <<
" receiving back the same packet (UID=" << uid
705 <<
") it had previously transmitted, on the same channel!");
709 TransmissionSampleKey key = { record.srcNode, node, channel };
711 #ifdef NS3_LOG_ENABLE
713 if (g_log.IsEnabled (ns3::LOG_DEBUG))
715 for (std::map<TransmissionSampleKey,TransmissionSampleValue>::const_iterator iter
716 = m_transmissionSamples.begin (); iter != m_transmissionSamples.end (); iter++)
718 NS_LOG_DEBUG (iter->first.transmitter<<
"/"<<iter->first.transmitter->GetId () <<
", "
719 << iter->first.receiver<<
"/"<<iter->first.receiver->GetId ()
720 <<
", " << iter->first.channel <<
" => " << iter->second.bytes <<
" (@ " << &iter->second <<
")");
726 std::map<TransmissionSampleKey,TransmissionSampleValue>::iterator
727 iter = m_transmissionSamples.find (key);
729 if (iter == m_transmissionSamples.end ())
731 TransmissionSampleValue sample = { packet->GetSize () };
732 NS_LOG_DEBUG (
"RX: from " << key.transmitter<<
"/"<<key.transmitter->GetId () <<
" to "
733 << key.receiver<<
"/"<<key.receiver->GetId ()
734 <<
" channel " << channel <<
": " << packet->GetSize ()
735 <<
" bytes more. => new sample with " << packet->GetSize () <<
" bytes.");
736 m_transmissionSamples[key] = sample;
740 TransmissionSampleValue &sample = iter->second;
741 NS_LOG_DEBUG (
"RX: from " << key.transmitter<<
"/"<<key.transmitter->GetId () <<
" to "
742 << key.receiver<<
"/"<<key.receiver->GetId ()
743 <<
" channel " << channel <<
": " << packet->GetSize ()
744 <<
" bytes more. => sample " << &sample <<
" with bytes " << sample.bytes);
746 sample.bytes += packet->GetSize ();
751 PyViz::TraceNetDevRxWifi (std::string context, Ptr<const Packet> packet)
766 Mac48Address sourceAddress;
767 if (hdr.IsToDs () && !hdr.IsFromDs ())
769 sourceAddress = hdr.GetAddr2 ();
771 else if (!hdr.IsToDs () && hdr.IsFromDs ())
773 sourceAddress = hdr.GetAddr3 ();
775 else if (!hdr.IsToDs () && !hdr.IsFromDs ())
777 sourceAddress = hdr.GetAddr2 ();
781 sourceAddress = hdr.GetAddr4 ();
784 TraceNetDevRxCommon (context, packet, sourceAddress);
790 PyViz::TraceNetDevRxCsma (std::string context, Ptr<const Packet> packet)
792 EthernetHeader ethernetHeader;
793 NS_ABORT_IF (packet->PeekHeader (ethernetHeader) == 0);
794 TraceNetDevRxCommon (context, packet, ethernetHeader.GetSource ());
798 PyViz::TraceNetDevRxPointToPoint (std::string context, Ptr<const Packet> packet)
800 TraceNetDevRxCommon (context, packet, Mac48Address ());
804 PyViz::TraceNetDevPromiscRxCsma (std::string context, Ptr<const Packet> packet)
806 EthernetHeader ethernetHeader;
807 NS_ABORT_IF (packet->PeekHeader (ethernetHeader) == 0);
815 TraceNetDevRxCommon (context, packet, ethernetHeader.GetDestination ());
820 PyViz::TraceNetDevTxWimax (std::string context, Ptr<const Packet> packet, Mac48Address
const &destination)
823 TraceNetDevTxCommon (context, packet, destination);
827 PyViz::TraceNetDevRxWimax (std::string context, Ptr<const Packet> packet, Mac48Address
const &source)
830 TraceNetDevRxCommon (context, packet, source);
834 PyViz::TraceNetDevTxLte (std::string context, Ptr<const Packet> packet, Mac48Address
const &destination)
837 TraceNetDevTxCommon (context, packet, destination);
841 PyViz::TraceNetDevRxLte (std::string context, Ptr<const Packet> packet, Mac48Address
const &source)
844 TraceNetDevRxCommon (context, packet, source);
849 PyViz::TransmissionSampleList
850 PyViz::GetTransmissionSamples ()
const
853 TransmissionSampleList list;
854 for (std::map<TransmissionSampleKey, TransmissionSampleValue>::const_iterator
855 iter = m_transmissionSamples.begin ();
856 iter != m_transmissionSamples.end ();
859 TransmissionSample sample;
860 sample.transmitter = iter->first.transmitter;
861 sample.receiver = iter->first.receiver;
862 sample.channel = iter->first.channel;
863 sample.bytes = iter->second.bytes;
864 NS_LOG_DEBUG (
"from " << sample.transmitter->GetId () <<
" to " << sample.receiver->GetId ()
865 <<
": " << sample.bytes <<
" bytes.");
866 list.push_back (sample);
872 PyViz::PacketDropSampleList
873 PyViz::GetPacketDropSamples ()
const
876 PacketDropSampleList list;
877 for (std::map<Ptr<Node>, uint32_t>::const_iterator
878 iter = m_packetDrops.begin ();
879 iter != m_packetDrops.end ();
882 PacketDropSample sample;
883 sample.transmitter = iter->first;
884 sample.bytes = iter->second;
886 <<
": " << sample.bytes <<
" bytes dropped.");
887 list.push_back (sample);
894 PyViz::SetNodesOfInterest (std::set<uint32_t> nodes)
896 m_nodesOfInterest = nodes;
899 std::vector<PyViz::NodeStatistics>
900 PyViz::GetNodesStatistics ()
const
902 std::vector<PyViz::NodeStatistics> retval;
903 for (std::map<uint32_t, std::vector<NetDeviceStatistics> >::const_iterator iter = m_nodesStatistics.begin ();
904 iter != m_nodesStatistics.end (); iter++)
906 NodeStatistics stats = { iter->first, iter->second };
907 retval.push_back (stats);
913 PyViz::LastPacketsSample
914 PyViz::GetLastPackets (uint32_t nodeId)
const
918 std::map<uint32_t, LastPacketsSample>::const_iterator
919 iter = m_lastPackets.find (nodeId);
920 if (iter != m_lastPackets.end ())
926 return LastPacketsSample ();
957 void ClipStartTop (
Line &line)
959 line.start.x += line.dx * (m_clipMin.y - line.start.y) / line.dy;
960 line.start.y = m_clipMin.y;
963 void ClipStartBottom (Line &line)
965 line.start.x += line.dx * (m_clipMax.y - line.start.y) / line.dy;
966 line.start.y = m_clipMax.y;
969 void ClipStartRight (Line &line)
971 line.start.y += line.dy * (m_clipMax.x - line.start.x) / line.dx;
972 line.start.x = m_clipMax.x;
975 void ClipStartLeft (Line &line)
977 line.start.y += line.dy * (m_clipMin.x - line.start.x) / line.dx;
978 line.start.x = m_clipMin.x;
981 void ClipEndTop (Line &line)
983 line.end.x += line.dx * (m_clipMin.y - line.end.y) / line.dy;
984 line.end.y = m_clipMin.y;
987 void ClipEndBottom (Line &line) {
988 line.end.x += line.dx * (m_clipMax.y - line.end.y) / line.dy;
989 line.end.y = m_clipMax.y;
992 void ClipEndRight (Line &line)
994 line.end.y += line.dy * (m_clipMax.x - line.end.x) / line.dx;
995 line.end.x = m_clipMax.x;
998 void ClipEndLeft (Line &line)
1000 line.end.y += line.dy * (m_clipMin.x - line.end.x) / line.dx;
1001 line.end.x = m_clipMin.x;
1005 FastClipping (Vector2 clipMin, Vector2 clipMax)
1006 : m_clipMin (clipMin), m_clipMax (clipMax)
1011 bool ClipLine (Line &line)
1013 uint8_t lineCode = 0;
1015 if (line.end.y < m_clipMin.y)
1017 else if (line.end.y > m_clipMax.y)
1020 if (line.end.x > m_clipMax.x)
1022 else if (line.end.x < m_clipMin.x)
1025 if (line.start.y < m_clipMin.y)
1027 else if (line.start.y > m_clipMax.y)
1030 if (line.start.x > m_clipMax.x)
1032 else if (line.start.x < m_clipMin.x)
1051 ClipEndRight (line);
1055 ClipEndBottom (line);
1060 if (line.end.y > m_clipMax.y)
1061 ClipEndBottom (line);
1065 ClipEndRight (line);
1066 if (line.end.y > m_clipMax.y)
1067 ClipEndBottom (line);
1076 if (line.end.y < m_clipMin.y)
1081 ClipEndRight (line);
1082 if (line.end.y < m_clipMin.y)
1088 ClipStartLeft (line);
1092 ClipStartLeft (line);
1093 ClipEndRight (line);
1097 ClipStartLeft (line);
1098 if (line.start.y > m_clipMax.y)
1100 ClipEndBottom (line);
1104 ClipStartLeft (line);
1105 if (line.start.y > m_clipMax.y)
1107 ClipEndBottom (line);
1108 if (line.end.x > m_clipMax.x)
1109 ClipEndRight (line);
1113 ClipStartLeft (line);
1114 if (line.start.y < m_clipMin.y)
1120 ClipStartLeft (line);
1121 if (line.start.y < m_clipMin.y)
1124 if (line.end.x > m_clipMax.x)
1125 ClipEndRight (line);
1130 ClipStartRight (line);
1134 ClipStartRight (line);
1139 ClipStartRight (line);
1140 if (line.start.y > m_clipMax.y)
1142 ClipEndBottom (line);
1146 ClipStartRight (line);
1147 if (line.start.y > m_clipMax.y)
1149 ClipEndBottom (line);
1150 if (line.end.x < m_clipMin.x)
1155 ClipStartRight (line);
1156 if (line.start.y < m_clipMin.y)
1162 ClipStartRight (line);
1163 if (line.start.y < m_clipMin.y)
1166 if (line.end.x < m_clipMin.x)
1172 ClipStartBottom (line);
1176 ClipStartBottom (line);
1177 if (line.start.x < m_clipMin.x)
1180 if (line.end.y > m_clipMax.y)
1181 ClipEndBottom (line);
1185 ClipStartBottom (line);
1186 if (line.start.x > m_clipMax.x)
1188 ClipEndRight (line);
1192 ClipStartBottom (line);
1197 ClipStartBottom (line);
1198 if (line.start.x < m_clipMin.x)
1201 if (line.end.y < m_clipMin.y)
1206 ClipStartBottom (line);
1207 if (line.start.x > m_clipMax.x)
1209 ClipEndRight (line);
1210 if (line.end.y < m_clipMin.y)
1216 ClipStartLeft (line);
1217 if (line.start.y > m_clipMax.y)
1218 ClipStartBottom (line);
1222 ClipEndRight (line);
1223 if (line.end.y > m_clipMax.y)
1225 ClipStartBottom (line);
1226 if (line.start.x < m_clipMin.x)
1227 ClipStartLeft (line);
1232 if (line.end.x < m_clipMin.x)
1234 ClipStartBottom (line);
1235 if (line.start.x < m_clipMin.x)
1236 ClipStartLeft (line);
1240 ClipStartLeft (line);
1241 if (line.start.y < m_clipMin.y)
1243 ClipEndRight (line);
1244 if (line.end.y > m_clipMax.y)
1246 if (line.start.y > m_clipMax.y)
1247 ClipStartBottom (line);
1248 if (line.end.y < m_clipMin.y)
1254 ClipStartRight (line);
1255 if (line.start.y > m_clipMax.y)
1256 ClipStartBottom (line);
1261 if (line.end.y > m_clipMax.y)
1263 ClipStartBottom (line);
1264 if (line.start.x > m_clipMax.x)
1265 ClipStartRight (line);
1270 if (line.end.x > m_clipMax.x)
1272 ClipStartRight (line);
1273 if (line.start.y > m_clipMax.y)
1274 ClipStartBottom (line);
1279 if (line.end.y > m_clipMax.y)
1281 ClipStartRight (line);
1282 if (line.start.y < m_clipMin.y)
1284 if (line.end.y < m_clipMin.y)
1286 if (line.start.y > m_clipMax.y)
1287 ClipStartBottom (line);
1292 ClipStartTop (line);
1296 ClipStartTop (line);
1297 if (line.start.x < m_clipMin.x)
1303 ClipStartTop (line);
1304 if (line.start.x > m_clipMax.x)
1306 ClipEndRight (line);
1310 ClipStartTop (line);
1311 ClipEndBottom (line);
1315 ClipStartTop (line);
1316 if (line.start.x < m_clipMin.x)
1319 if (line.end.y > m_clipMax.y)
1320 ClipEndBottom (line);
1324 ClipStartTop (line);
1325 if (line.start.x > m_clipMax.x)
1327 ClipEndRight (line);
1328 if (line.end.y > m_clipMax.y)
1329 ClipEndBottom (line);
1334 ClipStartLeft (line);
1335 if (line.start.y < m_clipMin.y)
1336 ClipStartTop (line);
1340 ClipEndRight (line);
1341 if (line.end.y < m_clipMin.y)
1343 ClipStartTop (line);
1344 if (line.start.x < m_clipMin.x)
1345 ClipStartLeft (line);
1349 ClipEndBottom (line);
1350 if (line.end.x < m_clipMin.x)
1352 ClipStartLeft (line);
1353 if (line.start.y < m_clipMin.y)
1354 ClipStartTop (line);
1358 ClipStartLeft (line);
1359 if (line.start.y > m_clipMax.y)
1361 ClipEndRight (line);
1362 if (line.end.y < m_clipMin.y)
1364 if (line.start.y < m_clipMin.y)
1365 ClipStartTop (line);
1366 if (line.end.y > m_clipMax.y)
1367 ClipEndBottom (line);
1372 ClipStartRight (line);
1373 if (line.start.y < m_clipMin.y)
1374 ClipStartTop (line);
1379 if (line.end.y < m_clipMin.y)
1381 ClipStartTop (line);
1382 if (line.start.x > m_clipMax.x)
1383 ClipStartRight (line);
1387 ClipEndBottom (line);
1388 if (line.end.x > m_clipMax.x)
1390 ClipStartRight (line);
1391 if (line.start.y < m_clipMin.y)
1392 ClipStartTop (line);
1397 if (line.end.y < m_clipMin.y)
1399 ClipStartRight (line);
1400 if (line.start.y > m_clipMax.y)
1402 if (line.end.y > m_clipMax.y)
1403 ClipEndBottom (line);
1404 if (line.start.y < m_clipMin.y)
1405 ClipStartTop (line);
1415 PyViz::LineClipping (
double boundsX1,
double boundsY1,
double boundsX2,
double boundsY2,
1416 double &lineX1,
double &lineY1,
double &lineX2,
double &lineY2)
1418 FastClipping::Vector2 clipMin = { boundsX1, boundsY1}, clipMax = { boundsX2, boundsY2};
1419 FastClipping::Line line = { { lineX1, lineY1 }, { lineX2, lineY2 }, (lineX2-lineX1), (lineY2-lineY1) };
1421 FastClipping clipper (clipMin, clipMax);
1422 clipper.ClipLine (line);
1423 lineX1 = line.start.x;
1424 lineX2 = line.end.x;
1425 lineY1 = line.start.y;
1426 lineY2 = line.end.y;
#define NS_LOG_FUNCTION(parameters)
static Ptr< Node > GetNode(uint32_t n)
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
#define NS_LOG_FUNCTION_NOARGS()
TAG_BUFFER_INLINE uint32_t ReadU32(void)
void Connect(std::string path, const CallbackBase &cb)
#define NS_FATAL_ERROR(msg)
fatal error handling
DropReason
Reason why a packet has been dropped.
TAG_BUFFER_INLINE void WriteU32(uint32_t v)
virtual uint32_t GetSerializedSize(void) const
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
static void ScheduleWithContext(uint32_t context, Time const &time, MEM mem_ptr, OBJ obj)
#define NS_LOG_LOGIC(msg)
#define NS_ABORT_IF(cond)
Abnormal program termination if cond is true.
tag a set of bytes in a packet
virtual void Deserialize(TagBuffer buf)
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
virtual TypeId GetInstanceTypeId(void) const
#define NS_LOG_DEBUG(msg)
virtual void Serialize(TagBuffer buf) const
virtual void Print(std::ostream &os) const
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
static TypeId LookupByName(std::string name)