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

📄 unitshellapis.~pas

📁 此代码是关于mapgis的在
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
unit UnitShellAPIs;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms, MapXLib_TLB,
  ComCtrls, MapXBase, UnitAppTypes, UnitProject, UnitGISShell;

function CreateAppProject(AOwner:TComponent; MapX:TMapXObject):TGISProject;
{创建GIS工程对象}
function CreateGISProject(GISClass:TGISProjectClass; AOwner:TComponent;
  MapX:TMapXObject):TGISProject;
{放开节点}
procedure LayerTreeDragDrop(Sender, Source: TObject; X,
  Y: Integer);
{拖动节点}
procedure LayerTreeDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
{初始化树}
procedure InitGISTree;
{清除图层树附带的信息}
procedure ClearLayerTreeInfo(ATreeView:TTreeView);
{清除某一节点下的附带的信息}
procedure ClearSubNodesInfo(ANode:TTreeNode);
{删除节点}
procedure DeleteNode(ANode:TTreeNode);
{强行创建Web地图路径}
function ForceCreateWebMapPath:string;
{增加图层节点}
function AddLayerNode(ATreeView:TTreeView; APNode:TTreeNode;
  Mode:TNodeAttachMode; const Id:Integer; const LayerName,
  FileName:string; IsSystem:Boolean; const DataFrom:Smallint;
  const FtClassType, ImageIndex:Integer):TTreeNode;
{查找图层节点}
function FindLayerNode(const LayerIndex:Integer):TTreeNode; overload;
function FindLayerNode(ALyr:Layer):TTreeNode; overload;
function GetLayerData(ALyr:Layer):TLayerTreeNodeRecord;
{查找图形类节点}
function FindFeatureClassNode(const FCId:Integer):TTreeNode;
{查找图层}
function GetLayer(const FtClassType:Integer; var LayerNode:TTreeNode): CMapXLayer;
{移动图层节点}
procedure MoveLayer(MapX:TMapXObject; const FromIndex, ToIndex:Integer);
{设置图层节点可见性}
procedure SetLayerVisible(MapX:TMapXObject; const Index:Integer; const Visible:Boolean);
{设置图层节点可编辑性}
procedure SetLayerEditable(MapX:TMapXObject; const Index:Integer; const Editable:Boolean);
{设置图层节点可选性}
procedure SetLayerSelectable(MapX:TMapXObject; const Index:Integer; const Selectable:Boolean);
{设置图层节点自动标注属性}
procedure SetLayerAutoLabel(MapX:TMapXObject; SysTreeRoot:TTreeNode;
  const Index:Integer; const AutoLabel:Boolean);
{移出指定图层}
procedure RemoveuserLayer(MapX:TMapXObject; const Index: Integer);
{清除所有图层}
procedure RemoveAllNodes;
{设置AddObjectTool}
function SetCurrentMapTool(const ToolClassName:string;
  TurnEvent:TNotifyEvent):TBaseMapTool;
{设置一般工具}
{检查编辑图层}
procedure CheckEditLayer;
{图层字段类型转换为逻辑类型}
function MapFieldTypeToLogicalFieldName(AFieldType:TMapFieldType):string;
{逻辑类型转换为图层字段类型}
function LogicalFieldNameToMapFieldType(const FieldName:string):TMapFieldType;
{取得图形类型名称}
function GetShapeTypeName(AShapeType:TShapeType):string;
{用名称取得图形类型}
function GetShapeTypeByName(const TypeName:string):TShapeType;
{从节点取得图层}
function GetLayerFromTreeNode(ANode:TTreeNode):Layer;
{是否为一般图层}
function IsCustomLayer(Lyr:Layer):Boolean;
function GetCustomLayerIndex(MapX:TMapXObject; const ComboIndex:Integer):Integer;
function GetCustomLayerComboIndex(MapX:TMapXObject; const LayerIndex:Integer):Integer;
{生成Bounds字符串}
function GetBoundsString(Bounds:CMapXRectangle):string;
{从Bounds字符串设置Bounds}
function CreateBoundsUseBoundsString(const BoundsStr:string):CMapXRectangle;

