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

📄 unt_project.pas

📁 煤矿行业采掘接替计划自动生成系统
💻 PAS
📖 第 1 页 / 共 4 页
字号:
       //如果超出边的范围
       if Task[Id].P1_Id>=Task[Id].OneSide.PCou-1 then
       begin
        Is_Fin:=true;
        break;
       end;
       //找到两段线交换时的p1->p2互换角
       if Task[Id].P1_Id>0
        then Task[Id].TwoAlfa:=Task[Id].TwoAlfa-Task[Id].OneAlfa;

       Task[Id].OneAlfa:=
         Direct(Task[Id].OneSide.Ps[Task[Id].P1_Id],
                Task[Id].OneSide.Ps[Task[Id].P1_Id+1]);

       if Task[Id].P1_Id>0
        then Task[Id].TwoAlfa:=Task[Id].TwoAlfa+Task[Id].OneAlfa;
       //---
       Task[Id].OneDis:=
         Distance(Task[Id].OneSide.Ps[Task[Id].P1_Id],
                  Task[Id].OneSide.Ps[Task[Id].P1_Id+1]);
       Fin_Alfa:=Fin_Alfa-Task[Id].OneDis;
      until Fin_Alfa<-1e-3;
      Task[Id].P1_Dis:=Task[Id].OneDis+Fin_Alfa;
     end;
     //如果超出边的范围
     if Is_Fin then continue;

     if (Task[Id].P1_Dis-Task[Id].OneDis)>1e-3 then
     begin
       inc(Task[Id].P1_Id);
       //如果超出边的范围
       if Task[Id].P1_Id>=Task[Id].OneSide.PCou-1 then
       begin
        Is_Fin:=true;
        continue;
       end;

       Fin_Alfa:=Task[Id].OneAlfa;
       Task[Id].OneDis:=
        Distance(Task[Id].OneSide.Ps[Task[Id].P1_Id],
                 Task[Id].OneSide.Ps[Task[Id].P1_Id+1]);
       Task[Id].OneAlfa:=
        Direct(Task[Id].OneSide.Ps[Task[Id].P1_Id],
               Task[Id].OneSide.Ps[Task[Id].P1_Id+1]);
       Task[Id].TwoAlfa:=Task[Id].TwoAlfa+Task[Id].OneAlfa-Fin_Alfa;
       Task[Id].P1_Dis:=0;
     end;

     Fin_Alfa:=Task[Id].OneDis-Task[Id].P1_Dis;
     if (Fin_Alfa-Task[Id].Unt_Dis)>1e-3
     then Fin_Alfa:=Task[Id].Unt_Dis;

     Task[Id].P_p1:=
      DirectXY(Task[Id].OneSide.Ps[Task[Id].P1_Id],
               Task[Id].OneAlfa,Task[Id].P1_Dis);
     Task[Id].P_p2:=
      DirectXY(Task[Id].P_p1,Task[Id].OneAlfa,Fin_Alfa);

     ACAD.RS_line(Task[Id].P_p1,Task[Id].P_p2,MCol,MLayer,MLineT,MHindle);
     ACAD.AcadObj.Update;

     Task[Id].P_p1:=
      DirectXY(Task[Id].P_p1,Task[Id].TwoAlfa,3.5*TScale);
     Task[Id].P_p2:=
      DirectXY(Task[Id].P_p2,Task[Id].TwoAlfa,3.5*TScale);

     //画短直线,以达到动态显示的效果
     ACAD.RS_line(Task[Id].P_p1,Task[Id].P_p2,MCol,MLayer,MLineT,MHindle);
     ACAD.AcadObj.Update;
     //对已经前进的距离进行累加
     Task[Id].P1_Dis:=Task[Id].P1_Dis+Task[Id].Unt_Dis;

    end;

    //如果是开切眼
    if Task[Id].TaskT_Id=3 then
    begin

     MCol:=1;
     //如果刚开始处理开切眼,进行准备工作:找到当前的方向角和当前点
     if Task[Id].P1_Id=-1 then
     begin
       //已经完成距离
       Task[Id].P1_Dis:=(NS_Date-Task[Id].BTime)*Task[Id].Unt_Dis;
       inc(Task[Id].P1_Id);
       Task[Id].OneAlfa:=
        Direct(Task[Id].OneSide.Ps[Task[Id].OneSide.PCou-1],
            Task[Id].TwoSide.Ps[Task[Id].TwoSide.PCou-1]);
       Task[Id].TwoAlfa:=
        Direct(Task[Id].OneSide.Ps[Task[Id].OneSide.PCou-2],
            Task[Id].OneSide.Ps[Task[Id].OneSide.PCou-1]);
     end;

     Task[Id].P_p1:=
      DirectXY(Task[Id].OneSide.Ps[Task[Id].OneSide.PCou-1],
               Task[Id].OneAlfa,Task[Id].P1_Dis);
     Task[Id].P_p2:=
      DirectXY(Task[Id].P_p1,Task[Id].OneAlfa,Task[Id].Unt_Dis);
     //画短直线,以达到动态显示的效果
     ACAD.RS_line(Task[Id].P_p1,Task[Id].P_p2,MCol,MLayer,MLineT,MHindle);
     ACAD.AcadObj.Update;

     //----------------------------????---------------------------
     Task[Id].P_p1:=
      DirectXY(Task[Id].P_p1,Task[Id].TwoAlfa,4*TScale);
     Task[Id].P_p2:=
      DirectXY(Task[Id].P_p2,Task[Id].TwoAlfa,4*TScale);
     ACAD.RS_line(Task[Id].P_p1,Task[Id].P_p2,MCol,MLayer,MLineT,MHindle);
     ACAD.AcadObj.Update;
     //----------------------------???---------------------------------------

     Task[Id].P1_Dis:=Task[Id].P1_Dis+Task[Id].Unt_Dis;
    end;
    //如果是工作面
    if Task[Id].TaskT_Id=5 then
    begin

     //-------------test-----------
     //showmessage(Task[id].Task_N);

     //---------------test-----------

     MCol:=4;//颜色,代表蓝色

     if Task[Id].P1_Id=-1 then
     begin
       //开切眼方向角
       Task[Id].MinAlfa:=
        Direct(Task[Id].OneSide.Ps[Task[Id].OneSide.PCou-1],
               Task[Id].TwoSide.Ps[Task[Id].TwoSide.PCou-1]);
       Task[Id].P1_Id:=Task[Id].OneSide.PCou; //注意:定位点编号初值设置为比定位点个数大1
       Task[Id].P2_Id:=Task[Id].TwoSide.PCou;
       //计算已经完成距离 找到当前点
       //找到一条边点
       Fin_Alfa:=(NS_Date-Task[Id].BTime)*Task[Id].Unt_Dis;
       repeat
        Dec(Task[Id].P1_Id);
        //如果超出边的范围
        if Task[Id].P1_Id<=0 then
        begin
         Is_Fin:=true;
         break;
        end;
        Task[Id].OneAlfa:=
          Direct(Task[Id].OneSide.Ps[Task[Id].P1_Id],
                 Task[Id].OneSide.Ps[Task[Id].P1_Id-1]);
        Task[Id].OneDis:=
          Distance(Task[Id].OneSide.Ps[Task[Id].P1_Id],
                   Task[Id].OneSide.Ps[Task[Id].P1_Id-1])
          *abs(cos(Task[Id].OneAlfa-Task[Id].MinAlfa-pi/2));
        Fin_Alfa:=Fin_Alfa-Task[Id].OneDis;
       until Fin_Alfa<-1e-3;
       //如果超出边的范围
       if Is_Fin then continue;
       Task[Id].P1_Dis:=Fin_Alfa+Task[Id].OneDis;

       //找到另一条边点
       Fin_Alfa:=(NS_Date-Task[Id].BTime)*Task[Id].Unt_Dis;
       repeat
        Dec(Task[Id].P2_Id);
        //如果超出边的范围
        if Task[Id].P2_Id<=0 then
        begin
         Is_Fin:=true;
         break;
        end;

        Task[Id].TwoAlfa:=
          Direct(Task[Id].TwoSide.Ps[Task[Id].P2_Id],
                 Task[Id].TwoSide.Ps[Task[Id].P2_Id-1]);
        Task[Id].TwoDis:=
          Distance(Task[Id].TwoSide.Ps[Task[Id].P2_Id],
                   Task[Id].TwoSide.Ps[Task[Id].P2_Id-1])
          *abs(cos(Task[Id].TwoAlfa-Task[Id].MinAlfa-pi/2));
        Fin_Alfa:=Fin_Alfa-Task[Id].TwoDis;
       until Fin_Alfa<-1e-3;
       //如果超出边的范围
       if Is_Fin then continue;
       Task[Id].P2_Dis:=Fin_Alfa+Task[Id].TwoDis;
     end;   //end:  if Task[Id].P1_Id=-1 then

     if (Task[Id].P1_Dis-Task[Id].OneDis)>1e-3 then
     begin
       Dec(Task[Id].P1_Id);
       //如果超出边的范围
       if Task[Id].P1_Id<=0 then
       begin
        Is_Fin:=true;
        continue;
       end;
       //求出矢量角
       Task[Id].OneAlfa:=
        Direct(Task[Id].OneSide.Ps[Task[Id].P1_Id],
               Task[Id].OneSide.Ps[Task[Id].P1_Id-1]);
       Task[Id].OneDis:=
        Distance(Task[Id].OneSide.Ps[Task[Id].P1_Id],
                 Task[Id].OneSide.Ps[Task[Id].P1_Id-1])
        *abs(cos(Task[Id].OneAlfa-Task[Id].MinAlfa-pi/2));
       Task[Id].P1_Dis:=0;
     end;

     if (Task[Id].P2_Dis-Task[Id].TwoDis)>1e-3 then
     begin
       Dec(Task[Id].P2_Id);
       //如果超出边的范围
       if Task[Id].P2_Id<=0 then
       begin
        Is_Fin:=true;
        continue;
       end;
       //求出矢量角
       Task[Id].TwoAlfa:=
        Direct(Task[Id].TwoSide.Ps[Task[Id].P2_Id],
               Task[Id].TwoSide.Ps[Task[Id].P2_Id-1]);
       Task[Id].TwoDis:=
        Distance(Task[Id].TwoSide.Ps[Task[Id].P2_Id],
                 Task[Id].TwoSide.Ps[Task[Id].P2_Id-1])
        *abs(cos(Task[Id].TwoAlfa-Task[Id].MinAlfa-pi/2));
       Task[Id].P2_Dis:=0;
     end;
     //求出P_p1,P_p2
     Task[Id].P_p1:=
       DirectXY(Task[Id].OneSide.Ps[Task[Id].P1_Id],Task[Id].OneAlfa,
                Task[Id].P1_Dis/abs(cos(Task[Id].OneAlfa-Task[Id].MinAlfa-pi/2)));
     Task[Id].P_p2:=
       DirectXY(Task[Id].TwoSide.Ps[Task[Id].P2_Id],Task[Id].TwoAlfa,
                Task[Id].P2_Dis/abs(cos(Task[Id].TwoAlfa-Task[Id].MinAlfa-pi/2)));

     //---------------------------------test------------------------
     //Tim_DyShow.Enabled:=false;
     //-----------------------------------test-----------------------

     ACAD.RS_line(Task[Id].P_p1,Task[Id].P_p2,MCol,MLayer,MLineT,MHindle);
     ACAD.AcadObj.Update;

     //---------------------------------------------test----------------------
     //if messagedlg('需要激活Timer控件吗?',mtconfirmation,[mbyes,mbno],0)=mryes then
       //begin
         //Tim_DyShow.Enabled:=true;
       //end;
      //------------------------------------------------test----------------------


     Task[Id].P1_Dis:=Task[Id].P1_Dis+Task[Id].Unt_Dis;
     Task[Id].P2_Dis:=Task[Id].P2_Dis+Task[Id].Unt_Dis;
    end;    //end: if Task[Id].TaskT_Id=5 then
   end;    //end:   with Sim_MD do
  NS_Date:=NS_Date+1;

  //---------------------------------test------------------------
     //Tim_DyShow.Enabled:=false;
     //if messagedlg('需要激活Timer控件吗?',mtconfirmation,[mbyes,mbno],0)=mryes then
       //begin
         //Tim_DyShow.Enabled:=true;
       //end;
  //------------------------------------------------test----------------------


  if NS_Date>ES_Date then //ES_Date:动态演示的结束时间
  begin
   NS_Date:=SS_Date;
   Tim_DyShow.Enabled:=false; //动态演示完毕,使得时间控制控件处于失效状态
   Btn_Add.Caption:='进行仿真';
   showmessage('动态演示完毕!');
  end;
