⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unt_simulate.pas

📁 煤矿行业采掘接替计划自动生成系统
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    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 + -