Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/Editblock.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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();
}