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

📄 unt_project.pas

📁 煤矿行业采掘接替计划自动生成系统
💻 PAS
📖 第 1 页 / 共 4 页
字号:
    sql.Clear;
    sql.Add('select min(B_date) as MD from 采掘计划 ');
    ExecSQL;open;
    decodedate(fieldbyname('MD').AsDateTime,yy,mm,dd);
    StrDate:=inttostr(yy)+'年'+inttostr(mm)+'月'+inttostr(dd)+'日';
    Add_Pro(StrDate);
    ChangeSys;
    Add_Field(1,'文本1','采区');
    Add_Field(-1,'文本2','本期工资');
    Add_Field(-1,'文本3','本期材料消耗');
    Add_Field(-1,'文本4','本期电费');
    Add_Field(-1,'文本5','本期设备费用');
    Add_Field(-1,'文本6','本期产煤量');
    Add_Field(-1,'文本7','本期推进距离');
    projectapp.TableApply('项(&E)');

    projectApp.ViewApply('资源工作表');
    close;
    sql.Clear;
    sql.Add('select SGD_Name from 施工队 ');
    ExecSQL;open;

    //frm_main.sbar.Panels[0].Text:='正在导出采掘计划...';
    //frm_main.Step:=frm_main.Sbarlen/(RecordCount+SGrid_MD.RowCount-1);
    //frm_main.PosId:=0;
    //frm_main.col:=clMedGray;

    for Id:=0 to recordcount-1 do
    begin

     //inc(frm_main.PosId);
     //frm_main.SbarFull;

     project.InputResource(fieldbyname('SGD_Name').AsString);
     next;
    end;
  end;
  Project.projectApp.ViewApply('甘特图');
  try
    with SGrid_MD do
    for Id:=0 to RowCount-2 do
    begin

      //inc(frm_main.PosId);
      //frm_main.SbarFull;

      PreTask:=' ';
      if (RBtnA.Checked)and(RGP_ProMod.ItemIndex=0)and(Cbx_SimSel.ItemIndex=-1)
      then PreTask:=cells[13,Id+1];
      Project.InputTask(Id+1,cells[1,Id+1],cells[2,Id+1],cells[3,Id+1],cells[4,Id+1],
        PreTask,cells[6,Id+1],cells[7,Id+1],cells[8,Id+1],cells[9,Id+1],
        cells[10,Id+1],cells[11,Id+1],cells[12,Id+1],false,false);
    end;
  except
    showmessage('请执行计划输出工作!');
  end;
  Project.ProjectApp.visible:=true;
  Project.Free;
end;}

procedure TFrm_Project.DBLookupComboBox1Click(Sender: TObject);
begin
  inherited;
  Is_DynS_Init:=false;  //设置动态演示前的准备工作还没有做
end;

procedure TFrm_Project.Btn_AddClick(Sender: TObject);
var m,i,j,k,pos1,pos2:integer;
    CADFilename:String;
    str:string;
    str1,str2:string;
