找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1835|回复: 7

[求助] 函数调用!

[复制链接]
发表于 2014-9-5 16:09:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
我把论坛上rave版主帖子里面的一个函数加入Hello.cpp的里面,想尝试调用,编译器说函数selectEntityInLayer的参数不对,那位兄台帮我看看,告诉我该怎样填写这个参数!

// 测试.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include <aced.h>
#include <rxregsvc.h>
#include <migrtion.h>
#include <dbsymtb.h>
#include <dbapserv.h>
#include <string.h>
#include <dbmain.h>
#include <cstringt.h>
#include <atlstr.h>
#include <dbidar.h>
#include <crtdbg.h>
//#include <acedxref.h>


//定义两个函数
void initApp();
void unloadApp();
void helloWorld();

//遍历容器
Acad::ErrorStatus  selectEntityInLayer(
                                                                           CString nLayerName,
                                                                           AcDbObjectIdArray& nIDs,
                                                                           bool nModelSpace
                                                                           );

void initApp()
{
        //register a command with the AutoCAD command mechanism
        acedRegCmds->addCommand(ACRX_T("HELLOWORLD_COMMANDS"),
                ACRX_T("Hello"),
                ACRX_T("Bonjour"),
                ACRX_CMD_TRANSPARENT,
                //helloWorld);
        selectEntityInLayer("0",AcDbObjectIdArray& nIDs,bool nModelSpace));
}





void helloWorld()  
{  
        acutPrintf(ACRX_T("\nHello World!"));  
}



//************************************************************************
//函数名称:selectEntityInLayer
//函数类型:Acad::ErrorStatus
//返回值:
//功能描述:选择指定层上的实体,得到其对象属性标识符!
//函数作者:Darcy
//创建日期:200X-XX-XX
//参数列表:
//变量名:nLayerName      变量类型:CString               变量说明:
//变量名:nIDs            变量类型:AcDbObjectIdArray&    变量说明:
//变量名:nModelSpace     变量类型:bool                  变量说明:
//************************************************************************
Acad::ErrorStatus    selectEntityInLayer(
                                         CString nLayerName,
                                         AcDbObjectIdArray& nIDs,
                                         bool nModelSpace
                                         )
{
    Acad::ErrorStatus es=Acad::eOk;

    AcDbBlockTable*        pBlockTable=NULL;
    AcDbBlockTableRecord*  pSpaceRecord=NULL;
    if (acdbHostApplicationServices()->workingDatabase()==NULL)
        return Acad::eNoDatabase;
    if ((es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead))==Acad::eOk)
    {
        char entryName[13];
        if (nModelSpace)
            strcpy(entryName,(const char*)ACDB_MODEL_SPACE);
        else
            strcpy(entryName,(const char*)ACDB_PAPER_SPACE);
        //Get the Model or Paper Space record and open it for read:  
        if ((es = pBlockTable->getAt((const wchar_t* )entryName, pSpaceRecord, AcDb::kForRead))==Acad::eOk)
        {
                AcDbBlockTableRecordIterator* pIter;
                if (pSpaceRecord->newIterator(pIter)==Acad::eOk)
                {
                    for (pIter->start();!pIter->done();pIter->step())
                    {
                        char *name=NULL;
                        AcDbEntity* pEntity;
                        if (pIter->getEntity(pEntity,AcDb::kForRead)==Acad::eOk)
                        {
                            name=(char*)pEntity->layer();
                            if (nLayerName.CompareNoCase(name)==0)
                                nIDs.append(pEntity->objectId());

                            pEntity->close();
                            acutDelString(name);
                        }
                    }
                    delete pIter;
                }            
                pSpaceRecord->close();
        }   
        pBlockTable->close();
    }

    return es;
}
void unloadApp()
{
        acedRegCmds->removeGroup(ACRX_T("HELLOWORLD_COMMANDS"));
}

extern "C"
AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
//void acrxEntryPoint(void* pkt)
{
        switch (msg)
        {
        case AcRx::kInitAppMsg:
                acrxDynamicLinker->unlockApplication(pkt);
                acrxRegisterAppMDIAware(pkt);
                initApp();

                break;
        case AcRx::kUnloadAppMsg:
                unloadApp();
                break;
        default:
                break;
        }
        return AcRx::kRetOK;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-5 16:12:23 | 显示全部楼层
你是怎么调用的,把你的代码贴上来,另外多看下编译器的信息,都提示你是什么原因过不了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-5 16:18:58 | 显示全部楼层
上面就是代码,调用那句在这里
void initApp()
{
        //register a command with the AutoCAD command mechanism
        acedRegCmds->addCommand(ACRX_T("HELLOWORLD_COMMANDS"),
                ACRX_T("Hello"),
                ACRX_T("Bonjour"),
                ACRX_CMD_TRANSPARENT,
                //helloWorld);
        selectEntityInLayer("0",AcDbObjectIdArray& nIDs,bool nModelSpace));
}
就是最后一句,selectEntityInLayer("0",AcDbObjectIdArray& nIDs,bool nModelSpace));
我看函数介绍,第一个参数是图层,Cstring型,我填的是“0”层,第二个和第三参数就不懂了,直接不管他,编译器告诉我" nIDs",未定义!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-5 16:29:35 | 显示全部楼层
首先你的代码不应该放到INITAPP里面,这段是在ACAD运行时候首先运行的的部分。你要放到定义的命令 HELLOWORLD_COMMANDS 里面。


另外:

selectEntityInLayer("0",AcDbObjectIdArray& nIDs,bool nModelSpace));

由于是UNICODE,你不能直接用“0”, 要改为:_T("0")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-5 16:39:03 | 显示全部楼层
那第二个参数和第三个参数怎么赋值呢?

点评

调用函数前,你要声明变量 CString lyrName; AcDbObjectIdArray mIds; lyrname=_T("0"); select....(lyrname,mIds,true) 选择的实体给你放到ID数组mIds里面了,你可以遍历这个数组进行其他操作。  详情 回复 发表于 2014-9-5 16:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-5 16:47:41 | 显示全部楼层
hh13123 发表于 2014-9-5 16:39
那第二个参数和第三个参数怎么赋值呢?

调用函数前,你要声明变量

CString lyrName;
AcDbObjectIdArray mIds;

lyrname=_T("0");

select....(lyrname,mIds,true)

选择的实体给你放到ID数组mIds里面了,你可以遍历这个数组进行其他操作。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-6 22:52:27 | 显示全部楼层
谢谢老大,编译是通过了,但遍历结果不对,正在研究,再次谢谢!

点评

说下哪个地方不对? 把你所有的代码都贴上来吧。  详情 回复 发表于 2014-9-7 00:24
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-7 00:24:22 | 显示全部楼层
hh13123 发表于 2014-9-6 22:52
谢谢老大,编译是通过了,但遍历结果不对,正在研究,再次谢谢!

说下哪个地方不对?

把你所有的代码都贴上来吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-10 05:42 , Processed in 0.188306 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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