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

📄 unt_readgra.pas

📁 煤矿行业采掘接替计划自动生成系统
💻 PAS
📖 第 1 页 / 共 5 页
字号:

procedure TRead_Graph.Add_Text; //
var PId:integer;
begin
 with frm_data.ADOT_Text do
 begin
  if not active then open;
  PId:=GetId(frm_data.ADOT_Text,'Text_Id');
  append;
  fieldbyname('Text_Id').AsInteger:=PId+1;
  fieldbyname('Graphic_Id').AsInteger:=Graphic_Id;
  fieldbyname('InsP_Id').Asinteger:=CenP_Id;
  fieldbyname('Text').AsString:=TTextStr;
  fieldbyname('Height').AsFloat:=Height;
  fieldbyname('Text_Ang').AsFloat:=Rotation;
  frm_data.ADOT_TextT.Locate('Graphic_Id;TextStyle',vararrayof([Graphic_Id,TTextSty]),[loCaseInsensitive]);
  fieldbyname('TextS_Id').AsInteger:=frm_data.ADOT_TextT.fieldbyname('TextS_Id').AsInteger;
  fieldbyname('Color').AsInteger:=TCol;
  frm_data.ADOT_LineT.Locate('Graphic_Id;LineType',vararrayof([Graphic_Id,TLineType]),[loCaseInsensitive]);
  fieldbyname('LineT_Id').AsInteger:=frm_data.ADOT_LineT.fieldbyname('LineT_Id').AsInteger;
  frm_data.ADOT_Layer.Locate('Graphic_Id;Layer',vararrayof([Graphic_Id,TLayer]),[loCaseInsensitive]);
  fieldbyname('layer_Id').AsInteger:=frm_data.ADOT_Layer.fieldbyname('Layer_Id').AsInteger;
  fieldbyname('Handle').AsString:=THandle;
  fieldbyname('LW').AsFloat:=0;
  post;
 end;
end;

procedure TRead_Graph.EncodeStr(MStr:string;var MName,Mh,MAng:string);
var len,n:integer;
begin
 len:=Pos('h=',MStr);
 if len=0 then len:=pos('H=',MStr);
 Mh:='';MAng:='';
 if len=0
 then MName:=MStr //工作面文本中如果没有关于煤层厚度的信息,则直接把MStr(工作面文本)作为工作面的名称
 else begin
        MName:=copy(MStr,1,len-2);
        len:=len+2;
        while (MStr[len]<>',')and(MStr[len]<>',')and(Len<length(MStr)) do
        begin
         Mh:=Mh+MStr[len];
         inc(len);
        end;
        len:=pos('\U+2220',MStr);
        if len=0
        then begin
              n:=pos('°',MStr);
              if n=0 then n:=pos('%%d',MStr);
              len:=pos('∠',MStr);
              MAng:=copy(MStr,len+2,n-len-2);
             end
        else begin
              n:=pos('%%d',MStr);
              if n=0 then n:=pos('°',MStr);
              MAng:=copy(MStr,len+7,n-len-7);
             end;
      end;
 if Mh='' then Mh:='0';
 if MAng='' then MAng:='0';
 with frm_data.ADOT_Text do
  begin
   Locate('Graphic_Id;Text',vararrayof([Graphic_id,MStr]),[loCaseInsensitive]);
   Edit;
   FieldByName('Text').AsString:=MName+','+'H='+Mh+','+'∠'+MAng+'°';
   post;
  end;
end;

procedure TRead_Graph.Deal_Area_lane;//处理采区、开拓巷道、断层
var Isd:boolean;
    Str,StrWork,fz,fm,AreaName:string;
    i,j,k,k1,m,n,Id,IId,AreaTxtNum,WorkTxtNum,FruTxtNum,len:integer;
    AreaTxt,WorkTxt,FruTxt,StopHnd:TStrs;//采区和工作面文本,和停采线相交的其他线的句柄
    AreaTxtPs,WorkTxtPs,FruTxtPs,StopLinePs,StopInW,RecPoints:TPoints;//采区和工作面文本插入点、停采线上的点和停采线与其他线的交点
    W_L_F_Points:TListPoints;//工作面两边线上的点
    Dis1,Dis2:double;
    Distans,wlist,blist:Tlistvalue;
    StopInwTId,Sp_List,Ep_List,StopInwPId:Tintegers;
    r,s,t:integer;