begin
  try
    Sim_MD:=TSimulate.Create;
    with frm_data,ADOQ_MDPlan do
     if Is_DynS_Init=false then//如果还没有为动态演示做好准备工作,则要做演示前的准备工作
     begin
      if MessageDlg('确认是这张图纸吗?',
        mtConfirmation,[mbYes, mbNo],0)=mrNo then exit;
      Sim_MD.Graphic_Id:=ADOT_Graph.fieldbyname('Graphic_Id').AsInteger;
      Sim_MD.TScale:=Sim_MD.GetScale;
      Sim_MD.TaskCou:=recordcount; //ADOQ_MDPlan中记录的个数,即动态演示所涉及的工序个数
      setlength(Sim_MD.Task,Sim_MD.TaskCou);
      //初始化各个待演示的采掘工序
      first;  //ADOQ_MDPlan
      for m:=0 to recordcount-1 do
      begin
       Sim_MD.Task[m].Area_Id:=fieldbyname('Area_Id').AsInteger;
       Sim_MD.Task[m].Task_Id:=fieldbyname('Task_Id').AsInteger;
       Sim_MD.Task[m].Task_N:=FieldByName('Task_Name').AsString;
       Sim_MD.Task[m].TaskT_Id:=fieldbyname('TaskT_Id').AsInteger;
       Sim_MD.Task[m].BTime:=fieldbyname('B_Date').AsDateTime;
       Sim_MD.Task[m].ETime:=fieldbyname('E_Date').AsDateTime;
       //数据表中存放的距离(Dis)是实际距离,
       //而动态演示的距离Sim_MD.Task[Id].Dis是CAD图中的距离
       //所以要把实际距离考虑比例尺后进行转换,因此,一般比例尺选为1:1
       //如实际100米,在CAD图中就是100,此时可以把CAD图中的单位认为是米

       //把CAD图中的距离和图中的演示步距与实际距离和实际的日进度按比例协调起来,
       //以使得实际进尺速度与演示速度相协调。具体办法是,CAD图中的距离:演示步距=实际距离:实际日进度

       Sim_MD.Task[m].Dis:=fieldbyname('Dis').AsFloat;//实际距离
       //原来:Sim_MD.Task[m].Dis:=fieldbyname('Dis').AsFloat*Sim_MD.TScale;

       Sim_MD.Task[m].WorkDay:=fieldbyname('WorkDay').AsInteger;
       Sim_MD.Task[m].OneSide.PCou:=0;
       Sim_MD.Task[m].TwoSide.PCou:=0;
       Sim_MD.Task[m].P1_Id:=-1; //组成各工序的两条边上的起点变量初始值为-1
       Sim_MD.Task[m].P2_Id:=-1;

       Sim_MD.Task[m].P1_Dis:=0;
       Sim_MD.Task[m].P2_Dis:=0;
       next;
      end;
      //确定Sim_MD.Task[]中的一些参数
      With Frm_Data.ADOT_CWork do
        begin
          if not active then open;
          first;
          while not eof do
            begin
              Task_Id1:=FieldByName('Task_Id').AsInteger;
              for i:=0 to High(Sim_MD.Task) do
                begin
                  if Sim_MD.Task[i].Task_Id=Task_Id1 then
                    begin
                      Sim_MD.Task[i].HandleStr1:=FieldByName('Sp1_LHnd').AsString;
                      Sim_MD.Task[i].HandleStr2:=FieldByName('Sp2_LHnd').AsString;
                      break;
                    end;
                end;
              next;
            end;
        end;
      with Frm_Data.ADOT_Pline do
        begin
          if not active then open;
          first;
          while not eof do
            begin
              str:=FieldByName('Handle').AsString;
              for i:=0 to High(Sim_MD.Task) do
                begin
                  if Sim_MD.Task[i].HandleStr1=str then
                    begin
                      Sim_MD.Task[i].StartP1_Id:=FieldByName('Sp_Id').AsInteger;
                      Sim_MD.Task[i].EndP1_Id:=FieldByName('Ep_Id').AsInteger;
                      break;
                    end;
                  if Sim_MD.Task[i].HandleStr2=str then
                    begin
                      Sim_MD.Task[i].StartP2_Id:=FieldByName('Sp_Id').AsInteger;
                      Sim_MD.Task[i].EndP2_Id:=FieldByName('Ep_Id').AsInteger;
                      break;
                    end;
                end;
              next;
            end;
        end;
      with Frm_Data.ADOT_Points do
        begin
          if not active then open;
          first;
          while not eof do
            begin
              k:=FieldByName('Point_Id').AsInteger;
              for i:=0 to High(Sim_MD.Task) do
                begin
                  if Sim_MD.Task[i].StartP1_Id=k then
                    begin
                      Sim_MD.Task[i].StartP1.x:=FieldByName('X').AsFloat;
                      Sim_MD.Task[i].StartP1.y:=FieldByName('Y').AsFloat;
                      Sim_MD.Task[i].StartP1.z:=FieldByName('Z').AsFloat;
                      //break;
                    end;
                  if Sim_MD.Task[i].StartP2_Id=k then
                    begin
                      Sim_MD.Task[i].StartP2.x:=FieldByName('X').AsFloat;
                      Sim_MD.Task[i].StartP2.y:=FieldByName('Y').AsFloat;
                      Sim_MD.Task[i].StartP2.z:=FieldByName('Z').AsFloat;
                      //break;
                    end;
                  if Sim_MD.Task[i].EndP1_Id=k then
                    begin
                      Sim_MD.Task[i].EndP1.x:=FieldByName('X').AsFloat;
                      Sim_MD.Task[i].EndP1.y:=FieldByName('Y').AsFloat;
                      Sim_MD.Task[i].EndP1.z:=FieldByName('Z').AsFloat;
                      //break;
                    end;
                  if Sim_MD.Task[i].EndP2_Id=k then
                    begin
                      Sim_MD.Task[i].EndP2.x:=FieldByName('X').AsFloat;
                      Sim_MD.Task[i].EndP2.y:=FieldByName('Y').AsFloat;
                      Sim_MD.Task[i].EndP2.z:=FieldByName('Z').AsFloat;
                      //break;
                    end;
                end;
              next;
            end;
        end;
      //计算巷道、开切眼在CAD图中的长度
      for i:=0 to High(Sim_MD.Task) do
        begin
          //风巷或者机巷
          if (Sim_MD.Task[i].TaskT_Id=1)or(Sim_MD.Task[i].TaskT_Id=2)then
            begin
              Point1.x:=Sim_MD.Task[i].StartP1.x;
              Point1.y:=Sim_MD.Task[i].StartP1.y;
              Point1.z:=Sim_MD.Task[i].StartP1.z;

              Point2.x:=Sim_MD.Task[i].EndP1.x;
              Point2.y:=Sim_MD.Task[i].EndP1.y;
              Point2.z:=Sim_MD.Task[i].EndP1.z;

              GraphDis1:=CalDis(Point1,Point2);
              Sim_MD.Task[i].GraphDis1:=GraphDis1;

              Point1.x:=Sim_MD.Task[i].StartP2.x;
              Point1.y:=Sim_MD.Task[i].StartP2.y;
              Point1.z:=Sim_MD.Task[i].StartP2.z;

              Point2.x:=Sim_MD.Task[i].EndP2.x;
              Point2.y:=Sim_MD.Task[i].EndP2.y;
              Point2.z:=Sim_MD.Task[i].EndP2.z;

              GraphDis2:=CalDis(Point1,Point2);
              Sim_MD.Task[i].GraphDis2:=GraphDis2;
              if Sim_MD.Task[i].WorkDay>0
                then
                  begin
                    Sim_MD.Task[i].Unt_Dis:=(GraphDis1+abs(GraphDis1-GraphDis2)/2)/Sim_MD.Task[i].WorkDay;
                    if abs(Sim_MD.Task[i].Unt_Dis-15)>1E-4 then Sim_MD.Task[i].Unt_Dis:=10;
                    if (Sim_MD.Task[i].Task_N='S5218风巷')or(Sim_MD.Task[i].Task_N='S5218机巷') then
                      begin
                        Sim_MD.Task[i].Unt_Dis:=15;
                      end;
                    //showmessage('采掘工序”'+Sim_MD.Task[i].Task_N+'“'+'的工期是:'+floattostr(Sim_MD.Task[i].Unt_Dis));
                  end;
                //else  showmessage('采掘工序”'+Sim_MD.Task[i].Task_N+'“'+'的工期未指定(<=0)' );

            end;
          //开切眼
          if Sim_MD.Task[i].TaskT_Id=3 then
            begin
              Point1.x:=Sim_MD.Task[i].StartP1.x;
              Point1.y:=Sim_MD.Task[i].StartP1.y;
              Point1.z:=Sim_MD.Task[i].StartP1.z;

              Point2.x:=Sim_MD.Task[i].StartP2.x;
              Point2.y:=Sim_MD.Task[i].StartP2.y;
              Point2.z:=Sim_MD.Task[i].StartP2.z;

              GraphDis1:=CalDis(Point1,Point2);
              if Sim_MD.Task[i].WorkDay>0
                then
                  begin
                    Sim_MD.Task[i].Unt_Dis:=GraphDis1/Sim_MD.Task[i].WorkDay;
                    if abs(Sim_MD.Task[i].Unt_Dis-3)>1E-4 then Sim_MD.Task[i].Unt_Dis:=3;
                    if (Sim_MD.Task[i].Task_N='N326开切眼')or(Sim_MD.Task[i].Task_N='S526下开切眼')
                      or(Sim_MD.Task[i].Task_N='S526开切眼')then
                      begin
                        Sim_MD.Task[i].Unt_Dis:=1;
                      end;
                    //showmessage('采掘工序”'+Sim_MD.Task[i].Task_N+'“'+'的工期是:'+floattostr(Sim_MD.Task[i].Unt_Dis));
                  end;
                //else  showmessage('采掘工序”'+Sim_MD.Task[i].Task_N+'“'+'的工期未指定(<=0)' );
            end;
        end;
      //回采面
      for i:=0 to High(Sim_MD.Task) do
        begin
          if Sim_MD.Task[i].TaskT_Id=5 then  //回采
            begin
              str1:=Sim_MD.Task[i].Task_N;
              pos1:=-1;
              pos1:=Pos('回采',str1);
              if pos1<=0 then continue;
              str1:=copy(str1,1,pos1-1);
              for j:=0 to High(Sim_MD.Task) do
                begin
                  str2:=Sim_MD.Task[j].Task_N;
                  if (Sim_MD.Task[j].TaskT_Id=1)or(Sim_MD.Task[j].TaskT_Id=2)then
                    begin
                      if Pos(str1,str2)>0 then
                        begin
                          Sim_MD.Task[i].Unt_Dis:=Sim_MD.Task[j].Unt_Dis;
                          if abs(Sim_MD.Task[i].Unt_Dis-15)>1E-4 then Sim_MD.Task[i].Unt_Dis:=10;
                          break;
                        end;
                    end;
                end;
            end;
        end;
      //如果有些回采工序的Unit_Dis为0时,设置初值为5;
      for i:=0 to High(Sim_MD.Task) do
        begin
          if Sim_MD.Task[i].TaskT_Id=5 then
            begin
              if abs(Sim_MD.Task[i].Unt_Dis)<1E-1 then
                begin
                  Sim_MD.Task[i].Unt_Dis:=5;
                end;
              if abs(Sim_MD.Task[i].Unt_Dis-5)>1E-3 then
                begin
                  Sim_MD.Task[i].Unt_Dis:=5;
                end;
            end;
        end;
      Sim_MD.IsSimu:=false;//设置Sim_MD对象状态为动态演示,而不是模拟。
      Sim_MD.init;  //

      NS_Date:=SS_Date;//取得开始动态演示的时间
      Is_DynS_Init:=true; //动态演示前的准备工作完成,进行标记,以避免循环重复做准备工作
      //把原来读取的图形进行重新绘制,在重新绘制的图形上进行动态演示
      Read_Graph:=TRead_Graph.Create;
      Read_Graph.DrawGraphic(CADFilename);
      Read_Graph.Free;
     end; //if Is_DynS_Init=false
    //以上是在做动态演示前的准备工作

    if trim(Btn_Add.Caption)='进行仿真' then
    begin
      MLayer:='0';
      MLineT:='BYLAYER';
      MHindle:='';
      CADFilename:=frm_data.ADOT_Graph.fieldbyname('Graphic_Name').AsString;
      ACAD:=TSetCADData.Create;
      if ACAD.Link_CAD then exit;

      Tim_DyShow.Enabled:=true; //激活动态演示时间控制控件,开始演示

      Btn_Add.Caption:='停止仿真';
    end else
    begin
      Tim_DyShow.Enabled:=false;
      Btn_Add.Caption:='进行仿真';
    end;
  except
   Is_DynS_Init:=false;
   Sim_MD.Free;
   ACAD.Free;
  end;
