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/Module/GeoSigmaDraw/InterfaceFaultStatistic.cpp

261 lines
7.2 KiB
C++

1 month ago
#include "stdafx.h"
#include <random>
#include "SigmaView.h"
#include "..\GVision\FaultStatisticsLib\FaultStatisticsCreator.h"
extern "C" __declspec(dllexport)
bool XyCreateFaultStatistic(CXy* pXy, LPCTSTR statisticFile,
LPCTSTR faultLayer, int markType)
{
CFaultStatisticsCreator faCreator;
faCreator.InsertLayer(faultLayer);
CPtrList* pDataAll = pXy->GetValueList();
POSITION pos = pDataAll->GetHeadPosition();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
COne *pOne;
CMesh* pMesh = nullptr;
bool bSuccess = false;
while (pos)
{
pOne = (COne *)(pDataAll->GetNext(pos));
int nEleType = pOne->GetType();
// <20><><EFBFBD><EFBFBD>
if (nEleType == DOUBLEFOX_MESH)
{
pMesh = (CMesh*)pOne->value;
CGrid* pGrid = pMesh->GetMesh();
faCreator.CreateDfg(pGrid->xnum(), pGrid->ynum()
, pGrid->xmin(), pGrid->ymin(), pGrid->dx(), pGrid->dy()
, ((CDimension2D*)pGrid)->u);
faCreator.SetZRange(pGrid->range[0], pGrid->range[1]);
bSuccess = true;
break;
}
}
CPositionList lstFault;
pXy->GetElement(faultLayer, lstFault, DOUBLEFOX_CURVE, true);
POSITION pt;
//COne* pOne;
CCurveEx* pCurve;
pos = lstFault.GetHeadPosition();
while (pos)
{
pt = lstFault.GetNext(pos);
pOne = pXy->GetAt(pt);
1 month ago
if (pOne->GetType() != DOUBLEFOX_CURVE)
continue;
1 month ago
pCurve = (CCurveEx*)pOne->GetValue();
GPline* pc = new GPline();
pc->SetName(pCurve->GetName());
NBase::dfPoint fpt;
int i;
for (i = 0; i < pCurve->num; i++)
{
pCurve->GetPoint(i, fpt);
GPoint3D pt(fpt.x0, fpt.y0, 0);
pc->AddPoint(pt);
}
uintptr_t number = (uintptr_t)pt;
char buffer[65];
//sprintf(buffer, "%lx", pt);
//sscanf(buffer, "%lx", pt);
_ui64toa(number, buffer, 10);
pc->SetPosition(buffer);
CString strLayerName = pOne->GetLayer()->GetName();
//TRACE("%s\n", strLayerName);
faCreator.InsertElement(pc, strLayerName.GetString());
}
faCreator.SetOutPaths("", statisticFile);
faCreator.m_strFltLayer = "";
//faCreator.m_pillarStep = (float)pillarStep; //
faCreator.m_bLocalFltDirect = true; //
faCreator.m_clrMark = RGB(255,0,0); //
faCreator.m_iMarkType = markType; //
//faCreator.m_TextHeight = textHeight; //
faCreator.Execute();
return true;
}
extern "C" __declspec(dllexport)
bool CreateFaultStatistic(CSigmaView* pView, LPCTSTR statisticFile,
LPCTSTR faultLayer, int markType)
{
if (pView == nullptr) {
return false;
}
return XyCreateFaultStatistic(pView->m_pDoc->m_pXy, statisticFile, faultLayer, markType);
}
CLayer* FindFaultLayer(CXy* pXy, const CString& strLayer) {
bool isNew = false;
CLayer* pLayer = pXy->FindAddLayer(strLayer, &isNew);
if (isNew == true) {
if (pLayer->HowToViewCurve == NULL)
{
pLayer->HowToViewCurve = new CHowToViewCurve;
CCurveProperties* pCurveProperty = new CCurveProperties();
pCurveProperty->SetCurveType(PLINE_SOLID);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷֲ<C8B7>
std::uniform_int_distribution<int> distribution(0, 255);
std::uniform_int_distribution<int> distributionR(20, 255);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::random_device rd; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::mt19937 gen(rd()); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int randR = distributionR(gen);
int randG = distribution(gen);
int randB = distribution(gen);
pCurveProperty->color = RGB(randR, randG, randB);
pLayer->HowToViewCurve->Add(pCurveProperty);
}
}
return pLayer;
}
bool XyCreateFaultClass(CXy* pXy,
LPCTSTR faultLayer, double* classStart, double* classEnd, int classCount, int classType, CString& destLayer)
{
CFaultStatisticsCreator faCreator;
faCreator.InsertLayer(faultLayer);
CPtrList* pDataAll = pXy->GetValueList();
POSITION pos = pDataAll->GetHeadPosition();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
COne *pOne;
CMesh* pMesh = nullptr;
bool bSuccess = false;
while (pos)
{
pOne = (COne *)(pDataAll->GetNext(pos));
int nEleType = pOne->GetType();
// <20><><EFBFBD><EFBFBD>
if (nEleType == DOUBLEFOX_MESH)
{
pMesh = (CMesh*)pOne->value;
CGrid* pGrid = pMesh->GetMesh();
faCreator.CreateDfg(pGrid->xnum(), pGrid->ynum()
, pGrid->xmin(), pGrid->ymin(), pGrid->dx(), pGrid->dy()
, ((CDimension2D*)pGrid)->u);
faCreator.SetZRange(pGrid->range[0], pGrid->range[1]);
bSuccess = true;
break;
}
}
CPositionList lstFault;
pXy->GetElement(faultLayer, lstFault, DOUBLEFOX_CURVE, true);
POSITION pt;
//COne* pOne;
CCurveEx* pCurve;
pos = lstFault.GetHeadPosition();
while (pos)
{
pt = lstFault.GetNext(pos);
pOne = pXy->GetAt(pt);
if (pOne->GetType() != DOUBLEFOX_CURVE) continue;
pCurve = (CCurveEx*)pOne->GetValue();
GPline* pc = new GPline();
NBase::dfPoint fpt;
int i;
for (i = 0; i < pCurve->num; i++)
{
pCurve->GetPoint(i, fpt);
GPoint3D pt(fpt.x0, fpt.y0, 0);
pc->AddPoint(pt);
}
uintptr_t number = (uintptr_t)pt;
char buffer[65];
//sprintf(buffer, "%lx", pt);
//sscanf(buffer, "%lx", pt);
_ui64toa(number, buffer, 10);
pc->SetPosition(buffer);
faCreator.InsertElement(pc, faultLayer);
}
faCreator.SetOutPaths("", "");
faCreator.m_strFltLayer = "";
//faCreator.m_pillarStep = (float)pillarStep; //
faCreator.m_bLocalFltDirect = true; //
faCreator.m_clrMark = RGB(255, 0, 0); //
//faCreator.m_iMarkType = markType; //
//faCreator.m_TextHeight = textHeight; //
faCreator.Execute();
std::list<CFaultStatisticsCreator::FltInfo> infos = faCreator.GetFltInfo();
list<CFaultStatisticsCreator::FltInfo>::iterator iter = infos.begin();
for (; iter != infos.end(); iter++)
{
double dVDist = 0;
if (classType == 0) {
dVDist = iter->MaxVDist;
}
else if (classType == 1)
{
dVDist = iter->fltStrike;
}
else if (classType == 2) {
dVDist = iter->fltLength;
}
std::string strPos = (LPCTSTR)iter->position;
uintptr_t num = std::stoull(strPos);
void* pVoid = reinterpret_cast<void*>(num);
POSITION pt = (POSITION)pVoid;
for (int i = 0; i < classCount; i++)
{
if (dVDist >= classStart[i] && dVDist < classEnd[i])
{
pOne = pXy->GetAt(pt);
CString strLayer;
//strLayer.Format("<22><><EFBFBD>ѻ<EFBFBD><D1BB><EFBFBD>\\%s-%s", strLayerStart, strLayerEnd);
strLayer.Format("%s\\%g-%g", destLayer, classStart[i], classEnd[i]);
CLayer* pLayer = FindFaultLayer(pXy, strLayer);
//CLayer* pLayer = pXy->FindAddLayer(strLayer);
CCurveEx* pCurve = (CCurveEx*)pOne->value;
CCurveEx* pCurveNew = new CCurveEx;
*pCurveNew = *pCurve;
POSITION pos = pXy->AddElement(pCurveNew, DOUBLEFOX_CURVE);
pOne = pXy->GetAt(pos);
pOne->SetLayer(pLayer);
break;
}
}
}
return true;
}
extern "C" __declspec(dllexport)
bool XyCreateFaultDelimit(CXy* pXy,
LPCTSTR faultLayer, double* classStart, double* classEnd, int classCount)
{
CString strLayerName(_T("<EFBFBD>Ͼ<EFBFBD>"));
return XyCreateFaultClass(pXy, faultLayer, classStart, classEnd, classCount, 0, strLayerName);
}
extern "C" __declspec(dllexport)
bool XyCreateFaultDelimitByAngle(CXy* pXy,
LPCTSTR faultLayer, double* classStart, double* classEnd, int classCount)
{
CString strLayerName(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"));
return XyCreateFaultClass(pXy, faultLayer, classStart, classEnd, classCount, 1, strLayerName);
}
extern "C" __declspec(dllexport)
bool XyCreateFaultDelimitByLength(CXy* pXy,
LPCTSTR faultLayer, double* classStart, double* classEnd, int classCount)
{
CString strLayerName(_T("<EFBFBD><EFBFBD><EFBFBD>ѳ<EFBFBD><EFBFBD><EFBFBD>"));
return XyCreateFaultClass(pXy, faultLayer, classStart, classEnd, classCount, 2, strLayerName);
}