begin

 Hint_Frm.Caption:='处理过程提示';
 Hint_Frm.DockSite:=false;
 Hint_Frm.Button1.Enabled:=false;
 Hint_Frm.Label1.Caption:='获取图纸比例.....';
 Hint_Frm.Show;
 Frm_Gra.Refresh;
 //获取图纸比例
 with frm_data.ADOT_Graph do
  begin
   Graphic_Id:=frm_data.ADOT_Graph.fieldbyname('Graphic_Id').AsInteger;
   str:=frm_data.ADOT_Graph.fieldbyname('Scale').AsString;
  end;
 i:=pos(':',str);
 if i=0 then i:=pos(':',str);
 fz:=copy(str,1,i-1);
 fm:=copy(str,i+1,length(str)-i);
 Gra_Scale:=strtoint(fz)/strtoint(fm);

 //处理采区
 Hint_Frm.Label1.Caption:='处理采区.....';
 Hint_Frm.Refresh;
 Frm_Gra.Refresh;

 with frm_data.ADOQ_All do //读取“采区工序名称”表中的数据
  begin

    //CommonTask:存放通用工序名称和工序类型,如风巷、机巷、开切眼、安装调试和回采
   setlength(CommonTask,frm_data.ADOT_ATaskN.recordcount+1);
   frm_data.ADOT_ATaskN.First;  //ADOT_ATaskN:采区工序名称,有回风巷、运输巷、开切眼、安装调试和回采
   for i:=1 to frm_data.ADOT_ATaskN.recordcount do
    begin
     CommonTask[i].Type_Id:=frm_data.ADOT_ATaskN.fieldbyname('TaskN_Id').AsInteger;
     CommonTask[i].CommonTaskName:=frm_data.ADOT_ATaskN.fieldbyname('TaskN').AsString;
     CommonTask[i].CommonTaskTypeName:=frm_data.ADOT_ATaskN.fieldbyname('TaskT').AsString;
     frm_data.ADOT_ATaskN.Next;
    end;

   //查找采区文本和其插入点
   close;
   SQL.Clear;
   SQL.Add('select 文本.Text,点.X,点.Y,点.Z from 点,文本,图层 ');
   SQL.Add('where (文本.Graphic_Id=:v1)and(点.Point_Id=文本.InsP_Id)');
   SQL.Add('and(图层.Layer_Id=文本.Layer_Id)and(图层.Layer like '+''''+'%工作面%'+''''+')');
   SQL.Add('and(文本.Color=6)'); //采区文本的颜色为紫色
   Parameters.ParamByName('v1').Value:=Graphic_Id;
   ExecSQL;open;
   AreaTxtNum:=recordcount; //AreaTxtNum:采区名称文本个数
   setlength(AreaTxt,AreaTxtNum);//AreaTxt:存放采区文本内容
   setlength(AreaTxtPs,AreaTxtNum); //AreaTxtPs:存放采区文本插入点
   for i:=0 to AreaTxtNum-1 do
    begin
     AreaTxt[i]:=fieldbyname('Text').AsString;
     AreaTxtPs[i,0]:=fieldbyname('X').AsFloat;
     AreaTxtPs[i,1]:=fieldbyname('Y').AsFloat;
     AreaTxtPs[i,2]:=fieldbyname('Z').AsFloat;
     next;
    end;

   //查找工作面文本和其插入点
   close;
   SQL.Clear;
   SQL.Add('select 文本.Text,点.X,点.Y,点.Z from 点,文本,图层 ');
   SQL.Add('where (文本.Graphic_Id=:v1)and(点.Point_Id=文本.InsP_Id)');
   SQL.Add('and(图层.Layer_Id=文本.Layer_Id)and(图层.Layer like '+''''+'%工作面%'+''''+')');
   SQL.Add('and(文本.Color=5)');  //工作面文本的颜色为蓝色
   Parameters.ParamByName('v1').Value:=Graphic_Id;
   ExecSQL;open;
   WorkTxtNum:=recordcount;
   setlength(WorkTxt,WorkTxtNum);
   setlength(WorkTxtPs,WorkTxtNum);
   for i:=0 to WorkTxtNum-1 do
    begin
     WorkTxt[i]:=fieldbyname('Text').AsString;
     WorkTxtPs[i,0]:=fieldbyname('X').AsFloat;
     WorkTxtPs[i,1]:=fieldbyname('Y').AsFloat;
     WorkTxtPs[i,2]:=fieldbyname('Z').AsFloat;
     next;
    end;

   //查找停采线,并对每一条停采线进行采区和工作面处理
   close;
   SQL.Clear;
   SQL.Add('select distinct LType,StopL_Id from 停采线和断层交线 ');
   SQL.Add('where (Graphic_Id=:v)and(Sp_F=0) ');   //Sp_F=0代表该多义线为停采线
   Parameters.ParamByName('v').Value:=Graphic_Id;
   ExecSQL;open;

   Hint_Frm.Label1.Caption:='处理停采线.....';
   Hint_Frm.Refresh;
   Frm_Gra.Refresh;

   for i:=0 to recordcount-1 do //从第一条停采线开始处理,
    begin
    Hint_Frm.Refresh;
    Frm_Gra.Refresh;

     m:=fieldbyname('LType').AsInteger;
     n:=fieldbyname('StopL_Id').AsInteger;
     //查找这条停采线上的交点情况,由于停采线上的交点可能较多,
     //因此同一条停采线在“停采线和断层交线”表中存在重复记录

     frm_data.ADOQ_Aid.Close;
     frm_data.ADOQ_Aid.SQL.Clear;
     //ADOQ_Aid:在“停采线和断层”表中找到LType=m和StopL_Id=n的停采线所有的交点
     frm_data.ADOQ_Aid.SQL.Add('select InS_LType,InS_Hnd,Stop_Id from 停采线和断层交线 ');
     frm_data.ADOQ_Aid.SQL.Add('where (Graphic_Id=:v1)and(LType=:v2)and(StopL_Id=:v3)');
     frm_data.ADOQ_Aid.Parameters.ParamByName('v1').Value:=Graphic_Id;
     frm_data.ADOQ_Aid.Parameters.ParamByName('v2').Value:=m;
     frm_data.ADOQ_Aid.Parameters.ParamByName('v3').Value:=n;
     frm_data.ADOQ_Aid.ExecSQL;
     frm_data.ADOQ_Aid.open;

     n:=frm_data.ADOQ_Aid.RecordCount; //该停采线的交点个数

     setlength(StopInwPId,n);//交点编号
     setlength(StopInW,n);//交点
     setlength(StopHnd,n);//交线句柄
     setlength(StopInwTId,n);//交线类型2、24,19
     setlength(W_L_F_Points,n);//交线,有多少交点就有多少交线
     setlength(Sp_List,n);//交线起点编号
     setlength(Ep_List,n);//交线终点编号

     //取得交点坐标和交线的句柄和类型
     for j:=0 to frm_data.ADOQ_Aid.RecordCount-1 do
      begin
       StopHnd[j]:=frm_data.ADOQ_Aid.fieldbyname('InS_Hnd').AsString;//交线句柄
       StopInwTId[j]:=frm_data.ADOQ_Aid.fieldbyname('InS_LType').AsInteger;//交线类型
       StopInwPId[j]:=frm_data.ADOQ_Aid.fieldbyname('Stop_Id').AsInteger;
       frm_data.ADOT_Points.Locate('Point_Id',StopInwPId[j],[loCaseInsensitive]);
       StopInW[j,0]:=frm_data.ADOT_Points.fieldbyname('X').AsFloat;//交点坐标
       StopInW[j,1]:=frm_data.ADOT_Points.fieldbyname('Y').AsFloat;
       StopInW[j,2]:=frm_data.ADOT_Points.fieldbyname('Z').AsFloat;
       frm_data.ADOQ_Aid.Next;
      end;


     n:=fieldbyname('StopL_Id').AsInteger;
     if (m=2)or(m=24)  //如果停采线是多义线,记录停采线的起终点编号
      then begin
            frm_data.ADOT_Pline.Locate('Pline_Id',n,[loCaseInsensitive]);
            Sp_Id:=frm_data.ADOT_Pline.fieldbyname('Sp_Id').AsInteger;
            Ep_Id:=frm_data.ADOT_Pline.fieldbyname('Ep_Id').AsInteger;
           end;

     if m=19  //如果停采线是直线,记录停采线的起终点编号
      then begin
            frm_data.ADOT_line.Locate('Line_Id',n,[loCaseInsensitive]);
            Sp_Id:=frm_data.ADOT_line.fieldbyname('Sp_Id').AsInteger;
            Ep_Id:=frm_data.ADOT_line.fieldbyname('Ep_Id').AsInteger;
           end;
     //停采线上定位点的个数
     k:=Ep_Id-Sp_Id+1;    //k为停采线上定位点的个数
     setlength(StopLinePs,k);
     CenP_Id:=-1; //记录已经排好序的交点个数
     frm_data.ADOT_Points.Locate('Point_Id',Sp_Id,[loCaseInsensitive]);

     len:=2*frm_data.ADOQ_Aid.RecordCount;
     Setlength(RecPoints,len);
     for j:=0 to k-1 do//两两处理停采线上的定位点之间的交点
      begin
        //首先取得停采线上定位点的坐标
        StopLinePs[j,0]:=frm_data.ADOT_Points.fieldbyname('X').AsFloat;
        StopLinePs[j,1]:=frm_data.ADOT_Points.fieldbyname('Y').AsFloat;
        StopLinePs[j,2]:=frm_data.ADOT_Points.fieldbyname('Z').AsFloat;
        frm_data.ADOT_Points.Next;
        if j=0 then continue;
        PCou:=0; //记录两个定位点之间的交点个数
        {逐个排列停采线上的交点,必要时进行交换过程}
        for m:=0 to frm_data.ADOQ_Aid.RecordCount-1 do
        begin
         n:=PInP1P2(StopInW[m],StopLinePs[j-1],StopLinePs[j]);
         if n=0 then continue;//如果停采线上的交点StopInW[m]不是停采线上的定位点StopLinePs[j-1]和StopLinePs[j]确定的这段线上的点
         //如果交点StopInW[m]是定位点StopLinePs[j-1]和StopLinePs[j]确定的这段线上的开始交点
         if (n=2)or((n=1)and(abs(StopInW[m,0]-StopLinePs[j-1,0])<1e-3)
             and(abs(StopInW[m,1]-StopLinePs[j-1,1])<1e-3)) then
         begin
          inc(CenP_Id); //对排好序的点进行累计
          Inc(PCou); //累计该段线上的交点
          ExPoint(StopInW[m],StopInW[CenP_Id]);//交换交点
          ExString(StopHnd[m],StopHnd[CenP_Id]);//交换交线句柄
          Exinteger(StopInwTId[m],StopInwTId[CenP_Id]);//交换交线类型
         end;
        end;
        if PCou>1 then //如果这一段线中含有多个交点,需要对这段线上的交点进行排序
         begin
          Setlength(Distans,PCou);
          for m:=CenP_Id-PCou+1 to CenP_Id do Distans[m-CenP_Id+Pcou-1]:=Distance(StopLinePs[j-1],StopInW[m]);
          for m:=CenP_Id-PCou+1 to CenP_Id-1 do//冒泡法交换
           begin
            Isd:=true;
            for n:=CenP_Id-PCou+1 to 2*CenP_Id-PCou-m do
             if Distans[n-CenP_Id+PCou]<Distans[n-CenP_Id+PCou-1]
              then begin
                    Isd:=false;
                    ExPoint(StopInW[n],StopInW[n+1]);//交换交点
                    ExString(StopHnd[n],StopHnd[n+1]);//交换交线句柄
                    Exinteger(StopInwTId[n],StopInwTId[n+1]);//交换交线类型
                    ExDouble(Distans[n-CenP_Id+PCou],Distans[n-CenP_Id+PCou-1]);
                   end;
            if Isd then break;
           end;
         end;
        for n:=CenP_Id-PCou+1 to CenP_Id do RecPoints[n]:=StopInW[n];//取得多边形的底边
      end;

     {依次找到这些交点所在的线的起终点,可能有交换过程}
     for j:=0 to frm_data.ADOQ_Aid.RecordCount-1 do   //ADOQ_Aid:在“停采线和断层”表中找到LType=m和StopL_Id=n的停采线所有的交点
      begin
       if (StopInwTId[j]=2)or(StopInwTId[j]=24) //如果是多义线
        then begin
              frm_data.ADOT_Pline.Locate('Graphic_Id;Handle',vararrayof([Graphic_Id,StopHnd[j]]),[loCaseInsensitive]);
              Sp_List[j]:=frm_data.ADOT_Pline.fieldbyname('Sp_Id').AsInteger;
              Ep_List[j]:=frm_data.ADOT_Pline.fieldbyname('Ep_Id').AsInteger;
             end;
       if StopInwTId[j]=19//如果是直线
        then begin
              frm_data.ADOT_line.Locate('Graphic_Id;Handle',vararrayof([Graphic_Id,StopHnd[j]]),[loCaseInsensitive]);
              Sp_List[j]:=frm_data.ADOT_line.fieldbyname('Sp_Id').AsInteger;
              Ep_List[j]:=frm_data.ADOT_line.fieldbyname('Ep_Id').AsInteger;
             end;
       k:=Ep_List[j]-Sp_List[j]+1;

⌨️ 快捷键说明

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