?? unitqcgisproject.pas
字號(hào):
unit UnitQCGISProject;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Forms, Graphics,
Dialogs, MapXLib_TLB, Grids, yhbGrid, Buttons, DB, MapXTools, Controls,
ADODB, TFlatEditUnit, ComCtrls, Menus, ExtCtrls, ToolWin, MapXContainer,
AppCmdCtrl, jpeg, DBTrees, VirtualDBEngine, WinControl, MapXDrv, MapXBase,
DLControl, DBTools, UnitProject, UnitSubStationData, mis_RightDBStore,
AnyPoster, DBM_MSSQL, DLRight, ActiveX, UnitAppTypes, AnyDBFactory,
UnitQCConsts, IniFiles, UnitRecords;
type
TDirectState=(dsKeepState, dsDisConnected, dsConnected);
{七廠GIS工程類}
TqcGISProject=class(TGISProject)
private
//---------------------------------------------------------------------//
FDLCtrl:TDLControl;
FRootMenuItem:TMenuItem;
NAddStation:TMenuItem;
NAddLine:TMenuItem;
NAddKG:TMenuItem;
NAddBT:TMenuItem;
NLinkToPower:TMenuItem;
NUserRight:TMenuItem;
NReDirectServer:TMenuItem;
NUpLoad:TMenuItem;
NDownLoad:TMenuItem;
NConfigPopedom:TMenuItem;
NShapeProperties:TMenuItem;
NConfigBDS:TMenuItem;
PIMLoaded: Boolean;
FDataFrom: Integer;
{子站當(dāng)前狀態(tài)Frame}
FSubStationFrame:TFrame_SubStationData;
{SQLServer數(shù)據(jù)庫(kù)管理者,因?yàn)槲锢頂?shù)據(jù)庫(kù)的不同導(dǎo)致了SQL語(yǔ)句的細(xì)微差別,
數(shù)據(jù)庫(kù)管理者就是為外界提供所需的SQL語(yǔ)句或子句}
FDBManager:TSQLServerDBManager;
{數(shù)據(jù)工廠對(duì)象}
FDBFactory:TAnyDBFactory;
{用戶層}
FUserLayer:CMapXLayer;
{線路層}
FLineLayer:CMapXLayer;
{變壓器層}
FBTLayer:CMapXLayer;
{開關(guān)層}
FDotLayer:CMapXLayer;
{子站層}
FSubStationLayer:CMapXLayer;
{水系層}
FWaterSystemLayer:CMapXLayer;
{道路層}
FRoadLayer:CMapXLayer;
{建筑物層}
FBuildingLayer:CMapXLayer;
{底圖層}
FBottomLayer:CMapXLayer;
{當(dāng)前變電所編號(hào)}
FCurUnitID:Integer;
{隨機(jī)模擬開關(guān)狀態(tài)的Timer}
FPowerTimer:TTimer;
//---------------------------------------------------------------------//
{設(shè)置某個(gè)系統(tǒng)圖層為編輯狀態(tài)}
procedure EditSystemLayer(LayerId:Integer);
procedure DefConnectToServer;
procedure ReInitServerPart;
{加載圖層樹
如果為系統(tǒng)管理員,可以維護(hù)圖層樹。維護(hù)內(nèi)容包括:增加圖層,圖層屬性,刪除圖
層,拖動(dòng)圖層。拖動(dòng)圖層時(shí):當(dāng)FeatureClass中只有一個(gè)圖層時(shí),F(xiàn)eatureClass的編號(hào)變
化。
如果為一般用戶,則可以查看圖層屬性,但不能修改。}
procedure CreateFeatureClassNode(const FCId:Integer;
ATreeView:TTreeView; ATreeNode:TTreeNode);
procedure LoadLayerTreeInfo;
procedure LoadAndInitMap;
function IsOldLayer(aUnitID:Integer; aTableName:string):Boolean;
procedure SetDownloadDate(aUnitID:Integer; aTableName:string;
aDownDate:TDateTime);
{加載地圖內(nèi)容}
function CheckLocalMap:Boolean;
procedure DownloadSymbolBitmaps(Section:Integer; LocalPath:string);
procedure DownloadBinaryLayer(const UnitID:Integer;
const LayerName, LocalPath, LocalLayerName:string);
procedure DownLoadSystemLayers;
{從系統(tǒng)表創(chuàng)建圖層}
procedure CreateLayerFromTable(aLayerInfo:TLayerTreeNodeRecord;
const Index:Integer);
{上載地圖}
procedure UpLoadResources(Section:Integer; ResType, ResPath:string);
procedure UpLoadLayerFile(const UnitID:Integer; const FileName:string);
procedure UpLoadSystemLayers;
{加載一個(gè)菜單項(xiàng)}
function LoadMenuItem(aPItem:TMenuItem; const Caption:string;
const Tag:Integer; ClickProc:TNotifyEvent):TMenuItem;
//---------------------------------------------------------------------//
function ReDirectSQLServer(INIF:TIniFile; PState:TDirectState):TDirectState;
//---------------------------------------------------------------------//
{連接服務(wù)器菜單事件處理過程}
procedure ConnectClick(Sender: TObject);
{上載圖層菜單事件處理過程}
procedure UpLoadClick(Sender: TObject);
{下載圖層菜單事件處理過程}
procedure DownLoadClick(Sender: TObject);
{增加子站菜單事件處理過程}
procedure AddStationClick(Sender: TObject);
{增加線路菜單事件處理過程}
procedure AddLineClick(Sender: TObject);
{增加開關(guān)菜單事件處理過程}
procedure AddKGClick(Sender: TObject);
{增加變臺(tái)菜單事件處理過程}
procedure AddBTClick(Sender: TObject);
{分析子站是否關(guān)聯(lián)記錄}
procedure AnalyzeSubStationClick(Sender: TObject);
{分析開關(guān)是否關(guān)聯(lián)記錄}
procedure AnalyzePowerClick(Sender: TObject);
{分析線路是否關(guān)聯(lián)記錄}
procedure AnalyzeSDLineClick(Sender: TObject);
{分析線路是否關(guān)聯(lián)開關(guān)}
procedure AnalyzeLinkPowerClick(Sender: TObject);
{輸電線路關(guān)聯(lián)到開關(guān)}
procedure LinkToPowerClick(Sender: TObject);
{裝載電力模擬數(shù)據(jù)}
procedure LoadDLControlDataClick(Sender: TObject);
{隨機(jī)演示開關(guān)狀態(tài)}
procedure RandomPowerStateClick(Sender: TObject);
{圖形屬性信息菜單事件處理過程}
procedure ShapePropertiesClick(Sender: TObject);
{窗口切換菜單事件處理過程}
procedure ChangeWindowClick(Sender: TObject);
{權(quán)限分配}
procedure ConfigPopedomClick(Sender: TObject);
{重新連接}
procedure ReConnectClick(Sender: TObject);
{重新登陸}
procedure CheckPasswordClick(Sender: TObject);
{圖形類是否存在}
function FeatueClassExists(const FCId:Integer):Boolean;
{如果連接到數(shù)據(jù)庫(kù),則進(jìn)一步設(shè)置}
procedure DoAfterUserConnect;
{圖層是否存在}
function LayerExists(const LayerName:string):Boolean;
{取得單位名稱}
function GetCurUnitName: string;
{取得系統(tǒng)圖層路徑,注意:和具體單位有關(guān)}
function GetLocalMapPath: string;
function GetConnected: Boolean;
procedure GetUnits(List:TStrings);
function GetUserUnitType: Integer;
procedure AnalyzeFeatures(ALyr:Layer; Fts:Features; FtType:TOLEEnum;
WarningColor:TColor);
procedure PowerTimerOnTimer(Sender:TObject);
//---------------------------------------------------------------------//
protected
FirstFeature:Boolean;
FirstFeatureKeyValue:string;
{數(shù)據(jù)提交者,對(duì)有必要隱藏的SQL語(yǔ)句進(jìn)行了隔離處理,對(duì)于變成者來說,
編寫提交數(shù)據(jù)的代碼將更加簡(jiǎn)潔}
GDBPoster:TDBPosterWithSQL;
{取得圖層的圖形類編號(hào)}
function GetLayerFeatureId(ALyr:Layer):Integer;
{注冊(cè)本GIS實(shí)例所需的風(fēng)格}
procedure RegisterProjectStyles; override;
{注冊(cè)本GIS實(shí)例所需的工具}
procedure RegisterProjectTools; override;
public
//---------------------------------------------------------------------//
constructor Create(AOwner:TComponent; MapX:TMapXObject); override;
destructor Destroy; override;
//---------------------------------------------------------------------//
{應(yīng)用權(quán)限}
procedure DoApplayFunctions; override;
{檢查是否有權(quán)操作}
function CheckFunction(ActionId:Integer):Boolean; override;
{顯示屬性對(duì)話框}
procedure DoOnCtrlPropDialog(Sender:TObject; ActionId:Integer; Ft:Feature); override;
{開始動(dòng)作}
procedure DoBeginAction(ActionId:Integer; var Cancel:Boolean); override;
{結(jié)束動(dòng)作}
procedure DoEndAction(ActionId:Integer); override;
{圖形刪除前}
procedure DoBeforeDelete(Ft:Feature; ActionId:Integer); override;
{圖形創(chuàng)建后}
procedure DoFeatureCreate(Ft:Feature; ActionId:Integer); override;
{填寫網(wǎng)格數(shù)據(jù)}
function DoWriteDataGridData(AGridFrame:TFrame_Records):Boolean; override;
//---------------------------------------------------------------------//
{增加本地圖層到工程}
procedure AddLayerToProject(ALyr:CMapXLayer; aLayerInfo:TLayerTreeNodeRecord;
const FCId:Integer); override;
{從工程下載圖層}
procedure DownloadProjectLayer(ALyr:CMapXLayer; aLayerInfo:TLayerTreeNodeRecord;
const LayerName, Path:string); override;
{創(chuàng)建業(yè)務(wù)菜單項(xiàng)}
procedure LoadBusinessMenuItems(AMenuItem:TMenuItem); override;
{工程實(shí)例加載,包括連接數(shù)據(jù)庫(kù)、加載所有系統(tǒng)圖層等操作}
procedure LoadProject; override;
{連接數(shù)據(jù)庫(kù)}
function ConnectToDataBase(const Server, UserName, Password:string):Boolean;
{登陸到服務(wù)器}
function Connect(const UserName, Password:string):Boolean;
{用對(duì)話框登陸}
function ConnectUseDialog:Boolean;
{加載地圖}
procedure LoadMaps(const ItemIndex:Integer); override;
procedure SetCurrentUnit(const UnitID:Integer);
{注冊(cè)命令}
procedure RegisterCmdCtrlGroups; override;
{刷新開關(guān)顯示}
procedure RefreshDotState(aDot:TDot);
{刷新所有開關(guān)顯示}
procedure RefreshAllDotState;
{刷新電路狀態(tài)顯示}
procedure RefreshLineLayerState(const bChanged:Boolean);
{監(jiān)控?cái)U(kuò)展菜單}
procedure LoadParentInstanceModules; override;
{刷新模擬圖}
procedure RefreshSimulantMap;
{選擇子站當(dāng)前狀態(tài)刷新}
procedure RefreshSelectedSubStationsState;
{取得子站關(guān)聯(lián)的開關(guān)及其當(dāng)前狀態(tài)}
function GetSubStationLinkPowerInfo(const SubStationId:Integer;
var ZKPowerId, GLPower1Id, GLPower2Id:Integer;
var ZKPowerState, GLPower1State, GLPower2State:Smallint):Boolean;
{子站報(bào)警}
procedure SubStationWarning(const SubStationId:Integer;
const WarningString:string; BoundSeed:Double);
{定位子站}
procedure GoToSubStation(const SubStationId:Integer; BoundSeed:Double);
{設(shè)置開關(guān)狀態(tài)}
procedure SetPowerState(aDot:TDot; aState:TDotState; bAnalyze,
bSaveState:Boolean); overload;
{設(shè)置開關(guān)狀態(tài)}
procedure SetPowerState(const PowerId:Integer; aState:Smallint; bAnalyze,
bSaveState:Boolean); overload;
{雙擊}
procedure DoFeatureDblClick(Sender:TObject; Ft:Feature); override;
procedure InitLineLayerRecords;
procedure InitDotLayerRecords;
//---------------------------------------------------------------------//
property DLCtrl:TDLControl read FDLCtrl;
property SubStationLayer:CMapXLayer read FSubStationLayer;
property DotLayer:CMapXLayer read FDotLayer;
property LineLayer:CMapXLayer read FLineLayer;
property DataFrom:Integer read FDataFrom write FDataFrom;
property UserUnitType:Integer read GetUserUnitType;
property CurUnitID:Integer read FCurUnitID;
property CurUnitName:string read GetCurUnitName;
property LocalMapPath:string read GetLocalMapPath;
property Connected:Boolean read GetConnected;
property DefDBPoster:TDBPosterWithSQL read GDBPoster;
//---------------------------------------------------------------------//
end;
implementation
uses
UnitDMLinks, UnitMainLinkObjects, BusinessDialogs, MapXStyles, MapXAPIs,
MapXAdvance, MapXConsts, MapXMessages, UnitLineInfo, UnitPowerInfo, IntList,
ADODBTools, StringOperations, WinFileSystem, MainFormInstance, DBBase,
UnitGetUserInfo, mis_Instance, UnitQCProjectTools, UnitConnectToSQLServerDB,
ADOConnection, UnitGISShell, UnitShellAPIs, UnitAppConsts, UnitQCAPIs,
UnitEagleEye, UnitPopedomInfo, mis_Right, UnitChangePassword,
UnitQCProjectOptions, AppDebug, TypInfo, UnitSubStationInfo, DBS_MSSQL;
{ TqcGISProject }
function GetPowerLocalState(strState:string):SmallInt;
begin
strState:=Trim(strState);
if strState='開' then
Result:=1
else if strState='關(guān)' then
Result:=0
else
Result:=-1;
end;
procedure TqcGISProject.AddBTClick(Sender: TObject);
begin
EditSystemLayer(LAYER_SYS_BT);
end;
procedure TqcGISProject.AddKGClick(Sender: TObject);
begin
EditSystemLayer(LAYER_SYS_POWER);
SetCurrentMapTool('TAddKGLineMapTool', OnTurnTool);
end;
procedure TqcGISProject.AddLayerToProject(ALyr: CMapXLayer;
aLayerInfo:TLayerTreeNodeRecord; const FCId:Integer);
var
LayerId:Integer;
Path:string;
TableName:string;
ANode:TTreeNode;
begin
if not dm_Links.DBMachine1.Connected then Exit;
Path:=CheckPath(ExtractFilePath(aLayerInfo.FileName));
TableName:=ExtractFileNameNoExt(aLayerInfo.FileName);
{圖形類是否存在}
if not FeatueClassExists(FCId) then
raise Exception.Create('圖形類不存在!');
{圖層是否存在}
if LayerExists(ALyr.Name) then
raise Exception.Create('工程中存在同名圖層,請(qǐng)重新命名后加入!');
case DataFrom of
1:begin
{將數(shù)據(jù)導(dǎo)入到表中}
with GMapTools.m_Layer do
begin
Layer:=aLyr;
SaveFeaturesToTable(dm_MainLinkObjects.PublicQuery,
aLyr.DataSets.Item[1],
dbtSQLServer,
TableName);
end;
end;
2:begin
UpLoadLayerFile(CurUnitID, Path+TableName+'.DAT');
UpLoadLayerFile(CurUnitID, Path+TableName+'.ID');
UpLoadLayerFile(CurUnitID, Path+TableName+'.MAP');
UpLoadLayerFile(CurUnitID, Path+TableName+'.TAB');
end;
else begin
WarningAbort('錯(cuò)誤', '無(wú)法識(shí)別圖層存儲(chǔ)標(biāo)志!');
end;
end;
{記錄圖層信息}
LayerId:=GetNewIntID(dm_MainLinkObjects.PublicQuery, 't_Layers', 'LayerId', '', 1);
with dm_MainLinkObjects.PublicQuery do
begin
Close;
SQL.Clear;
SQL.Add('select * from t_Layers where LayerId=:LayerId');
SetParamValue(dm_MainLinkObjects.PublicQuery, 'LayerId', -1);
Open;
Append;
FieldByName('LayerId').Value:=LayerId;
FieldByName('LayerName').Value:=ALyr.Name;
FieldByName('LayerIndex').Value:=1;
FieldByName('FCId').Value:=FCId;
FieldByName('LayerType').Value:=1;
FieldByName('Visible').Value:=aLyr.Visible;
FieldByName('DataFrom').Value:=DataFrom;
FieldByName('TableName').Value:=TableName;
FieldByName('SysCfg').Value:='InitBounds='+GetBoundsString(GMapTools.MapX.Bounds)+';KeyField=;Caption=;ShowCaption=False';
FieldByName('UserCfg').Value:='';
FieldByName('CDataTime').Value:=Now;
FieldByName('CUser').Value:='';
FieldByName('LMDateTime').Value:=Now;
FieldByName('LMUser').Value:='';
Post;
end;
{增加圖層類的LayerCount}
with dm_MainLinkObjects.PublicQuery do
begin
Close;
SQL.Clear;
SQL.Add('update t_FeatureClasses set LayerCount=LayerCount+1');
SQL.Add('where FCId=:FCId');
SetParamValue(dm_MainLinkObjects.PublicQuery, 'FCId', FCId);
ExecSQL;
end;
{刪除原有節(jié)點(diǎn),增加新節(jié)點(diǎn)}
ANode:=FindFeatureClassNode(FCId);
AddLayerNode(SysTree, ANode, naAddChildFirst,
-1, aLyr.Name, aLayerInfo.FileName, False, 2, -1, 3);
ANode:=FindLayerNode(ALyr);
DeleteNode(ANode);
end;
procedure TqcGISProject.AddLineClick(Sender: TObject);
begin
EditSystemLayer(LAYER_SYS_LINE);
SetCurrentMapTool('TAddSDLineMapTool', OnTurnTool);
end;
procedure TqcGISProject.AddStationClick(Sender: TObject);
begin
EditSystemLayer(LAYER_SYS_SUBSTATION);
SetCurrentMapTool('TAddSubStationMapTool', OnTurnTool);
end;
constructor TqcGISProject.Create(AOwner:TComponent; MapX:TMapXObject);
begin
inherited Create(AOwner, MapX);
RegOwnerName:='大慶采油七廠';
ProjectName:=RegOwnerName+'電力監(jiān)控系統(tǒng) -- 地理信息子系統(tǒng)';
FDBManager:=TSQLServerDBManager.Create;
GDBPoster:=TDBPosterWithSQL.Create;
GDBPoster.DBManager:=FDBManager;
FDBFactory:=TAnyDBFactory.Create;
FDBFactory.DBManager:=FDBManager;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -