#include "stdafx.h" #include "AcDbObjectPtr.h" #include "globalDefine.h" #include "globalfunc.h" #include "AecDbText.h" #include "SHAcDbBlockTable.h" extern AcDbObjectId InitTextStyle(TTextStyle ts, AcDbDatabase *pDb = NULL); // 建立尺寸样式 AcDbObjectId InitDimStyle(const TCHAR *pszStyle, const TCHAR *pszDimBlk) { //TCString sName=GetDsName(pszStyle, nScale); AcDbObjectId id = GlobalFunc::GetDimStyleId(pszStyle); if (!id) { AcDbObjectId idTextStyle = InitTextStyle(TS_DIM); int nTextColor = GlobalFunc::GetTextStyleColor(idTextStyle); if (!idTextStyle) return id; AcDbDimStyleTableRecord *pDimStyle = new AcDbDimStyleTableRecord; AcCmColor clr; clr.setColorIndex(7); pDimStyle->setDimclrt(clr); pDimStyle->setDimgap(1.0); pDimStyle->setDimtxt(3.5); pDimStyle->setDimblk(pszDimBlk); pDimStyle->setDimtxsty(idTextStyle); pDimStyle->setDimexe(2.5); pDimStyle->setDimexo(3.0); pDimStyle->setDimasz(1.0); pDimStyle->setDimscale(1.0); pDimStyle->setName(pszStyle); //pDimStyle->setDimlwe(-1); pDimStyle->setDimdli(0.0); pDimStyle->setDimtofl(true); //pDimStyle->setDimlwd(-1); pDimStyle->setDimtmove(2); pDimStyle->setDimtdec(0); pDimStyle->setDimdec(0); pDimStyle->setDimaunit(0); //十进制 if (GlobalFunc::DocGetCurMeterUnitDraw() || GlobalFunc::DocGetMeterUnitDim())//米单位绘制或米单位标注 { pDimStyle->setDimdec(2); //if (!GlobalFunc::DocGetCurMeterUnitDraw()) pDimStyle->setDimlfac(0.001); } pDimStyle->setDimadec(2); //保留2位小数 //pDimStyle->setDimaunit(1); //度分秒 //pDimStyle->setDimadec(3); //精确到秒 pDimStyle->setDimazin(2); //消除后续0 pDimStyle->setDimtoh(false); pDimStyle->setDimtad(1); pDimStyle->setDimtix(true); pDimStyle->setDimtih(false); if (nTextColor > 0) { AcCmColor cmColor; cmColor.setColorIndex(nTextColor); pDimStyle->setDimclrt(cmColor); } //dimclrd=pDimStyle->dimclrd().colorIndex(); //dimclrt=pDimStyle->dimclrt().colorIndex(); id = GlobalFunc::AddDimStyle(pDimStyle, TRUE); if (!id) delete pDimStyle; else { if (_tcsicmp(pszDimBlk, _T("_ArchTick")) == 0) { SHAcDbBlockTable rec(_T("_ArchTick")); if (rec.ent.Is(_T("LWPOLYLINE"))) { OPENOBJ_BEGIN(rec.ent, AcDb::kForWrite, AcDbPolyline, pline); if (pline) pline->setConstantWidth(GlobalFunc::DocGetHighBold()); OPENOBJ_END(); } } } } return id; } struct TDimStyleInfo { TDimStyle ds; //名称 const TCHAR *szName; //名称 const TCHAR *szDimBlk; //箭头 }; TDimStyleInfo g_tchDimStyles[] = { {DS_STANDARD, _T("STANDARD"), _T(""),}, {DS_LINEAR, _T("_SH_ARCH"), _T("_ArchTick"),}, {DS_ANGLE, _T("_SH_DOTE"), _T("_Dot"), }, {DS_RADIUS, _T("_SH_ARROW"), _T(""), }, }; AcDbObjectId InitDimStyle(TDimStyle ds) { AcDbObjectId idRet; if (ds == DS_LINEAR) { if (GlobalFunc::DocGetCurMeterUnitDraw())//绘制M-标注M { if (g_DimOption::instance().g_nLineDimArrow == 2) { idRet = GlobalFunc::GetDimStyleId(g_DimOption::instance().g_sDim2M_M); if (!idRet) idRet = InitDimStyle(g_DimOption::instance().g_sDim2M_M, _T("_Dot")); } else if (g_DimOption::instance().g_nLineDimArrow == 1) { idRet = GlobalFunc::GetDimStyleId(g_DimOption::instance().g_sDim1M_M); if (!idRet) idRet = InitDimStyle(g_DimOption::instance().g_sDim1M_M, _T("_Oblique")); } else { idRet = GlobalFunc::GetDimStyleId(g_DimOption::instance().g_sDim0M_M); if (!idRet) idRet = InitDimStyle(g_DimOption::instance().g_sDim0M_M, _T("_ArchTick")); } } else if (GlobalFunc::DocGetMeterUnitDim())//绘制mm-标注M { if (g_DimOption::instance().g_nLineDimArrow == 2) { idRet = GlobalFunc::GetDimStyleId(g_DimOption::instance().g_sDim2mm_M); if (!idRet) idRet = InitDimStyle(g_DimOption::instance().g_sDim2mm_M, _T("_Dot")); } else if (g_DimOption::instance().g_nLineDimArrow == 1) { idRet = GlobalFunc::GetDimStyleId(g_DimOption::instance().g_sDim1mm_M); if (!idRet) idRet = InitDimStyle(g_DimOption::instance().g_sDim1mm_M, _T("_Oblique")); } else { idRet = GlobalFunc::GetDimStyleId(g_DimOption::instance().g_sDim0mm_M); if (!idRet) idRet = InitDimStyle(g_DimOption::instance().g_sDim0mm_M, _T("_ArchTick")); } } else//绘制mm-标注mm { if (g_DimOption::instance().g_nLineDimArrow == 2) { idRet = GlobalFunc::GetDimStyleId(g_DimOption::instance().g_sDim2); if (!idRet) idRet = InitDimStyle(g_DimOption::instance().g_sDim2, _T("_Dot")); } else if (g_DimOption::instance().g_nLineDimArrow == 1) { idRet = GlobalFunc::GetDimStyleId(g_DimOption::instance().g_sDim1); if (!idRet) idRet = InitDimStyle(g_DimOption::instance().g_sDim1, _T("_Oblique")); } else { idRet = GlobalFunc::GetDimStyleId(g_DimOption::instance().g_sDim0); if (!idRet) idRet = InitDimStyle(g_DimOption::instance().g_sDim0, _T("_ArchTick")); } } } else if (ds == DS_ANGLE) { if (g_DimOption::instance().g_nAngleDimArrow) { idRet = GlobalFunc::GetDimStyleId(g_DimOption::instance().g_sDimA1); if (!idRet) idRet = InitDimStyle(g_DimOption::instance().g_sDimA1, _T("_Dot")); } else { idRet = GlobalFunc::GetDimStyleId(g_DimOption::instance().g_sDimA0); if (!idRet) { idRet = InitDimStyle(g_DimOption::instance().g_sDimA0, _T("")); // sg add 120412,将箭头标注默认的箭头大小设置为2 OPENOBJ_BEGIN(idRet, AcDb::kForWrite, AcDbDimStyleTableRecord, pStyle); if (pStyle != NULL) { pStyle->setDimasz(2); } OPENOBJ_END(); } } } else { TDimStyleInfo *pInfo = &g_tchDimStyles[0]; for (int i = 0; i < ELEMENTS(g_tchDimStyles); i++) { if (g_tchDimStyles[i].ds == ds) { pInfo = &(g_tchDimStyles[i]); break; } } idRet = GlobalFunc::GetDimStyleId(pInfo->szName); if (!idRet) { idRet = InitDimStyle(pInfo->szName, pInfo->szDimBlk); // jsx add 160713,将箭头标注默认的箭头大小设置为2 OPENOBJ_BEGIN(idRet, AcDb::kForWrite, AcDbDimStyleTableRecord, pStyle); if (pStyle != NULL) { pStyle->setDimasz(2); } OPENOBJ_END(); } } return idRet; } //转成DIMN, DIMNxx //AcDbObjectId DimStyleTch2Acad(AcDbObjectId idTch, double nScale, BOOL bAngular, AcDbDatabase *pDb) //{ // ASSERT(!!idTch); // int iScale = AS_INT(nScale); // double dimscale = nScale/100.0; // // TCString sName; // sName << (bAngular? _T("ANGL") : _T("DIMN")); // // if (iScale != 100) // sName << iScale; // // AcDbObjectId idAcad = GetDimStyleId(sName, pDb); // if (!idAcad) // { // OPENOBJ_BEGIN(idTch, AcDb::kForRead, AcDbDimStyleTableRecord, pStyle); // if (pStyle != NULL) // { // AcDbDimStyleTableRecord *pNewStyle = (AcDbDimStyleTableRecord *)pStyle->clone(); // pNewStyle->setDimscale(dimscale); // pNewStyle->setDimgap(150); // pNewStyle->setDimtxt(300); // pNewStyle->setDimexe(250); // pNewStyle->setDimexo(300); // pNewStyle->setDimasz(pStyle->dimasz()*100); // pNewStyle->setName(sName); // !!!!! // pNewStyle->setDimdli(0.0); // pNewStyle->setDimse1(false); // pNewStyle->setDimse2(false); // // AcDbObjectId idStyle=GetTextStyleId(_T("DIM_FONT"), pDb); // AcDbObjectId idStyle = InitTextStyle(TS_DIMFONT,pDb);//modified by whl on 051230 // if (idStyle.isValid()) // pNewStyle->setDimtxsty(idStyle); // // idAcad = AddDimStyle(pNewStyle, TRUE, pDb); // if (!idAcad) // delete pNewStyle; // } // OPENOBJ_END(); // } // // 对有关的文字样式清0 // OPENOBJ_BEGIN(idAcad, AcDb::kForRead, AcDbDimStyleTableRecord, pStyle); // if (pStyle != NULL) // { // AcDbObjectId idStyle = pStyle->dimtxsty(); // OPENOBJ_BEGIN(idStyle, AcDb::kForWrite, AcDbTextStyleTableRecord, pTxtStyle); // if (pTxtStyle != NULL) // { // pTxtStyle->setTextSize(0.0); // } // OPENOBJ_END(); // } // OPENOBJ_END(); // return idAcad; //} AcDbObjectId DimStyleTch2Acad(AcDbObjectId idTch, double nScale, BOOL bAngular, AcDbDatabase *pDb, double dTxtHeight) { ASSERT(!!idTch); //wlw mod 12.0903解决上华连续标注炸成cad的对齐标注后文字变大问题 //1.先生成与以前一样的一个文字样式 AcDbObjectId idTxtStyle; // 原有文字样式名 OPENOBJ_BEGIN(idTch, AcDb::kForRead, AcDbDimStyleTableRecord, pDimStyle); if (pDimStyle != NULL) { idTxtStyle = pDimStyle->dimtxsty(); } OPENOBJ_END(); BOOL bWinFont = FALSE;//判断是否是windows字体 wlw add131119 AcGiTextStyle txtStyle; if (fromAcDbTextStyle(txtStyle, idTxtStyle) == Acad::eOk) { int nRetFlag = txtStyle.loadStyleRec(); TCHAR *pWinFont = NULL; #if ARX < 21 BOOL bold, italic; int charset, pitch; if (txtStyle.font(pWinFont, bold, italic, charset, pitch) == Acad::eOk && pWinFont && pWinFont[0]) #else bool bold, italic; Autodesk::AutoCAD::PAL::FontUtils::FontPitch pitch; Autodesk::AutoCAD::PAL::FontUtils::FontFamily family; Charset charset; if (txtStyle.font(pWinFont, bold, italic, charset, pitch, family) == Acad::eOk && pWinFont && pWinFont[0]) #endif { delete[] pWinFont; bWinFont = TRUE; } } TCString sTxtName = GlobalFunc::GetSymbolName(idTxtStyle); _tcsupr(sTxtName); TCString sT3TxtName(256); sT3TxtName << sTxtName << _T("_T3"); int nColor(0); double dEnChScaleX(1.0), dEnChScaleY(1.0); AcDbObjectId idNewTxtStyle; OPENOBJ_BEGIN(idTxtStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pTxtStyle); if (pTxtStyle != NULL) { resbuf *pxData = pTxtStyle->xData(TCHXD); if (pxData != NULL) { resbuf *pNext = pxData->rbnext; if (pNext != NULL && pNext->restype == 1040) { dEnChScaleY = pNext->resval.rreal; pNext = pNext->rbnext; if (pNext != NULL && pNext->restype == 1040) dEnChScaleX = pNext->resval.rreal; pNext = pNext->rbnext; if (pNext != NULL && pNext->restype == 1070) nColor = pNext->resval.rint; } ads_relrb(pxData); } double dChXYScale = pTxtStyle->xScale(); if (fabs(dEnChScaleX - dEnChScaleY) > 1.0E-5 || fabs(dEnChScaleX - 1.0) > 1.0E-5) { dChXYScale *= dEnChScaleX / dEnChScaleY; } idNewTxtStyle = GlobalFunc::GetTextStyleId(sT3TxtName, pDb); if (!idNewTxtStyle) { AcDbTextStyleTableRecord *pNewTxtStyle = (AcDbTextStyleTableRecord*)pTxtStyle->clone(); pNewTxtStyle->setName(sT3TxtName); if (!bWinFont) { pNewTxtStyle->setXScale(dChXYScale); } pNewTxtStyle->setTextSize(0.0); idNewTxtStyle = GlobalFunc::AddTextStyle(pNewTxtStyle, TRUE, pDb); } OPENOBJ_END() } //2.生成一个新的标注样式,并把新的文字样式设置到里面 TCString sName = GlobalFunc::GetSymbolName(idTch); // 原有的样式名称 _tcsupr(sName); TCString sNameTch(256); int iScale = AS_INT(nScale); sNameTch << sName << _T("&&") << iScale; // 增加原有比例,不管是否是100,增加“&&”为了好识别样式,方便读取旧图进行转化 AcDbObjectId idAcad = GlobalFunc::GetDimStyleId(sNameTch, pDb); if (!idAcad.isValid()) { OPENOBJ_BEGIN(idTch, AcDb::kForRead, AcDbDimStyleTableRecord, pStyle); if (pStyle == NULL) { return AcDbObjectId::kNull; } double ddimTextH = pStyle->dimtxt(); AcDbDimStyleTableRecord *pNewStyle = (AcDbDimStyleTableRecord *)pStyle->clone(); pNewStyle->setDimscale(1.0); pNewStyle->setDimtxsty(idNewTxtStyle); //由于上华文字和cad文字的高度有差异,所以将dimgap()参数增加这个差异,否则文字会变位置。 double ddimgap = pStyle->dimgap(); ddimgap += ddimTextH * (1 - dEnChScaleY) * 0.5; //单独计算windows字体上华文字的高度 AecXDbText dimText; dimText.SetAlignment(AcGiDraw::kMiddleCenter); dimText.SetHeight(ddimTextH); dimText.SetText(_T("1")); dimText.SetStyleId(idTxtStyle); dimText.SetPScale(nScale); TextLine lstTextParts; dimText.GetTextParts(lstTextParts, FALSE); double dDH(0.0); if (lstTextParts.Length() > 0) { dDH = lstTextParts[0]->m_nHeight; } if (bWinFont) { //windows字体上华文字dimgap没有差异 pNewStyle->setDimgap(pStyle->dimgap() * nScale); pNewStyle->setDimtxt(dDH); } else { pNewStyle->setDimgap(ddimgap * nScale); pNewStyle->setDimtxt(ddimTextH * nScale * dEnChScaleY); } pNewStyle->setDimexe(pStyle->dimexe() * nScale); pNewStyle->setDimexo(pStyle->dimexo() * nScale); pNewStyle->setDimasz(pStyle->dimasz() * nScale); pNewStyle->setDimdle(pStyle->dimdle() * nScale); pNewStyle->setName(sNameTch); pNewStyle->setDimdli(0.0); pNewStyle->setDimse1(false); pNewStyle->setDimse2(false); idAcad = GlobalFunc::AddDimStyle(pNewStyle, TRUE, pDb); OPENOBJ_END() } return idAcad; // 对有关的文字样式清0 // OPENOBJ_BEGIN(idAcad, AcDb::kForRead, AcDbDimStyleTableRecord, pStyle); // if (pStyle != NULL) // { // AcDbObjectId idStyle = pStyle->dimtxsty(); // OPENOBJ_BEGIN(idStyle, AcDb::kForWrite, AcDbTextStyleTableRecord, pTxtStyle); // if (pTxtStyle != NULL) // { // pTxtStyle->setTextSize(0.0); // } // OPENOBJ_END(); // } // OPENOBJ_END(); // 对有关的文字样式清0 // OPENOBJ_BEGIN(idAcad, AcDb::kForWrite, AcDbDimStyleTableRecord, pStyle); // if (pStyle != NULL) // { // if (idNewTxtStyle.isValid()) // pStyle->setDimtxsty(idNewTxtStyle); // pStyle->close(); // } // OPENOBJ_END(); } // 转成DIMN, DIMNxx AcDbObjectId DimStyleAcad2Tch(AcDbObjectId idAcad, double &nScale) { ASSERT(!!idAcad); int iScale = AS_INT(nScale); TCString sNameAcad = GlobalFunc::GetSymbolName(idAcad); _tcsupr(sNameAcad); TCHAR szWild[100] = _T("DIMN*,DIMA*,DIMB*"); BOOL bOldTch = (ads_wcmatch(sNameAcad, szWild) == RTNORM); // sg add 120410,增加新的带“&&”的解析,如果转出去的样式名中,有“&&”,也是T3的样式,也需要乘以100 if (!bOldTch) { TCHAR szWildNew[100] = _T("*&&*"); bOldTch = (ads_wcmatch(sNameAcad, szWild) == RTNORM); } TCString sNameTch(256); sNameTch << sNameAcad << _T("$TCH"); //转化而来 AcDbObjectId idTch = GlobalFunc::GetDimStyleId(sNameTch); nScale = GlobalFunc::DocGetPScale(); OPENOBJ_BEGIN(idAcad, AcDb::kForRead, AcDbDimStyleTableRecord, pStyle); if (pStyle) { if (bOldTch) { nScale = 100.0 * pStyle->dimscale(); } if (!idTch) { AcDbDimStyleTableRecord *pNewStyle = (AcDbDimStyleTableRecord *)pStyle->clone(); double nFactor = pNewStyle->dimscale() / nScale; pNewStyle->setDimscale(1.0); pNewStyle->setDimgap(nFactor * pNewStyle->dimgap()); pNewStyle->setDimtxt(nFactor * pNewStyle->dimtxt()); pNewStyle->setDimexe(nFactor * pNewStyle->dimexe()); pNewStyle->setDimexo(nFactor * pNewStyle->dimexo()); pNewStyle->setDimasz(nFactor * pNewStyle->dimasz()); pNewStyle->setName(sNameTch); pNewStyle->setDimdli(nFactor * pNewStyle->dimdli()); pNewStyle->setDimdle(nFactor * pNewStyle->dimdle());//add by whl on 060219 超出标记调整 idTch = GlobalFunc::AddDimStyle(pNewStyle, TRUE); if (!idTch) delete pNewStyle; } } OPENOBJ_END(); return idTch; }