implementation

uses
  WinControl, BusinessDialogs, StringOperations, MapXAPIs, MapXTools,
  UnitLocalGISProject, UnitAppConsts;

function CreateAppProject(AOwner:TComponent; MapX:TMapXObject):TGISProject;
begin
  if MyGISClass=nil then
    MyGISClass:=TLocalGISProject;
  Result:=CreateGISProject(MyGISClass, AOwner, MapX);
end;

function CreateGISProject(GISClass:TGISProjectClass; AOwner:TComponent;
  MapX:TMapXObject):TGISProject;
begin
  Result:=TGISProject(GISClass.NewInstance);
  Result.Create(AOwner, MapX);
end;

function AddLayerNode(ATreeView:TTreeView; APNode:TTreeNode;
  Mode:TNodeAttachMode; const Id:Integer; const LayerName,
  FileName:string; IsSystem:Boolean; const DataFrom:Smallint;
  const FtClassType, ImageIndex:Integer):TTreeNode;
var
  aLayerItem:TTreeNode;
  aLayerInfo:TLayerTreeNodeRecord;
begin
  Result:=nil;
  case Mode of
    naAdd             : aLayerItem:=ATreeView.Items.Add(APNode, LayerName);
    naAddFirst        : aLayerItem:=ATreeView.Items.AddFirst(APNode, LayerName);
    naAddChild        : aLayerItem:=ATreeView.Items.AddChild(APNode, LayerName);
    naAddChildFirst   : aLayerItem:=ATreeView.Items.AddChildFirst(APNode, LayerName);
    naInsert          : aLayerItem:=ATreeView.Items.Insert(APNode, LayerName);
    else                Exit;
  end;
  aLayerItem.ImageIndex:=ImageIndex;
  aLayerItem.SelectedIndex:=ImageIndex;
  aLayerItem.StateIndex:=TREENODESTATE_SUBCHECKEDALL;
  aLayerInfo:=TLayerTreeNodeRecord.Create;
  aLayerItem.Data:=aLayerInfo;
  aLayerInfo.NodeType:=LTN_LAYER;
  aLayerInfo.Id:=Id;
  aLayerInfo.Name:=LayerName;
  aLayerInfo.FtClassType:=FtClassType;
  aLayerInfo.IsSystem:=IsSystem;
  aLayerInfo.DataFrom:=DataFrom;
  aLayerInfo.FileName:=FileName;
  Result:=aLayerItem;
end;

procedure LayerTreeDragDrop(Sender, Source: TObject; X,
  Y: Integer);
begin
  TreeViewDragDrop(Sender, Source, X, Y, DragType);
end;

procedure LayerTreeDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  TreeViewDragOver(Sender, Source, X, Y, State, Accept);
end;

procedure InitGISTree;
begin
  SysTreeRoot:=SysTree.Items.AddChild(nil, '所有图层');
  SysTreeRoot.ImageIndex:=0;
  SysTreeRoot.SelectedIndex:=0;
  SysTreeRoot.StateIndex:=TREENODESTATE_SUBCHECKEDALL;
end;

procedure ClearLayerTreeInfo(ATreeView:TTreeView);
var
  i:Integer;
  AItem:TTreeNode;
begin
  for i:=1 to ATreeView.Items.Count-1 do
  begin
    AItem:=ATreeView.Items[i];
    if AItem.Data<>nil then
      TLayerTreeNodeRecord(AItem.Data).Free;
  end;
end;

procedure ClearSubNodesInfo(ANode:TTreeNode);
var
  i:Integer;
  AItem:TTreeNode;
begin
  for i:=0 to ANode.Count-1 do
  begin
    AItem:=ANode.Item[i];
    if AItem.Data<>nil then
      TLayerTreeNodeRecord(AItem.Data).Free;
    ClearSubNodesInfo(AItem);
  end;
