明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3928|回复: 6

[原创]用TAB键移动视图的程序

[复制链接]
发表于 2007-7-3 09:45:00 | 显示全部楼层 |阅读模式

自己用SDK中pretranslate的例子写了一个移动视图的程序,挺简单的

附上工程中唯一的CPP文件,用它来替代SDK下pretranslate中的CPP文件再编译即可

//////////////////////////////////////////////////////////////
//
// Includes
//
//////////////////////////////////////////////////////////////
#define _AFX_NOFORCE_LIBS // we do not want to link to MFC DLLs or libs
#ifdef _DEBUG
#define WAS_DEBUG
#undef _DEBUG
#endif

#include "afxwin.h"  // need this because rxmfcapi.h needs windows header.

#ifdef WAS_DEBUG
#undef WAS_DEBUG
#define _DEBUG
#endif

#include "aced.h"
#include "adslib.h"
#include "rxmfcapi.h"
#include <windef.h>
#include<accmd.h> //acedCommand
#include<acedads.h> //acedSetVar
#include<adscodes.h>
#include<adsdef.h> //resbuf
#include <rxmfcapi.h>
#include<dbsymtb.h> //AcDbViewTableRecord
#include<gepnt3d.h> //AcGePoint3d
#include<dbapserv.h> //acdbHostApplicationServices
#include<gepnt2d.h> //AcGePoint2d


//////////////////////////////////////////////////////////////
//
// Standard C Test function
//
//////////////////////////////////////////////////////////////

void snapTAB();                   // ARX callbacks
//void zoomExtents();
//void zoomExtents();
void moveview();
BOOL filterTAB(MSG *pMsg);      // hook function for capsing.


// preventing from inserting the same hook twice.
static BOOL TABDone = FALSE;
static long px=0;
static long py=0;

/*static struct resbuf wcs, ucs;*/ // 转换坐标时使用的坐标系统标记
//////////////////////////////////////////////////////////////
//
// Rx interface
//
//////////////////////////////////////////////////////////////


void initApp()
{
////snapTAB();
  acedRegCmds->addCommand( "MKEvents",      // Group name
                           "caps",      // Global function name
                           "caps",          // Local function name
                           ACRX_CMD_MODAL,    // Type
                           &snapTAB );         // Function pointer
 
  //acutPrintf( ".OK!\n" );

}

void unloadApp()
{
 
  if (TABDone == TRUE)
      acedRemoveFilterWinMsg(filterTAB);


}


//////////////////////////////////////////////////////////////
//
// Entry point
//
//////////////////////////////////////////////////////////////

extern "C" AcRx::AppRetCode acrxEntryPoint( AcRx::AppMsgCode msg, void* pkt)
{
  switch( msg )
  {
    case AcRx::kInitAppMsg:
      //initApp();
  snapTAB();
  acrxUnlockApplication(pkt);
  acrxDynamicLinker->registerAppMDIAware(pkt);
  acutPrintf( ".OK!\n" );
      break;
    case AcRx::kUnloadAppMsg:
      unloadApp();
      break;
    default:
      break;
  }
  return AcRx::kRetOK;
}

//////////////////////////////////////////////////////////////

BOOL filterTAB(MSG *pMsg)
{   
    // Change All lowercase to caps!!
    if (pMsg->message == WM_CHAR && pMsg->wParam == 9)//TAB键
 {

 moveview();

 }else if (pMsg->message == WM_MOUSEMOVE || pMsg->message == WM_LBUTTONDOWN
  || pMsg->message == WM_LBUTTONUP){
     px=LOWORD(pMsg->lParam);
     py=HIWORD(pMsg->lParam);
  }
    return FALSE; // continue
}


void snapTAB()
{
    if (TABDone == TRUE) // already has the hook??
      return;
    acutPrintf( "Capsing...\n" );
    if (acedRegisterFilterWinMsg(filterTAB) == FALSE)
        acutPrintf("Can't register Windows Msg hook - Lower->upper\n");
    else
      TABDone = TRUE;
}

