📄 unt_project.pas
字号:
//如果超出边的范围
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 + -