end;

procedure DeleteNode(ANode:TTreeNode);
begin
  TLayerTreeNodeRecord(ANode.Data).Free;
  ANode.Free;
end;

function GetSystemDirectory(var S: String): Boolean;
var
  Len: Integer;
begin
  Result:=False;
  Len := Windows.GetSystemDirectory(nil, 0);
  if Len > 0 then
  begin
    SetLength(S, Len);
    Windows.GetSystemDirectory(PChar(S), Len);
    Result:=True;
  end;
end;

function ForceCreateWebMapPath:string;
var
  SysPath, MyPath:string;
begin
  if not GetSystemDirectory(SysPath) then
  begin
    Result:='';
    Exit;
  end;
  Result:=SysPath[1]+':\QxWebMap\';
  if not DirectoryExists(Result) then
    ForceDirectories(Result);
  MyPath:=Result+'Maps';
  if not DirectoryExists(MyPath) then
    ForceDirectories(MyPath);
  MyPath:=Result+'SymbolBitmaps';
  if not DirectoryExists(MyPath) then
    ForceDirectories(MyPath);
end;

function FindLayerNode(const LayerIndex: Integer): TTreeNode;

  function FindNodeInChildren(const Index:Integer;
    ANode:TTreeNode; var PriorIndex:Integer):TTreeNode;
  var
    i:Integer;
  begin
    Result:=nil;
    for i:=0 to ANode.Count-1 do
    begin
      if TLayerTreeNodeRecord(ANode.Item[i].Data).NodeType=LTN_LAYER then
      begin
        Inc(PriorIndex);
        if PriorIndex=Index then
        begin
          Result:=ANode.Item[i];
          Exit;
        end;
      end
      else
        Result:=FindNodeInChildren(Index, ANode.Item[i], PriorIndex);
    end;
  end;
  
var
  Index:Integer;
  PriorIndex:Integer;
begin
  PriorIndex:=-1;
  //取得在显示给用户的图层列表中的序号//
  Index:=GetCustomLayerComboIndex(MyGIS.GMapTools.MapX, LayerIndex);
  //根据显示给用户的图层列表中的序号,查找节点//
  Result:=FindNodeInChildren(Index, SysTreeRoot, PriorIndex);
end;

function FindLayerNode(ALyr:Layer):TTreeNode;
var
  LayerIndex:Integer;
begin
  LayerIndex:=MyGIS.GMapTools.m_Layers.IndexByLayer(ALyr);
  Result:=FindLayerNode(LayerIndex);
end;

function GetLayerData(ALyr:Layer):TLayerTreeNodeRecord;    
var
  ANode:TTreeNode;
begin
  Result:=nil;
  ANode:=FindLayerNode(ALyr);
  if ANode<>nil then
    Result:=TLayerTreeNodeRecord(ANode.Data);
end;

function FindFeatureClassNode(const FCId:Integer):TTreeNode;
//var
//  i:Integer;
begin
{  for i:=0 to SysTreeRoot.Count-1 do
  begin
    if TLayerTreeNodeRecord(ANode.Item[i].Data)^.NodeType=LTN_LAYER then
    begin
      Inc(PriorIndex);
      if PriorIndex=Index then
      begin
        Result:=ANode.Item[i];
        Exit;
      end;
    end
    else
      Result:=FindNodeInChildren(Index, ANode.Item[i], PriorIndex);
  end;  }
end;

function GetLayer(const FtClassType:Integer; var LayerNode:TTreeNode): CMapXLayer;
var
  i:Integer;
  ANode:TTreeNode;
begin
  Result:=nil;
  LayerNode:=nil;
  for i:=1 to MyGIS.GMapTools.MapX.Layers.Count do
  begin
    ANode:=FindLayerNode(i);
    if ANode<>nil then

⌨️ 快捷键说明

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