logplus/common/geometryutils.cpp

1007 lines
27 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "geometryutils.h"
#include <QCoreApplication>
#include <QDir>
#include <QDate>
#include <QComboBox>
#include <QSettings>
#include <QTextCodec>
#include <QTextStream>
#include <QMessageBox>
#include "LogIO.h"
QString OilField;
QString setdec(QString text,int dec,bool all)
{
if(text.size()==0) return text;
QString cs=text,digla="+-.1234567890";
cs=cs.trimmed();
QStringList strs;
if(!all) {
for(int i=0;i<cs.size();i++) if(digla.indexOf(cs.at(i))<0) return text;
}
{
int s=0,e=0,n=0;
for(int i=0;i<cs.size();i++) {
if(digla.indexOf(cs.at(i))<0||(cs.at(i)=='+'||cs.at(i)=='-')&&i){
if(e) {
strs.append(cs.mid(s,e));
int j=strs.size()-1;
int dot=strs[j].indexOf(".");
if(dot<0) {
strs[j]+=".";
for(int i=0;i<dec;i++) strs[j]+="0";
}
else {
QStringList css=strs[j].split(".");
int len=css[1].size();
for(int i=len;i<2;i++)
{
css[1]+="0";
}
if(len>2) css[1]=css[1].remove(2,len-2);
strs[j]=css.join(".");
}
s=i;
e=0;
n=1;
}
else n++;
if(i==cs.size()-1)strs.append(cs.mid(s,n));;
}
else
{
if(n){
strs.append(cs.mid(s,n));
n=0;
}
if(!e) s=i;
e++;
if(i==cs.size()-1){
strs.append(cs.mid(s,e));
int j=strs.size()-1;
int dot=strs[j].indexOf(".");
if(dot<0) {
strs[j]+=".";
for(int i=0;i<dec;i++) strs[j]+="0";
}
else {
QStringList css=strs[j].split(".");
int len=css[1].size();
for(int i=len;i<2;i++)
{
css[1]+="0";
}
if(len>2) css[1]=css[1].remove(2,len-2);
strs[j]=css.join(".");
}
}
}
}
}
text=strs.join("");
return text;
}
QString GetProjectFolder()
{
// 1.获取当前运行程序的目录路径
QString applicationDirPath = QCoreApplication::applicationDirPath();
//获取上级目录
int index = applicationDirPath.lastIndexOf("/");
int index1 = applicationDirPath.lastIndexOf("\\");
if(index1 > index)
{
index = index1;
}
//
QString strProjectDir;
strProjectDir = applicationDirPath.mid(0,index+1) + "/project/";
//
QDir dir(strProjectDir);
if( !dir.exists( strProjectDir ) )
{
dir.mkdir(strProjectDir);
}
return strProjectDir ;
}
QString GetLogdataPath()
{
// 1.获取当前运行程序的目录路径
QString applicationDirPath = QCoreApplication::applicationDirPath();
//获取上级目录
int index = applicationDirPath.lastIndexOf("/");
int index1 = applicationDirPath.lastIndexOf("\\");
if(index1 > index)
{
index = index1;
}
//
QString strImagePath;
strImagePath = applicationDirPath.mid(0,index+1) + "/Logdata/";
//
QDir dir(strImagePath);
if( !dir.exists( strImagePath ) )
{
dir.mkdir(strImagePath);
}
return strImagePath;
}
void GetWellNameAndPath(QString slf,QString &wellname,QString &path)
{
QString slffilename=QString("");
int ind=slf.lastIndexOf('\\');
int ind2=slf.lastIndexOf('/');
if(ind2>ind) ind=ind2;
if(ind>-1) {
slffilename=slf.mid(ind+1);
path=slf.left(ind);
ind=slffilename.lastIndexOf('.');
if(ind>0) wellname=slffilename.left(ind);
}
}
int chakan(QString path, QStringList &wellfs, QString strSuffix)
{
QDir dir(path);
QFileInfoList fileInfos = dir.entryInfoList(QStringList() << strSuffix, QDir::Files);
foreach(QFileInfo fileInfo, fileInfos)
{
wellfs.append(fileInfo.absoluteFilePath());
}
return 1;
}
QString GetImagePath()
{
static QString imgpath;
if(imgpath!="") return imgpath;
QString strImagePath;
{
QString strPathTmp = QCoreApplication::applicationDirPath() + QDir::separator();
strImagePath = QDir::toNativeSeparators( strPathTmp );
QDir dir;
if( dir.exists( strPathTmp + "image" ) )
{
return strPathTmp + "image" + QDir::separator();
}else
{
strImagePath = strImagePath+".."+ "/LogPlus/image/";
}
}
imgpath=strImagePath;
return imgpath;
}
QString GetDate(time_t mDate)
{
QString cs;
char buf[100]="";
if(!mDate||mDate==-1) {
QDate td=QDate::currentDate();
sprintf(buf,"%4d年-%02d月-%02d日",td.year(),td.month(),td.day());
}
else {
time_t tm1=mDate;
struct tm *_Tm=localtime(&tm1);
if(!_Tm) {
QDate td=QDate::currentDate();
sprintf(buf,"%4d年-%02d月-%02d日",td.year(),td.month(),td.day());
}
else sprintf(buf,"%4d年-%02d月-%02d日",_Tm->tm_year+1900,_Tm->tm_mon+1,_Tm->tm_mday);
}
cs=buf;
return cs;
}
QMap<QString,QString> GetZoneOrder(bool isOilFile,QWidget *pW)
{
return GetZoneOrder(QString("RESULT"),isOilFile,pW);
}
QMap<QString,QString> GetZoneOrder(QString table,bool isOilFile,QWidget *pW)
{
QMap<QString,QString> zoneOrder;
//层序号根据层位名来配置文件在conf\\RESULT.txt
//初始化ZoneOrder
QString oilfield=GetOilFieldName();
QString configfile=GetConfPath();
if(isOilFile) configfile+=oilfield;
configfile+=table;
QDir ss1;
if(!ss1.exists(configfile))
{
if(!ss1.exists(configfile+".txt")) {
configfile+=".ini";
}
else configfile+=".txt";
}
QStringList lines;
QFile file( configfile );
if ( file.open( QIODevice::ReadOnly ) ) {
QTextStream stream( &file );
QString line;
while ( !stream.atEnd() ) {
line = stream.readLine(); // 不包括“\n”的一行文本
lines += line;
}
file.close();
}
lines.removeAll("");
QStringList aaa;
for(int i=0;i<lines.size();i++){
if(aaa.indexOf(lines[i])<0)
{
aaa.append(lines[i]);
}
else {
QString ss=configfile+"\"";
ss+=lines[i];
ss+="\"符号重复!";
if(pW) QMessageBox::about(pW,"提示",ss);
}
if(lines[i].indexOf(" ")>-1)
{
QStringList strs=lines[i].split(" ");
zoneOrder.insert(strs[0],strs[1]);
}
else zoneOrder.insert(lines[i],QString::number(i+1));
}
return zoneOrder;
}
QString toString(QString cs)
{
int index=cs.indexOf(".");
if(index>=0) {
QStringList css=cs.split('e');
if(css.size()==1) {
if(cs.size()>1)
{
if(cs.indexOf("-",1)>-1) return cs;
}
}
if(css.size()>1) {
cs=css[0];
}
int len=cs.length();
int j=0;
for(int i=len-1;i>=index;i--) {
if(cs.at(i)=='0') j++;
else {
if(cs.at(i)=='.') j++;
break;
}
}
cs=cs.left(len-j);
if(css.size()>1) {
css[0]=cs;
cs=css.join("e");
}
}
return cs;
}
QString toString(int value,char f,int dem,bool iscut,bool ise)
{
if(ise&&(fabsf(value)>=1e4||(fabsf(value)<=1e-4&&value!=0))){
QString V=QString::number(value,'e',6);
V=toString(V);
return V;
}
QString cs=QString::number(value);
if(iscut) return toString(cs);
else return cs;
}
QString toString(float value,char f,int dem,bool iscut,bool ise)
{
if(ise&&(fabsf(value)>=1e4||(fabsf(value)<=1e-4&&value!=0))){
QString V=QString::number(value,'e',6);
V=toString(V);
return V;
}
QString cs="%";
char buf[100],format[100];
sprintf(format,"10.%d%c",dem,f);
cs+=format;
sprintf(buf,cs.toStdString().c_str(),value);
cs=buf;
cs=cs.trimmed();
if(iscut) return toString(cs);
else return cs;
}
QString toString(double value,char f,int dem,bool iscut,bool ise)
{
if(ise&&(fabsf(value)>=1e4||(fabsf(value)<=1e-4&&value!=0))){
QString V=QString::number(value,'e',6);
V=toString(V);
return V;
}
QString cs="%";
char buf[100],format[100];
sprintf(format,"10.%d%c",dem,f);
cs+=format;
cs=cs.trimmed();
sprintf(buf,cs.toStdString().c_str(),value);
cs=buf;
cs=cs.trimmed();
if(iscut) return toString(cs);
else return cs;
}
QStringList GetSimilarCurves(QString curvename,char *INI,bool isEqu)
{
QStringList vars,temps;
QString path=GetConfPath();
if(INI) {
QDir ss(INI);
if(ss.exists(INI)) path=INI;
else path+=INI;
}
else path+="StringName.ini";
QFile file(path);
if (!file.open(QIODevice::ReadOnly))
return vars;
QTextStream textstream(&file );
curvename=curvename.trimmed();
char Left[200];
int len=strlen(curvename.toStdString().c_str());
int len1=0,len2=0;
while (!textstream.atEnd())
{
QString va = textstream.readLine(1000);
if(va.indexOf("#")>-1) continue;
va=va.trimmed();
vars=va.split("=");
if(vars.size()>1) {
vars[0]=vars[0].trimmed();
if(vars[0].isEmpty()) continue;
strcpy(Left,curvename.toStdString().c_str());
if(!isEqu) {
len1=strlen(vars[0].toStdString().c_str());
if(curvename.indexOf(vars[0])>=0) {
if(len1>len2) {
strncpy(Left,curvename.toStdString().c_str(),len1);
Left[len1]=0;
len2=len1;
}
}
}
if(vars[0]==Left) {
va=vars[1];
if(va.indexOf("color(",0,Qt::CaseInsensitive)>-1) {
va.replace("COLOR","",Qt::CaseInsensitive);
va.replace("(","");
va.replace(")","");
}
// va.replace(" ","");
va.trimmed();
vars=va.split(",");
if(isEqu) return vars;
else temps=vars;
}
}
}
if(temps.size()) {
if(!isEqu) {
int i=temps[0].indexOf(" ");
if(i>-1) temps[0]=temps[0].replace(temps[0].left(i),curvename);
}
return temps;
}
vars.clear();
return vars;
}
//whp add 2020.3.14 for 检查井名合理性
bool IsValidWellName(QString wellname)
{
int nCount = wellname.count();
if(nCount<=0)return 0;
bool IsValidWellName=1;
for(int i = 0 ; i < nCount ; i++)
{
QChar cha = wellname.at(i);
ushort uni = cha.unicode();
if(i==0)
{//首字符必须是字母或汉字
if(cha>='0'&&cha<='9'||cha>=65&&cha<=90||cha>=97&&cha<=122||(uni >= 0x4E00 && uni <= 0x9FA5))continue;
else
{
IsValidWellName=0;break;
}
}
if(cha>=48&&cha<=57||cha>=65&&cha<=90||cha>=97&&cha<=122||cha==45||cha==46||cha==95)continue;
if(uni >= 0x4E00 && uni <= 0x9FA5)continue;
IsValidWellName=0;
break;
}
return IsValidWellName;
}
bool IsValidNmae(QString wellname)
{
int nCount = wellname.count();
if(nCount<=0)return 0;
bool IsValidWellName=1;
QString value="AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789#_-*αβγδεζηθικλμνξοπρστυφχψ.";
for(int i = 0 ; i < nCount ; i++)
{
QChar cha = wellname.at(i);
ushort uni = cha.unicode();
if(i==0)
{//首字符必须是字母或汉字
if(value.indexOf(cha)>=0||(uni >= 0x4E00 && uni <= 0x9FA5)) continue;
}
else {
if(value.indexOf(cha)>=0||(uni >= 0x4E00 && uni <= 0x9FA5)) continue;
}
return false;
}
return true;
}
bool IsInvalidString(QString filename)
{
QStringList strs=GetSimilarCurves("InvalidFile");
bool isInvalid=false;
QString wellname;
int i=filename.lastIndexOf('\\');
int i0=filename.lastIndexOf('/');
if(i0>i) {
wellname=filename.mid(i0+1);
}
else {
wellname=filename.mid(i+1);
}
foreach(QString cname,strs) {
if(cname.size()&&(cname.at(0)=='.')||cname.indexOf('*')>-1) {
if(cname.indexOf('*')>-1) {
int i=cname.indexOf('*');
if(i>0) cname=cname.left(i);
else if(i==0) cname=cname.mid(i+1);
}
if(wellname.indexOf(cname)>-1) {
isInvalid=true;
break;
}
}
else if(wellname.compare(cname,Qt::CaseInsensitive)==0) {
isInvalid=true;
break;
}
}
return isInvalid;
}
QStatusBar* GetStatusBar()
{
static QStatusBar * pStatusBar = new QStatusBar;
return static_cast<QStatusBar*>(pStatusBar);
}
QString GetOutDataPath()
{
QString strProjectDir = QCoreApplication::applicationDirPath()+ QDir::separator() + "../Outdata";
QDir dir(strProjectDir);
if( !dir.exists( strProjectDir ) )
{
dir.mkdir(strProjectDir);
}
strProjectDir += QDir::separator();
return strProjectDir ;
}
QString ReadOilFieldName()
{
QString path=GetLogPlusPath();
path+="oilfield.ini";
FILE *fp=fopen(path.toStdString().c_str(),"rt");
char oilfield[200];
oilfield[0]=0;
if(fp) {
fscanf(fp,"%s\n",oilfield);
fclose(fp);
}
OilField=oilfield;
return OilField;
}
QString GetOilFieldName(QString c)
{
if(OilField.isEmpty())
{
ReadOilFieldName();
}
QString cs=OilField;
if(!cs.isEmpty()) return cs+c;
else return cs;
}
QString GetLogPlusPath()
{
QString strProjectDir = QCoreApplication::applicationDirPath()+ QDir::separator() + "..";
strProjectDir += QDir::separator();
return strProjectDir ;
}
QString GetConfPath()
{
QString strConfPath;
{
QString strPathTmp = QCoreApplication::applicationDirPath()+ QDir::separator() ;
strConfPath = QDir::toNativeSeparators( strPathTmp );
return strPathTmp + "conf" + QDir::separator();
}
return strConfPath;
}
bool RenameWellName(QString filename, QString strNewName)
{
QString path,wellname;
GetWellNameAndPath(filename,wellname,path);
QFileInfo f(filename);
QDir ss;
QString newname=path;
newname+="/"+strNewName+"."+f.suffix();
if(ss.rename(filename,newname)) {//.WELL文件改名
return true;
}
return false;
}
void ComboxFromConfigFile( QComboBox *aCombox ,QString configCategory)
{
if(aCombox==NULL) return;
if(configCategory=="") return;
static QString temp = ::GetConfPath()+"data.ini";
QSettings settings(temp,QSettings::IniFormat,0);
settings.setIniCodec(QTextCodec::codecForName("UTF-8"));
QStringList serials=settings.value(configCategory,0).toStringList();
aCombox->clear();
aCombox->addItems(serials);
}
QString GetDataPath()
{
static QString imgpath;
if(imgpath!="") return imgpath;
QString strImagePath;
{
QString strPathTmp = QCoreApplication::applicationDirPath() + QDir::separator();
strImagePath = QDir::toNativeSeparators( strPathTmp );
QDir dir;
return strPathTmp + ".."+QDir::separator()+"Data" + QDir::separator();
}
imgpath=strImagePath;
return imgpath;
}
// get Decimal,such as "6.0003000040000" return "9"
unsigned short GetDecimal( double dValue )
{
unsigned short nMaxDecimal = 20;
double Zero = pow( 10.0,-nMaxDecimal );
for( unsigned short i = 0 ; i < nMaxDecimal ; ++i )
{
double dValueTmp = dValue * pow( 10.0 ,i );
qint64 nValueTmp = static_cast<qint64 >( qint64(dValueTmp ) );
if( fabs( dValueTmp - nValueTmp ) < Zero )
{
return i;
}
}
return 2;
}
QString DoubleToString(double dValue, int nDecimal,int *pReallyDecimal)
{
if( nDecimal < 0 )
{
nDecimal = GetDecimal( dValue );
}
QString str;
str.setNum( dValue , 'a' , nDecimal );
if( nDecimal>0 && !str.isEmpty() )
{
int iPos(0);
for( iPos = str.length()-1 ; iPos>=0 ; --iPos )
{
if( str[iPos] != '0' )
{
break;
}
--nDecimal;
}
if( str[iPos] =='.' ) --iPos;
str.truncate( iPos +1 );
}
if( pReallyDecimal )
{
*pReallyDecimal = qMax(0,nDecimal );
}
return str;
}
bool SystemIsExiting=false;
void SetSystemExisting(bool exiting)
{
SystemIsExiting=exiting;
}
bool SystemExiting(){return SystemIsExiting;}
//直方图获取当前工程下的slf
bool getAllSlf(QString prjname, QVector<QString> &vecSlfList, QVector<QString> &vecWellList)
{
//Logdata
QString folderPath;
folderPath = GetLogdataPath();
folderPath = folderPath + prjname;
folderPath = folderPath + "/";
//-------------------
QStringList listFolders;
QFileInfo mfi(folderPath);
if(!mfi.isDir())
{
//井文件 *.wwl
if(!mfi.isFile())
{
return false;
}
//listFiles.append(folderPath);
}
else
{
//井目录
//取当前当前目录内容
QDir dir(folderPath);
dir.setFilter(QDir::Dirs |QDir::NoDotAndDotDot |QDir::Files | QDir::NoSymLinks);
QFileInfoList list = dir.entryInfoList();
int file_count = list.count();
if(file_count <= 0)//判断目录是否为空,空目录返回
{
return false;
}
//取当前目录内容,符合后缀文件
QStringList string_list;
for(int i=0; i<list.size();i++)
{
QFileInfo file_info = list.at(i);
if(file_info.isDir())
{
//#JPH-307
QString absolute_file_path = file_info.absoluteFilePath();
if(absolute_file_path.at(absolute_file_path.length()-1)==' ') {
dir.rmdir(absolute_file_path);
continue;
}
listFolders.append(absolute_file_path);
}
}
}
QStringList wellfiles;
foreach(QString wellFolder, listFolders )
{
QFileInfo w(wellFolder);//#JPH-307
if(w.isDir())
{
chakan(wellFolder, wellfiles, "*.well");
}
}
QStringList wellNames;
foreach(QString wellFile1, wellfiles )
{
QString filename=wellFile1;
//----------------
CLogIO * logio=new CLogIO();
if(!logio->Open(filename.toStdString().c_str(),CSlfIO::modeRead))
{
delete logio;
QString aa=filename+"文件打开失败,请检查!";
//qDebug() << aa;
//AppendConsole(pai::log::PAI_ERROR,aa);
continue;
}
//
QString wellname="";
Slf_FILE_MESSAGE mssage;
logio->GetFileMessage(mssage);
wellname=mssage.WellName;
wellname=wellname.toUpper();
if (wellname.isEmpty()||wellname.length()>64||wellname.indexOf('&')>-1)
{
//辨别井名是否有效,无效则采用文件名
QFileInfo fileInfo(filename);
QString strWellName = fileInfo.completeBaseName();
strWellName=strWellName.toUpper();
//
wellname=strWellName.toStdString().c_str();
int len=strlen(strWellName.toStdString().c_str());
if(len>sizeof(mssage.WellName)) len=sizeof(mssage.WellName);
strncpy(mssage.WellName,strWellName.toStdString().c_str(),len);
mssage.WellName[len]=0;
logio->SetFileMessage(mssage);
}
wellname=wellname.toUpper();
//查找是否已经存在该井和井次
if(wellNames.contains(wellname))
{
delete logio;
continue;
}
wellNames.append(wellname);
//
vecWellList.append(wellname);
//加载*.slf
QStringList slffiles;
QString pathTmp=GetLogdataPath();
pathTmp+=prjname+"/#"+wellname;
chakan(pathTmp, slffiles, "*.slf");
foreach(QString slfFile1, slffiles )
{
CLogIO * logioSLf=new CLogIO();
if(!logioSLf->Open(slfFile1.toStdString().c_str(),CSlfIO::modeRead))
{
delete logioSLf;
//QString aa=fileFull+"文件打开失败,请检查!";
//qDebug() << aa;
//AppendConsole(pai::log::PAI_ERROR,aa);
continue;
}
else
{
Slf_FILE_MESSAGE mssageSlf;
logioSLf->GetFileMessage(mssageSlf);
if(wellname != QString(mssageSlf.WellName))
{
delete logioSLf;
continue;
}
QString wellnameSLf=mssageSlf.Item;
if (wellnameSLf.isEmpty()||wellnameSLf.length()>64||wellnameSLf.indexOf('&')>-1)
{
QFileInfo fileinfo;
fileinfo = QFileInfo(slfFile1);
wellnameSLf = fileinfo.completeBaseName();
}
if(wellnameSLf != wellname)
{
//井次名称不一致
//qDebug() << "井次名称不一致";
delete logioSLf;
continue;
}
vecSlfList.append(slfFile1);
delete logioSLf;
}
}
}
return true;
}
bool getAliasNameFromIni(QString CurveName, QString &strAliasName, QString &strUnit)
{
QString curveFamilyFilePath = ::GetConfPath() + "CurveFamily_New.ini";
QFile curveFamilyFile(curveFamilyFilePath);
if(!curveFamilyFile.open(QIODevice::ReadOnly | QIODevice::Text)) return false;
bool finished = false;
while(!curveFamilyFile.atEnd())
{
QByteArray line = curveFamilyFile.readLine();
QString str(line);
QStringList strList = str.split("=");
if(strList[0] == CurveName && strList.size()>1)
{
QStringList strListSub = strList[1].split(",");
if(strListSub.size()>3)
{
strAliasName = strListSub[0]; //显示名
strUnit = strListSub[3]; //单位
}
// float minValue = strList[1].toFloat();
// float maxValue = strList[2].toFloat();
// if(minValue < -9999 || minValue > 9999) return false;
// if(maxValue < -9999 || maxValue > 9999) return false;
// if(maxValue <= minValue) return false;
finished = true;
break;
}
}
curveFamilyFile.close();
return finished;
}
int getSystemColorNumber(QStringList &names)
{
QString strImagePath;
QString strPathTmp = QCoreApplication::applicationDirPath() + QDir::separator();
strImagePath = QDir::toNativeSeparators( strPathTmp );
QString filecfg=strImagePath+"image"+QDir::separator()+"colortable"+QDir::separator()+"colortable.cfg";
FILE *fp1=fopen(filecfg.toStdString().c_str(),"rt");
if(!fp1) return -1;
char buf[100];
QString str;
int i=0;
while(!feof(fp1)) {
fscanf(fp1,"%s",buf);
str=buf;
//读取全部
//if(str.indexOf("custom",Qt::CaseInsensitive)>=0) continue;
names.push_back(str);
i++;
}
fclose(fp1);
return i;
}
int getSystemColor(int nIndex,QVector<MyColorItem> &colorList,bool inpolation)
{
colorList.clear();
MyColorItem itemColor;
QString strImagePath;
QString strPathTmp = QCoreApplication::applicationDirPath() + QDir::separator();
strImagePath = QDir::toNativeSeparators( strPathTmp );
QString filecfg=strImagePath+"image"+QDir::separator()+"colortable"+QDir::separator()+"colortable.cfg";
FILE *fp1=fopen(filecfg.toStdString().c_str(),"rt");
if(!fp1) return -1;
char buf[100];
QString str;
int i=0;
while(!feof(fp1)) {
fscanf(fp1,"%s",buf);
if(i>=nIndex) {
str=buf;
break;
}
i++;
}
fclose(fp1);
if(str.isEmpty()) return -1;
QString filename=strImagePath+"image"+QDir::separator()+"colortable"+QDir::separator()+str;
FILE *fp=fopen(filename.toStdString().c_str(),"rt");
if(!fp) return -1;
float r,g,b;
QStringList strs;
int colornum=0;
while(!feof(fp)) {
char *ret=fgets(buf,100,fp);
if(!ret) break;
str=buf;
str.replace("\r","");
str.replace("\n","");
str.replace("\t"," ");
if(str.indexOf("#")>-1) continue;
if(str.indexOf("=")>-1) continue;
if(str.indexOf("R",Qt::CaseInsensitive)>-1) continue;
if(str.indexOf("G",Qt::CaseInsensitive)>-1) continue;
if(str.indexOf("B",Qt::CaseInsensitive)>-1) continue;
strs=str.split(" ");
strs.removeAll("");
if(strs.size()!=3) continue;
r=strs[0].toFloat();
g=strs[1].toFloat();
b=strs[2].toFloat();
if(g<=1||b<=1) if(r>0&&r<=1) r*=255;
if(r<=1||b<=1) if(g>0&&g<=1) g*=255;
if(r<=1||g<=1) if(b>0&&b<=1) b*=255;
int rr=r,gg=g,bb=b;
colorList.push_back(MyColorItem(QColor(rr,gg,bb)));
colornum++;
}
fclose(fp);
if(colornum<PAITOTALCOLOR_MIN) colornum=PAITOTALCOLOR_MIN; // 最小总颜色数目
if(colornum>PAITOTALCOLOR_MAX) colornum=PAITOTALCOLOR_MAX; // 最大总颜色数目
if(inpolation)
{
colorList=myInpolation(colorList,colornum);//SYSTEM_INPOLATION);
}
return colorList.count();
}
QVector<MyColorItem> myInpolation(const QVector<MyColorItem> &colorList,int totalColorNum)
{
QVector<MyColorItem> newColorList;
// 填充新的颜色项目
for(int i=0;i<totalColorNum;i++)
newColorList.push_back(MyColorItem());
float gap=(colorList.count()-1)*1.0/(totalColorNum-1);
for(int i=0;i<totalColorNum;i++)
{
float pos=i*gap;
int index1=pos;
if(::fabs(pos-index1)<1.0e-10)
{
newColorList[i]=colorList[index1];
}
else
{
int index2=index1+1;
if(index2>=colorList.size()) index2=colorList.size()-1;
float flgap1=pos-index1;
float flgap2=index2-pos;
int r=colorList[index1].color.red()*flgap2+colorList[index2].color.red()*flgap1;
int g=colorList[index1].color.green()*flgap2+colorList[index2].color.green()*flgap1;
int b=colorList[index1].color.blue()*flgap2+colorList[index2].color.blue()*flgap1;
newColorList[i]=MyColorItem(QColor(r,g,b));
}
}
return newColorList;
}
// 读取定制的颜色方案
void ReadColorSettings(QList<SchemeColor> &shcemeLis)
{
MyColorItem itemColor;
QString strImagePath;
QString strPathTmp = QCoreApplication::applicationDirPath() + QDir::separator();
strImagePath = QDir::toNativeSeparators( strPathTmp );
QString filecfg=strImagePath+"image"+QDir::separator()+"colortable"+QDir::separator()+"colortable.cfg";
FILE *fp1=fopen(filecfg.toStdString().c_str(),"rt");
if(!fp1) return;
char buf[100];
QString str,name;
int i=0;
while(!feof(fp1)) {
fscanf(fp1,"%s",buf);
name=buf;
if(name.indexOf("custom",Qt::CaseInsensitive)>=0) {
QString filename=strImagePath+"image"+QDir::separator()+"colortable"+QDir::separator()+name;
FILE *fp=fopen(filename.toStdString().c_str(),"rt");
if(!fp) return;
QVector<MyColorItem> colorList;
float r,g,b;
QStringList strs;
while(!feof(fp)) {
char *ret=fgets(buf,100,fp);
if(!ret) break;
str=buf;
str.replace("\r","");
str.replace("\n","");
if(str.indexOf("#")>-1) continue;
if(str.indexOf("=")>-1) continue;
if(str.indexOf("R",Qt::CaseInsensitive)>-1) continue;
if(str.indexOf("G",Qt::CaseInsensitive)>-1) continue;
if(str.indexOf("B",Qt::CaseInsensitive)>-1) continue;
strs=str.split(" ");
strs.removeAll("");
if(strs.size()!=3) continue;
r=strs[0].toFloat();
g=strs[1].toFloat();
b=strs[2].toFloat();
if((r>0&&r<=1)||(g>0&&g<=1)||(b>0&&b<=1)) {
r*=255;
g*=255;
b*=255;
}
int rr=r,gg=g,bb=b;
colorList.push_back(MyColorItem(QColor(rr,gg,bb)));
}
fclose(fp);
SchemeColor schemeItem;
name=name.mid(name.lastIndexOf("\\")+1);
if(name.lastIndexOf(".rgb",-1,Qt::CaseInsensitive)>-1)name=name.mid(0,name.lastIndexOf(".rgb",-1,Qt::CaseInsensitive));
schemeItem.schemeName=name;
schemeItem.colorList=colorList;
schemeItem.isDirty=false;
schemeItem.isCustom=true;
schemeItem.currentIndex=0;
shcemeLis.push_back(schemeItem);
}
}
fclose(fp1);
return;
}