end;

procedure TFrm_Project.Btn_ExitClick(Sender: TObject);
begin
  inherited;
  //Dec(TFrmCou);
end;

procedure TFrm_Project.DynamicShowInit;
var
i,j,k,m,n,s,t,AheadDays,LaneId:integer;
str,str1,str_property:string;
Find:boolean;
str11,str22,str33,str44:string;
begin

  //读取原数据库系统的相关数据
  With Frm_Data.ADOT_Area do //采区,原数据库中,由于CAD图纸只是画出一部分,所以这里获取的采区可能只是部分采区
    begin
      if not active then open;
      setlength(Area,recordcount+1);
      i:=1;
      first;
      while not eof do
        begin
          Area[i].Area_Id:=FieldByName('Area_Id').AsInteger;
          Area[i].Area_Name:=FieldByName('Area_Name').AsString;
          next;
          i:=i+1;
        end;
    end;
  with Frm_Data.ADOT_Task do //工序,原数据库中
    begin
      if not active then open;
      setlength(DynTask,recordcount+1);
      i:=1;
      first;
      while not eof do
        begin
          DynTask[i].Task_Id:=FieldByName('Task_Id').AsInteger;
          DynTask[i].TaskT_Id:=FieldByName('TaskT_Id').AsInteger;
          DynTask[i].Task_Name:=FieldByName('Task_Name').AsString;
          next;
          i:=i+1;
        end;
    end;
  with Frm_Data.ADOT_ATaskN do //采区工序名称,原数据库中
    begin
      if not active then open;
      setlength(DrillT,recordcount+1);
      i:=1;
      first;
      while not eof do
        begin
          DrillT[i].Id:=FieldByName('TaskN_Id').AsInteger;
          DrillT[i].Name:=FieldByName('TaskN').AsString;
          DrillT[i].DrillT:=FieldByName('TaskT').AsString;
          next;
          i:=i+1;
        end;
    end;
  with Data_Frm.MineInterval_AdoTab do  //获取掘进提前天数,从现有数据库中的“接替间隔f”表中
    begin
      if not active then open;
      setlength(DrillAhead,RecordCount+1);
      first;
      i:=1;
      while not eof do
        begin
          DrillAhead[i].MineT_Id:=FieldByName('Technic_Type').AsInteger;
          DrillAhead[i].AheadDay:=FieldByName('DrillFinish_Ahead').AsInteger;
          DrillAhead[i].FixPrepareDay:=FieldByName('FixPrepare_Time').AsInteger;
          next;
          i:=i+1;
        end;
    end;
  with Data_frm.MineTech_AdoTab do //确定回采工艺名称:1:炮采;2:普采;3:综采;4:综放,从现在数据库中的“回采工艺f”表
    begin
      if not active then open;
      first;
      while not eof do
        begin
          for i:=1 to High(DrillAhead) do
            begin
              if DrillAhead[i].MineT_Id=FieldByName('MineType_Id').AsInteger then
                begin
                  DrillAhead[i].MineT_Name:=FieldByName('Mine_TypeName').AsString;
                  break;
                end;
            end;
          next;
        end;
    end;
  with Data_Frm.Worker_AdoTab do  //施工队,现在数据库中的“施工队f”表,与原数据库的“施工队”表相同
    begin
      if not active then open;
      setlength(Worker,recordcount+1);
      i:=1;
      first;
      while not eof do
        begin
          Worker[i].SGD_Id:=FieldByName('WorkGroup_Id').AsInteger;
          Worker[i].SGD_Name:=FieldByName('WorkGroup_Name').AsString;
          Worker[i].SGDT_Name:=FieldByName('WorkGroup_Type').AsString;
          next;
          i:=i+1;
        end;
    end;
  //把现在数据库中的“施工队f”表导入到原数据库的“施工队”表中
  with Frm_Data.ADOT_SGD do
    begin
      if not active then open;
      if recordcount>0 then
        begin
          first;
          while not eof do
            begin
              delete;
            end;
        end;
      for i:=1 to High(Worker) do
        begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -