?? unt_simulate.pas
字號:
anglr:=abs(anglb-angla);
anglbp:=arctan(sin(anglb)*cos(anglr)/cos(anglb));
// k:=0;
// if abs(Fru[i].side.Ps[0,0]-Fru[i].side.Ps[Fru[i].Side.PCou-1,0])<1e-3 then k:=1;
//求的當前點的落差,pxyz為斷層與模擬當前工作面的交點
H:=the_re(pxyz[1],Fru[i].cal_H.PCou,Fru[i].cal_H.Ps);
//斷層對速度影響系數
f:=0.2+(MDH-H)*0.8/MDH;
if f<0.2 then f:=0.2;
//根據斷層性質計算它的理論影響長度
case fru[i].FruT_Id of
//正斷層反向
1:L:=H*(cos(anglbp)/sin(anglbp)+cos(angla)/sin(angla));
//逆斷層反向
2:L:=sqrt(sqr(MDH*cos(angla)/sin(angla))
+sqr(MDH+H*sin(angla+anglbp)/sin(anglbp)*(cos(angla)
+sin(angla)*sin(angla)/cos(angla))))
+MDH*cos(angla+anglbp)/sin(angla+anglbp);
//正斷層同向
3:L:=(H+MDH)*sin(anglbp-angla)/Cos(anglbp-angla);
//逆斷層同向
4:L:=(MDH+H*sin(anglbp-angla)/cos(angla))
*(Cos(angla)/sin(angla)+cos(anglbp-angla)/sin(anglbp-angla))
end;//case
dis:=Distance(Task[Task_Index].P_p1,pxyz)/Tscale;//計算模擬工組面起點到面和斷層交點的距離
dis:=dis-l/2;
if dis<0 then begin l:=l+dis;dis:=0; end;
if (dis+l)>MDDis then l:=MDDis-dis;
//保存當前工作面模擬過程中斷層影響情況
fru_strs.Add(floattostr(f)+','+floattostr(dis)+','+floattostr(l)+','+floattostr(Fru[i].Rock)+',');
break;
end; //if b=true
end;
end;//for i
setlength(fru_xyz,fru_strs.Count);
setlength(Rockl,fru_strs.Count);
f_Count:=fru_strs.Count;
for i:=0 to fru_strs.Count-1 do
begin
tstr:=fru_strs.Strings[i];
len:=length(tstr);
str[0]:='';str[1]:='';str[2]:='';str[3]:='';
k:=0;
for j:=1 to len do
begin
if tstr[j]=',' then
begin
if k=0 then fru_xyz[i,k]:=strtofloat(str[k]); //f_para
if k=1 then fru_xyz[i,k]:=strtofloat(str[k]); //begin_pos
if k=2 then fru_xyz[i,k]:=strtofloat(str[k]); //len
if k=3 then Rockl[i]:=strtofloat(str[k]); //Rock
k:=k+1;
continue;
end;
str[k]:=str[k]+tstr[j];
end;
end;
fru_strs.Free;
for i:=0 to f_Count-2 do
for j:=i+1 to f_Count-1 do
if fru_xyz[i,1]>fru_xyz[j,1] then
begin
ExPoint(fru_xyz[i],fru_xyz[j]); //按從小到大對斷層起點排序
ExDouble(Rockl[i],Rockl[j]);
end;
f_cou:=f_count;
for i:=0 to f_count-2 do //重疊處理
begin
if abs(fru_xyz[i,0])<1e-3 then continue;
for j:=i+1 to f_count-1 do
begin
if abs(fru_xyz[j,0])<1e-3 then continue;
if (fru_xyz[i,1]+fru_xyz[i,2])>fru_xyz[j,1]
then begin
fru_xyz[i,0]:=(fru_xyz[i,0]+fru_xyz[j,0])/2;
fru_xyz[i,2]:=fru_xyz[j,1]+fru_xyz[j,2]-fru_xyz[i,1];
Rockl[i]:=(Rockl[i]+Rockl[j])/2;
fru_xyz[j,0]:=0;
f_cou:=f_cou-1;
end;
end;
end;
//當前工作面斷層數目
Task[Task_Index].TFcou:=f_cou;
setlength(Task[Task_Index].TaskFru,f_cou);
j:=0;
for i:=0 to f_count-1 do
if abs(fru_xyz[i,0])>1e-3 then
begin
Task[Task_Index].TaskFru[j].F_Pa:=fru_xyz[i,0];
Task[Task_Index].TaskFru[j].Blen:=fru_xyz[i,1];
Task[Task_Index].TaskFru[j].simlen:=fru_xyz[i,2];
Task[Task_Index].TaskFru[j].Rock:=Rockl[i];
j:=j+1;
end;}
end;
//初始化
procedure TSimulate.init;
var i,j,k:integer;
ADOQ_TaskSim,AdoQ_Show:TAdoQuery;
begin
ADOQ_TaskSim:=TADOQuery.Create(nil);
AdOQ_Show:=TADOQuery.Create(nil);
//****************** 模擬參數初始化過程*******************
with frm_data do
begin
ADOQ_TaskSim.Connection:=ADOC_Mining;
AdoQ_Show.Connection:=ADOC_Mining;
with ADOQ_TaskSim do
begin
//分別查找準備巷道和回采工作面兩邊的點
close;
sql.Clear;
sql.Add('select distinct 工序采區.Area_Id,工序采區.Task_Id,');
sql.Add('巷道回采面子表.Sp1_LType,巷道回采面子表.Sp1_LHnd,');
sql.Add('巷道回采面子表.Sp2_LType,巷道回采面子表.Sp2_LHnd ');
sql.Add('from 工序采區,巷道回采面子表 ');
sql.Add('where (巷道回采面子表.Graphic_Id=:r0)');
sql.Add('and(巷道回采面子表.Task_Id=工序采區.Task_Id)');
parameters.ParamByName('r0').Value:=Graphic_Id;
ExecSQL;Open;
for i:=0 to recordcount-1 do
begin
for j:=0 to TaskCou-1 do
if Task[j].Task_Id=fieldbyname('Task_Id').AsInteger then
begin
//第一條邊
ADOQ_Show.Close;
ADOQ_Show.SQL.Clear;
if fieldbyname('Sp1_LType').AsInteger=19 then ////如果工作面的邊為一條直線
begin
ADOQ_Show.sql.Add('select 點.X,點.Y,點.Z from 直線,點 ');
ADOQ_Show.sql.Add('where (直線.Graphic_Id=:v1)and(直線.Handle=:v2)');
ADOQ_Show.SQL.Add('and(點.Point_Id>=直線.Sp_Id)');
ADOQ_Show.SQL.Add('and(點.Point_Id<=直線.Ep_Id)');
ADOQ_Show.Parameters.ParamByName('v1').Value:=Graphic_Id;
ADOQ_Show.Parameters.ParamByName('v2').Value:=fieldbyname('Sp1_LHnd').AsString;
ADOQ_Show.ExecSQL;ADOQ_Show.Open;
end;
if (fieldbyname('Sp1_LType').AsInteger=2) //如果工作面的邊為多段線
or(fieldbyname('Sp1_LType').AsInteger=24) then
begin //查找多段線表
ADOQ_Show.sql.Add('select 點.X,點.Y,點.Z from 多義線,點 ');
ADOQ_Show.sql.Add('where (多義線.Graphic_Id=:v1)and(多義線.Handle=:v2)');
ADOQ_Show.SQL.Add('and(點.Point_Id>=多義線.Sp_Id)');
ADOQ_Show.SQL.Add('and(點.Point_Id<=多義線.Ep_Id)');
ADOQ_Show.Parameters.ParamByName('v1').Value:=Graphic_Id;
ADOQ_Show.Parameters.ParamByName('v2').Value:=fieldbyname('Sp1_LHnd').AsString;
ADOQ_Show.ExecSQL;ADOQ_Show.Open;
end;
if fieldbyname('Sp1_LType').AsInteger<>0
then begin
Task[j].OneSide.PCou:=ADOQ_Show.RecordCount;
setlength(Task[j].OneSide.Ps,Task[j].OneSide.PCou);
for k:=0 to ADOQ_Show.RecordCount-1 do
begin
Task[j].OneSide.Ps[k,0]:=ADOQ_Show.fieldbyname('X').AsFloat;
Task[j].OneSide.Ps[k,1]:=ADOQ_Show.fieldbyname('Y').AsFloat;
Task[j].OneSide.Ps[k,2]:=ADOQ_Show.fieldbyname('Z').AsFloat;
ADOQ_Show.Next;
end;
end
else Task[j].OneSide.PCou:=0;
//第二條邊
ADOQ_Show.Close;ADOQ_Show.SQL.Clear;
if fieldbyname('Sp2_LType').AsInteger=19 then ////如果工作面的邊為一條直線
begin
ADOQ_Show.sql.Add('select 點.X,點.Y,點.Z from 直線,點 ');
ADOQ_Show.sql.Add('where (直線.Graphic_Id=:v1)and(直線.Handle=:v2)');
ADOQ_Show.SQL.Add('and(點.Point_Id>=直線.Sp_Id)');
ADOQ_Show.SQL.Add('and(點.Point_Id<=直線.Ep_Id)');
ADOQ_Show.Parameters.ParamByName('v1').Value:=Graphic_Id;
ADOQ_Show.Parameters.ParamByName('v2').Value:=fieldbyname('Sp2_LHnd').AsString;
ADOQ_Show.ExecSQL;ADOQ_Show.Open;
end;
if (fieldbyname('Sp2_LType').AsInteger=2)//如果工作面的邊為多段線
or(fieldbyname('Sp2_LType').AsInteger=24) then
begin //查找多段線表
ADOQ_Show.sql.Add('select 點.X,點.Y,點.Z from 多義線,點 ');
ADOQ_Show.sql.Add('where (多義線.Graphic_Id=:v1)and(多義線.Handle=:v2)');
ADOQ_Show.SQL.Add('and(點.Point_Id>=多義線.Sp_Id)');
ADOQ_Show.SQL.Add('and(點.Point_Id<=多義線.Ep_Id)');
ADOQ_Show.Parameters.ParamByName('v1').Value:=Graphic_Id;
ADOQ_Show.Parameters.ParamByName('v2').Value:=fieldbyname('Sp2_LHnd').AsString;
ADOQ_Show.ExecSQL;ADOQ_Show.Open;
end;
if fieldbyname('Sp2_LType').AsInteger<>0
then begin
Task[j].TwoSide.PCou:=ADOQ_Show.RecordCount;
setlength(Task[j].TwoSide.Ps,Task[j].TwoSide.PCou);
for k:=0 to ADOQ_Show.RecordCount-1 do
begin
Task[j].TwoSide.Ps[k,0]:=ADOQ_Show.fieldbyname('X').AsFloat;
Task[j].TwoSide.Ps[k,1]:=ADOQ_Show.fieldbyname('Y').AsFloat;
Task[j].TwoSide.Ps[k,2]:=ADOQ_Show.fieldbyname('Z').AsFloat;
ADOQ_Show.Next;
end;
end
else Task[j].TwoSide.PCou:=0;
break;
end;
next;
//inc(frm_main.PosId);
//frm_main.SbarFull;
end; //end: for i:=0 to recordcount-1 do
end;//with ADOQ_TaskSim
end;//with frm_data
ADOQ_TaskSim.Free;
ADOQ_TaskSim:=nil;
AdoQ_Show.Free;
AdoQ_Show:=nil;
end;
procedure TSimulate.Simu;
var Id:integer;
begin
with frm_data do
begin
//模擬下標增加1
inc(Task_Index);
if Task_Index=TaskCou then
begin
//frm_main.SBar.Panels[0].Text:='模擬結果寫入數據庫';
if messagedlg('模擬結束!是否將模擬結果(成本和工期)寫入數據庫?',
mtConfirmation, [mbYes, mbNo], 0)=mrYes then
begin
for Id:=0 to TaskCou-1 do
with ADOQ_All do
begin
close;
sql.Clear;
sql.Add('Update 工序采區 ');
sql.Add('set WorkDay=:r1,Material=:r2,Equipment=:r3,Electricity=:r4,Q=:r5,IsSim=1 ');
sql.Add('where (Area_Id=:v1)and(Task_Id=:v2) ');
parameters.ParamByName('r1').Value:=Task[Id].WorkDay;
parameters.ParamByName('r2').Value:=Task[Id].Mat_cost;
parameters.ParamByName('r3').Value:=Task[Id].s_cost;
parameters.ParamByName('r4').Value:=Task[Id].E_cost;
parameters.ParamByName('r5').Value:=Task[Id].Q;
parameters.ParamByName('v1').Value:=Task[Id].Area_Id;
parameters.ParamByName('v2').Value:=Task[Id].Task_Id;
ExecSQL;
end;
end;
ADOT_TaskArea.Close;ADOT_TaskArea.Open;
Sim_MD.Free;Sim_MD:=nil;
//frm_main.SBar.Panels[0].Text:=' ';
end;
end;
if Task_index<TaskCou then
begin
case Task[Task_index].TaskT_Id of
0,1,2,3:begin
Lane_Index:=Task[Task_index].WLT_Id;
//如果是回風巷、運輸巷、開切眼
if (Task[Task_index].OneSide.PCou>0)
and(Task[Task_index].TwoSide.PCou>0) then
begin
if Task[Task_index].TaskT_Id=2 then //Task[Task_index].TaskT_Id=1
begin
Task[Task_index].P1_Id:=0;
Task[Task_index].P1_Dis:=0;
Task[Task_index].P_p1:=Task[Task_index].OneSide.Ps[0];
Task[Task_index].P_p2:=Task[Task_index].TwoSide.Ps[0];
//求出巷道方向角
Task[Task_index].OneAlfa:=Direct(Task[Task_index].OneSide.Ps[0],
Task[Task_index].OneSide.Ps[1]);
//求出開切眼方向角
Task[Task_index].TwoAlfa:=Direct(Task[Task_index].P_p2,Task[Task_index].P_p1);
Task[Task_index].OneDis:=Distance(Task[Task_index].OneSide.Ps[0],
Task[Task_index].OneSide.Ps[1])/TScale;
//修改ACT以保證處理斷層
end;
//如果是開切眼
if Task[Task_index].TaskT_Id=3 then //Task[Task_index].TaskT_Id=2
begin
//開切眼方向角
Task[Task_index].OneAlfa:=
Direct(Task[Task_index].OneSide.Ps[Task[Task_index].OneSide.PCou-1],
Task[Task_index].TwoSide.Ps[Task[Task_index].TwoSide.PCou-1]);
Task[Task_index].TwoAlfa:=
Direct(Task[Task_index].OneSide.Ps[Task[Task_index].OneSide.PCou-2],
Task[Task_index].OneSide.Ps[Task[Task_index].OneSide.PCou-1]);
end;
end;
//調用巷道模擬過程
Sim_MD.BMD_Simu;
end;
4:Sim_MD.Pre_Simu;//調用安裝準備模擬過程
5:begin
Mine_Index:=Task[Task_index].WLT_Id;
//回采面
if (Task[Task_index].OneSide.PCou>0)
and(Task[Task_index].TwoSide.PCou>0) then
begin
Task[Task_index].P1_Id:=Task[Task_index].OneSide.PCou-1;
Task[Task_index].P2_Id:=Task[Task_index].TwoSide.PCou-1;
Task[Task_index].P_p1:=Task[Task_index].OneSide.Ps[Task[Task_index].P1_Id];
Task[Task_index].P_p2:=Task[Task_index].TwoSide.Ps[Task[Task_index].P2_Id];
Task[Task_index].P1_Dis:=0;Task[Task_index].P2_Dis:=0;
//求出開切眼方向角
Task[Task_index].MinAlfa:=Direct(Task[Task_index].P_p1,Task[Task_index].P_p2);
Task[Task_index].OneAlfa:=
Direct(Task[Task_index].OneSide.Ps[Task[Task_index].P1_Id],
Task[Task_index].OneSide.Ps[Task[Task_index].P1_Id-1]);
Task[Task_index].OneDis:=
Distance(Task[Task_index].OneSide.Ps[Task[Task_index].P1_Id],
Task[Task_index].OneSide.Ps[Task[Task_index].P1_Id-1])
*abs(cos(Task[Task_index].OneAlfa-Task[Task_index].MinAlfa-pi/2))/TScale;
Task[Task_index].TwoAlfa:=
Direct(Task[Task_index].TwoSide.Ps[Task[Task_index].P2_Id],
Task[Task_index].TwoSide.Ps[Task[Task_index].P2_Id-1]);
Task[Task_index].TwoDis:=
Distance(Task[Task_index].TwoSide.Ps[Task[Task_index].P2_Id],
Task[Task_index].TwoSide.Ps[Task[Task_index].P2_Id-1])
*abs(cos(Task[Task_index].TwoAlfa-Task[Task_index].MinAlfa-pi/2))/TScale;
end;
//修改ACT以保證處理斷層
Sim_MD.Mine_Simu;//調用回采模擬過程
end;
end;// case
//inc(frm_main.PosId);
//frm_main.SbarFull;
end;// if
end;
{掘進模擬}
//每個截深
procedure TSimulate.BMD_Action;
var s:double; // s,
i:integer;
begin
Task[Task_Index].P1_Dis:=Task[Task_Index].P1_Dis+DEqu[Task[Task_index].Equ_Id].B;
Task[TasK_index].TFcou:=0;
//對于非開拓巷道進行點處理和處理斷層
if Task[Task_Index].OneSide.PCou>0 then
begin
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -