📄 unt_project.pas
字号:
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 + -