免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 2432|回复: 2
收起左侧

用Delphi实现MapX中类似AutoCAD的平滑移动的Pen工具

[复制链接]

2072

主题

100000万

铜板

363

好友

地信专家组

每一次的分离都是为了下一次的相聚

Rank: 14Rank: 14Rank: 14Rank: 14

积分
17622

精华勋章宣传勋章爱心勋章组织勋章地信元老灌水勋章荣誉会员勋章活跃勋章贡献勋章

发表于 2009-11-15 16:46 | 显示全部楼层 |阅读模式
用Delphi实现MapX中类似AutoCAD的平滑移动的Pen工具
//类文件
unit TFlowPenClass;
interface
uses Controls,Classes,MapXLib_TLB;
type
  TFlowPen=Class(TObject)
  protected
    m_IriMouseMoveEvent:TMouseMoveEvent;
    m_IriMouseUpEvent:TMouseEvent;
    m_IriMouseDownEvent:TMouseEvent;
    m_pMap:Tmap;
    m_bMosueDown:Boolean;
    m_sPenInX:Single;
    m_sPenInY:Single;
  protected
    procedure MapMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure MapMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure MapMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  public
    Function CreateFlowPenTool(pMap:TMap):Integer;
    Function InstallFlowPenTool():Boolean;
    Function UnInstallFlowPenTool():Boolean;
    Function GetToolNum():Integer;
end;
const
  MAP_TOOL_FLOWPEN=1;
implementation
  procedure TFlowPen.MapMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  begin
    If (m_pMap.CurrentTool=MAP_TOOL_FLOWPEN) And (Not m_bMosueDown) Then
    begin
      m_bMosueDown:=True;
      m_sPenInX:=X;
      m_sPenInY:=Y;
    end;
    if @m_IriMouseDownEvent<>nil then
      m_IriMouseDownEvent(Sender,Button,Shift,X,Y);
  end;
  procedure TFlowPen.MapMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  begin
    If (m_pMap.CurrentTool=MAP_TOOL_FLOWPEN) And m_bMosueDown Then
      m_bMosueDown:=False;
    if @m_IriMouseUpEvent<>nil then
      m_IriMouseUpEvent(Sender,Button,Shift,X,Y);
  end;
procedure TFlowPen.MapMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  dX1,dX2,dY1,dY2ouble;
  sX,sY:Single;
begin
  If (m_pMap.CurrentTool=MAP_TOOL_FLOWPEN) And m_bMosueDown Then
  begin
    sX:=X;sY:=y;
    m_pMap.ConvertCoord(sX,sY,dX1,dY1,miScreenToMap);
    m_pMap.ConvertCoord(m_sPenInX,m_sPenInY,dX2,dY2,miScreenToMap);
    m_pMap.CenterX:=m_pMap.CenterX-(dX1-dX2);
    m_pMap.CenterY:=m_pMap.CenterY-(dY1-dY2);
    m_sPenInX:=X;
    m_sPenInY:=Y;
  End;
  if @m_IriMouseMoveEvent<>nil then
    m_IriMouseMoveEvent(Sender,Shift,X,Y);
end;
Function TFlowPen.CreateFlowPenTool(pMap:Tmap):Integer;
begin
    m_pMap:=pMap;
    if m_pMap<>nil then
    begin
      m_pMap.CreateCustomTool(MAP_TOOL_FLOWPEN,miToolTypePoint,miPanCursor,miPanCursor,miPanCursor);
      InstallFlowPenTool;
      result:=MAP_TOOL_FLOWPEN;
    end
    else
      result:=-1;
end;
Function TFlowPen.InstallFlowPenTool():boolean;
begin
    if m_pMap<>nil then
    begin
      m_IriMouseMoveEvent:=m_pMap.OnMouseMove;
      m_IriMouseUpEvent:=m_pMap.OnMouseUp;
      m_IriMouseDownEvent:=m_pMap.OnMouseDown;
      m_pMap.OnMouseMove:=MapMouseMove;
      m_pMap.OnMouseUp:=MapMouseUp;
      m_pMap.OnMouseDown:=MapMouseDown;
      m_bMosueDown:=False;
      result:=True;
    end
    else
      result:=False;
end;
Function TFlowPen.UnInstallFlowPenTool():Boolean;
begin
    if m_pMap<>nil then
    begin
      m_pMap.OnMouseMove:=m_IriMouseMoveEvent;
      m_pMap.OnMouseUp:=m_IriMouseUpEvent;
      m_pMap.OnMouseDown:=m_IriMouseDownEvent;
      m_IriMouseMoveEvent:=nil;
      m_IriMouseUpEvent:=nil;
      m_IriMouseDownEvent:=nil;
      m_pMap:=nil;
      result:=True;
    end
    else
      result:=False;
end;
Function TFlowPen.GetToolNum():Integer;
begin
  result:=MAP_TOOL_FLOWPEN;
end;
end.
//使用时初试化
  m_FlowPenTool:=TFlowPen.Create;
  m_FlowPenTool.CreateFlowPenTool(Map1);
//开始使用FlowPen
Map1.CurrentTool:=m_FlowPenTool.GetToolNum();
//MapX.RedrawInterval设置为30或更大效果会比较好

0

主题

4

铜板

0

好友

助理工程师

Rank: 5Rank: 5

积分
142
发表于 2010-4-22 16:09 | 显示全部楼层
楼主辛苦了

0

主题

2638

铜板

0

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1542
发表于 2025-1-9 15:06 | 显示全部楼层
探矿者软件可以提高矿体的命中率,减少找矿的成本和难度,主要功能:数据管理、二维制图、三维建模、储量估算、三维立体预测等,有需要免费试用可以联系负责人邓帅15377311476(微信同号),软件针对单位或者企业试用,不面向个人试用
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表