/******************************************************************** created: 2006/04/12 created: 12:4:2006 16:19 filename: f:\tg_dev\telecdev\tapi\pubcmd.cpp file path: f:\tg_dev\telecdev\tapi file base: pubcmd file ext: cpp author: 沈睿 purpose: 上华水电公共命令 *********************************************************************/ #include "stdafx.h" //#include #include //管线 #include //#include //#include #include #include "resource.h" #include "acedinpt.h" #include "tapi.h" #include "acedxref.h" #include "xblock.h" #include #include #include #include #include "CompareDwg.h" #include "DictionaryViewerDlg.h" //#include "zip.h" //#include "unzip.h" //extern GEOAPI int DragPickSet1(PickSet &ss, XPoint &ptBase); extern GEOAPI void LoadConfig(); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 加载高级选项 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void LoadConfigCmd() { LoadConfig();//tch_kernal导出的 } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 依线正交 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// namespace { bool g_bDefault = false; bool g_bESC = false; bool g_bMouseLeft = false; BOOL KeyboardMouseHook(MSG* pMsg) { BOOL bRet=FALSE; switch(pMsg->message) { case WM_LBUTTONDOWN: { g_bMouseLeft = true; break; } case WM_RBUTTONDOWN: { g_bDefault = true; break; } case WM_KEYDOWN: { if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_SPACE) { g_bDefault = true; } else if (pMsg->wParam == VK_ESCAPE) { g_bESC = true; } break; } default: break; } return bRet; } } void SetSnapAngByLineCmd() { // cet 2018.1.25 modify 支持ucs // double s_angle(0); // adsout << _T("注意:仅单AutoCAD正交设为开状态[F8切换]时起作用!"); // int err_value=get_line_angle(s_angle); // if(err_value == RTNORM){ // xg_setvar(_T("snapang"), s_angle); // } // else // xg_setvar(_T("snapang"), 0); g_bDefault = false; g_bESC = false; g_bMouseLeft = false; double dAngle = 0.0; adsout << _T("注意:仅单AutoCAD正交设为开状态[F8切换]时起作用!"); acedRegisterFilterWinMsg(KeyboardMouseHook); int nRet = get_line_angle(dAngle); // 此函数返回值无法很好区分当前操作状态,添加钩子辅助判断 acedRemoveFilterWinMsg(KeyboardMouseHook); if(!g_bESC && // 未按ESC !g_bDefault&& // 非默认操作 nRet == RTNORM) { dAngle = Wcs2Ucs(dAngle); xg_setvar(_T("snapang"), dAngle); } else if (g_bDefault) { xg_setvar(_T("snapang"), 0); } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 绘多段线 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void DrawCustomPoly() { Entity ent; long len = g_ssPickFirst.Length(); if(len == 1){ ent = g_ssPickFirst[0L]; } XPoly2D poly2d; if(GetOpenPoly2D(_T("\n绘制POLYLINE"), poly2d)!=RTNORM) return; poly2d.Make(); Entity entLast; entLast.GetLast(); if(!ent) return; CString csLayer, csLineType; double dThick(0); OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbPolyline, pEnt); if(pEnt){ TCHAR *chlayer = pEnt->layer(); csLayer = chlayer; delete [] chlayer; TCHAR *szLineType = pEnt->linetype(); csLineType = szLineType; delete [] szLineType; pEnt->getConstantWidth(dThick); } OPENOBJ_END(); OPENOBJ_BEGIN(entLast, AcDb::kForWrite, AcDbPolyline, pEnt2); if(pEnt2){ pEnt2->setLayer(csLayer); pEnt2->setLinetype(csLineType); pEnt2->setConstantWidth(dThick); } OPENOBJ_END(); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 图纸保护 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class TExplodeSet: public AcDbVoidPtrArray { public: TMasterProperties m_prop; }; //在图块内分解上华对象 BOOL ExplodeWithinBlock(AcDbBlockTableRecord *pRec, BOOL bExp3d) { AcDbBlockTableRecordIterator *pRecIter=NULL; if(pRec->newIterator(pRecIter)==Acad::eOk && pRecIter) { } else return FALSE; //对块表记录中的对象进行分解 //AcDbVoidPtrArray entSetNew; DList lstNewSet; for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt=NULL; if(pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) { ASSERT(pEnt); if(pEnt->isKindOf(TDbEntity::desc()) || pEnt->isKindOf(TDbCurveEntity::desc()) || pEnt->isKindOf(TDbBlockInsert::desc())) { //分解对象 TExplodeSet *pNewSet=new TExplodeSet; pEnt->explode(*pNewSet); pNewSet->m_prop.m_idLayer=pEnt->layerId(); pNewSet->m_prop.m_idLineType=pEnt->linetypeId(); pNewSet->m_prop.m_nColor=pEnt->colorIndex(); lstNewSet.Append(pNewSet); } pEnt->close(); } } //对块表中的上华对象进行删除 for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt=NULL; if(pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) { ASSERT(pEnt); if(pEnt->isKindOf(TDbEntity::desc()) || pEnt->isKindOf(TDbCurveEntity::desc()) || pEnt->isKindOf(TDbBlockInsert::desc())) { pEnt->erase(); //删除对象 } pEnt->close(); } } for(int idx=0; idxappendAcDbEntity(pNewEnt)==Acad::eOk); pNewEnt->close(); } } delete pRecIter; return TRUE; } int HexString(char *szBuf1, int nLen, char *szHexBuf) { unsigned char *szBuf=(unsigned char *)szBuf1; char szOut[256]=""; //int nLen=strlen(szBuf); for(int i=0; i=1); if(nCharLen==1) { szHex[1]=szHex[0]; szHex[0]='0'; szHex[2]=0; } strcat(szOut, &szHex[strlen(szHex)-2]); } strcpy(szHexBuf, szOut); return TRUE; } // 把一ASCII码表示的串转化为正常串 // "414331" -> "AC1" int UnHexString( char *szHexBuf, char *szBuf) { int nLen=(int)strlen(szHexBuf); if((nLen%2)!=0) return FALSE; //int k=0; int i = 0; for(i=0; i:"), szYes); if(_tcsicmp(szYes, _T("Y")) != 0) return; if(SelectEntities(_T("\n请选择范围<退出>"), ss, RBList()) != RTNORM) return; RBList mask(RTDXF0, _T("TCH_*"), NULL); XPushVarStr clayer(_T("LAYER"), _T("0")); // 第一步, 分解块表中上华对象 AcDbDatabase *pCurDwg = acdbCurDwg(); AcDbBlockTable *pNewBlockTab=NULL; VERIFY(pCurDwg->getSymbolTable(pNewBlockTab, AcDb::kForRead)==Acad::eOk); ASSERT(pNewBlockTab); AcDbBlockTableIterator *pIterator=NULL; Acad::ErrorStatus es1=pNewBlockTab->newIterator(pIterator); pNewBlockTab->close(); XPushMemVar vTemp1(XExplodeStream::m_bExportTch4, TRUE); XPushMemVar vTemp(XExplodeStream::m_bFullExplode, TRUE); if(es1==Acad::eOk && pIterator) { for(pIterator->start(); !pIterator->done(); pIterator->step()) { AcDbBlockTableRecord *pRec=NULL; if(pIterator->getRecord(pRec, AcDb::kForWrite)==Acad::eOk && pRec) { if(pRec->isFromExternalReference()) { } else { const TCHAR *rName=NULL; pRec->getName(rName); BOOL bMspace=(_tcsicmp(rName, ACDB_MODEL_SPACE)==0); if(!bMspace) { //分解图块中的对象 ExplodeWithinBlock(pRec, FALSE); } } pRec->close(); } } delete pIterator; } // 第二步, 创建1个空的匿名块 AcDbBlockTableRecord *pMspace=new AcDbBlockTableRecord; pMspace->setName(_T("*U")); AcDbObjectId idTempBlock=AddBlock(pMspace, FALSE); pMspace->close(); acedSetStatusBarProgressMeter(_T("分解中..."), 0, ss.Length()); // 第三步, 分解本图中上华对象,并把所有需要保护的图元deepClone到匿名块记录中 for(long i=0; iexplode(entitySet); int nCount=entitySet.length(); for(int j=0; jExplodeOrDraw2d(dc); int nCount=entitySet.length(); for(int j=0; jobjectId(); ArrayID.append(id); } OPENOBJ_END(); } Acad::ErrorStatus es = acdbCurDwg()->deepCloneObjects(ArrayID,idTempBlock,pIdMap); if(Acad::eOk!=es && Acad::eIllegalEntityType!=es){ acedRestoreStatusBar(); return; // 2009-3-19增加eIllegalEntityType,由匿名块组成的组,无法成功deepCloneObjects,但不影响结果 } } acedRestoreStatusBar(); // 第四步, 创建一个MInsert块参考,并把密码放到其扩展数据中 AcGePoint3d pt; AcDbMInsertBlock *pNewBlk = new AcDbMInsertBlock; pNewBlk->setBlockTableRecord(idTempBlock); pNewBlk->setPosition(pt); pNewBlk->setLayer(_T("0")); pNewBlk->setRotation(0); pNewBlk->setColumns(1); pNewBlk->setRows(2); pNewBlk->setColumnSpacing(0); pNewBlk->setRowSpacing(0); pNewBlk->setScaleFactors(AcGeScale3d(1,1,1)); AddToCurrentSpace(pNewBlk, Adesk::kTrue); ss.Erase(); ssTch.Erase(); TCHAR szPw[256]=_T(""); char szPwAsc[256]="", szPw2[256]; ads_getstring(0, _T("\n请输入密码<空>:"), szPw); Entity entLast; entLast.GetLast(); if(_tcsicmp(szPw, _T("")) != 0){ strcpy(szPw2, AString(szPw)); int datalen = (int)strlen(szPw2); HexString(szPw2, datalen, szPwAsc); } WriteXdata(entLast, _T("TG_PASSWORD"), TString(szPwAsc)); } void UnlockProtectDwg() { RBList mask(RTDXF0, _T("INSERT"), NULL); Entity ent; if(SelectEntity(_T("\n请选择对象<退出>"), ent, mask) != RTNORM) return; CString csPw; csPw = ReadXdata(ent, _T("TG_PASSWORD")); TCHAR szPw[256]; ads_getstring(0, _T("\n请输入密码:"), szPw); if(_tcscmp(csPw, szPw) != 0){ char szPw2[256], szPwAsc[256]; strcpy(szPwAsc, AString(csPw)); UnHexString(szPwAsc, szPw2); if(_tcscmp(TString(szPw2), szPw) != 0){ adsout << _T("\n密码错误,无法解锁!"); return; } } AcDbVoidPtrArray entitySet; OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbMInsertBlock , pEnt); if(pEnt) { AcDbBlockReference *pEnt2 = new AcDbBlockReference; pEnt2->copyFrom(pEnt); AcDbObjectId idNew = AddToCurrentSpace(pEnt2, Adesk::kTrue); } OPENOBJ_END(); int len = entitySet.length(); Entity entLast; entLast.GetLast(); ads_command(RTSTR, _T("explode"), RTENAME, (TLong_ptr*)entLast, RTNONE); ent.Erase(); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 虚实变换 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void Continue2Dash() { PickSet ss(SS_FREE); if(SelectEntities(_T("\n请选择要变换的图元<退出>"), ss, RBList()) != RTNORM) return; int iNum = 1; CString csLineType = _T("DASH"); BOOL flag = FALSE; Entity ent1 = ss[0L]; AcDbObjectId eId1; AcDbEntity *pEnt1 = NULL; acdbGetObjectId(eId1, ent1); acdbOpenObject(pEnt1, eId1, AcDb::kForRead); if(pEnt1){ TCHAR *linetype1; linetype1 = pEnt1->linetype(); if(_tcsicmp(linetype1, _T("ByLayer")) == 0 || _tcsicmp(linetype1, _T("CONTINUES")) == 0 || _tcsicmp(linetype1, _T("CONTINUOUS")) == 0 || _tcsicmp(linetype1, _T("ByBlock")) == 0){ flag = TRUE; } delete [] linetype1; pEnt1->close(); } if(flag){ ads_getint(_T("\n请输入线型{1:虚线 2:点划线 3:双点划线 4:三点划线}<虚线>"), &iNum); if(iNum == 2) csLineType = _T("CENTER2"); else if(iNum == 3) csLineType = _T("PHANTOM2"); else if(iNum == 4) csLineType = _T("PHANTOM3"); } long len = ss.Length(); for(long i=0;ilinetype(); if((_tcsicmp(linetype, _T("ByLayer")) == 0 || _tcsicmp(linetype, _T("CONTINUES")) == 0 || _tcsicmp(linetype, _T("CONTINUOUS")) == 0 || _tcsicmp(linetype, _T("ByBlock")) == 0 ) && AddLineType((const TCHAR*)csLineType)){ pEnt->setLinetype(csLineType); pEnt->setLinetypeScale(1); } else if(_tcsicmp(linetype, _T("DASH")) == 0 || _tcsicmp(linetype, _T("CENTER2")) == 0 || _tcsicmp(linetype, _T("PHANTOM3")) == 0 || _tcsicmp(linetype, _T("PHANTOM2")) == 0) pEnt->setLinetype(_T("ByLayer")); delete [] linetype; pEnt->close(); } } } //************************************************************************** // 修正线形 //************************************************************************** void ReviseLineType() { Entity ent; if(SelectEntity(_T("\n请选择要修正线形的任意图元<退出>:"), ent, RBList()) != RTNORM) return; CString csLineType; OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); if(pEnt) { TCHAR *linetype1; linetype1 = pEnt->linetype(); csLineType = linetype1; delete [] linetype1; } OPENOBJ_END(); // cet 2017.9.13 add 支持ucs,原代码旋转角度大时会出错 double dViewRotateAngle = 0.0; xg_getvar(_T("VIEWTWIST"), &dViewRotateAngle); bool bUcsView = false; if (fabs(dViewRotateAngle) > 0.001) { bUcsView = true; } RBList mask(RTDXF0, _T("LWPOLYLINE,LINE,ATS_PIPE"), 6, csLineType, NULL); PickSet ss(SS_FREE); ss.Get(_T("X"), NULL, NULL, mask); long len = ss.Length(); for(long i=0;i PI/2 && nAng < (PI/2*3 + 0.001)){ line.Reverse(); line.Modify(&entTmp); } } else if(entTmp.Is(_T("ATS_PIPE"))){ XPoint ptStart, ptEnd; OPENOBJ_BEGIN(entTmp, AcDb::kForWrite, TDbPipe, pPipe); if(pPipe) { ptStart = pPipe->StartPoint(); ptEnd = pPipe->EndPoint(); ptStart.z = 0; ptEnd.z = 0; double nAng = ads_angle(ptStart, ptEnd); nAng = bUcsView ? Wcs2Ucs(nAng) : nAng; // cet 2017.9.13 add 支持ucs if(nAng > PI/2 && nAng < (PI/2*3 + 0.001)){ pPipe->Reverse(); } } OPENOBJ_END(); } else if(entTmp.Is(_T("LWPOLYLINE"))){//多段PLINE线, 包含圆弧的PLINE 都不考虑 XPoly2D poly(entTmp); if(poly.Length() > 2) continue; if(poly.HasArcSegment()) continue; XPoint ptStart, ptEnd; ptStart = *poly[0]; ptEnd = *poly[1]; ptStart.z = 0; ptEnd.z = 0; double nAng = ads_angle(ptStart, ptEnd); nAng = bUcsView ? Wcs2Ucs(nAng) : nAng; // cet 2017.9.13 add 支持ucs if(nAng > PI/2 && nAng < (PI/2*3 + 0.001)){ OPENOBJ_BEGIN(entTmp, AcDb::kForWrite, AcDbPolyline, pPline); if(pPline) { pPline->setPointAt(0, *poly[1]); pPline->setPointAt(1, *poly[0]); } OPENOBJ_END(); } } } } //************************************************************************** // 线形比例 //************************************************************************** void SetDashLine() { PickSet ss(SS_FREE); if(SelectEntities(_T("\n请选择需要设置比例的线<整图修改>:"), ss, RBList()) != RTNORM) { Entity entSel; if(SelectEntity(_T("\n请选择需要设置比例的参考线>:"), entSel, RBList()) != RTNORM) return; TCHAR szLinetype[256]=_T(""); entSel.GetData(6, szLinetype); RBList rbMask(RTDXF0, _T("*"), 6, szLinetype, NULL); ss.Get(_T("X"), NULL, NULL, rbMask); } double nNum = 1; ads_getreal(_T("\n请输入线型比例 <1>"), &nNum); long len = ss.Length(); for(long i=0;isetLinetypeScale(nNum); pEnt->close(); } return; } //************************************************************************** // 上华拷贝 //************************************************************************** //extern GEOAPI void CapturePoint(const ads_point ptBase, const ads_point ptDest,ads_point ptCapture); //static XPoint g_ptBase; // UCS static int MoveSampler(ads_point pt0, ads_matrix mat) { // Move操作时,没有基点,正交不起作用 XPoint pt; pt=Ucs2Wcs(pt); CapturePoint(NULL, pt0, pt); //使得正交(Ortho)和捕捉(SNAP)起作用 pt = Ucs2Wcs(pt); Ucs2Wcs(g_ptBase).GetMoveMatrix(pt, mat); return RTNORM; } /* class TAdvanceSampler { public: static XPoint g_ptLastTemp; static XPoint g_ptBase; static int g_nCtrlFlag; // 0--Disable Drag Line; 1--Enable Drag Line static double g_nDirection; static int MoveSampler(ads_point pt0, ads_matrix mat); static void Init(XPoint ptBase, int nFlag); }; XPoint TAdvanceSampler::g_ptLastTemp; XPoint TAdvanceSampler::g_ptBase; int TAdvanceSampler::g_nCtrlFlag=0; //double TAdvanceSampler::g_nDirection=0.0; void TAdvanceSampler::Init(XPoint ptBase, int nFlag) { g_ptBase=g_ptLastTemp=ptBase; g_nCtrlFlag=nFlag; g_nDirection=0.0; } // According to pt0, Modify mat int TAdvanceSampler::MoveSampler(ads_point pt0, ads_matrix mat) { // Move操作时,没有基点,正交不起作用 XPoint pt; //pt=Ucs2Wcs(pt); if(g_nCtrlFlag) { CapturePoint(g_ptBase, pt0, pt); //使得正交(Ortho)和捕捉(SNAP)起作用 } else { CapturePoint(NULL, pt0, pt); //使得正交(Ortho)和捕捉(SNAP)起作用 } if(g_nCtrlFlag) { XScreenDc dc(-1); dc << XLine(g_ptBase, g_ptLastTemp); dc << XLine(g_ptBase, pt); g_ptLastTemp=pt; } g_nDirection=ads_angle(g_ptBase, pt); pt = Ucs2Wcs(pt); Ucs2Wcs(g_ptBase).GetMoveMatrix(pt, mat); return RTNORM; } */ // ptBase==UCS // 用于带橡皮筋的复制 int DragPickSet2(PickSet &ss, XPoint &ptBase) { int rc; TCHAR draggenprompt[512]=_T(""); const TCHAR *szPrompt=_T("\n点取位置或 [转90度(A)/左右翻(S)/上下翻(D)/对齐(F)/改转角(R)/改基点(T)]<退出>:"); int cur=0; XPoint ptFinal; TAdvanceSampler samp; samp.Init(ptBase, 1); XPoint pp = samp.g_ptBase; cur = 0; //g_ptBase=ptBase; adsout << szPrompt; LAB_DRAG: ss.Redraw(2); INITGET_BEG(RSG_OTHER, _T("A S D F R T")); rc = ads_draggen(ss, draggenprompt, cur, TAdvanceSampler::MoveSampler, ptFinal); INITGET_END(); ptFinal.z = ptBase.z; XScreenDc dc(-1); dc << XLine(samp.g_ptBase, samp.g_ptLastTemp); if(rc==RTKWORD) { XString sKeyChar; VERIFY(ads_getinput(sKeyChar)==RTNORM); /* XPoint g_ptNewBase=GetCursorWcs(); XPoint vtMove=g_ptNewBase-Ucs2Wcs(samp.g_ptBase); ads_matrix mat={{1.0, 0.0, 0.0, vtMove.x}, {0.0, 1.0, 0.0, vtMove.y}, {0.0, 0.0, 1.0, vtMove.z}, {0.0, 0.0, 0.0, 1.0}}; VERIFY(ads_xformss(ss, mat)==RTNORM); samp.g_ptBase=Wcs2Ucs(g_ptNewBase); */ ads_printf(_T("%c%c %c"), 8,8,8); if(sKeyChar[0]==_T('A') || sKeyChar[0]==_T('S') || sKeyChar[0]==_T('D')) { XPushVar nMode(_T("OSMODE"), 0); //ads_matrix mat; if(sKeyChar[0]==_T('S')) { XPoint ptOther=samp.g_ptBase+XPoint(0,100,0); ads_command(RTSTR, _T(".MIRROR"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &samp.g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), NULL); } else if(sKeyChar[0]==_T('D')) { XPoint ptOther=samp.g_ptBase+XPoint(100,0,0); ads_command(RTSTR, _T(".MIRROR"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &samp.g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), NULL); } else if(sKeyChar[0]==_T('A')) { ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &samp.g_ptBase, RTREAL, 90.0, NULL); } rc=RTNORM; } else if(sKeyChar[0]==_T('F')) { int nOsMode=0; xg_getvar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA|OS_PER|OS_END|OS_MID|OS_CEN; XPushVar vOsMode(_T("OSMODE"), nOsMode); XPoint pt1=samp.g_ptBase, pt2, qt1, qt2; if(ads_getpoint(NULL, _T("\n对齐参考点:"), pt1)==RTNORM && ads_getpoint(pt1, _T("\n对齐参考轴:"), pt2)==RTNORM && ads_getpoint(NULL, _T("\n对齐目标点:"), qt1)==RTNORM && ads_getpoint(qt1, _T("\n对齐目标轴:"), qt2)==RTNORM) { XPushVar osmode(_T("OSMODE"), 0); double nRot=CT_std_angle(ads_angle(qt1, qt2)-ads_angle(pt1, pt2)); ads_command(RTSTR, _T(".MOVE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &pt1, RT3DPOINT, &qt1, NULL); ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &qt1, RTREAL, nRot*180/PI, NULL); rc=RTNORM; return rc; } rc=RTNORM; } else if(sKeyChar[0]==_T('R')) { double nRot=0.0; adsout << _T("\n旋转角度: "); rc=ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &samp.g_ptBase, RTSTR, _T("\\"), NULL); //ss.Rotate(g_ptBase, &nRot); if(rc==RTNORM) adsout << szPrompt; } else if(sKeyChar[0]==_T('T')) { ss.Redraw(1); int nOsMode=0; xg_getvar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA|OS_PER|OS_END|OS_MID|OS_CEN; XPushVar vOsMode(_T("OSMODE"), nOsMode); rc=XGetPoint(NULL, _T("\n输入插入点"), samp.g_ptBase); if(rc==RTNORM) { adsout << szPrompt; ptBase=samp.g_ptBase; } } if(rc==RTNORM) { samp.g_ptLastTemp=samp.g_ptBase; goto LAB_DRAG; } } ptBase=samp.g_ptBase; switch (rc) { case RTSTR: case RTNORM: { if(rc==RTSTR) { XString str; ads_getinput(str); ads_polar(samp.g_ptBase, samp.g_nDirection, _tstof(str), ptFinal); } else { CapturePoint(samp.g_ptBase, XPoint(ptFinal), ptFinal); } ptFinal=Ucs2Wcs(ptFinal); XPoint vtMove=ptFinal-Ucs2Wcs(samp.g_ptBase); ads_matrix mat={{1.0, 0.0, 0.0, vtMove.x}, {0.0, 1.0, 0.0, vtMove.y}, {0.0, 0.0, 1.0, vtMove.z}, {0.0, 0.0, 0.0, 1.0}}; VERIFY(ads_xformss(ss, mat)==RTNORM); XPoint pt0=Ucs2Wcs(ptBase); ptBase=pt0.TransformAs(mat); ptBase=Wcs2Ucs(ptBase); rc=RTNORM; } break; case RTCAN: case RTNONE: case RTERROR: break; } ss.Redraw(1); //actrTransactionManager->flushGraphics(); //acedUpdateDisplay(); return rc; } /* int DragPickSet2(PickSet &ss, XPoint &ptBase) { int rc; TCHAR draggenprompt[512]=_T(""); const TCHAR *szPrompt=_T("\n点取位置或 [转90度(A)/左右翻(S)/上下翻(D)/对齐(F)/改转角(R)/改基点(T)]<退出>:"); int cur=0; XPoint ptFinal; // TAdvanceSampler samp; // samp.Init(ptBase, 1); cur = 0; //g_ptBase=ptBase; adsout << szPrompt; LAB_DRAG: ss.Redraw(2); INITGET_BEG(RSG_OTHER, _T("A S D F R T")); rc = ads_draggen(ss, draggenprompt, cur, MoveSampler, ptFinal); INITGET_END(); // XScreenDc dc(-1); // dc << XLine(samp.g_ptBase, samp.g_ptLastTemp); if(rc==RTKWORD) { XString sKeyChar; VERIFY(ads_getinput(sKeyChar)==RTNORM); ads_printf(_T("%c%c %c"), 8,8,8); if(sKeyChar[0]==_T('A') || sKeyChar[0]==_T('S') || sKeyChar[0]==_T('D')) { XPushVar nMode(_T("OSMODE"), 0); //ads_matrix mat; if(sKeyChar[0]==_T('S')) { XPoint ptOther=g_ptBase+XPoint(0,100,0); ads_command(RTSTR, _T(".MIRROR"), RTPICKS, (long *)ss, RTSTR, _T(""), RT3DPOINT, &g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), NULL); } else if(sKeyChar[0]==_T('D')) { XPoint ptOther=g_ptBase+XPoint(100,0,0); ads_command(RTSTR, _T(".MIRROR"), RTPICKS, (long *)ss, RTSTR, _T(""), RT3DPOINT, &g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), NULL); } else if(sKeyChar[0]==_T('A')) { ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""), RT3DPOINT, &g_ptBase, RTREAL, 90.0, NULL); } rc=RTNORM; } else if(sKeyChar[0]==_T('F')) { int nOsMode=0; xg_getvar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA|OS_PER|OS_END|OS_MID|OS_CEN; XPushVar vOsMode(_T("OSMODE"), nOsMode); XPoint pt1=g_ptBase, pt2, qt1, qt2; if(ads_getpoint(NULL, _T("\n对齐参考点:"), pt1)==RTNORM && ads_getpoint(pt1, _T("\n对齐参考轴:"), pt2)==RTNORM && ads_getpoint(NULL, _T("\n对齐目标点:"), qt1)==RTNORM && ads_getpoint(qt1, _T("\n对齐目标轴:"), qt2)==RTNORM) { XPushVar osmode(_T("OSMODE"), 0); double nRot=CT_std_angle(ads_angle(qt1, qt2)-ads_angle(pt1, pt2)); ads_command(RTSTR, _T(".MOVE"), RTPICKS, (long *)ss, RTSTR, _T(""), RT3DPOINT, &pt1, RT3DPOINT, &qt1, NULL); ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""), RT3DPOINT, &qt1, RTREAL, nRot*180/PI, NULL); rc=RTNORM; return rc; } rc=RTNORM; } else if(sKeyChar[0]==_T('R')) { double nRot=0.0; adsout << _T("\n旋转角度: "); rc=ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""), RT3DPOINT, &g_ptBase, RTSTR, _T("\\"), NULL); //ss.Rotate(g_ptBase, &nRot); if(rc==RTNORM) adsout << szPrompt; } else if(sKeyChar[0]==_T('T')) { ss.Redraw(1); int nOsMode=0; xg_getvar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA|OS_PER|OS_END|OS_MID|OS_CEN; XPushVar vOsMode(_T("OSMODE"), nOsMode); rc=XGetPoint(NULL, _T("\n输入插入点"), g_ptBase); if(rc==RTNORM) { adsout << szPrompt; ptBase=g_ptBase; } } if(rc==RTNORM) { // g_ptLastTemp=g_ptBase; goto LAB_DRAG; } } ptBase=g_ptBase; switch (rc) { case RTSTR: case RTNORM: { if(rc==RTSTR) { XString str; ads_getinput(str); ads_polar(g_ptBase, g_nDirection, _tstof(str), ptFinal); } else { CapturePoint(g_ptBase, XPoint(ptFinal), ptFinal); } ptFinal=Ucs2Wcs(ptFinal); XPoint vtMove=ptFinal-Ucs2Wcs(g_ptBase); ads_matrix mat={{1.0, 0.0, 0.0, vtMove.x}, {0.0, 1.0, 0.0, vtMove.y}, {0.0, 0.0, 1.0, vtMove.z}, {0.0, 0.0, 0.0, 1.0}}; VERIFY(ads_xformss(ss, mat)==RTNORM); XPoint pt0=Ucs2Wcs(ptBase); ptBase=pt0.TransformAs(mat); ptBase=Wcs2Ucs(ptBase); rc=RTNORM; } break; case RTCAN: case RTNONE: case RTERROR: break; } ss.Redraw(1); //actrTransactionManager->flushGraphics(); //acedUpdateDisplay(); return rc; } */ //extern void OpenDwgFile(void *pData); //void TgDragCopy44() //{ // CString csFileName1; // CAcModuleResourceOverride vTemp; // CFileDialog dlg(TRUE,_T("*.dwg"),csFileName1,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, // _T("Drawing(*.dwg) |*.dwg||"), acedGetAcadFrame()); // TCHAR strDlgTitle[] = _T("选择要比对的DWG文件"); // dlg.m_ofn.lpstrTitle = strDlgTitle; // if(dlg.DoModal()!=IDOK) // return; // // csFileName1 = dlg.GetPathName(); // // // static TContextOpen sContext; // _tcscpy(sContext.szFileName, (const TCHAR *)csFileName1); // sContext.bClose = TRUE; // // // AcApDocument* pDoc = acDocManager->curDocument(); // if (pDoc) // { // acDocManager->lockDocument(pDoc); // acDocManager->executeInApplicationContext(OpenDwgFile, (void *)&sContext); // acDocManager->unlockDocument(pDoc); // } // void TgDragCopy() { AcAxDocLock docLock; PickSet ss(SS_FREE); PickSet ssAll(SS_FREE); VERIFY(docLock.lockStatus() == Acad::eOk); { XPushVarStr clayer(_T("USERS5"), _T("IGNORETGCPCMD")); RBList mask(RTDXF0, _T("*"), NULL); if(SelectEntities(_T("\n请选择要拷贝的对象: "), ss, mask)==RTNORM) { ssAll+=ss; XPoint ptLow, ptUp; ss.GetExtend(ptLow, ptUp); ptLow=Wcs2Ucs(ptLow); ads_getpoint(ptLow, _T("\n请点选基点<左下角>:"), ptLow); while(1) { PickSet ss1(SS_FREE); ss1.IncludeBegin(); { XPushVar tVar(_T("OSMODE"), 0); ads_command(RTSTR, _T("_COPY"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RTSTR, _T("0,0"), RTSTR, _T("0,0"), RTNONE); } ss1.IncludeEnd(); // ptLow.x += 1000; // ptLow.y += 1000; if(DragPickSet2(ss1, ptLow)!=RTNORM) { ss1.Erase(); break; } else { ss.Free(); ss += ss1; ssAll+=ss1; } } } } //如果上华拷贝含有电气桥架或风管,必须将新生成的对象重新更新关系 BOOL bHasPipebase = FALSE; long len = ss.Length(); for(long i=0;iobjectId(); LONG_PTR iTmp = id.asOldId(); CString csTmp; csTmp.Format(_T("%ld,"), iTmp); csUser += csTmp; } OPENOBJ_END(); } xg_setvar(_T("USERS5"), csUser); //把需要更新的id通过写入USERS5通知tch_pipebase, 那边处理完了后会自动清除 } //************************************************************************** // 字典检查 //************************************************************************** //发现有很多图纸中带有垃圾字典ACAD_LAYERFILTERS,影响到上华【另存旧版】而且文件巨大。 //本命令目的删除这个字典。 //图层表-字典-ACAD_LAYERFILTERS-.... //找到字典,看看有没有ACAD_LAYERFILTERS,如果有_tremove它。 //因为还保留字典,所有没有执行pLayertable->releaseExtensionDictionary() // 沈睿 2005-8-1 void CheckDictionary() { // tsjmodify 2010.6.17 CAcModuleResourceOverride vTemp; AcApDocument* pDoc = acDocManager->curDocument(); CString sTitle; if (pDoc != NULL) { sTitle = pDoc->fileName(); } AcDbHostApplicationServices* pSvs = acdbHostApplicationServices(); AcDbDatabase* pDb = NULL; if (pSvs != NULL) { pDb = pSvs->workingDatabase(); } CDictionaryViewerDlg dicDlg(pDb, sTitle, acedGetAcadDwgView()); dicDlg.DoModal(); /* AcDbLayerTable *pLayertable = NULL; acdbCurDwg()->getLayerTable(pLayertable, AcDb::kForRead); if(!pLayertable) return; AcDbObjectId idExtDict=pLayertable->extensionDictionary(); if(!!idExtDict) { OPENOBJ_BEGIN(idExtDict, AcDb::kForWrite, AcDbDictionary, pDict); if(pDict) { if(pDict->has(_T("ACAD_LAYERFILTERS"))){ adsout<<_T("已经成功删除多余扩展字典:ACAD_LAYERFILTERS!\n"); pDict->remove(_T("ACAD_LAYERFILTERS")); } } OPENOBJ_END(); } pLayertable->close(); TCHAR szDict[256]; ads_getstring(0, _T("\n请输入要删除的字典名:"), szDict); if(_tcsicmp(szDict, _T("")) == 0) return; Acad::ErrorStatus es=Acad::eOk; AcDbDatabase *pDb = curDoc()->database(); if(pDb==NULL) return; AcDbDictionary* pRootDict=NULL; es=pDb->getNamedObjectsDictionary(pRootDict,AcDb::kForWrite); assert(es==Acad::eOk); if(pRootDict->has(szDict)) { pRootDict->remove(szDict); } pRootDict->close(); */ } ///////////////////////////////////////////////////////////////////////////// // 设置轴号 ///////////////////////////////////////////////////////////////////////////// void SetOldDrawingIndex() { BOOL bFlag = DocGetOldDrawingIndex(); DocSetOldDrawingIndex(!bFlag); } ///////////////////////////////////////////////////////////////////////////// // 打印检查 ///////////////////////////////////////////////////////////////////////////// void CheckPlot() { PickSet ssAll(SS_FREE); RBList mask(RTDXF0, _T("TCH_*"), NULL); ssAll.Get(_T("X"), NULL, NULL, mask); long len = ssAll.Length(); for(long i=0;icolorIndex(); if(iColor == 0){ if(pEnt->upgradeOpen()==Acad::eOk) { pEnt->setColorIndex(256); pEnt->downgradeOpen(); } } pEnt->close(); } } } //*************************************************************************************************** // 修改加密方式 //*************************************************************************************************** void SetTgMode() { TCHAR szText[256]; int mode = 0; CRegProperty regProp(GetRegLocation(), _T("License")); regProp.SetTopRootKey(HKEY_LOCAL_MACHINE); regProp.GetValue(_T("Mode"), mode); if(mode == 0) mode = 3; _tcscpy(szText, XString(_T("%d"), mode)); CString csPrompt; csPrompt.Format(_T("\n请选择上华软件运行模式[单机版(1)/网络版(2)/试用版(3)]<%d>:"), mode); int result = ads_getstring(NULL, csPrompt, szText); if(result != RTNORM) return; int ret = _ttoi(szText); if(ret < 1 || ret > 3) return; if(ret == 3) ret = 0; regProp.SetValue(_T("Mode"), ret); } //*************************************************************************************************** // 上华抓屏 //*************************************************************************************************** GEOAPI int SaveBitmapToFile(HBITMAP hBitmap,LPTSTR lpFileName); //hBitmap 为刚才的屏幕位图句柄 lpFileName 为位图文件名 //#ifdef _WIN64 //#include "ximage.h" // extern int WriteJpeg( FILE * input_file, FILE * output_file); extern int g_iSrcImgType; //#else // extern int WriteJpeg( FILE * input_file, FILE * output_file); //#endif BOOL g_bTracking = FALSE; CPoint g_point, g_ptOld; void GetRectBmpFromBmp( CWnd *pWnd ,CRect rectClient, CBitmap &bitmap) { CClientDC dc(pWnd); CDC memDC; CRect rect; memDC.CreateCompatibleDC(&dc); pWnd->GetWindowRect(rect); bitmap.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height()); CBitmap* pOldBitmap = memDC.SelectObject(&bitmap); memDC.BitBlt(0, 0, rectClient.Width(),rectClient.Height(), &dc, rectClient.left,rectClient.top,SRCCOPY); memDC.SelectObject(pOldBitmap); } BOOL OnMouseMove(UINT_PTR nFlags, CPoint point) { CWinApp* pApp = AfxGetApp(); HICON hIcon = pApp->LoadCursor(IDC_CUR_CELLMOVE); ::SetCursor( hIcon ); // SHORT nState=GetKeyState(VK_LBUTTON); bool bCtrl=(GetKeyState(VK_LBUTTON)&-128)!=0; if(g_bTracking && bCtrl) { CDC *pDC=acedGetAcadFrame()->GetDC(); ASSERT(pDC); CSize size(1,1); CRect rectOld(g_point, g_ptOld); rectOld.NormalizeRect(); CRect rectNew(g_point, point); rectNew.NormalizeRect(); // 绘制矩形拖曳线 pDC->DrawDragRect(rectNew, size, rectOld, size); g_ptOld=point; acedGetAcadFrame()->ReleaseDC(pDC); return TRUE; } return FALSE; } // Move From DgnSpace BOOL DragMsgHook(MSG* msg) { CMDIFrameWnd *pWnd=acedGetAcadFrame(); if(!pWnd) return FALSE; BOOL nRet = FALSE; switch(msg->message) { case WM_LBUTTONDOWN: { if(!g_bTracking){ g_bTracking = TRUE; acedGetAcadFrame()->SetCapture(); CPoint ptDwgView = msg->pt; pWnd->ScreenToClient(&ptDwgView); g_point = ptDwgView; } else{ g_bTracking = FALSE; ::ReleaseCapture(); acedPostCommand(_T(" ")); } } break; case WM_LBUTTONUP: if(g_bTracking){ g_bTracking = FALSE; CSize size(1,1); CDC *pDC=acedGetAcadFrame()->GetDC(); CPoint ptDwgView = msg->pt; pWnd->ScreenToClient(&ptDwgView); CRect rectNew(g_point, ptDwgView); rectNew.NormalizeRect(); pDC->DrawDragRect(rectNew, size, NULL, size); acedGetAcadFrame()->ReleaseDC(pDC); ::ReleaseCapture(); acedPostCommand(_T(" ")); } break; case WM_MOUSEMOVE: { CPoint ptDwgView = msg->pt; pWnd->ScreenToClient(&ptDwgView); OnMouseMove(msg->wParam, ptDwgView); } break; case WM_KEYDOWN: if(msg->wParam==VK_ESCAPE) { acedPostCommand(_T(" ")); } break; } return false;//鼠标消息不会被ACAD截获 } void InitMsgHook(BOOL bTrue) { static BOOL bMsgHook=FALSE; if(bTrue) { if(!bMsgHook) bMsgHook=acedRegisterFilterWinMsg(DragMsgHook); } else { if(bMsgHook) { acedRemoveFilterWinMsg(DragMsgHook); bMsgHook=FALSE; } } } void CatchScreenCmd() { adsout << _T("\n请按下鼠标拖动希望截图的范围<退出>:"); InitMsgHook(TRUE); curDoc()->inputPointManager()->disableSystemCursorGraphics(); g_bTracking = FALSE; g_point = CPoint(); g_ptOld = CPoint(); int nKey, ret; while(1){ ret = ads_getint(_T(""),&nKey); if(ret == 5000) break; } InitMsgHook(FALSE); curDoc()->inputPointManager()->enableSystemCursorGraphics(); CPoint pt1, pt2; CRect rectNew(g_point, g_ptOld); rectNew.NormalizeRect(); pt1 = rectNew.TopLeft(); pt2 = rectNew.BottomRight(); if(pt1 == CPoint() || pt2 == CPoint()) return; CRect rectVP(pt1, pt2); ads_command(RTSTR,_T(".UCSICON"),RTSTR,_T("OFF"),RTNONE); CBitmap bitmap; GetRectBmpFromBmp(acedGetAcadFrame(), rectVP, bitmap); HBITMAP hBitmap = (HBITMAP) bitmap.GetSafeHandle(); CFileDialog dlg(FALSE,_T("*.JPG"),_T(""),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("JPG文件 (*.JPG) |*.JPG||"),acedGetAcadFrame()); if(dlg.DoModal()!=IDOK) return; TCHAR szShortPath[256]=_T(""); TCHAR bmpPrefix[256]; _tcscpy(szShortPath, dlg.GetPathName()); CString csFileName = szShortPath; csFileName = csFileName.Left(csFileName.GetLength() - 4) + _T(".bmp"); _tcscpy(bmpPrefix, csFileName); SaveBitmapToFile(hBitmap, bmpPrefix); ads_command(RTSTR,_T(".UCSICON"),RTSTR,_T("ON"),RTNONE); // #ifndef _WIN64 // FILE *fpIn = _tfopen(bmpPrefix, _T("rb")); // FILE *fpOut = _tfopen(szShortPath, _T("wb")); // if(!fpIn || !fpOut) // return; // int bOk = WriteJpeg(fpIn, fpOut); // fclose(fpIn); // fclose(fpOut); // #else XString sTempFile=GetTempFileName(_T(".jpg")); int bOk = CTangentImage::WriteJpeg(bmpPrefix, szShortPath, CXIMAGE_FORMAT_JPG); // #endif // _WIN64 _tremove(bmpPrefix); } //*************************************************************************************************** // 图块改色 //*************************************************************************************************** BOOL ExplodeEntity2(AcDbEntity* pEnt, AcDbVoidPtrArray& arpNewSet) { if(pEnt == NULL) return FALSE; AcDbVoidPtrArray entSet; if(pEnt->isKindOf(AcDbAlignedDimension::desc())){ return FALSE; } Acad::ErrorStatus es = pEnt->explode(entSet); ////////////////////////////////////////////////////////////////////////////////////// //对于图块特殊处理, 因为炸开后, 属性字不能正常显示, 这里新生成一个文字 if(pEnt->isKindOf(AcDbBlockReference::desc())){ AcDbBlockReference *pInsert = (AcDbBlockReference *)pEnt; AcDbObjectIterator *pAttrIterator = NULL; pAttrIterator = pInsert->attributeIterator(); if(pAttrIterator != NULL){ for (pAttrIterator->start();!pAttrIterator->done();pAttrIterator->step()) { AcDbObjectId att_id; att_id = pAttrIterator->objectId(); AcDbEntity *pEnt2 = NULL; AcDbAttribute *pAtt = NULL; acdbOpenAcDbEntity(pEnt2, att_id, AcDb::kForRead); if(pEnt2 != NULL){ if(pAtt = AcDbAttribute::cast(pEnt2)){ AcDbText *pText = new AcDbText; pText->copyFrom(pAtt); TCHAR *szText2 = pAtt->textString(); pText->setTextString(szText2); delete szText2; pText->setHorizontalMode(pAtt->horizontalMode()); pText->setVerticalMode(pAtt->verticalMode()); pText->setPosition(pAtt->position()); pText->setAlignmentPoint(pAtt->alignmentPoint()); pText->setTextStyle(pAtt->textStyle()); pText->setHeight(pAtt->height()); arpNewSet.append(pText); } pEnt2->close(); } } } delete pAttrIterator; } ////////////////////////////////////////////////////////////////////////////////////// int num=entSet.length(); if(num == 0){ return FALSE; //如果不能再删除, 说明是简单对象, 直接返回 } for(int n=0; nnewIterator(pRecIter)==Acad::eOk && pRecIter) { } else return FALSE; //第一步, 对块表记录中的对象进行分解 AcDbVoidPtrArray arpNewSet; AcDbVoidPtrArray arpDelSet; AcDbObjectIdArray arrId; for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt=NULL; if(pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) { ASSERT(pEnt); if(ExplodeEntity2(pEnt, arpNewSet)){//循环炸碎对象, 如果能分解, 就把该对象删除 AcDbObjectId id = pEnt->objectId(); arrId.append(id); //但现在不能删除, 因为自定义实体还有依赖关系. 先存放起来 } pEnt->close(); } } //对块表中的上华对象(复杂对象)进行删除 for(int j=0;jerase(); pEnt->close(); } } delete pRecIter; //第二步, 把新对象加入图块记录中 int idx = arpNewSet.length(); while((--idx) >= 0) { AcDbEntity* pNewEnt = (AcDbEntity*)arpNewSet[idx]; if (pNewEnt != NULL) { Acad::ErrorStatus es = pRec->appendAcDbEntity(pNewEnt); VERIFY(es==Acad::eOk); pNewEnt->close(); } } return TRUE; } BOOL ExplodeEntity_old(AcDbEntity* pEnt, AcDbVoidPtrArray& arpNewSet) { if(pEnt == NULL) return FALSE; AcDbVoidPtrArray entSet; if(pEnt->isKindOf(AcDbAlignedDimension::desc())){ return FALSE; } Acad::ErrorStatus es = pEnt->explode(entSet); ////////////////////////////////////////////////////////////////////////////////////// //对于图块特殊处理, 因为炸开后, 属性字不能正常显示, 这里新生成一个文字 if(pEnt->isKindOf(AcDbBlockReference::desc())){ AcDbBlockReference *pInsert = (AcDbBlockReference *)pEnt; AcDbObjectIterator *pAttrIterator = NULL; pAttrIterator = pInsert->attributeIterator(); if(pAttrIterator != NULL){ for (pAttrIterator->start();!pAttrIterator->done();pAttrIterator->step()) { AcDbObjectId att_id; att_id = pAttrIterator->objectId(); AcDbEntity *pEnt2 = NULL; AcDbAttribute *pAtt = NULL; acdbOpenAcDbEntity(pEnt2, att_id, AcDb::kForRead); if(pEnt2 != NULL){ if(pAtt = AcDbAttribute::cast(pEnt2)){ AcDbText *pText = new AcDbText; pText->copyFrom(pAtt); TCHAR *szText2 = pAtt->textString(); pText->setTextString(szText2); delete szText2; pText->setHorizontalMode(pAtt->horizontalMode()); pText->setVerticalMode(pAtt->verticalMode()); pText->setPosition(pAtt->position()); pText->setAlignmentPoint(pAtt->alignmentPoint()); pText->setTextStyle(pAtt->textStyle()); pText->setHeight(pAtt->height()); arpNewSet.append(pText); } pEnt2->close(); } } } delete pAttrIterator; } ////////////////////////////////////////////////////////////////////////////////////// int num=entSet.length(); if(num == 0){ return FALSE; //如果不能再删除, 说明是简单对象, 直接返回 } for(int n=0; nnewIterator(pRecIter)==Acad::eOk && pRecIter) { } else return FALSE; //第一步, 对块表记录中的对象进行分解 AcDbVoidPtrArray arpNewSet; AcDbVoidPtrArray arpDelSet; AcDbObjectIdArray arrId; for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) { AcDbEntity *pEnt=NULL; if(pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) { ASSERT(pEnt); if(pEnt->isKindOf(AcDbBlockReference::desc()) || bOnlyBlock == FALSE) { if(ExplodeEntity_old(pEnt, arpNewSet)){//循环炸碎对象, 如果能分解, 就把该对象删除 AcDbObjectId id = pEnt->objectId(); arrId.append(id); //但现在不能删除, 因为自定义实体还有依赖关系. 先存放起来 } } pEnt->close(); } } //对块表中的上华对象(复杂对象)进行删除 for(int j=0;jerase(); pEnt->close(); } } delete pRecIter; //第二步, 把新对象加入图块记录中 int idx = arpNewSet.length(); acedSetStatusBarProgressMeter(_T("图块分析中..."), 0, arpNewSet.length()); while((--idx) >= 0) { acedSetStatusBarProgressMeterPos(arpNewSet.length()-idx); AcDbEntity* pNewEnt = (AcDbEntity*)arpNewSet[idx]; if (pNewEnt != NULL) { Acad::ErrorStatus es = pRec->appendAcDbEntity(pNewEnt); VERIFY(es==Acad::eOk); pNewEnt->close(); } } acedRestoreStatusBar(); return TRUE; } void ChangeBlkColor(AcDbBlockReference* pRef,int iColor) { if (!pRef) return; AcDbObjectId idBlock = pRef->blockTableRecord(); AcDbBlockTableRecordIterator *pIterator = NULL; OPENOBJ_BEGIN(idBlock, AcDb::kForWrite, AcDbBlockTableRecord , pRec); if(pRec) pRec->newIterator(pIterator); OPENOBJ_END(); if (pIterator) { for(pIterator->start(); !pIterator->done(); pIterator->step()) { AcDbEntity *pEnt = NULL; pIterator->getEntity(pEnt, AcDb::kForWrite); if(pEnt != NULL) { if (pEnt->isKindOf(AcDbBlockReference::desc())) { pEnt->setColorIndex(iColor);//随块 AcDbBlockReference* pRef = AcDbBlockReference::cast(pEnt); ChangeBlkColor(pRef,iColor); } else { pEnt->setColorIndex(0);//随块 } pEnt->close(); } } } } void ChangeBlkColorCmd() { RBList rbMask(RTDXF0, _T("INSERT,ATS_EQUIPMENT"), NULL); //2006-5-25 修改 图块改颜色,修改图块内子实体的颜色为“随块” PickSet ss(SS_FREE); if(SelectEntities(_T("\n请选择要修改颜色的图块<退出>:"), ss, rbMask) != RTNORM) return; int iColor = 1; if (Adesk::kTrue != acedSetColorDialog(iColor, Adesk::kFalse, iColor)) return; long len = ss.Length(); for(long i=0;isetColorIndex(iColor); } OPENOBJ_END(); if(entBlk.Is(_T("INSERT"))) { //modify liaoy 2016-8-26 OPENOBJ_BEGIN(entBlk, AcDb::kForWrite, AcDbBlockReference, pRef); ChangeBlkColor(pRef,iColor); OPENOBJ_END(); /* AcDbObjectId idBlock = NULL; OPENOBJ_BEGIN(entBlk,AcDb::kForRead, AcDbBlockReference, pBlk); if (pBlk) { idBlock = pBlk->blockTableRecord(); } OPENOBJ_END(); //处理嵌套图块 AcDbBlockTableRecordIterator *pIterator = NULL; OPENOBJ_BEGIN(idBlock, AcDb::kForWrite, AcDbBlockTableRecord , pRec); if(pRec){ pRec->newIterator(pIterator); if(!pRec->isFromExternalReference()) //外部参考不支持 2011-10-24 { DeepExplodeBlock_old(pRec, TRUE); } } OPENOBJ_END(); for(pIterator->start(); !pIterator->done(); pIterator->step()){ AcDbEntity *pEnt = NULL; pIterator->getEntity(pEnt, AcDb::kForWrite); if(pEnt != NULL) { pEnt->setColorIndex(0);//随块 pEnt->close(); } } */ //modify end } else if(entBlk.Is(_T("ATS_EQUIPMENT"))) { AcDbBlockTableRecordIterator *pIterator; AcDbObjectId idRec = NULL; OPENOBJ_BEGIN(entBlk, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) idRec = pEquip->GetBlock2d(); OPENOBJ_END(); OPENOBJ_BEGIN(idRec, AcDb::kForRead, AcDbBlockTableRecord, pRec); if(pRec) pRec->newIterator(pIterator); OPENOBJ_END(); for(pIterator->start(); !pIterator->done(); pIterator->step()){ AcDbEntity *pEnt = NULL; pIterator->getEntity(pEnt, AcDb::kForWrite); if(pEnt != NULL) { pEnt->setColorIndex(0);//随块 pEnt->close(); } } delete pIterator; } } TCHAR chText[256]; ads_getstring(NULL, _T("\n同名图块是否同时变颜色?: "), chText); if(_tcsicmp(chText, _T("Y")) == 0) { XStringList lstName; for(i=0;i -1) continue; lstName.Append(tstrnew(szName)); RBList rbMask2(RTDXF0, _T("INSERT,ATS_EQUIPMENT"), 2, szName, NULL); PickSet ssAll(SS_FREE); ssAll.Get(_T("X"), NULL, NULL, rbMask2); long len2 = ssAll.Length(); for(long j=0;jsetColorIndex(iColor); } OPENOBJ_END(); } } } UpdateGraphic(ss); actrTransactionManager->flushGraphics(); //acad 刷新 acedUpdateDisplay(); } void ChangeBlkNameCmd() { RBList rbMask(RTDXF0, _T("ATS_EQUIPMENT,ATS_WELL"), NULL); Entity entBlk; if(SelectEntity(_T("\n请选择要修改名字的图块<退出>:"), entBlk, rbMask) != RTNORM) return; AcDbObjectId idRec = NULL; OPENOBJ_BEGIN(entBlk, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip) idRec = pEquip->GetBlock2d(); OPENOBJ_END(); CString csRecordName; AcDbObjectId idNew = NULL; OPENOBJ_BEGIN(idRec, AcDb::kForWrite, AcDbBlockTableRecord, pRec); if(pRec) { TCHAR *str = NULL; pRec->getName(str); csRecordName = str; delete str; TCHAR chText[256]; CString csTmp; csTmp.Format(_T("\nn请输入新图块名<%s>: "), csRecordName); ads_getstring(NULL, csTmp, chText); CString csName = chText; if(csName == _T("")) return; idNew = GetBlockIdFromString(csName); } OPENOBJ_END(); if(idNew == NULL) return; RBList rbMask2(RTDXF0, _T("ATS_EQUIPMENT,ATS_WELL"), 2, csRecordName, NULL); PickSet ssAll(SS_FREE); ssAll.Get(_T("X"), NULL, NULL, rbMask2); long len2 = ssAll.Length(); for(long j=0;jSetBlock2d(idNew); } OPENOBJ_END(); } } //*************************************************************************************************** // 设置标高 //*************************************************************************************************** void SetElev(Entity ent, double dElev) { int nFlag=0; if(ent.Is(_T("LINE"))) { XLine ln(ent); ln.StartPoint().z=ln.EndPoint().z=dElev; ln.Modify(&ent); } else if(ent.Is(_T("ARC")) || ent.Is(_T("CIRCLE"))){ OPENOBJ_BEGIN(ent,AcDb::kForWrite,AcDbCurve,pEnt) if(pEnt) { XPoint pt; if(ent.Is(_T("ARC"))) { pt=((AcDbArc*)pEnt)->center(); ((AcDbArc*)pEnt)->setCenter(XPoint(pt.x,pt.y,dElev)); } else { pt=((AcDbCircle*)pEnt)->center(); ((AcDbCircle*)pEnt)->setCenter(XPoint(pt.x,pt.y,dElev)); } } OPENOBJ_END() } else if(ent.Is(_T("LWPOLYLINE"))) { OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbPolyline, pline); if(pline) pline->setElevation(dElev); OPENOBJ_END(); } else if(ent.Is(_T("DIMENSION"))) { OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbDimension, pDim); if(pDim) { double nElev=pDim->elevation(); AcGePoint3d ptText=pDim->textPosition(); AcGePoint3d ptDimBlk=pDim->dimBlockPosition(); nElev=dElev; ptText[2]=dElev; ptDimBlk[2]=dElev; pDim->setElevation(nElev); // ASSERT(fabs(pDim->elevation())<_DIST_SNAP); pDim->setTextPosition(ptText); pDim->setDimBlockPosition(ptDimBlk); } OPENOBJ_END(); ent.FreeGroups(); for(int i=10; i<16; i++) { XPoint pt; if(ent.GetData(i, &pt)==RTNORM) { pt.z=dElev; ent.SetData(i, &pt); } } ent.Modify(); } else if(ent.Is(_T("INSERT"))) { XPoint ptIns; ent.GetData(10, &ptIns); ptIns.z=dElev; ent.SetData(10, &ptIns); ent.Modify(); Entity entnext=ent; while(entnext.GetNext()==RTNORM) { entnext.FreeGroups(); if(!entnext.Is(_T("ATTRIB"))) { break; } XPoint pt10, pt11; if(entnext.GetData(10, &pt10)==RTNORM) { pt10.z=dElev; entnext.SetData(10, &pt10); } if(entnext.GetData(11, &pt11)==RTNORM) { pt11.z=dElev; entnext.SetData(11, &pt11); } entnext.Modify(); } ent.Update(); } else if(ent.Is(_T("TEXT")) || ent.Is(_T("MTEXT"))) { XPoint pt10, pt11; if(ent.GetData(10, &pt10)==RTNORM) { pt10.z=dElev; ent.SetData(10, &pt10); } if(ent.GetData(11, &pt11)==RTNORM) { pt11.z=dElev; ent.SetData(11, &pt11); } ent.Modify(); } else if(ent.Is(_T("HATCH"))) { OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbHatch, pHatch); if(pHatch) { pHatch->setElevation(dElev); } OPENOBJ_END(); } else if(ent.Is(_T("POINT"))) { OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbPoint, pPoint); if(pPoint) { XPoint pt0 = pPoint->position(); pPoint->setPosition(XPoint(pt0.x,pt0.y,dElev)); } OPENOBJ_END(); } else if(ent.Is(_T("POLYLINE")) /*&& ent.GetData(70, &nFlag)==RTNORM && nFlag<7*/) { OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDb2dPolyline, pline); if(pline) pline->setElevation(dElev); OPENOBJ_END(); } else if(ent.Is(_T("ELLIPSE"))) { OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEllipse, pEllipse); if(pEllipse) { AcGePoint3d ptCen=pEllipse->center(); ptCen.z=dElev; pEllipse->setCenter(ptCen); } OPENOBJ_END(); } else if(ent.Is(_T("SPLINE"))) { OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbSpline, pEnt); if(pEnt) { int num=pEnt->numControlPoints(); for(int n=0; ngetControlPointAt(n, pt)==Acad::eOk) { pt.z=dElev; pEnt->setControlPointAt(n, pt); } } } OPENOBJ_END(); } } // Command: 统一标高 void ModifyElev() { double dElev = 0; ads_getreal(_T("\n请输入新的标高:<0>"), &dElev); PickSet ss(SS_FREE); g_ssPickFirst.Free(); if(SelectEntities(_T("\n选择需要修改标高的对象:"), ss, RBList())==RTNORM) { long lCount=ss.Length(); acedSetStatusBarProgressMeter(_T("修改中..."), 0, lCount); for(long i=0L; i"), ssWall, rbMask) != RTNORM) return; if(ssWall.Length() != 2) return; Entity entSel1, entSel2; entSel1 = ssWall[0L]; entSel2 = ssWall[1L]; // 1.0 获取2段墙的参数信息 XPoint p1, p2, p3, p4; TWallData::TWallStyle style1, style2; OPENOBJ_BEGIN(entSel1, AcDb::kForRead, TDbWall, pWall); if(pWall){ p1 = pWall->StartPoint(); p2 = pWall->EndPoint(); style1 = pWall->GetStyle(); } OPENOBJ_END(); OPENOBJ_BEGIN(entSel2, AcDb::kForRead, TDbWall, pWall); if(pWall){ p3 = pWall->StartPoint(); p4 = pWall->EndPoint(); style2 = pWall->GetStyle(); } OPENOBJ_END(); XLine line1(p1, p2, 1); XLine line2(p3, p4, 1); if(!Is2LineOnLine(line1,line2)){ ads_alert(_T("2墙不共线!")); return; } if(style1 != style2){ ads_alert(_T("不是同材质墙!")); return; } // 2.0 获取2段墙的最外侧2点以及最内侧2点 XPoint ptTmp3, ptTmp4, ptTmp1(p3), ptTmp2(p4); GetLineMax2Pt(p1, p2, ptTmp1, ptTmp2); XPoint ptMin1, ptMin2, ptMax1(ptTmp1), ptMax2(ptTmp2), ptIns; if(ptTmp1 != p3 && ptTmp1 != p4){ ptMin1 = ptTmp2 == p3 ? p4 : p3; ptMin2 = ptTmp1 == p2 ? p1 : p2; ptTmp3 = ptTmp1 == p1 ? p2 : p1; ptTmp1 = ptTmp2; //自己的端点 } else{ ptMin1 = ptTmp1 == p3 ? p4 : p3; ptMin2 = ptTmp2 == p2 ? p1 : p2; ptTmp3 = ptTmp2 == p1 ? p2 : p1; ptTmp1 = ptTmp1; } // 3.0 获取门窗的插入参数:基点,宽度 XLine line3(ptMin1, ptMin2); double dWidth(600); line3.MidPoint(ptIns); dWidth = ads_distance(ptMin1, ptMin2); AcDbObjectId idWall; OPENOBJ_BEGIN(entSel2, AcDb::kForWrite, TDbWall, pWall); if(pWall){ // 4.0 修改墙,让2段墙合并 if(pWall->StartPoint() == ptTmp1) pWall->SetEndPoint(ptTmp3); else pWall->SetStartPoint(ptTmp3); idWall = pWall->objectId(); // 5.0 获取插入门窗的2,3维图块信息 XString szDoor2d(256), szDoor3d(256); AcDbObjectId idStyle2d, idStyle3d; if(LoadDwbBlock(XString(_T("%s%s"), g_sDwbPath, SYS_WIN2D), szDoor2d)!=RTNORM) return; idStyle2d=InitBlock(szDoor2d); if(LoadDwbBlock(XString(_T("%s%s"), g_sDwbPath, SYS_WIN3D), szDoor3d)!=RTNORM) return; idStyle3d=InitBlock(szDoor3d); // 6.0 插入门窗 TDbOpening *pOpening=new TDbOpening(idWall, idStyle2d, idStyle3d); pOpening->InitHardPointerId(); pOpening->m_ptLocation = ptIns; pOpening->SetWidth(dWidth); pOpening->SetHeight(2100); pOpening->SetThickness(60); pOpening->SetKind(TOpeningData::OP_WINDOW); // pOpening->m_nOpStyle |= OPS_LIFTDOOR; pOpening->AddToMSpace(Adesk::kFalse); pWall->InsertOpening(pOpening); pOpening->m_nQuadrant=1; pOpening->close(); } OPENOBJ_END(); } */ //*************************************************************************************************** // 工具条升级 //*************************************************************************************************** // 工具条升级标准 bool UpdateText(CString &sCmd) { if (sCmd.Compare(_T("T88")) == 0)// twt { sCmd = _T("T98"); } else if (sCmd.Compare(_T("T86")) == 0) // tch { sCmd = _T("T96"); } else if (sCmd.Compare(_T("T83")) == 0)// th { sCmd = _T("T93"); } else if (sCmd.Compare(_T("t88")) == 0)// twt { sCmd = _T("t98"); } else if (sCmd.Compare(_T("t86")) == 0) // tch { sCmd = _T("t96"); } else if (sCmd.Compare(_T("t83")) == 0)// th { sCmd = _T("t93"); } else { return false; } return true; } // 升级acad.pgp文件 void UpdateAcad() { XString fullFile, fullFile2; if(!FindFile(_T("acad.pgp"), fullFile)) { AfxMessageBox(_T("acad.pgp文件错误!")); return; } FILE *pFile = fopen(_AS(fullFile), "r"); CString sOldText = fullFile; int n = sOldText.ReverseFind('\\'); CString sText = sOldText.Left(n + 1); fullFile2 = sText + _T("acadCopy.pgp"); FILE *pFileCopy = fopen(_AS(fullFile2), "w"); if(!pFile || !pFileCopy) { return; } while(!feof(pFile)) { char sBuf[256]=""; fgets(sBuf, 255, pFile); CString csTmp = sBuf; csTmp.TrimRight(); int iIndex = csTmp.Find(_T("_")); if(iIndex > 0) { CString sCmdLeft = csTmp.Left(iIndex); CString sCmdRight = csTmp.Right(csTmp.GetLength() - iIndex); CString sCmd = sCmdLeft.Right(3); UpdateText(sCmd); sCmdLeft = sCmdLeft.Left(sCmdLeft.GetLength() - 3); csTmp = sCmdLeft + sCmd + sCmdRight; } csTmp +=_T("\n"); fputs(_AS(csTmp), pFileCopy); } fclose(pFile); fclose(pFileCopy); remove(_AS(fullFile)); rename(_AS(fullFile2), _AS(fullFile)); } #include"TGAs.h" // 升级tchdata.dbf文件 void UpdateTchData() { CodeBase db; XString fullFile; if(!FindFile(_T("tchdata.dbf"), fullFile)) { AfxMessageBox(_T("tchdata.dbf文件错误!")); return; } XDbfTable *pTable = db.Open(fullFile); if(!pTable) { return; } CString sCmd, sCmdNew; for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()) { GET_FIELD(pTable, _T("Engcmd"), sCmd); int nIndex = sCmd.Find(_T("_")); if(nIndex > 0) { CString sCmdLeft = sCmd.Left(nIndex); sCmdLeft.TrimLeft(); CString sCmdRight = sCmd.Right(sCmd.GetLength() - nIndex); if (!UpdateText(sCmdLeft)) { continue; } sCmdNew = sCmdLeft + sCmdRight; SET_FIELD(pTable, _T("Engcmd"), (const TCHAR*)sCmdNew); } } } // 工具条升级标准 bool UpdateText2(CString &sCmd) { if (sCmd.Compare(_T("T88_")) == 0 || sCmd.Compare(_T("T98_")) == 0)// twt { sCmd = _T(""); } else if (sCmd.Compare(_T("T86_")) == 0 || sCmd.Compare(_T("T96_")) == 0) // tch { sCmd = _T(""); } else if (sCmd.Compare(_T("T83_")) == 0 || sCmd.Compare(_T("T93_")) == 0)// th { sCmd = _T(""); } else if (sCmd.Compare(_T("t88_")) == 0 || sCmd.Compare(_T("t98_")) == 0)// twt { sCmd = _T(""); } else if (sCmd.Compare(_T("t86_")) == 0 || sCmd.Compare(_T("t96_")) == 0) // tch { sCmd = _T(""); } else if (sCmd.Compare(_T("t83_")) == 0 || sCmd.Compare(_T("t93_")) == 0 )// th { sCmd = _T(""); } else { return false; } return true; } // 升级acad.pgp文件 void UpdateAcad2() { XString fullFile, fullFile2; if(!FindFile(_T("acad.pgp"), fullFile)) { AfxMessageBox(_T("acad.pgp文件错误!")); return; } FILE *pFile = fopen(_AS(fullFile), "r"); CString sOldText = fullFile; int n = sOldText.ReverseFind('\\'); CString sText = sOldText.Left(n + 1); fullFile2 = sText + _T("acadCopy.pgp"); FILE *pFileCopy = fopen(_AS(fullFile2), "w"); if(!pFile || !pFileCopy) { return; } while(!feof(pFile)) { char sBuf[256]=""; fgets(sBuf, 255, pFile); CString csTmp = sBuf; csTmp.TrimRight(); int iIndex = csTmp.Find(_T("_")); if(iIndex > 0) { iIndex++; CString sCmdLeft = csTmp.Left(iIndex); CString sCmdRight = csTmp.Right(csTmp.GetLength() - iIndex); CString sCmd = sCmdLeft.Right(4); UpdateText2(sCmd); sCmdLeft = sCmdLeft.Left(sCmdLeft.GetLength() - 4); csTmp = sCmdLeft + sCmd + sCmdRight; } csTmp +=_T("\n"); fputs(_AS(csTmp), pFileCopy); } fclose(pFile); fclose(pFileCopy); remove(_AS(fullFile)); rename(_AS(fullFile2), _AS(fullFile)); } // 升级tchdata.dbf文件 void UpdateTchData2() { CodeBase db; XString fullFile; if(!FindFile(_T("tchdata.dbf"), fullFile)) { AfxMessageBox(_T("tchdata.dbf文件错误!")); return; } XDbfTable *pTable = db.Open(fullFile); if(!pTable) { return; } CString sCmd, sCmdNew; for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()) { GET_FIELD(pTable, _T("Engcmd"), sCmd); int nIndex = sCmd.Find(_T("_")); if(nIndex > 0) { nIndex++; CString sCmdLeft = sCmd.Left(nIndex); sCmdLeft.TrimLeft(); CString sCmdRight = sCmd.Right(sCmd.GetLength() - nIndex); if (!UpdateText2(sCmdLeft)) { continue; } sCmdNew = sCmdLeft + sCmdRight; SET_FIELD(pTable, _T("Engcmd"), (const TCHAR*)sCmdNew); } } } // 工具条升级 void UpdateToolBar() { UpdateTchData2(); UpdateAcad2(); AfxMessageBox(_T("工具条升级完成,需重启软件生效! ")); }