658 lines
18 KiB
C++
658 lines
18 KiB
C++
#include "stdafx.h"
|
|
#include "actrans.h"
|
|
#include "Resource.h"
|
|
#include "DlgEditblc.h"
|
|
#include "DlgEdit.h"
|
|
|
|
#include "dbxrecrd.h"
|
|
#include "dbObjptr.h"
|
|
////// clone
|
|
#include "adslib.h"
|
|
#include "aced.h"
|
|
#include "dbidmap.h"
|
|
#include "dbsymtb.h"
|
|
#include "geassign.h"
|
|
|
|
|
|
/*********************************************************/
|
|
// 2002/3/13 图块编辑和图层修改 lg //
|
|
/*********************************************************/
|
|
// 2002/3/18 modify
|
|
|
|
bool SearchBlc(int &blcnum,const TCHAR *strblcname) /// 查找同名图块,返回数目
|
|
{
|
|
PickSet ssent(SS_FREE);
|
|
Entity ent;
|
|
long length(0);
|
|
AcDbObjectId idBlock;
|
|
|
|
blcnum=0;
|
|
RBList mask=ads_buildlist(RTDXF0, _T("INSERT,TCH_BLOCK_INSERT,TCH_MVINSERT"),2,strblcname, NULL);
|
|
ssent.Get(_T("X"), NULL, NULL, mask);
|
|
blcnum=ssent.Length();
|
|
return true;
|
|
/*
|
|
if (ads_ssget (_T("X"), NULL, NULL, mask, ssent) == RTNORM)
|
|
{
|
|
ads_sslength(ssent,&length);
|
|
for (int i=0;i<length;i++) {
|
|
AcDbBlockReference *pBlockRef=NULL; // 定义块表指针
|
|
ads_ssname(ssent,i,ent); // 从选择集中得到实体名3
|
|
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbBlockReference, pBlockRef);
|
|
if (pBlockRef)
|
|
idBlock=pBlockRef->blockTableRecord();
|
|
OPENOBJ_END();
|
|
|
|
AcDbBlockTableRecord *pBlkTblRec=NULL; // 定义块表记录指针
|
|
OPENOBJ_BEGIN(idBlock,AcDb::kForRead,AcDbBlockTableRecord,pBlkTblRec)
|
|
if (pBlkTblRec)
|
|
{
|
|
const TCHAR *pchName=NULL; // 块名
|
|
pBlkTblRec->getName(pchName); // 得到块名
|
|
if (strcmp(pchName,strblcname)==0)
|
|
blcnum=blcnum++;
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
*/
|
|
}
|
|
|
|
|
|
// 遍历图块中的实体并列出图层,并将块中各实体ID存入组 ArrayID // modify 2002/3/19
|
|
void showblclayer(AcDbObjectIdArray &ArrayID,Entity entblc, CStringArray &strlayerArray,int &blcNum)
|
|
{
|
|
AcDbObjectId entityId;
|
|
AcDbBlockReference *pBlkRef=NULL; // 定义块表指针
|
|
//CString strlayername;
|
|
AcDbObjectId idBlock;
|
|
/*
|
|
OPENOBJ_BEGIN(entblc, AcDb::kForRead, AcDbBlockReference, pBlkRef);
|
|
if (pBlkRef)
|
|
idBlock=pBlkRef->blockTableRecord();
|
|
OPENOBJ_END();
|
|
*/
|
|
XString sBlockName;
|
|
entblc.GetData(2, (TCHAR *)sBlockName);
|
|
idBlock=GetBlockIdFromString(sBlockName);
|
|
if (!idBlock)
|
|
return;
|
|
AcDbBlockTableRecordIterator *pIterator=NULL;
|
|
OPENOBJ_BEGIN(idBlock,AcDb::kForWrite,AcDbBlockTableRecord,pBlockRec)
|
|
if (pBlockRec) {
|
|
if ((pBlockRec->newIterator(pIterator))!=Acad::eOk)
|
|
ads_printf(_T("块遍历有误!"),NULL);
|
|
}
|
|
OPENOBJ_END();
|
|
XStringList lstLayers;
|
|
if (pIterator) {
|
|
blcNum=0;
|
|
for (pIterator->start(); !pIterator->done(); pIterator->step()) {
|
|
AcDbEntity *pEntity=NULL;
|
|
// 遍历块中实体
|
|
if (pIterator->getEntity(pEntity, AcDb::kForRead)==Acad::eOk && pEntity) {
|
|
pIterator->getEntityId(entityId);
|
|
ArrayID.append(entityId); // 将实体ID存入数组
|
|
TCHAR *chlayer=pEntity->layer();
|
|
//strlayername=chlayer;
|
|
if (lstLayers.Index(chlayer, FALSE)<0)
|
|
lstLayers.Append(tstrnew(chlayer));
|
|
blcNum=blcNum+1;
|
|
delete [] chlayer;
|
|
pEntity->close();
|
|
}
|
|
// 将数据加入数组
|
|
//strlayerArray.Add(strlayername);
|
|
}
|
|
delete pIterator;
|
|
}
|
|
for(int i=0; i<lstLayers.Length(); i++)
|
|
strlayerArray.Add(lstLayers[i]);
|
|
}
|
|
|
|
// 遍历图块,并改块中实体的层
|
|
void ChangeObjlayer(AcDbObjectIdArray &ArrayID,CString strOldlayer,CString strnewlayer,Entity entblc)
|
|
{
|
|
if (!XSymbolTable(_T("BLOCK"), strnewlayer))
|
|
InitLayer(strnewlayer, FALSE);
|
|
|
|
AcDbObjectId entityId;
|
|
AcDbBlockReference *pBlkRef=NULL; // 定义块表指针
|
|
AcDbEntity *pEntity=NULL;
|
|
CString strlayername;
|
|
AcDbObjectId idBlock;
|
|
XString sBlockName;
|
|
entblc.GetData(2, (TCHAR *)sBlockName);
|
|
idBlock=GetBlockIdFromString(sBlockName);
|
|
if (!idBlock)
|
|
return;
|
|
AcDbBlockTableRecord *pBlockRec=NULL;
|
|
AcDbBlockTableRecordIterator *pIterator=NULL;
|
|
OPENOBJ_BEGIN(idBlock,AcDb::kForWrite,AcDbBlockTableRecord,pBlockRec)
|
|
if (pBlockRec) {
|
|
if ((pBlockRec->newIterator(pIterator))!=Acad::eOk)
|
|
ads_printf(_T("块遍历有误!"),NULL);
|
|
}
|
|
OPENOBJ_END();
|
|
|
|
for (pIterator->start(); !pIterator->done(); pIterator->step())
|
|
{ // 遍历块中实体
|
|
if (pIterator->getEntity(pEntity, AcDb::kForWrite)==Acad::eOk && pEntity) {
|
|
TCHAR *chlayer=pEntity->layer();
|
|
strlayername=chlayer;
|
|
delete [] chlayer;
|
|
// 比较实体层名
|
|
if (_tcscmp(strlayername,strOldlayer)==0) {
|
|
pEntity->setLayer(strnewlayer);
|
|
pEntity->setColorIndex(256);
|
|
}
|
|
pIterator->getEntityId(entityId);
|
|
ArrayID.append(entityId);
|
|
|
|
AcDbObjectIterator *pSubIter=NULL;
|
|
if (pEntity->isKindOf(AcDbPolyFaceMesh::desc())) {
|
|
pSubIter=AcDbPolyFaceMesh::cast(pEntity)->vertexIterator();
|
|
} else if (pEntity->isKindOf(AcDbPolygonMesh::desc())) {
|
|
pSubIter=AcDbPolygonMesh::cast(pEntity)->vertexIterator();
|
|
}
|
|
if (pSubIter) {
|
|
XPointList lstVertexes;
|
|
for (pSubIter->start(); !pSubIter->done(); pSubIter->step()) {
|
|
AcDbObjectId idSubEnt=pSubIter->objectId();
|
|
XDbObject subObj(idSubEnt, AcDb::kForWrite);
|
|
ASSERT(!!subObj);
|
|
if (subObj.m_pObject->isKindOf(AcDbFaceRecord::desc())) {
|
|
AcDbFaceRecord *pSubEnt=AcDbFaceRecord::cast(subObj.m_pObject);
|
|
pSubEnt->setColorIndex(256);
|
|
//pSubEnt->setLayer(strnewLay);
|
|
}
|
|
}
|
|
delete pSubIter;
|
|
}
|
|
|
|
|
|
pEntity->close();
|
|
}
|
|
}
|
|
delete pIterator;
|
|
}
|
|
// 克隆复制图块为具有和原块相同属性的无名块
|
|
bool Cloneblc(CString &strblcname,Entity entname,
|
|
XPoint basepoint, AcDbObjectIdArray ArrayID, const resbuf *xd)
|
|
{
|
|
AcDbObjectId blockId;
|
|
// 定义块表记录指针pBTableRec
|
|
AcDbBlockTableRecord *pBTableRec=new AcDbBlockTableRecord();
|
|
// 设置块表记录名(块名)
|
|
TCHAR blockName[20];
|
|
_tcscpy(blockName,_T("*U"));
|
|
pBTableRec->setName(blockName);
|
|
// 定义块的插入基点
|
|
pBTableRec->setOrigin(basepoint);
|
|
// 以写方式得到当前图形的块表指针
|
|
AcDbBlockTable *pBTable=NULL;
|
|
acdbCurDwg()->getBlockTable(pBTable,AcDb::kForWrite);
|
|
// 将新的块表记录加入块表中,得到块表的ID号
|
|
if (Acad::eOk!=pBTable->add(blockId,pBTableRec))
|
|
ads_printf(_T("/n 操作有错误!"),NULL);
|
|
pBTable->close();
|
|
// 获得无名块名
|
|
const TCHAR *pBlcName=NULL;
|
|
pBTableRec->getName(pBlcName);
|
|
strblcname=pBlcName;
|
|
if (xd)
|
|
pBTableRec->setXData(xd);
|
|
pBTableRec->close();
|
|
AcDbIdMapping pIdMap; // 定义映射对象
|
|
// 调用deepCloneObjects()函数将选中的目标复制到块表中;
|
|
if (Acad::eOk!=acdbCurDwg()->deepCloneObjects(ArrayID,blockId,pIdMap))
|
|
return false;
|
|
else {
|
|
XString sBlockName=GetSymbolName(blockId);
|
|
entname.SetData(2, (const TCHAR *)sBlockName);
|
|
//AcDbBlockReference *pBlkRef=NULL;
|
|
//OPENOBJ_BEGIN(entname, AcDb::kForWrite, AcDbBlockReference, pBlkRef);
|
|
//if (pBlkRef) {
|
|
//XPoint postpt=pBlkRef->position();
|
|
//pBlkRef->setBlockTableRecord(blockId); // 将原来的块的blockRefence指向新的无名块
|
|
//pBlkRef->setPosition(postpt); // 块引用的插入点
|
|
//}
|
|
//OPENOBJ_END();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
void SearchSyslayer(CStringArray &Syslayer,int &layerNum) // 检索数据库中的层,返回层名,和个数
|
|
{
|
|
layerNum=0;
|
|
XSymbolList lstlay(_T("LAYER"));
|
|
int len = lstlay.Length();
|
|
for (int i=0;i<lstlay.Length();i++)
|
|
{
|
|
Syslayer.Add(lstlay[i]);
|
|
layerNum=layerNum++;
|
|
}
|
|
}
|
|
|
|
void lightblc(Entity entblc,CString strlayer,bool bchange) // 遍历图块中的实体,并亮显该实体
|
|
{
|
|
AcDbBlockReference *pBlkRef=NULL; // 定义块表指针
|
|
CString strlayername;
|
|
AcDbObjectId idBlock;
|
|
/*
|
|
OPENOBJ_BEGIN(entblc, AcDb::kForRead, AcDbBlockReference, pBlkRef);
|
|
if (pBlkRef)
|
|
idBlock=pBlkRef->blockTableRecord();
|
|
OPENOBJ_END();*/
|
|
XString sBlockName;
|
|
entblc.GetData(2, (TCHAR *)sBlockName);
|
|
idBlock=GetBlockIdFromString(sBlockName);
|
|
if (!idBlock)
|
|
return;
|
|
AcDbBlockTableRecordIterator *pIterator=NULL;
|
|
OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlockRec);
|
|
if (pBlockRec) {
|
|
if ((pBlockRec->newIterator(pIterator))!=Acad::eOk)
|
|
ads_printf(_T("块遍历有误!"),NULL);
|
|
}
|
|
OPENOBJ_END();
|
|
for (pIterator->start(); !pIterator->done(); pIterator->step())
|
|
{ // 遍历块中实体
|
|
AcDbEntity *pEntity=NULL;
|
|
if (pIterator->getEntity(pEntity, AcDb::kForWrite)==Acad::eOk && pEntity) {
|
|
TCHAR *chlayer=pEntity->layer();
|
|
strlayername=chlayer;
|
|
delete [] chlayer;
|
|
if (_tcscmp(strlayername,strlayer)==0) {
|
|
if (bchange)
|
|
pEntity->setColorIndex(6);
|
|
else
|
|
pEntity->setColorIndex(256);
|
|
}
|
|
pEntity->close();
|
|
}
|
|
}
|
|
delete pIterator;
|
|
}
|
|
|
|
|
|
// 图块编辑
|
|
void editblcCommand() // curblc=0 当前图块,1 同名图块
|
|
{
|
|
int curblc(0);
|
|
AcDbBlockReference *pBlockRef=NULL; // 定义块表指针
|
|
AcDbBlockTableRecord *pBlkTblRec=NULL;
|
|
TCHAR *pchName=NULL; // 块名
|
|
int blcNum=0; // 块中实体个数
|
|
long length(0); // 同名图块数
|
|
CString strlayername; // 层名
|
|
XPoint inspt; // basepoint of the block
|
|
bool breadblc(false); // 读块表记录是否成功
|
|
AcDbObjectId idBlock;
|
|
|
|
RBList mask(RTDXF0, _T("INSERT,TCH_BLOCK_INSERT,TCH_MVINSERT"), NULL);
|
|
Entity entname; // 当前所选图块选择集
|
|
//XPoint ptPick;
|
|
if (SelectEntity(_T("\n请选择要编辑的图块:"), entname, mask)==RTNORM) {
|
|
XString sBlockName;
|
|
entname.GetData(2, (TCHAR *)sBlockName);
|
|
if (!sBlockName)
|
|
return;
|
|
idBlock=GetBlockIdFromString(sBlockName);
|
|
/*
|
|
OPENOBJ_BEGIN(entname, AcDb::kForRead, AcDbBlockReference, pBlockRef);
|
|
if (pBlockRef) {
|
|
pBlockRef->highlight();
|
|
idBlock=pBlockRef->blockTableRecord();
|
|
}
|
|
OPENOBJ_END();
|
|
*/
|
|
|
|
RBList xd;
|
|
OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlkTblRec);
|
|
if (pBlkTblRec) {
|
|
pBlkTblRec->getName(pchName); // 得到块名
|
|
inspt=pBlkTblRec->origin();
|
|
breadblc=true;
|
|
xd.groups=(Groups *)pBlkTblRec->xData(TCHXD);
|
|
}
|
|
else {
|
|
breadblc=false;
|
|
ads_printf(_T("\n 图块有误!"),NULL);
|
|
//ads_redraw(entname,4); // 去掉实体高亮状态
|
|
}
|
|
OPENOBJ_END();
|
|
|
|
CDlgEditblc showdlg;
|
|
showdlg.mEntname=entname;
|
|
showdlg.minspt=inspt;
|
|
// 遍历图块,列出各实体的图层
|
|
int blcObjNum(0);
|
|
// 块中各实体ID showdlg.mArrayID
|
|
showblclayer(showdlg.mArrayID,entname,showdlg.mstrlayerArray,blcObjNum); // 遍历块读出层信息
|
|
CAcModuleResourceOverride vTemp;
|
|
if (breadblc) {
|
|
bool bSeekBlc(false); // 搜索同名图块是否成功
|
|
/* 遍历全图,找出同名图块统计个数 */
|
|
if (SearchBlc(blcNum,pchName)) {
|
|
if (blcNum>1) {
|
|
CDlgEdit editdlg;
|
|
editdlg.m_blcnum=blcNum;
|
|
editdlg.DoModal();
|
|
if (editdlg.Cmdok) {
|
|
curblc=editdlg.m_bCurblc;
|
|
}
|
|
else {
|
|
delete pchName;
|
|
ads_redraw(entname,4); // 去掉实体高亮状态
|
|
return;
|
|
}
|
|
}
|
|
showdlg.m_nowblc=curblc;
|
|
showdlg.m_blcname=pchName;
|
|
showdlg.m_blcnum=blcNum;
|
|
showdlg.mblcObjNum=blcObjNum;
|
|
|
|
if (blcNum>1 && curblc==0) { // 如果编辑当前实体,则克隆该实体
|
|
if (!Cloneblc(showdlg.m_blcname,entname,inspt,showdlg.mArrayID, xd)) // 克隆这个块
|
|
ads_printf(_T("\n 复制图块有误!"),NULL);
|
|
}
|
|
// 读取系统层信息
|
|
SearchSyslayer(showdlg.mSyslayer,showdlg.msyslayerNum);
|
|
bSeekBlc=true;
|
|
} else {
|
|
bSeekBlc=false;
|
|
ads_printf(_T("\n 搜索图块有误!"),NULL);
|
|
}
|
|
if (bSeekBlc)
|
|
showdlg.DoModal();
|
|
}
|
|
if (pchName)
|
|
delete [] pchName;
|
|
ads_redraw(entname,4); // 去掉实体高亮状态
|
|
}
|
|
else
|
|
ads_printf(_T("\n 您没有选中图块!"),NULL);
|
|
}
|
|
|
|
|
|
void UpdateBlockInserts(Entity entInsert)
|
|
{
|
|
AcDbObjectId idBlock;
|
|
XString sBlockName;
|
|
entInsert.GetData(2, (TCHAR *)sBlockName);
|
|
if (!sBlockName)
|
|
return;
|
|
idBlock=GetBlockIdFromString(sBlockName);
|
|
/*
|
|
OPENOBJ_BEGIN(entInsert, AcDb::kForRead, AcDbBlockReference, pInsert);
|
|
if (!pInsert)
|
|
return;
|
|
idBlock=pInsert->blockTableRecord();
|
|
OPENOBJ_END();
|
|
*/
|
|
|
|
PickSet ssInsert(SS_FREE);
|
|
OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlock);
|
|
if (pBlock) {
|
|
AcDbObjectIdArray idArray;
|
|
if (pBlock->getBlockReferenceIds(idArray)==Acad::eOk) {
|
|
int nCount=idArray.length();
|
|
for(int i=0; i<nCount; i++) {
|
|
AcDbObjectId idInsert=idArray[i];
|
|
ssInsert += idInsert;
|
|
}
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
|
|
UpdateGraphic(ssInsert);
|
|
actrTransactionManager->flushGraphics(); //acad 刷新
|
|
acedUpdateDisplay();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//查找同名图块
|
|
//lxb add on 2012/01/10
|
|
bool SearchBlc(PickSet &ss, Entity &ent,CString &sName)
|
|
{
|
|
bool bFlag = false;
|
|
|
|
AcDbObjectId idBlock(NULL);
|
|
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbBlockReference, pBlockRef);
|
|
if (pBlockRef)
|
|
{
|
|
idBlock=pBlockRef->blockTableRecord();
|
|
}
|
|
OPENOBJ_END();
|
|
|
|
if (idBlock.isValid())
|
|
{
|
|
TCHAR*pName=NULL;
|
|
CString sBlockName;
|
|
OPENOBJ_BEGIN(idBlock,AcDb::kForRead,AcDbBlockTableRecord,pBlockTable);
|
|
if (pBlockTable)
|
|
{
|
|
pBlockTable->getName(pName);
|
|
if (pName)
|
|
{
|
|
sBlockName = pName;
|
|
}
|
|
}
|
|
if (pName)
|
|
{
|
|
OPENOBJ_END();
|
|
RBList mask=ads_buildlist(RTDXF0, _T("INSERT,TCH_BLOCK_INSERT,TCH_MVINSERT"),2,pName, NULL);
|
|
ss.Get(_T("X"), NULL, NULL, mask);
|
|
if (ss.IsInclude(ent))
|
|
{
|
|
ss-=ent;
|
|
if (ss.Length()>0)
|
|
{
|
|
bFlag = true;
|
|
}
|
|
}
|
|
|
|
sName = pName;
|
|
acutDelString(pName);
|
|
}
|
|
}
|
|
|
|
return bFlag;
|
|
}
|
|
|
|
//创建块
|
|
//lxb add on 2012/01/12
|
|
bool CreateBlock(TCHAR *pBlockName,AcDbObjectId &cBlockId)
|
|
{
|
|
bool bRe = false;
|
|
Acad::ErrorStatus eReturn;
|
|
AcDbBlockTable *pBlockTable = NULL;
|
|
AcDbBlockTableRecord *pBlockTableRecord = NULL;
|
|
|
|
//获取块表指针
|
|
eReturn = acdbCurDwg()->getBlockTable(pBlockTable,AcDb::kForWrite);
|
|
if (eReturn!=Acad::eOk)
|
|
{
|
|
return bRe;
|
|
}
|
|
if (pBlockTable->has(pBlockName))
|
|
{
|
|
pBlockTable->close();
|
|
return bRe;
|
|
}
|
|
//新建块表记录并设置其名称
|
|
pBlockTableRecord = new AcDbBlockTableRecord();
|
|
pBlockTableRecord->setName(pBlockName);
|
|
//将块表记录添加到块表中
|
|
eReturn = pBlockTable->add(cBlockId,pBlockTableRecord);
|
|
pBlockTable->close();
|
|
if (eReturn!=Acad::eOk)
|
|
{
|
|
delete pBlockTableRecord;
|
|
return bRe;
|
|
}
|
|
pBlockTableRecord->close();
|
|
|
|
bRe = true;
|
|
return bRe;
|
|
}
|
|
|
|
//更改块集中块的名称
|
|
//lxb add on 2012/01/10
|
|
void UpDateBlockName(PickSet &ssBlock)
|
|
{
|
|
TCHAR cName[133]={0};
|
|
if (acedGetString(0,_T("\n请输入新的图块名称:"),cName)!=RTNORM)
|
|
{
|
|
return;
|
|
}
|
|
|
|
AcDbObjectId idNewBlock(NULL);
|
|
|
|
if(ssBlock.Length() > 0)
|
|
{
|
|
AcDbObjectId idBlock(NULL);
|
|
OPENOBJ_BEGIN(ssBlock[(long)0], AcDb::kForRead, AcDbBlockReference, pBlockRef);
|
|
if (pBlockRef)
|
|
{
|
|
idBlock=pBlockRef->blockTableRecord();
|
|
}
|
|
OPENOBJ_END();
|
|
if (idBlock.isValid())
|
|
{
|
|
OPENOBJ_BEGIN(idBlock,AcDb::kForRead,AcDbBlockTableRecord,pOrg);
|
|
if (pOrg)
|
|
{
|
|
//创建块
|
|
if(CreateBlock(cName,idNewBlock))
|
|
{
|
|
//复制块信息
|
|
AcDbObjectIdArray arrSubEnt;
|
|
AcDbBlockTableRecordIterator *pIterator=NULL;
|
|
pOrg->newIterator( pIterator);
|
|
if (pIterator)
|
|
{
|
|
for (pIterator->start(); !pIterator->done(); pIterator->step())
|
|
{
|
|
// 遍历块中实体
|
|
AcDbEntity *pEntity=NULL;
|
|
AcDbObjectId idsub ;
|
|
pIterator->getEntityId(idsub);
|
|
if (idsub.isValid())
|
|
{
|
|
arrSubEnt.append(idsub);
|
|
}
|
|
}
|
|
delete pIterator;
|
|
}
|
|
AcDbIdMapping pIdMap;
|
|
acdbCurDwg()->deepCloneObjects(arrSubEnt,idNewBlock,pIdMap);
|
|
}
|
|
else
|
|
{
|
|
AfxMessageBox(_T("更改块名失败,是否指定名称已存在?"));
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
}
|
|
|
|
if (idNewBlock.isValid())
|
|
{
|
|
//选中的快参照指向新的块
|
|
for(long i=0;i<ssBlock.Length();i++)
|
|
{
|
|
OPENOBJ_BEGIN(ssBlock[i], AcDb::kForWrite, AcDbBlockReference, pBlockRef);
|
|
if (pBlockRef)
|
|
{
|
|
pBlockRef->setBlockTableRecord(idNewBlock);
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// sg add 120109,根据9.0需求,增加图块改名的功能
|
|
void ModifyBlkNameCmd()
|
|
{
|
|
|
|
//新增【图块改名】命令,用于修改图中块参照的名称
|
|
//lxb add on 2012/01/10
|
|
g_ssPickFirst.Free();
|
|
|
|
//需改名字的块集
|
|
PickSet sstol(SS_FREE);
|
|
|
|
//选择第一个块
|
|
Entity ent;
|
|
RBList rbMask(RTDXF0, _T("INSERT,TCH_BLOCK_INSERT,TCH_MVINSERT"), NULL);
|
|
XPoint ptPick;
|
|
if (SelectEntity1(_T("\n请选择要改名的图块<退出>: "), ent, ptPick, rbMask)!=RTNORM)
|
|
{
|
|
return;//退出命令
|
|
}
|
|
|
|
//高亮显示
|
|
ent.Redraw(3);
|
|
sstol+=ent;
|
|
|
|
//检索同名块
|
|
CString sName;
|
|
PickSet ssOther;
|
|
if(SearchBlc(ssOther,ent,sName))
|
|
{
|
|
CString sPrompt;
|
|
sPrompt.Format(_T("\n其他%d个同名的图块是否同时参与修改?[全部(A)/部分(S)/否(N)]<A>: "), int(ssOther.Length()));
|
|
CString sKey;
|
|
{
|
|
THook hook(sPrompt,_T("A S N"));
|
|
sKey = hook.GetKeyWord();
|
|
}
|
|
if (sKey == _T("") || sKey == _T("A"))//全部
|
|
{
|
|
sstol+=ssOther;
|
|
}
|
|
else if (sKey == _T("S")) //部分
|
|
{
|
|
PickSet ss(SS_FREE);
|
|
TCHAR rebuf0[133]={0};
|
|
|
|
struct resbuf eb0;
|
|
eb0.restype = 2;
|
|
memcpy(rebuf0,sName,133);
|
|
eb0.resval.rstring=rebuf0;
|
|
eb0.rbnext = NULL;
|
|
|
|
const TCHAR *szPrompts0[2]={_T("\n请选择同时参与修改的图块:"), _T("")};
|
|
int iRe = acedSSGet(_T(":$"),szPrompts0,NULL,&eb0,ss.name);
|
|
if (iRe==RTCAN)
|
|
{
|
|
//取消高亮
|
|
ent.Redraw(4);
|
|
return;
|
|
}
|
|
|
|
if (ss.Length()>0)
|
|
{
|
|
sstol+=ss;
|
|
ss.Free();
|
|
}
|
|
}
|
|
}
|
|
//更改块名
|
|
UpDateBlockName(sstol);
|
|
//取消高亮
|
|
ent.Redraw(4);
|
|
|
|
sstol.Free();
|
|
}
|