LOGO
帮助文档
旧版文档
简介运行控件函数说明
简介

在本教程的准备文件中已备好所需头文件及源文件,如下所示:


    教程  MyCFilter.h

    教程  MyCFilter.cpp


在本教程中,我们使用控件\MxDraw52\Src\MxDraw5.2\samples\Edit项目进行添加自定义实体演示。

运行控件

运行VS,打开“Edit”项目,添加MyCFilter类(本教程使用已准备好的文件)。在 TestCommands.cpp 头文件中包含“MyCFilter.h”,并在 CTestCommands 类的RegisterCommand函数下调用 MyFilterByMrxDbgSelSet 类的RegisterCommand函数。


    在上述操作中,我们将类及其命令注册进了控件系统,而后我们将调用命令来实现过滤。

    在本实例中,我们将使用构造选择集(MrxDbgSelSet类)进行过滤,该类封装了选择集及其处理函数,支持如下过滤条件,且当对象被析构的时候,将自动释放选择集。


参数类型类型
RTDXF0TEXT文字
MTEXT多行文字
CIRCLE
ARC圆弧
LINE线
LWPOLYLINE多段线
INSERT图块
ELLIPSE椭圆
SPLINE样条线
LinkLine超链接
8图层
2图块
-4通配符
62颜色
-3扩展数据
函数说明

接下来将解释MyCFilter类下的命令及其过滤的含义。


userSelect function


作用:与用户交互,选择实体。


接口SelSetStatus userSelect(const resbuf * filter = NULL);

参数


名称说明

filter

过滤表


参考例程


void MyFilterByMrxDbgSelSet::SelSetByIN()
{
MrxDbgSelSet ss;
 
auto eResult = ss.userSelect();
McDbObjectIdArray vId;
ss.asArray(vId);
 
PrintVecEntName(vId);
}


allSelect function


作用:选择全部实体。


接口SelSetStatus allSelect(const resbuf * filter = NULL);


参数


名称说明

filter

过滤表


参考例程


void MyFilterByMrxDbgSelSet::SelSetByX()
{
MrxDbgSelSet ss;
auto eResult = ss.allSelect();
McDbObjectIdArray vId;
ss.asArray(vId);
 
PrintVecEntName(vId);
}


userSelect function


作用:与用户交互,选择实体。


接口SelSetStatus userSelect(LPCTSTR selectPrompt, LPCTSTR removePrompt, const resbuf * filter = NULL);


参数


名称说明

selectPrompt

选择对象时的提示

removePrompt

从选择集中删除对象时的提示(没用)

filter

过滤表


参考例程


void MyFilterByMrxDbgSelSet::SelSetByIN1()
{
MrxDbgSelSet ss;
 
auto eResult = ss.userSelect(L"提示1", L"删除1");
McDbObjectIdArray vId;
ss.asArray(vId);
 
PrintVecEntName(vId);
}


impliedSelect function


作用:返回当前图上已经选择的实体。


接口SelSetStatus impliedSelect(const resbuf * filter = NULL);


参数


名称说明

filter

过滤表


参考例程


void MyFilterByMrxDbgSelSet::SelSetByI()
{
MrxDbgSelSet ss;
auto eResult = ss.impliedSelect();
McDbObjectIdArray vId;
ss.asArray(vId);
 
PrintVecEntName(vId);
}


crossingSelect function


作用:由p1,p2交叉框选实体,实体在pt和p2组成的矩形框内或与矩形框边线相交都放入选择集。


接口SelSetStatus crossingSelect(

          const McGePoint3d & pt1

          const McGePoint3d & pt2

          const resbuf * filter = NULL

      );


参数


名称说明

pt1

矩形窗口的第一个角点,UCS坐标

pt2

矩形窗口的第二个角点,UCS坐标

filter

过滤表


参考例程


void MyFilterByMrxDbgSelSet::SelSetByW()
{
MrxDbgSelSet ss;
auto eResult = ss.crossingSelect(
McGePoint3d(0, 0, 0),
McGePoint3d(100, 100, 0));
McDbObjectIdArray vId;
ss.asArray(vId);
 
PrintVecEntName(vId);
}


