注册 登录
明经CAD社区 返回首页

风树的个人空间 http://www.mjtd.com/?408117 [收藏] [复制] [分享] [RSS]

日志

(源码)选择操作相关的一些函数

热度 1已有 835 次阅读2013-11-19 15:46 |系统分类:应用

提供给想学习arx和刚入门的同学一些参考例子。

刚学的时候模仿着做的,比较乱,各种不好,抱着能用就行的想法,没有细纠,反正用的时候暂时没发现问题。
部分说明有可能有出入,请自行检查。

//头文件和实现文件如下
#pragma once
#ifndef _Select_h_ 
#define _Select_h_ 
namespace xtcow
{
#define CAD_Select_TEMPLATE_ template<typename ELEMTYPE >
#define CAD_Select_QUAL_ Select< ELEMTYPE >//
template<typename ELEMTYPE >
class Select
{
public:
static bool read_real_from_cad(double &nReturn,std::wstring tishi_show);
static bool read_int_from_cad(int &nReturn,std::wstring tishi_show);
static bool get_point_from_cad(AcGePoint3d &point,std::wstring tishi_show);

//提示的形式获得一个实体id
static AcDbObjectId get_entity(void);
static bool get_entity(ELEMTYPE *&fanhui,std::wstring tishi_show,bool ForWrite=1);//

//用鼠标点取多个对象,提去指定类型的对象
static bool get_entity_simple(std::vector<ELEMTYPE*> &fanhui,std::wstring tishi_show=_T(""),bool ForWrite=0,bool add_to_fanhui=0);
static bool get_entity_simple(std::set<ELEMTYPE*> &fanhui,std::wstring tishi_show=_T(""),bool ForWrite=0,bool add_to_fanhui=0);
static bool get_entity_simple_IdArray(AcDbObjectIdArray &fanhui,bool ForWrite=0,std::wstring tishi_show=_T(""),bool add_to_fanhui=0);

//提示从图上框选指定类型的实体(不会遍历参照)
static bool get_entity_in_active_datebase_by_rectang(std::vector<ELEMTYPE*> &fanhui,AcGePoint3d &minpoint,AcGePoint3d &maxpoint,bool ForWrite=1);
static bool get_entity_simple(AcDbObjectIdArray &fanhui,AcGePoint3d &minpoint,AcGePoint3d &maxpoint,bool ForWrite=1);//改好
static bool get_entity_simple_in_active_datebase_IdArray(AcDbObjectIdArray &fanhui,bool ForWrite=0,std::wstring tishi_show=_T(""),bool add_to_fanhui=0);

//从cad图上选择所有实体,从中提取出T类的实体(cad命令行中有提示)
//例如,你提取的时曲线,如果选择范围内有参照,程序也将返回在参照中的曲线,同时在参照中返回的实体已经加入了模型空间。
//参照中提取的对象复制保存到in_AcDbBlockReference中,未加入模型空间
static bool get_entity_copy_in_active_datebase(AcDbObjectIdArray &fanhui,std::vector< ELEMTYPE* > &in_AcDbBlockReference,std::wstring tishi_show,bool ForWrite,bool add_to_fanhui=0);//改好
//返回全图所有ELEMTYPE,在块内的ELEMTYPE返回他的拷贝。
   static bool get_entity_copy_in_active_datebase(std::vector< ELEMTYPE* > &all_,std::wstring tishi_show,bool ForWrite,bool add_to_fanhui=0);
//一定要以AcDbEntity为模版参数,提取指定范围内的所有实体的拷贝(含参照内,但不进行裁剪)
static bool get_entity_copy_in_active_datebase_by_rectang(std::vector<ELEMTYPE*> &fanhui,AcGePoint3d &minpoint,AcGePoint3d &maxpoint);

//从selected中提取对应id的ELEMTYPE指针,该指针在原来容器中仍然保留
static ELEMTYPE* get_specified_id_entity_from_the_container(AcDbObjectId one,std::vector<ELEMTYPE*> &selected);
static void remove_specified_entity_from_the_container(ELEMTYPE *one,std::vector<ELEMTYPE*> &selected);
static void remove_specified_entity_from_the_container(ELEMTYPE *one,std::set<ELEMTYPE*> &selected);
//未试
static Acad::ErrorStatus select_entity_by_lay(AcDbObjectIdArray &selected,std::wstring nLayerName,bool ForWrite=1);//在指定层选择T类实体//改好
//从cad图上提示用户选择一条闭合多段线,作为选择cad图上实体的范围线,提取范围内的T类实体
static void get_circle_that_less_then_specified_radius(std::vector< ELEMTYPE* > &Fanhui_DbEntity, std::vector< ELEMTYPE* > &Shuru_DbEntity,double radius);
static void get_specified_radius_circle(std::vector< ELEMTYPE* > &Fanhui_DbEntity,std::vector< ELEMTYPE* > &Shuru_DbEntity,double r);
static bool get_entity_from_region(std::vector<ELEMTYPE*> &selected);//没用
};

CAD_Select_TEMPLATE_
bool  CAD_Select_QUAL_::read_real_from_cad(double &nReturn,std::wstring tishi_show)
{
int Re = acedGetReal(tishi_show.c_str(), &nReturn);
if (Re != RTNORM)
{
acutPrintf(_T("\n用户取消操作"));
return 0;
}
return 1;
}
CAD_Select_TEMPLATE_
bool  CAD_Select_QUAL_::read_int_from_cad(int &nReturn,std::wstring tishi_show)
{
if (acedGetInt(tishi_show.c_str(), &nReturn) != RTNORM)
{
acutPrintf(_T("\n用户取消操作"));
return 0;
}
return 1;
}
CAD_Select_TEMPLATE_
bool  CAD_Select_QUAL_::get_point_from_cad(AcGePoint3d &point,std::wstring tishi_show)
{
ads_name entname;
ads_point ptres;
//提示用户输入一个点
ads_point pt;
if(acedGetPoint(NULL,tishi_show.c_str(),pt)!=RTNORM)
{
acutPrintf(_T("\n用户取消操作"));
return 0;
}else
{
point=asPnt3d(pt);
return 1;
}
}


//功能:选择指定实体的id
CAD_Select_TEMPLATE_
AcDbObjectId  CAD_Select_QUAL_::get_entity(void)
{
ads_name en;
ads_point pt;
acedEntSel(_T("\n请选择一个实体:"), en, pt);
AcDbObjectId fanhui_;
acdbGetObjectId(fanhui_,en);
return fanhui_;
}

//功能描述://在提供的圆实体对象中获得指定半径的实体,并将选中的在原有数组中删除
CAD_Select_TEMPLATE_
void CAD_Select_QUAL_::get_specified_radius_circle(std::vector< ELEMTYPE* > &Fanhui_DbEntity,std::vector< ELEMTYPE* > &Shuru_DbEntity,double r)
{
Acad::ErrorStatus es=Acad::eOk;
Fanhui_DbEntity.clear();
if (Shuru_DbEntity.size()==0||((es=AcDbCircle::cast(*(Shuru_DbEntity.begin()))))!=Acad::eOk)
{
return ;
}
std::vector< ELEMTYPE* >::iterator pt_Shuru_DbEntity=Shuru_DbEntity.begin();
for (;pt_Shuru_DbEntity!=Shuru_DbEntity.end();)
{
if ((*pt_Shuru_DbEntity)->radius()==r) //圆的半径
{
Fanhui_DbEntity.push_back(*pt_Shuru_DbEntity);
pt_Shuru_DbEntity=Shuru_DbEntity.erase(pt_Shuru_DbEntity);
}
else
{
pt_Shuru_DbEntity++;
}
}
if (es!=Acad::eOk)
{
acutPrintf(_T("\nget_specified_radius_circle_from_the_container出现问题"));
}
return ;
}
CAD_Select_TEMPLATE_
void CAD_Select_QUAL_::get_circle_that_less_then_specified_radius(std::vector< ELEMTYPE* > &Fanhui_DbEntity, std::vector< ELEMTYPE* > &Shuru_DbEntity,double radius)
{
Acad::ErrorStatus es=Acad::eOk;
Fanhui_DbEntity.clear();
if (Shuru_DbEntity.size()==0||((es=AcDbCircle::cast(*(Shuru_DbEntity.begin()))))!=Acad::eOk)
{
return ;
}
std::vector< ELEMTYPE* >::iterator pt_Shuru_DbEntity=Shuru_DbEntity.begin();
for (;pt_Shuru_DbEntity!=Shuru_DbEntity.end();pt_Shuru_DbEntity++)
{
if ((*pt_Shuru_DbEntity)->radius()<=radius) //圆的半径
{
Fanhui_DbEntity.push_back(*pt_Shuru_DbEntity);
pt_Shuru_DbEntity=Shuru_DbEntity.erase(pt_Shuru_DbEntity);
}
else
{
pt_Shuru_DbEntity++;
}
}
if (es!=Acad::eOk)
{
acutPrintf(_T("\nget_circle_that_less_then_specified_radius出现问题"));
}
return ;
}
CAD_Select_TEMPLATE_
ELEMTYPE* CAD_Select_QUAL_::get_specified_id_entity_from_the_container(AcDbObjectId one,std::vector<ELEMTYPE*> &selected)
{
std::vector<ELEMTYPE*>::iterator begin=selected.begin();
for(;begin!=selected.end();begin++)
{
if ((*begin)==NULL)
{
continue;
}
if ((*begin)->id()==one)
{
return *begin;
}
}
return NULL;
}
CAD_Select_TEMPLATE_
void CAD_Select_QUAL_::remove_specified_entity_from_the_container(ELEMTYPE *one,std::vector<ELEMTYPE*> &selected)
{
if (one==NULL||selected.size()==0)
{
return;
}
std::vector<ELEMTYPE*>::iterator find=std::find(selected.begin(),selected.end(),one);
if (find!=selected.end())
{
(*find)->close();
selected.erase(find);
}
}
CAD_Select_TEMPLATE_
void CAD_Select_QUAL_::remove_specified_entity_from_the_container(ELEMTYPE *one,std::set<ELEMTYPE*> &selected)
{
if (one==NULL||selected.size()==0)
{
return;
}
std::set<ELEMTYPE*> find=selected.find(one);
if (find!=selected.end())
{
(*find)->close();
selected.erase(find);
}
}
//功能:选择指定类型T的实体
CAD_Select_TEMPLATE_
bool CAD_Select_QUAL_::get_entity(ELEMTYPE*&fanhui_,std::wstring tishi_show,bool ForWrite )
{
ads_name en;
ads_point pt;
if(RTNORM != acedEntSel(tishi_show.c_str(), en, pt))
{
acutPrintf(_T("\n没有选择任何实体!"));
return 0;
}
AcDbObjectId  objectId;
acdbGetObjectId(objectId,en);
AcDbEntity *pEntity=NULL;
if(ForWrite==1)
acdbOpenObject(pEntity, objectId,AcDb::kForWrite);//获得资源
else
acdbOpenObject(pEntity, objectId,AcDb::kForRead);//获得资源
int i=0;
if(pEntity!=0)
{
if (pEntity->isKindOf(ELEMTYPE::desc()))//
{
fanhui_=ELEMTYPE::cast(pEntity);
i=1;
}
else
{
pEntity->close();
i=0;
}

}
return i;

}
CAD_Select_TEMPLATE_
bool CAD_Select_QUAL_::get_entity_copy_in_active_datebase(AcDbObjectIdArray &fanhui,std::vector< ELEMTYPE* > &in_AcDbBlockReference,std::wstring tishi_show,bool ForWrite,bool add_to_fanhui=0)
{
if(add_to_fanhui==0) fanhui.removeAll();
acutPrintf(tishi_show.c_str());
ads_name ssname;
acedSSGet(NULL,NULL,NULL,NULL,ssname);////使用者建立选择集 ssname
///////////////////////////////////////提取选择集中所有的元素
AcDbObjectIdArray objectIdArray;//保存选择集中元素id
long len;
acedSSLength(ssname,&len);//提取ssname元素的个数
if(RTNORM != acedSSLength(ssname, &len) || len<=0 )
{
acutPrintf(_T("\n没有选择任何实体!"));
return 0;

}
/////////////////////////////////////////////
for(long i=0;i<len;i++)//提取ssname各元素,并保存到AcDbObjectIdArray中
{
AcDbObjectId objectId;//临时变量
ads_name entryName;//临时变量
acedSSName(ssname,i,entryName);
acdbGetObjectId(objectId,entryName);
AcDbEntity *pEntity=NULL;
if(ForWrite==1)
acdbOpenObject(pEntity, objectId,AcDb::kForWrite);//获得资源
else
acdbOpenObject(pEntity, objectId,AcDb::kForRead);//获得资源
if(pEntity==0) continue;
if (pEntity->isKindOf(ELEMTYPE::desc())||AcDbBlockReference::cast(pEntity))
{
if(pEntity->isKindOf(AcDbBlockReference::desc()))
{
AcGeMatrix3d m_;
recursive_procedure_for_copy(AcDbBlockReference::cast(pEntity),in_AcDbBlockReference,m_);//复制出所需的东西
}else if(pEntity->isKindOf(ELEMTYPE::desc()))
{
fanhui.append(objectId);
}
}
pEntity->close();
}
///////////////////////////////////////////////
acedSSFree(ssname);//释放选择集
//////////////////////////////////////////////
return 1;
}
CAD_Select_TEMPLATE_
bool CAD_Select_QUAL_::get_entity_copy_in_active_datebase(std::vector< ELEMTYPE* > &all_,std::wstring tishi_show,bool ForWrite,bool add_to_fanhui=0)
{
if(add_to_fanhui==0) all_.clear();
acutPrintf(tishi_show.c_str());
ads_name ssname;
acedSSGet(NULL,NULL,NULL,NULL,ssname);////使用者建立选择集 ssname
///////////////////////////////////////提取选择集中所有的元素
AcDbObjectIdArray objectIdArray;//保存选择集中元素id
long len;
acedSSLength(ssname,&len);//提取ssname元素的个数
if(RTNORM != acedSSLength(ssname, &len) || len<=0 )
{
acutPrintf(_T("\n没有选择任何实体!"));
return 0;

}
/////////////////////////////////////////////
for(long i=0;i<len;i++)//提取ssname各元素,并保存到AcDbObjectIdArray中
{
AcDbObjectId objectId;//临时变量
ads_name entryName;//临时变量
acedSSName(ssname,i,entryName);
acdbGetObjectId(objectId,entryName);
AcDbEntity *pEntity=NULL;
if(ForWrite==1)
acdbOpenObject(pEntity, objectId,AcDb::kForWrite);//获得资源
else
acdbOpenObject(pEntity, objectId,AcDb::kForRead);//获得资源
if(pEntity==0) 
continue;
if (pEntity->isKindOf(ELEMTYPE::desc())||AcDbBlockReference::cast(pEntity))
{
if(pEntity->isKindOf(AcDbBlockReference::desc()))
{
AcGeMatrix3d m_;
recursive_procedure_for_copy(AcDbBlockReference::cast(pEntity),all_,m_);//复制出所需的东西
       pEntity->close();
}else if(pEntity->isKindOf(ELEMTYPE::desc()))
{
all_.push_back((ELEMTYPE*)pEntity);
}
}
}
///////////////////////////////////////////////
acedSSFree(ssname);//释放选择集
//////////////////////////////////////////////
return 1;
}

CAD_Select_TEMPLATE_
bool CAD_Select_QUAL_::get_entity_copy_in_active_datebase_by_rectang(std::vector<ELEMTYPE*> &fanhui,AcGePoint3d &minpoint,AcGePoint3d &maxpoint)
{
fanhui.clear();
//提示用户输入一个点
ads_point pt,result;//分别为框选两角点
if(acedGetPoint(NULL,_T("请输入标记范围的一个角点"),pt)!=RTNORM) //第一角点选择
return 0;
if(acedGetCorner(pt,_T("请输入标记范围的另一个对角点"),result)!=RTNORM)//框选
return 0;
AcDbExtents extent_linshi;
extent_linshi.addPoint(AcGePoint3d(pt[0],pt[1],pt[2]));
extent_linshi.addPoint(AcGePoint3d(result[0],result[1],result[2]));

minpoint=extent_linshi.minPoint();
maxpoint=extent_linshi.maxPoint();
////////////////////////////////////////////////////////////
//提取对象
AcDbObjectIdArray fanhui_IdArray;
Select<AcDbEntity>::get_entity_simple(fanhui_IdArray,minpoint,maxpoint,0);
if(fanhui_IdArray.length()==0) 
{
acutPrintf(_T("\n选择集为空"));
return 0;

}
std::vector< AcDbEntity * > copy_1;
clone_entity(copy_1,fanhui_IdArray);//拷贝一份出来
//
/////////////////////////////////////////////
for(long i=0;i<copy_1.size();i++)//提取copy_1中各元素保存到linshi_total,(包括参照内的实体),并释放copy1中的资源
{
if ((ELEMTYPE::cast(copy_1[i])!=0)||AcDbBlockReference::cast(copy_1[i]))
{
if(copy_1[i]->isKindOf(AcDbBlockReference::desc()))
{
AcGeMatrix3d m_;
recursive_procedure_for_copy(AcDbBlockReference::cast(copy_1[i]),fanhui,m_);//复制出所需的东西
}else if(copy_1[i]->isKindOf(ELEMTYPE::desc()))
{
if(ELEMTYPE::cast(copy_1[i]->clone())!=0)
fanhui.push_back(ELEMTYPE::cast(copy_1[i]->clone()));
}
}
copy_1[i]->close();
}
return 1;

}
CAD_Select_TEMPLATE_
bool CAD_Select_QUAL_::get_entity_simple(std::vector<ELEMTYPE*> &fanhui,std::wstring tishi_show,bool ForWrite,bool add_to_fanhui=0)
{
acDocManager->lockDocument(acDocManager->curDocument(),AcAp::kWrite);//锁定
if(add_to_fanhui==0) fanhui.clear();
acutPrintf(tishi_show.c_str());
ads_name ssname;
acedSSGet(NULL,NULL,NULL,NULL,ssname);////使用者建立选择集 ssname
///////////////////////////////////////提取选择集中所有的元素
AcDbObjectIdArray objectIdArray;//保存选择集中元素id
long len;
acedSSLength(ssname,&len);//提取ssname元素的个数
if(RTNORM != acedSSLength(ssname, &len) || len<=0 )
{
acutPrintf(_T("\n没有选择任何实体!"));
acDocManager->unlockDocument(acDocManager->curDocument());//解除上面的锁定
return 0;

}
/////////////////////////////////////////////

for(long i=0;i<len;i++)//提取ssname各元素,并保存到AcDbObjectIdArray中
{
AcDbObjectId objectId;//临时变量
ads_name entryName;//临时变量
acedSSName(ssname,i,entryName);
acdbGetObjectId(objectId,entryName);
AcDbEntity *pEntity=NULL;
if(ForWrite==1)
acdbOpenObject(pEntity, objectId,AcDb::kForWrite);//获得资源
else
acdbOpenObject(pEntity, objectId,AcDb::kForRead);//获得资源
if(pEntity==0) continue;
if (pEntity->isKindOf(ELEMTYPE::desc()))
{
fanhui.push_back(ELEMTYPE::cast(pEntity));
}
else
{
pEntity->close();
}
}
///////////////////////////////////////////////
acedSSFree(ssname);//释放选择集
//////////////////////////////////////////////
acDocManager->unlockDocument(acDocManager->curDocument());//解除上面的锁定
return 1;
}

CAD_Select_TEMPLATE_
bool CAD_Select_QUAL_::get_entity_simple(std::set<ELEMTYPE*> &fanhui,std::wstring tishi_show,bool ForWrite,bool add_to_fanhui=0)
{
acDocManager->lockDocument(acDocManager->curDocument(),AcAp::kWrite);//锁定
if(add_to_fanhui==0) fanhui.clear();
acutPrintf(tishi_show.c_str());
ads_name ssname;
acedSSGet(NULL,NULL,NULL,NULL,ssname);////使用者建立选择集 ssname
///////////////////////////////////////提取选择集中所有的元素
AcDbObjectIdArray objectIdArray;//保存选择集中元素id
long len;
acedSSLength(ssname,&len);//提取ssname元素的个数
if(RTNORM != acedSSLength(ssname, &len) || len<=0 )
{
acutPrintf(_T("\n没有选择任何实体!"));
acDocManager->unlockDocument(acDocManager->curDocument());//解除上面的锁定
return 0;

}
/////////////////////////////////////////////

for(long i=0;i<len;i++)//提取ssname各元素,并保存到AcDbObjectIdArray中
{
AcDbObjectId objectId;//临时变量
ads_name entryName;//临时变量
acedSSName(ssname,i,entryName);
acdbGetObjectId(objectId,entryName);
AcDbEntity *pEntity=NULL;
if(ForWrite==1)
acdbOpenObject(pEntity, objectId,AcDb::kForWrite);//获得资源
else
acdbOpenObject(pEntity, objectId,AcDb::kForRead);//获得资源
if(pEntity==0) continue;
if (pEntity->isKindOf(ELEMTYPE::desc()))
{
fanhui.insert(ELEMTYPE::cast(pEntity));
}
else
{
pEntity->close();
}
}
///////////////////////////////////////////////
acedSSFree(ssname);//释放选择集
//////////////////////////////////////////////
acDocManager->unlockDocument(acDocManager->curDocument());//解除上面的锁定
return 1;
}

CAD_Select_TEMPLATE_
bool CAD_Select_QUAL_::get_entity_simple_IdArray(AcDbObjectIdArray &fanhui,bool ForWrite,std::wstring tishi_show,bool add_to_fanhui=0)
{
acDocManager->lockDocument(acDocManager->curDocument(),AcAp::kWrite);//锁定
if(add_to_fanhui==0) fanhui.removeAll();
acutPrintf(tishi_show.c_str());
ads_name ssname;
acedSSGet(NULL,NULL,NULL,NULL,ssname);////使用者建立选择集 ssname
///////////////////////////////////////提取选择集中所有的元素
AcDbObjectIdArray objectIdArray;//保存选择集中元素id
long len;
acedSSLength(ssname,&len);//提取ssname元素的个数
if(RTNORM != acedSSLength(ssname, &len) || len<=0 )
{
acutPrintf(_T("\n没有选择任何实体!"));
acDocManager->unlockDocument(acDocManager->curDocument());//解除上面的锁定
return 0;

}
/////////////////////////////////////////////
std::vector< ELEMTYPE* > linshi_total;

for(long i=0;i<len;i++)//提取ssname各元素,并保存到AcDbObjectIdArray中
{
AcDbObjectId objectId;//临时变量
ads_name entryName;//临时变量
acedSSName(ssname,i,entryName);
acdbGetObjectId(objectId,entryName);
AcDbEntity *pEntity=NULL;
if(ForWrite==1)
acdbOpenObject(pEntity, objectId,AcDb::kForWrite);//获得资源
else
acdbOpenObject(pEntity, objectId,AcDb::kForRead);//获得资源
if(pEntity==0) continue;
if (pEntity->isKindOf(ELEMTYPE::desc()))
{
fanhui.append(objectId);
}
pEntity->close();

}
///////////////////////////////////////////////
AcDbObjectIdArray copy=AddToModelSpace(linshi_total);
close_entity(linshi_total);
fanhui.append(copy);
///////////////////////////////////////////////
acedSSFree(ssname);//释放选择集
//////////////////////////////////////////////
acDocManager->unlockDocument(acDocManager->curDocument());//解除上面的锁定
return 1;
}
CAD_Select_TEMPLATE_
bool CAD_Select_QUAL_::get_entity_simple_in_active_datebase_IdArray(AcDbObjectIdArray &fanhui,bool ForWrite,std::wstring tishi_show,bool add_to_fanhui=0)
{
if(add_to_fanhui==0) fanhui.removeAll();
acutPrintf(tishi_show.c_str());
ads_name ssname;
acedSSGet(_T("A"),NULL,NULL,NULL,ssname);////使用者建立选择集 ssname
///////////////////////////////////////提取选择集中所有的元素
AcDbObjectIdArray objectIdArray;//保存选择集中元素id
long len;
acedSSLength(ssname,&len);//提取ssname元素的个数
if(RTNORM != acedSSLength(ssname, &len) || len<=0 )
{
acutPrintf(_T("\n没有选择任何实体!"));
return 0;

}
/////////////////////////////////////////////

for(long i=0;i<len;i++)//提取ssname各元素,并保存到AcDbObjectIdArray中
{
AcDbObjectId objectId;//临时变量
ads_name entryName;//临时变量
acedSSName(ssname,i,entryName);
acdbGetObjectId(objectId,entryName);
AcDbEntity *pEntity=NULL;
if(ForWrite==1)
acdbOpenObject(pEntity, objectId,AcDb::kForWrite);//获得资源
else
acdbOpenObject(pEntity, objectId,AcDb::kForRead);//获得资源
if(pEntity==0) continue;
if (pEntity->isKindOf(ELEMTYPE::desc()))
{
fanhui.append(objectId);
}
pEntity->close();

}
///////////////////////////////////////////////
acedSSFree(ssname);//释放选择集
//////////////////////////////////////////////
return 1;
}
CAD_Select_TEMPLATE_
bool CAD_Select_QUAL_::get_entity_simple(AcDbObjectIdArray &fanhui,AcGePoint3d &minpoint,AcGePoint3d &maxpoint,bool ForWrite)
{
fanhui.removeAll();
ads_name ssname;
double pt1[3]={minpoint.x,minpoint.y,minpoint.z};
double pt2[3]={maxpoint.x,maxpoint.y,maxpoint.z};
acedSSGet(_T("C"),pt1,pt2,NULL,ssname);////使用者建立选择集 ssname
///////////////////////////////////////提取选择集中所有的元素
AcDbObjectIdArray objectIdArray;//保存选择集中元素id
long len=0;
acedSSLength(ssname,&len);//提取ssname元素的个数
if(RTNORM != acedSSLength(ssname, &len) || len<=0 )
{
acutPrintf(_T("\n没有选择任何实体!"));
return 0;

}
/////////////////////////////////////////////
for(long i=0;i<len;i++)//提取ssname各元素,并保存到AcDbObjectIdArray中
{
AcDbObjectId objectId;//临时变量
ads_name entryName;//临时变量
acedSSName(ssname,i,entryName);
acdbGetObjectId(objectId,entryName);
AcDbEntity *pEntity=NULL;
if(ForWrite==1)
acdbOpenObject(pEntity, objectId,AcDb::kForWrite);//获得资源
else
acdbOpenObject(pEntity, objectId,AcDb::kForRead);//获得资源
if(pEntity==0) continue;
if (ELEMTYPE::cast(pEntity)!=0)//对象为ELEMTYPE类型,且能打开
{
fanhui.append(objectId);
}
pEntity->close();
}
///////////////////////////////////////////////
acedSSFree(ssname);//释放选择集
//////////////////////////////////////////////
return 1;
}
CAD_Select_TEMPLATE_
Acad::ErrorStatus CAD_Select_QUAL_::select_entity_by_lay(AcDbObjectIdArray &selected,std::wstring nLayerName,bool ForWrite)
{
acDocManager->lockDocument(acDocManager->curDocument(),AcAp::kWrite);//锁定
Acad::ErrorStatus es=Acad::eOk; 
AcDbBlockTableRecord *pSpaceRecord=NULL;
selected.removeAll();
if((es=Cad_BlockTableRecord<AcDbRegion,std::vector<AcDbRegion*> >::OpenSpace(pSpaceRecord,acdbHostApplicationServices()->workingDatabase()))==Acad::eOk)
{
AcDbBlockTableRecordIterator* pIter;//注意这里是AcDbBlockTableRecordIterator指针
if (pSpaceRecord->newIterator(pIter)==Acad::eOk)//获得AcDbBlockTableRecordIterator资源
{
for (pIter->start();!pIter->done();pIter->step())
{
wchar_t *name=NULL;//注意这里是字符串指针
AcDbEntity* pEntity=NULL;//注意这里是AcDbEntity指针
if (pIter->getEntity(pEntity,ForWrite)==Acad::eOk)//获得当前工作区中能以可读形式打开的所有AcDbEntity资源
{
name=pEntity->layer();//获得字符串资源
if ((nLayerName.compare(name)==0)&&(ELEMTYPE::cast(pEntity)))//相等
{
selected.append(pEntity->id());
}
pEntity->close();//释放AcDbEntity资源
acutDelString(name); //释放字符串资源
}
}
delete pIter;//释放AcDbBlockTableRecordIterator资源
}            
pSpaceRecord->close();//释放AcDbBlockTableRecord资源
}
acDocManager->unlockDocument(acDocManager->curDocument());//解除上面的锁定
return es;
}
CAD_Select_TEMPLATE_
bool CAD_Select_QUAL_::get_entity_from_region(std::vector<ELEMTYPE*> &selected)
{
Acad::ErrorStatus es=Acad::eOk;
acDocManager->lockDocument(acDocManager->curDocument(),AcAp::kWrite);//解除上面的锁定
selected.clear();
ads_name ssname;
acedSSGet(NULL,NULL,NULL,NULL,ssname);////使用者建立选择集 ssname
///////////////////////////////////////提取选择集中所有的元素
long len;
acedSSLength(ssname,&len);//提取ssname元素的个数
if(RTNORM != acedSSLength(ssname, &len) || len<=0 )
{
acutPrintf(_T("\n没有选择任何实体!"));
acDocManager->unlockDocument(acDocManager->curDocument());//解除上面的锁定
return 0;
}
/////////////////////////////////////////////
AcDbObjectIdArray objectIdArray;//保存选择集中元素id
for(long i=0;i<len;i++)//提取ssname各元素,并保存到AcDbObjectIdArray中
{ AcDbObjectId objectId;//临时变量
ads_name entryName;//临时变量
acedSSName(ssname,i,entryName);
acdbGetObjectId(objectId,entryName);
objectIdArray.append(objectId);
}
///////////////////////////////////////////////
acedSSFree(ssname);//释放选择集
//////////////////////////////////////////////
//提取objectIdArray的所有对象的点坐标
struct resbuf* pointlist;
pointlist = acutNewRb(RT3DPOINT);////建立RT3DPOINT类型的数组,提供给acedSSGet使用
AcArray<AcGePoint3d> Point3d;//建立存点向量AcArray
for(int i=0,k=0;i<objectIdArray.length();i++)
{
//获得指向当前元素的指针  
AcDbEntity *pEnt = NULL;  
acdbOpenAcDbEntity(pEnt,objectIdArray[i],kForRead); //取得第i个获取的实体 
//////////////////////////////////////////////对多段线进行以下操作
if(pEnt->isKindOf(AcDbPolyline::desc()))//只对多段线提取点坐标
{
AcDbPolyline * pPline=NULL;
pPline=AcDbPolyline::cast(pEnt); //获得pPline资源
int numVerts = pPline->numVerts();//矩形的点顺序
for (int j=0; j<numVerts; j++)
{
AcGePoint3d tempLineSeg3d;
pPline->getPointAt(j,tempLineSeg3d);//依次提取AcDbPolyline的各个点
ads_point pt;
pt[X] = tempLineSeg3d.x;
pt[Y] = tempLineSeg3d.y;
pt[Z] = tempLineSeg3d.z;
if (!Point3d.contains(tempLineSeg3d))//没有相同点进行下面操作
{ Point3d.append(tempLineSeg3d);
if(0 == k++)
{
pointlist = acutBuildList(RT3DPOINT,pt,NULL);//对提取的第一个RT3DPOINT,pt点入表
}
else
{
pointlist=  acutBuildList(RTRESBUF, pointlist,RT3DPOINT, pt, NULL);//RTRESBUF表示在原有pointlist的基础上加入RT3DPOINT,pt
}
}
}

pPline->close(); //释放pPline资源
}

pEnt->close(); //释放第i个实体资源

}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 按"WP"形式,选择框内的要素,保存到ss中
ads_name ss;
acedSSGet(_T("WP"),pointlist,NULL,NULL,ss);//建立ss选择集
delete pointlist;
long lSSLen=0;
if(RTNORM != acedSSLength(ss, &lSSLen) || lSSLen<=0 )
{
acutPrintf(_T("\n面积线层上没有任何实体!"));
acDocManager->unlockDocument(acDocManager->curDocument());//解除上面的锁定
return 0;

}
else
{
///////////////////////////////////////提取被选择的多个元素
AcDbObjectIdArray objectIdArray1;
long  len1;
acedSSLength(ss,&len1);//提取ssname元素的个数
for(unsigned int i=0;i<len1;i++)
{
AcDbObjectId objectId;
ads_name entryName;

acedSSName(ss,i,entryName);//依次提取ss集合中的元素老名字
acdbGetObjectId(objectId,entryName);
AcDbEntity *pEntity=NULL;
es=acdbOpenAcDbEntity(pEntity,objectId,AcDb::kForWrite);//以读写的形式提取元素实体 
if (ELEMTYPE::cast(pEntity))
{
selected.push_back(ELEMTYPE::cast(pEntity));//将元素的新名字放到selected中
}
else
{
pEntity->close();
}
acedSSFree(ss);//释放选择集
//////////////////////////////////////////////
acDocManager->unlockDocument(acDocManager->curDocument());//解除上面的锁定
return 1;
}
}
}
#endif

路过

雷人

握手
1

鲜花

鸡蛋

刚表态过的朋友 (1 人)

发表评论 评论 (1 个评论)

回复 自贡黄明儒 2013-11-22 10:10
这个玩意太复杂,还是转成lisp给我们学习学习吧!

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

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

GMT+8, 2024-5-11 18:27 , Processed in 0.106622 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部