/////////////////////////////////////////////////////////////////////////////////
//
// This file is part of SACAMOS, cable models for EMI simulations in SPICE.
// It was developed by the University of Nottingham and the Netherlands Aerospace
// Centre (NLR) for ESA under contract number 4000112765/14/NL/HK.
//
// Copyright (C) 2015 - 2018 University of Nottingham
//
// SACAMOS is free software: you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the Free Software
// Foundation, either version 3 of the License, or (at your option) any later
// version.
//
// SACAMOS is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// A copy of the GNU General Public License version 3 can be found in the
// file GNU_GPL_v3 in the root or at .
//
// wxWidgets is currently licenced under the "wxWindows Library Licence".
// A copy of the wxWindows Library Licence, Version 3.1 can be found in the file
// wxWindows_Library_Licence_v3-1 in the root or at:
//
//
// The University of Nottingham can be contacted at: ggiemr@nottingham.ac.uk
//
// File Contents:
//
// NAME
// MESH_LAPLACE.cpp
//
// DESCRIPTION
// GUI for displaying Laplace solver mesh
//
// AUTHOR(S)
// Steve Greedy
//
/////////////////////////////////////////////////////////////////////////////////
#include "MESH_LAPLACE.h"
void draw_mesh(wxPanel *Panel, wxString mesh_to_draw, float zoom)
{
wxClientDC dc(Panel);
dc.Clear();
dc.SetTextForeground(*wxBLUE);
dc.DrawText(("Laplace Mesh: " + mesh_to_draw) , 10, 15);
mesh_to_draw = mesh_to_draw + ".msh.vtk";// + "_mesh_domain_1.msh.vtk";
std::string str, points, polygons;
int no_points, no_polygons;
std::ifstream meshFile;
meshFile.open (mesh_to_draw);
std::getline(meshFile, str); //Read to end of line
std::getline(meshFile, str); //Read to end of line
std::getline(meshFile, str); //Read to end of line
std::getline(meshFile, str); //Read to end of line
meshFile >>points >>no_points;
std::getline(meshFile, str); //Read to end of line
float ** dataPoint;
dataPoint = new float*[no_points];
for (int i = 0; i< no_points; i++)
{
dataPoint[i] = new float[2];
}
for (int i = 0; i< no_points; i++)
{
meshFile >> dataPoint[i][0] >> dataPoint[i][1];
std::getline(meshFile, str);
}
meshFile >> polygons >> no_polygons;
std::getline(meshFile, str); //Read to end of line & position at start of Polygon list
float xmin, xmax, ymin, ymax;
xmin = 0;
xmax = 0;
ymin = 0;
ymax = 0;
for (int i = 0; i< no_points; i++)
{
if (dataPoint[i][0] > xmax) xmax = dataPoint[i][0];
if (dataPoint[i][0] < xmin) xmin = dataPoint[i][0];
if (dataPoint[i][1] > ymax) ymax = dataPoint[i][1];
if (dataPoint[i][1] < ymin) ymin = dataPoint[i][1];
}
int size_h, size_v;
float scale;
Panel->GetSize(&size_h, &size_v );
if (xmax-xmin > ymax-ymin) scale = size_h/(xmax-xmin);
else scale = 0.75*(size_v/(ymax-ymin));
dc.SetPen( wxPen( *wxBLUE));
scale = scale * zoom;
int i, polygon_edges, v1, v2, v3;
v1 = 0;
v2 = 1;
v3 = 2;
int h_polygons = no_polygons/2;
//need to flip rows top to bottom to invert image...
for (i = 0; i < no_polygons;i++)
{
meshFile >> polygon_edges >> v1 >> v2 >> v3;
dc.DrawLine( dataPoint[v1][0]*scale+size_h/2,size_v - (dataPoint[v1][1]*scale+size_v/2), dataPoint[v2][0]*scale+size_h/2,size_v - (dataPoint[v2][1]*scale+size_v/2 ));
dc.DrawLine( dataPoint[v2][0]*scale+size_h/2,size_v - (dataPoint[v2][1]*scale+size_v/2), dataPoint[v3][0]*scale+size_h/2,size_v - (dataPoint[v3][1]*scale+size_v/2 ));
dc.DrawLine( dataPoint[v3][0]*scale+size_h/2,size_v - (dataPoint[v3][1]*scale+size_v/2), dataPoint[v1][0]*scale+size_h/2, size_v - (dataPoint[v1][1]*scale+size_v/2 ));
std::getline(meshFile, str);
}
meshFile.close();
}
void zoom_mesh(wxPanel *Panel, wxString mesh_to_draw, float zoom)
{
wxClientDC dc(Panel);
dc.Clear();
dc.SetTextForeground(*wxBLUE);
dc.DrawText(("Laplace Mesh: " + mesh_to_draw) , 10, 15);
mesh_to_draw = mesh_to_draw + "_mesh_domain_1.msh.vtk";
std::string str, points, polygons;
int no_points, no_polygons;
std::ifstream meshFile;
meshFile.open (mesh_to_draw);
std::getline(meshFile, str); //Read to end of line
std::getline(meshFile, str); //Read to end of line
std::getline(meshFile, str); //Read to end of line
std::getline(meshFile, str); //Read to end of line
meshFile >>points >>no_points;
std::getline(meshFile, str); //Read to end of line
float ** dataPoint;
dataPoint = new float*[no_points];
for (int i = 0; i< no_points; i++)
{
dataPoint[i] = new float[2];
}
for (int i = 0; i< no_points; i++)
{
meshFile >> dataPoint[i][0] >> dataPoint[i][1];
std::getline(meshFile, str);
}
meshFile >> polygons >> no_polygons;
std::getline(meshFile, str); //Read to end of line & position at start of Polygon list
float xmin, xmax, ymin, ymax;
xmin = 0;
xmax = 0;
ymin = 0;
ymax = 0;
for (int i = 0; i< no_points; i++)
{
if (dataPoint[i][0] > xmax) xmax = dataPoint[i][0];
if (dataPoint[i][0] < xmin) xmin = dataPoint[i][0];
if (dataPoint[i][1] > ymax) ymax = dataPoint[i][1];
if (dataPoint[i][1] < ymin) ymin = dataPoint[i][1];
}
int size_h, size_v;
float scale;
Panel->GetSize(&size_h, &size_v );
if (xmax-xmin > ymax-ymin) scale = size_h/(xmax-xmin);
else scale = 0.75*(size_v/(ymax-ymin));
dc.SetPen( wxPen( *wxBLUE));
scale = scale * 2;
int polygon_edges, v1, v2, v3;
v1 = 0;
v2 = 1;
v3 = 2;
for (int i = 0; i < no_polygons;i++)
{
meshFile >> polygon_edges >> v1 >> v2 >> v3;
/*dc.DrawLine( -1.0 *dataPoint[v1][0]*scale+size_h/2,-1.0 *dataPoint[v1][1]*scale+size_v/2, -1.0 *dataPoint[v2][0]*scale+size_h/2, -1.0 *dataPoint[v2][1]*scale+size_v/2 );
dc.DrawLine( -1.0 *dataPoint[v2][0]*scale+size_h/2,-1.0 *dataPoint[v2][1]*scale+size_v/2, -1.0 *dataPoint[v3][0]*scale+size_h/2, -1.0 *dataPoint[v3][1]*scale+size_v/2 );
dc.DrawLine( -1.0 *dataPoint[v3][0]*scale+size_h/2,-1.0 *dataPoint[v3][1]*scale+size_v/2, -1.0 *dataPoint[v1][0]*scale+size_h/2, -1.0 *dataPoint[v1][1]*scale+size_v/2 );*/
dc.DrawLine( dataPoint[v1][0]*scale+size_h/2,dataPoint[v1][1]*scale+size_v/2, dataPoint[v2][0]*scale+size_h/2, dataPoint[v2][1]*scale+size_v/2 );
dc.DrawLine( dataPoint[v2][0]*scale+size_h/2,dataPoint[v2][1]*scale+size_v/2, dataPoint[v3][0]*scale+size_h/2, dataPoint[v3][1]*scale+size_v/2 );
dc.DrawLine( dataPoint[v3][0]*scale+size_h/2,dataPoint[v3][1]*scale+size_v/2, dataPoint[v1][0]*scale+size_h/2, dataPoint[v1][1]*scale+size_v/2 );
std::getline(meshFile, str);
}
meshFile.close();
}