end;

procedure TFrm_Project.Btn_DelClick(Sender: TObject);
begin
  inherited;
 Tim_DyShow.Interval:=trunc(strtofloat(Edt_Int.Text));
end;

procedure TFrm_Project.FormCreate(Sender: TObject);
begin
  inherited;
  ADOQ_Other.Connection:=frm_data.ADOC_Mining;
  ADOQ_MDPlan.Connection:=frm_data.ADOC_Mining;
  Is_DynS_Init:=false;
end;

procedure TFrm_Project.Tim_DyShowTimer(Sender: TObject);
var Id,IId,MCol:integer;
    Fin_Alfa:double;
    Is_Fin:Boolean;
begin
  inherited;
  //调用动态演示过程
  for Id:=0 to Sim_MD.TaskCou-1 do
   if (Sim_MD.Task[Id].BTime<=NS_Date) //NS_Date:控制动态演示时间的变量,每个循环时间变量要增加1
      and(Sim_MD.Task[Id].ETime>=NS_Date)
      and(Sim_MD.Task[Id].OneSide.PCou>0) then
   with Sim_MD do
   begin
    //如果是风巷或机巷
    Is_Fin:=false; //Is_Fin:控制变量,判断是否超出边的范围
    if (Task[Id].TaskT_Id=1)or(Task[Id].TaskT_Id=2) then
    begin

     MCol:=1; //颜色值,代表红色
     //如果这个工作面刚开始处理,进行准备工作:找到当前的方向角和当前点
     if Task[Id].P1_Id=-1 then
     begin
      Task[Id].TwoAlfa:=  //相当于开切眼方向角
         Direct(Task[Id].TwoSide.Ps[0],Task[Id].OneSide.Ps[0]);
      //计算已经完成距离 找到当前点
      Fin_Alfa:=(NS_Date-Task[Id].BTime)*Task[Id].Unt_Dis;
      //是否根据比例尺调整单位运行距离
      repeat
       inc(Task[Id].P1_Id);

⌨️ 快捷键说明

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