#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;iblockTableRecord(); 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; inewIterator(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;iblockTableRecord(); 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; iflushGraphics(); //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;isetBlockTableRecord(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)]: "), 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(); }