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