void moveview()
{
//acutPrintf("移动视口!\n");
//本函数用来移动视口
 struct resbuf wcs, ucs; // 转换坐标时使用的坐标系统标记
 wcs.restype = RTSHORT; wcs.resval.rint = 0;
 ucs.restype = RTSHORT; ucs.resval.rint = 1;
 double screenx,screeny,vscal;// 1/2 屏幕 宽高 比例:像素/图形单位
 struct resbuf viewctr1 ;
 double vhight,vwidth;
 ads_point  ptCurrent;

 AcGePoint2d center_2d,ocenter_2d;//前一个为待移动的中心点 后一个为当前中心点
 acedGetVar("screensize",&viewctr1);//二维点 以像素为单位存储当前视口的大小
 screenx=viewctr1.resval.rpoint[X]/2;// 1/2 屏幕 宽
 screeny=viewctr1.resval.rpoint[Y]/2;// 1/2 屏幕 高
 
 acedGetVar("viewsize",&viewctr1);//类型:实数 按图形单位存储当前视口的高度。
 vhight=viewctr1.resval.rreal;//当前视口的高度 类型:实数
 vscal=screeny/vhight*2;//比例:像素/图形单位
 vwidth= screenx/vscal ;//当前视口的宽度 类型:实数

 //*********************************************************************
 acedGetVar("viewctr",&viewctr1);
 //类型:三维点 存储当前视口中视图的中心点。该值用 UCS 坐标表示。
 ocenter_2d[X]=viewctr1.resval.rpoint[X];
 ocenter_2d[Y]=viewctr1.resval.rpoint[Y];
 //*************************************************************
 ptCurrent[X]=(px-screenx)/vscal+ocenter_2d[X];
 ptCurrent[Y]=(screeny-py)/vscal+ocenter_2d[Y];
 acedTrans(ptCurrent,  &ucs, &wcs, 0, ptCurrent);
 center_2d[X]=ptCurrent[X];
 center_2d[Y]=ptCurrent[Y];

 AcDbViewTableRecord view ;// view2;
 view.setCenterPoint (center_2d);

 view.setHeight(vhight);//设定图形单位高
 view.setWidth(vwidth);//设定图形单位宽
 
 //acutPrintf("调用!x:%lf Y:%lf\n" ,vwidth,vhight);
 acedSetCurrentView (&view, NULL);//NULL

 acdbHostApplicationServices()->workingDatabase()->updateExt(TRUE);//TRUE
}

发表于 2008-5-12 18:29:00 | 显示全部楼层

我这里出现很多错误

--------------------Configuration: pretranslate - Win32 Debug--------------------
Linking...
   Creating library .\Debug/pretranslate.lib and object .\Debug/pretranslate.exp
LINK : warning LNK4098: defaultlib "msvcrt.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
rxtemplt.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall AcDbViewTableRecord::~AcDbViewTableRecord(void)" (??1AcDbViewTableRecord@@UAE@XZ)
rxtemplt.obj : error LNK2001: unresolved external symbol "public: enum Acad::ErrorStatus __thiscall AcDbDatabase::updateExt(bool)" (?updateExt@AcDbDatabase@@QAE?AW4ErrorStatus@Acad@@_N@Z)
rxtemplt.obj : error LNK2001: unresolved external symbol "public: void __thiscall AcDbAbstractViewTableRecord::setWidth(double)" (?setWidth@AcDbAbstractViewTableRecord@@QAEXN@Z)
rxtemplt.obj : error LNK2001: unresolved external symbol "public: void __thiscall AcDbAbstractViewTableRecord::setHeight(double)" (?setHeight@AcDbAbstractViewTableRecord@@QAEXN@Z)
rxtemplt.obj : error LNK2001: unresolved external symbol "public: void __thiscall AcDbAbstractViewTableRecord::setCenterPoint(class AcGePoint2d const &)" (?setCenterPoint@AcDbAbstractViewTableRecord@@QAEXABVAcGePoint2d@@@Z)
rxtemplt.obj : error LNK2001: unresolved external symbol "public: __thiscall AcDbViewTableRecord::AcDbViewTableRecord(void)" (??0AcDbViewTableRecord@@QAE@XZ)
.\pretranslate.arx : fatal error LNK1120: 6 unresolved externals
Error executing link.exe.

pretranslate.arx - 7 error(s), 1 warning(s)

发表于 2008-5-12 18:30:00 | 显示全部楼层

这是工程文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2008-5-13 08:51:00 | 显示全部楼层

看到下面的文字吗?

附上工程中唯一的CPP文件,用它来替代SDK下pretranslate中的CPP文件再编译即可

 楼主| 发表于 2008-5-13 09:28:00 | 显示全部楼层

问题出在引入的库文件上面,可能是有些库文件没引用,我用的的SDK2006,没法调试,我看了一下,你的调试版本和发布版本引入的库不一样。

你用下面的试试

acad.lib
rxapi.lib
acedapi.lib
acrx15.lib
acutil15.lib
acdb15.lib

发表于 2008-5-13 09:54:00 | 显示全部楼层

还是有很多错误:

--------------------Configuration: pretranslate - Win32 Debug--------------------
Linking...
   Creating library .\Debug/pretranslate.lib and object .\Debug/pretranslate.exp
rxtemplt.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: double & __thiscall AcGePoint2d::operator[](unsigned int)" (__imp_??AAcGePoint2d@@QAEAANI@Z)
rxtemplt.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall AcGePoint2d::AcGePoint2d(void)" (__imp_??0AcGePoint2d@@QAE@XZ)
.\pretranslate.arx : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

 楼主| 发表于 2008-5-13 16:33:00 | 显示全部楼层

acge15.lib
这个呢?

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-29 07:08 , Processed in 0.182881 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表