crossingPolygonSelect function


作用:指向一个点链表,点集合组成一个多边形区域,在这个区域内的和多边形的边相交的实体都放入到选择集中。


接口SelSetStatus crossingPolygonSelect(const McGePoint3dArray & ptArray, const resbuf * filter = NULL);


参数


名称说明
ptArray

构成多边形的点表,UCS坐标

filter

过滤表


参考例程


void MyFilterByMrxDbgSelSet::SelSetByCP()
{
MrxDbgSelSet ss;
McGePoint3dArray vecPos;
vecPos.append(McGePoint3d(-195, 270, 0));
vecPos.append(McGePoint3d(490, 395, 0));
vecPos.append(McGePoint3d(436, -124, 0));
vecPos.append(McGePoint3d(-76, -60, 0));
vecPos.append(McGePoint3d(-238, 54, 0));
vecPos.append(McGePoint3d(-195, 270, 0));
 
auto eResult = ss.crossingPolygonSelect(vecPos);
McDbObjectIdArray vId;
ss.asArray(vId);
 
PrintVecEntName(vId);
}


lastSelect function


作用:选择最后一次选择的实体。


接口SelSetStatus lastSelect(const resbuf * filter = NULL);


参数


名称说明
filter

过滤表


参考例程


void MyFilterByMrxDbgSelSet::SelSetByLast()
{
MrxDbgSelSet ss;
auto eResult = ss.lastSelect();
McDbObjectIdArray vId;
ss.asArray(vId);
 
PrintVecEntName(vId);
}


pointSelect function


作用:根据光标所在位置,选择靶框内的实体。


接口SelSetStatus pointSelect(const McGePoint3d & pt1, const resbuf * filter = NULL);


参数


名称说明
pt1

要构造选择集的目标点,UCS坐标

filter

过滤表


参考例程


void MyFilterByMrxDbgSelSet::SelSetByPt()
{
MrxDbgSelSet ss;
auto eResult = ss.pointSelect(McGePoint3d(-48, 135, 0));
McDbObjectIdArray vId;
ss.asArray(vId);
 
PrintVecEntName(vId);
}


SelSetBySetHight function


作用:设置mcedSSGet函数执行用户选择时,被选择的对象的高亮显示回调函数。


接口void setHighlightCallback(

          bool (*pSSGetHighlightFunPtr)(

              IN McDbEntity pEnt

              IN bool isHighlight

              IN void * pUserData),

          void * pUserData = NULL

      );


参数


名称说明
pSSGetHighlightFunPtr

回调函数的指针

pEnt

选择的实体

isHighlight

是否高亮

pUserData

用户自定义数据,将从回调函数中传入


参考例程


bool SS9Test(IN McDbEntity * pEnt, IN bool isHighlight, IN void * pUserData)
{
int * sEnt = static_cast<int*>(pUserData);
 
McDbExtents cRect;
pEnt->getGeomExtents(cRect);
 
McDbLine * pLine1 = new McDbLine(cRect.minPoint(), cRect.maxPoint());
McDbLine * pLine2 = new McDbLine(
McGePoint3d(cRect.minPoint().x, cRect.maxPoint().y, 0),
McGePoint3d(cRect.maxPoint().x, cRect.minPoint().y, 0));
 
MrxDbgUtils::addToCurrentSpaceAndClose(pLine1);
MrxDbgUtils::addToCurrentSpaceAndClose(pLine2);
 
vId.push_back(pLine1->objectId());
vId.push_back(pLine2->objectId());
 
return false;
}
 
void MyFilterByMrxDbgSelSet::SelSetBySetHight()
{
MrxDbgSelSet ss;
int iLen(10);
ss.setHighlightCallback(SS9Test, &iLen);
ss.userSelect();
McDbObjectIdArray arrayId;
ss.asArray(arrayId);
 
std::for_each(vId.begin(), vId.end(), [](McDbObjectId id) {
McDbObjectPointer<McDbEntity> spEnt(id, McDb::kForWrite);
if (spEnt.openStatus() != Mcad::eOk)
return;
spEnt->erase();
});
 
PrintVecEntName(arrayId);
}


