You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kev/Drawer/GVision/FaultStatisticsLib/FaultStatisticsCreator.cpp

309 lines
6.3 KiB
C++

1 month ago
#include "stdafx.h"
#include "FaultStatisticsCreator.h"
#include <numeric>
const double PI = 3.1415926535897932384626433832795028841971;
CFaultStatisticsCreator::CFaultStatisticsCreator()
{ this->m_pillarStep = 100;
this->m_iCalcMethod = 0;
this->m_bLocalFltDirect = true;
m_clrMark = RGB(255, 255, 255);
m_iMarkType = 0;
m_strLayerMark = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
}
CFaultStatisticsCreator::~CFaultStatisticsCreator()
{
}
bool CFaultStatisticsCreator::CalcFltInfo(GPline* pFlt, FltInfo& finfo)
{
return true;
}
bool CFaultStatisticsCreator::Execute()
{
GetCandidateFlts();
m_lstFltInfo.clear();
m_ampResults.clear();
GPline* pFlt = 0;
GPline* pSvy = 0;
GRect8 rtFlt, rtSvy;
FAmplitudeInfo fminfo;
////begin test
//gfw = fopen("f:/testsegs.dfd", "w");
////end test
for (int j = 0; j < m_candidateFlts.size(); j++)
{
pFlt = m_candidateFlts[j];
FltInfo finfo;
finfo.m_pFlt = pFlt;
finfo.SetPosition(pFlt->GetPosition().c_str());
CalcAmplitudeWithStep(pFlt,&finfo.m_ampResults);
if (finfo.GetParameters())
m_lstFltInfo.push_back(finfo);
}
if (!WriteResult())
return false;
return true;
}
bool CFaultStatisticsCreator::FltInfo::GetParameters(void)
{
if (m_ampResults.empty() || nullptr == m_pFlt )
return false;
fltName = m_pFlt->GetName().c_str();
layerName.Format("Layer:\\%s",m_pFlt->GetLayer().c_str());
fltMode = "<EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD>";
fltLength = m_pFlt->GetLength();
if (m_pFlt->IsClosed(1e-6))
fltLength /= 2.0;
double direct = m_pFlt->GetAverageDirection(); //-pi/2 -- pi/2
fltStrike = fabs(direct - PI/2); //<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>
fltStrike = fltStrike*180.0 / PI;
fltTendency = fltStrike + 90; //<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>
if (fltTendency > 180)
fltTendency -= 180.0;
list<double> hdists;
list<double> vdists;
for (int i = 0; i < m_ampResults.size(); i++)
{
hdists.push_back(m_ampResults[i].horizontal_dist);
vdists.push_back(m_ampResults[i].amplitude);
}
hdists.sort();
vdists.sort();
MaxHDist = hdists.back(); //<2F><><EFBFBD><EFBFBD>ˮƽ<CBAE>Ͼ<EFBFBD>
AveHDist = std::accumulate(hdists.begin(),hdists.end(),0.0 )/hdists.size(); //ƽ<><C6BD>ˮƽ<CBAE>Ͼ<EFBFBD>
MaxVDist = vdists.back(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ͼ<EFBFBD>
AveVDist = std::accumulate(vdists.begin(), vdists.end(), 0.0)/vdists.size(); //ƽ<><C6BD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ͼ<EFBFBD>
dipAngle = atan2(AveVDist, AveHDist);
dipAngle = fabs(dipAngle * 180 / PI ) ;
return true;
}
void CFaultStatisticsCreator::FltInfo::WriteInfo(FILE * fw)
{
fprintf(fw, "%s,%s,%s,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f,%s\n",
fltName,
layerName,
fltMode,
fltLength,
fltStrike,
fltTendency,
dipAngle,
MaxHDist,
AveHDist,
MaxVDist,
AveVDist
, position);
}
void CFaultStatisticsCreator::FltInfo::SetPosition(const char * pos)
{
position.Format("%s", pos);
}
void CFaultStatisticsCreator::WriteLayers(FILE* fw)
{
switch (m_iMarkType)
{
case 0:
m_strLayerMark = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\\<EFBFBD><EFBFBD>ֱ<EFBFBD>Ͼ<EFBFBD>";
break;
case 1:
m_strLayerMark = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\\ˮƽ<EFBFBD>Ͼ<EFBFBD>";
break;
case 2:
m_strLayerMark = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\\<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
break;
default:
break;
}
fprintf(fw, "Class Layer\n");
fprintf(fw, "\n");
fprintf(fw, "Layer M %s\n", m_strLayerMark.GetBuffer() );
fprintf(fw, "Layer ViewAndEdit\n");
fprintf(fw, "\n");
fprintf(fw, "HowToViewPoint\n");
fprintf(fw, "Font 0 20 0 400 0 0 0 1 0 16 0 0 Times New Roman\n");
fprintf(fw, "Text %.4f %.4f 0.0000 0.0000 0.0000 2188\n", this->m_TextHeight, this->m_TextHeight * 0.4);
fprintf(fw, "Color 0 %ld\n", this->m_clrMark);
fprintf(fw, "Mark 0.0000 0.0000 0.0000\n");
fprintf(fw, "\n");
fprintf(fw, "Layer M %s\n", m_strLayerMark.GetBuffer());
fprintf(fw, "Layer HowToViewPoint\n");
fprintf(fw, "HowToViewCurve\n");
fprintf(fw, "\n");
fprintf(fw, "HowToViewPoint\n");
fprintf(fw, "\n");
fprintf(fw, "State 10\n");
fprintf(fw, "Color 0\n");
//fprintf(fw, "Layer M %s\n", m_strLayerMark.GetBuffer());
// fprintf(fw, "3dPoint 21635025.888541, 5092018.981332, 0 45 P23 - 50 - 1
// fprintf(fw, "3dPoint 21634910.101707, 5091891.00641, 0 0 P23 - 50 - 2
// fprintf(fw, "
// fprintf(fw, "Layer M <20>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>
}
void CFaultStatisticsCreator::WriteTextPoints(FILE* fw)
{
double angle = 0;
GPoint3D pt;
float v = 0.0;
m_lstFltInfo;
list<FltInfo>::iterator iter = m_lstFltInfo.begin();
for (; iter != m_lstFltInfo.end(); iter++)
{
vector<FAmplitudeInfo>* pAmpRst = &iter->m_ampResults;
for (int i = 0; i < pAmpRst->size(); i++)
{
fprintf(fw, "Layer M %s\n", this->m_strLayerMark.GetBuffer());
//angle = m_ampResults[i].angle;
//angle -= PI / 2.0;
//angle = angle / PI * 180;
//pt = m_pillarTexts[m_pillarPolygons[i]];
switch (m_iMarkType)
{
case 0:
v = (*pAmpRst)[i].amplitude;
break;
case 1:
v = (*pAmpRst)[i].horizontal_dist;
break;
case 2:
if ((*pAmpRst)[i].horizontal_dist > 1e-6)
{
v = atan2((*pAmpRst)[i].amplitude, (*pAmpRst)[i].horizontal_dist);
v = fabs(v * 180 / PI);
}
break;
default:
v = 0;
break;
}
angle = 0;
pt.x0 = (*pAmpRst)[i].x0;
pt.y0 = (*pAmpRst)[i].y0;
fprintf(fw, "3dPoint %.12g,%.12g,0 %.4g %.4g\n",
pt.x0, pt.y0, angle, v);
}
}
}
//д<><D0B4>dfd
bool CFaultStatisticsCreator::WriteDfd(void)
{
if (m_strOutDfd.GetLength() <= 0) {
return true;
}
::CopyFile(m_strInputDfd, m_strOutDfd, FALSE);
FILE* fw = fopen(m_strOutDfd, "a+");
if (0 == fw)
return false;
WriteLayers(fw);
WriteTextPoints(fw);
////begin test
//for (int i = 0; i < m_pillarPolygons.size(); i++)
// m_pillarPolygons[i]->Write(fw);
////end test
fclose(fw);
return true;
}
//д<><D0B4>csv
bool CFaultStatisticsCreator::WriteCsv(void)
{
if (m_strOutCsv.IsEmpty())
{
return true;
}
FILE* fw = fopen(m_strOutCsv.GetBuffer(), "w");
if (nullptr == fw)
return false;
fprintf(fw, "<EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>Ͽ<EFBFBD><CFBF><EFBFBD>λ,<2C>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><ECB3A4>,<2C>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>(<28>㣩,<2C><><EFBFBD><EFBFBD>(<28>㣩,<2C><><EFBFBD><EFBFBD>(<28>㣩,<2C><><EFBFBD><EFBFBD>ˮƽ<CBAE>Ͼ<EFBFBD>,ƽ<><C6BD>ˮƽ<CBAE>Ͼ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ͼ<EFBFBD>,ƽ<><C6BD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ͼ<EFBFBD>,position\n");
list<FltInfo>::iterator iter = m_lstFltInfo.begin();
for (; iter != m_lstFltInfo.end(); iter++)
{
iter->WriteInfo(fw);
}
fclose(fw);
return true;
}
bool CFaultStatisticsCreator::WriteResult(void)
{
if (!WriteCsv())
return false;
WriteDfd();
return true;
}
CFaultStatisticsCreator::FltInfo::FltInfo(void)
{
m_pFlt = nullptr;
fltName = "";
layerName = "";
fltMode = "";
fltLength = 0.0;
fltStrike= 0.0; //<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>
fltTendency= 0.0; //<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>
dipAngle = 0.0; //<2F><><EFBFBD><EFBFBD>
MaxHDist= 0.0; //<2F><><EFBFBD><EFBFBD>ˮƽ<CBAE>Ͼ<EFBFBD>
AveHDist= 0.0; //ƽ<><C6BD>ˮƽ<CBAE>Ͼ<EFBFBD>
MaxVDist= 0.0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ͼ<EFBFBD>
AveVDist= 0.0; //ƽ<><C6BD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ͼ<EFBFBD>
position = "";
}
CFaultStatisticsCreator::FltInfo::~FltInfo(void)
{
}