SelSetBySetHight function


作用:创建一个链表数据,该函数是变参数的,可以一下传入多个链表数据,返回的链表数据在不使用时调用mcutRelRb释放内存。


接口ARXDLL struct resbuf * mcutBuildList (int rtype, ...);


参数


名称说明

rtype

参数类型

...

变参数


参考例程


void MyFilterByMrxDbgSelSet::MrxDbgfilter()
{
auto FuncSelect = [](resbuf * pFilter)
{
MrxDbgSelSet ss;
ss.allSelect(pFilter);
 
Mx::mcutRelRb(pFilter);
 
McDbObjectIdArray vId;
ss.asArray(vId);
 
PrintVecEntName(vId);
};
 
auto FuncEnt = [&FuncSelect](int rType, CString pStr)
{
FuncSelect(Mx::mcutBuildList(rType, pStr, 0));
};
 
auto FuncEnt1 = [&FuncSelect](
int rType0, CString pStr0,
int rType1, CString pStr1,
bool isOr
)
{
if (isOr)
{
FuncSelect(Mx::mcutBuildList(
-4, _T("<OR"), rType0, pStr0,
rType1, pStr1, -4, _T("OR>"),
0));
}
else
{
FuncSelect(Mx::mcutBuildList(
 -4, _T("<AND"), rType0, pStr0,
rType1, pStr1, -4, _T("AND>"),
0));
}
};
 
 
 
//基本类型
FuncEnt(RTDXF0, _T("TEXT"));
FuncEnt(RTDXF0, _T("MTEXT"));
FuncEnt(RTDXF0, _T("CIRCLE"));
FuncEnt(RTDXF0, _T("ARC"));
FuncEnt(RTDXF0, _T("LINE"));
FuncEnt(RTDXF0, _T("LWPOLYLINE"));
FuncEnt(RTDXF0, _T("INSERT"));
FuncEnt(RTDXF0, _T("ELLIPSE"));
FuncEnt(RTDXF0, _T("SPLINE"));
FuncEnt(RTDXF0, _T("TEXT,CIRCLE,SPLINE"));
 
//图层
FuncEnt(8, _T("TEST1"));
FuncEnt(8, _T("TEST3"));
 
//图块
FuncEnt(2, _T("123"));
 
//  //“或”连接
  FuncEnt1(RTDXF0, _T("TEXT"), 8, _T("TestColor1"), true);
  FuncEnt1(RTDXF0, _T("CIRCLE"), 8, _T("TestColor1"), true);
  FuncEnt1(RTDXF0, _T("CIRCLE"), RTDXF0, _T("TEXT"), true);
 
//  //“与”连接
FuncEnt1(RTDXF0, _T("TEXT"), 8, _T("TestColor1"), false);
FuncEnt1(RTDXF0, _T("CIRCLE"), 8, _T("TestColor1"), false);
}


    注意:在上述的滤过演示中,我们根据“基本类型”、“图层”、“图块”及“按位OR”和“按位AND”,在过滤时,我们需要在参数中填入类型,而在后跟类型名,如只选择文字时,我们需要在第一个参数填入“RTDXF0”,而在下一个参数填入类型,这里的类型如都是输入“RTDXF0”类型下的基本类型,则可以使用逗号隔开进行填入, 而在连接符号中,我们需要使用成对的符号进行填写,如选择“基本类型”中的“TEXT”且在“TestColor1”层时,我们需要写成:


Mx::mcutBuildList(
 -4, _T("<AND"), RTDXF0,  _T("TEXT"),
 8, _T("TestColor1"), -4, _T("AND>"),
0));


在“按位与”的条件中,我们要将同时存在的类型放在"<AND"与"AND>"之中,筛选条件必须以“0”结束,且参数链表需要通过

ARXDLL int            mcutRelRb (struct resbuf *rb)


进行释放。