#include "stdafx.h" #include //#include #include #include #include "jig.h" #include "DimSinglePipeRadiusDlg.h" #include "TDbPipeMultDim.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern void DoDimPipeDnByPt(Entity ent, int iRadius, const TCHAR* szType, double nHeight, BOOL bIsDown = FALSE, XPoint ptPick = XPoint()); extern void SplitDnDim(const TCHAR* szDim, CString &csHead, int &iDn); //*************************************************************************************************** // 单管管径 //*************************************************************************************************** void DoDimPipeDn2ByPt(Entity ent, int iRadius, const TCHAR* szType, double nHeight, BOOL bIsDown, XPoint ptPick) { if(!ent.Is(_T("ATS_PIPE"))) return; // cet 2014.4.25 modify 修改标注文字样式使其与初始设置中管径标注相同 // AcDbObjectId idTextStyle = InitTwtTextStyle(g_csTwtDimStyle); AcDbObjectId idTextStyle = InitTwtTextStyle(g_csPipeDnStyle); InitLayer(LAY_DIM_TEXT); double nDnDiameter(-1); OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbPipe, pPipe); if(!pPipe) return; AcGePoint3d pt1 = ptPick; AcGePoint3d pt2; pPipe->getClosestPointTo(pt1, pt2);//有可能PICK点不在管线上 ptPick = pt2; double nRotate(0); // cet 2011.8.30 modify 支持ucs // if(pPipe->Is(CURVE_LINE)){ // nRotate = ads_angle(pPipe->GetStartPoint(), pPipe->GetEndPoint()); // } // else if(pPipe->Is(CURVE_ARC)){ // XPoint ptCenter; // pPipe->GetArc().Center(ptCenter); // nRotate = ads_angle(ptCenter, ptPick) + PI/2; // } if(pPipe->Is(CURVE_LINE)) { nRotate = ads_angle(Wcs2Ucs(pPipe->GetStartPoint()), Wcs2Ucs(pPipe->GetEndPoint())); } else if(pPipe->Is(CURVE_ARC)) { XPoint ptCenter; pPipe->GetArc().Center(ptCenter); nRotate = ads_angle(Wcs2Ucs(ptCenter), Wcs2Ucs(ptPick)) + PI/2; } XPoint ptS, ptE; ptS = pPipe->StartPoint(); ptE = pPipe->EndPoint(); XVector3D vectBase(ptE.x - ptS.x, ptE.y - ptS.y, 0); vectBase.Normalize(); nDnDiameter = pPipe->GetDnDiameter(); if(!(iRadius < 0 && nDnDiameter > 0)) nDnDiameter = (double)iRadius; pPipe->SetDnDiameter(nDnDiameter); pPipe->SetLabel(szType); if(pPipe->IsVertical()) return; CString csLay = GetTextLayBySys(pPipe->GetSysType()); InitLayer(csLay); TDbPipeLabel *pLabel = new TDbPipeLabel; pLabel->SetDistToPipe(-g_nDnDimDist2Pipe*DocGetPScale()); //cet 2012.2.7 modify 默认在管线下方,距离为正 //pLabel->SetDistToPipe(g_nDnDimDist2Pipe*DocGetPScale()); if(bIsDown) pLabel->SetDistToPipe((-1)*pLabel->GetDistToPipe()); if(nRotate > PI/2 && nRotate <=PI*3/2)//管反了 pLabel->SetDistToPipe((-1)*pLabel->GetDistToPipe()); pLabel->SetPipeType(TDbPipeLabel::kCommon); pLabel->SetTextStyleId(idTextStyle); pLabel->SetPipeDiameter(nDnDiameter); pLabel->SetPipeId(pPipe->objectId()); pLabel->SetLocation(ptPick); pLabel->setLayer(csLay); pLabel->SetTextHeight(nHeight); pLabel->SetDirection(vectBase); pLabel->SetLeftText(szType); AddToCurrentSpace(pLabel, Adesk::kTrue); OPENOBJ_END(); } CString GetPipeDimLayByEnt(Entity ent) { CString csLay; TPipeSys::SysType sysType; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ sysType = pPipe->GetSysType(); } OPENOBJ_END(); csLay = GetDimLayBySys(sysType); return csLay; } // 删除图层 cet 2011.11.28 add void RemoveLayer(const CString &sLayerName) { AcDbLayerTable *pTbl = NULL; acdbHostApplicationServices()->workingDatabase()->getLayerTable(pTbl, AcDb::kForRead); if (pTbl != NULL) { AcDbLayerTableRecord *pRec = NULL; pTbl->getAt(sLayerName, pRec, AcDb::kForWrite); if (pRec != NULL) { pRec->erase(); pRec->close(); } pTbl->close(); } } void DimSinglePipeDnRadius() { // DocSetText2Base(0.2); g_ssPickFirst.Free(); CDimSinglePipeRadiusDlg dlg(acedGetAcadFrame()); { CTemporaryResourceOverride vTemp; dlg.Create(IDD_DIM_PIPE_RADIUS_SINGLE, acedGetAcadFrame()); } dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); //InitLayer(LAY_PIPE_DIM); //干掉无关图层 zxl 2011.11.24 Del RBList rbMask(RTDXF0, _T("ATS_PIPE"), NULL); AcDbObjectId idTextStyle = InitTwtTextStyle(g_csPipeDnStyle); ///////////////////////////////////////////////////////////////////////////////////////////////////////////// BOOL bExistLayer = IsLayerExistInDb(LAY_CALC_TEXT); // cet 2011.11.28 add XText text(_T(""), XPoint(), g_nTwtDimHeight * DocGetPScale(), g_nDimScale, g_csPipeDnStyle, LAY_CALC_TEXT); text.Draw(AcDb::kTextBase, AcDb::kTextRight); Entity ent; ent.GetLast(); ent.Erase(); //写1个字,然后删除,很弱智。TDbPipeText::GetWidth()第一次执行时AcGiTextStyle计算外框用的是STANDARD样式 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// SHads_command(RTNONE); while(1){ dlg.UpdateData(); Entity entSel; XPoint ptPick; int ret(0); /* cet 2011.4.27 modify 标注位置增加左上、右下 INITGET_BEG(0, _T("R")); // ret = SelectEntity1(g_nCurPipeWidth*DocGetPScale(), _T("\n请选取要标注管径的管线(单选,标注在点取位置) <退出>:"), entSel, ptPick, rbMask); // ret = SelectEntity(_T("\n请选取要标注管径的管线(单选,标注在点取位置)<退出>:"), entSel, ptPick, rbMask); cet 2011.4.25 modify ret = SelectEntity(_T("\n请单选需要标注管径的管线(标注位置参照光标与管线的相对位置)<退出>:"), entSel, ptPick, rbMask); INITGET_END(); if(ret == RTNORM) { // cet 2011.2.15 add 据选取管线时点的位置自动设置标注位置 XPoint pt, pt1, pt2; GetPipePoint(entSel, pt1, pt2, pt); XLine line(pt1, pt2, 1); ptPick = Ucs2Wcs(ptPick); if (ptPick.Project(&line, pt) != RTNORM) { return; } int nPos = 0; // 标注方向左上 pt = Wcs2Ucs(pt); if (ptPick.y < pt.y || (fabs(pt.y - ptPick.y) < 0.001 && ptPick.x > pt.x)) { nPos = 1; // 右下 } ptPick = pt; */ ret = SelectEntity(_T("\n请单选需要标注管径的管线(标注位置参照光标与管线的相对位置)<退出>:"), entSel, ptPick, rbMask); if (ret != RTNORM) { break; } WriteXdata(entSel, _T("TG_PIPELABEL_THICK_SHOW"), _T("0")); // 选择点到管线的投影(xy平面) BOOL bArc = FALSE; double dBulge = 0.0; XPoint pt, pt1, pt2; OPENOBJ_BEGIN(entSel, AcDb::kForRead, TDbPipe, pPipe); if (pPipe != NULL) { bArc = pPipe->Is(CURVE_ARC); pPipe->getStartPoint(pt1); pPipe->getEndPoint(pt2); dBulge = pPipe->GetBulge(); } OPENOBJ_END(); ptPick = Ucs2Wcs(ptPick); if (bArc) // 弧管 { pt1.z = 0.0; pt2.z = 0.0; XArc arc(pt1, pt2, dBulge); if (ptPick.Project(&arc, pt) != RTNORM) { break; } } else // 直管 { XLine line(pt1, pt2, 1); line.StartPoint().z = 0.0; line.EndPoint().z = 0.0; if (ptPick.Project(&line, pt) != RTNORM) { break; } } OPENOBJ_BEGIN(entSel, AcDb::kForRead, TDbPipe, pPipe); if (pPipe != NULL) { pPipe->getClosestPointTo(pt, AcGeVector3d::kZAxis, pt); // 获取投影点对应的管线上一点 } OPENOBJ_END(); int nPos = 0; CString strDimPos = dlg.m_strWndEdtPos; if (strDimPos.CompareNoCase(_T("屏幕拾取")) == 0) { nPos = 0; // 标注方向左上 pt = Wcs2Ucs(pt); ptPick = Wcs2Ucs(ptPick); if (ptPick.y < pt.y || (fabs(pt.y - ptPick.y) < 0.001 && ptPick.x > pt.x)) { nPos = 1; // 右下 } ptPick = pt; } else if (strDimPos.CompareNoCase(_T("左上")) == 0) { nPos = 0; ptPick = Wcs2Ucs(pt); } else if (strDimPos.CompareNoCase(_T("右下")) == 0) { nPos = 1; ptPick = Wcs2Ucs(pt); } dlg.UpdateData(TRUE); XString xsDim(_T("%s %d"), dlg.m_csType, dlg.m_iRadius); int idx = dlg.m_lstDim.Index((const TCHAR*)xsDim); if(idx > -1) dlg.m_lstDim.Remove(idx); if(_tcsicmp(dlg.m_csType, _T("自动")) != 0) dlg.m_lstDim.Append(tstrnew((const TCHAR*)xsDim)); if(dlg.m_iRet == 0){ //cet 2011.2.15 modify 根据选取管线时点的位置自动设置标注位置 //DoDimPipeDnByPt(entSel, dlg.m_iRadius, dlg.m_csType, dlg.m_nHeight, dlg.m_iPos, Ucs2Wcs(ptPick)); DoDimPipeDnByPt(entSel, dlg.m_iRadius, dlg.m_csType, dlg.m_nHeight, nPos, Ucs2Wcs(ptPick)); } else if(dlg.m_iRet == 1){//管线文字 CString csType = dlg.m_csType; int iDn = dlg.m_iRadius; OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TDbPipe, pPipe); if(pPipe){ if(iDn > 0) pPipe->SetDnDiameter(dlg.m_iRadius); else iDn = (int)pPipe->GetDnDiameter(); if(_tcsicmp(dlg.m_csType, _T("自动")) == 0){ int iMaterial = pPipe->GetMaterial(); CString csMat = GetPipeMaterialByIdx(iMaterial); csType = GetDnByMat(csMat); pPipe->SetLabel(csType); } else pPipe->SetLabel(dlg.m_csType); } OPENOBJ_END(); XString xsDim1(_T("%s%d"), csType, iDn); CString csLay = GetPipeTextLayByEnt(entSel); InitLayer(csLay); TDbPipeText *pText = new TDbPipeText(); pText->SetTextStyleId(idTextStyle); pText->SetLocation(Ucs2Wcs(ptPick)); pText->SetTextHeight(dlg.m_nHeight); pText->setLayer(csLay); pText->setColor(AcCmColor()); pText->SetText((const TCHAR*)xsDim1); AddToCurrentSpace(pText, Adesk::kTrue); } else if(dlg.m_iRet == 2){//引出管径 TCHAR szLayer[256]; entSel.GetData(8, szLayer); int iDn = dlg.m_iRadius; OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TDbPipe, pPipe); if(pPipe){ if(iDn > 0) pPipe->SetDnDiameter(dlg.m_iRadius); else iDn = (int)pPipe->GetDnDiameter(); if(_tcsicmp(dlg.m_csType, _T("自动")) == 0){ int iMaterial = pPipe->GetMaterial(); CString csMat = GetPipeMaterialByIdx(iMaterial); pPipe->SetLabel(GetDnByMat(csMat)); } else pPipe->SetLabel(dlg.m_csType); } OPENOBJ_END(); CString csLay = GetPipeDimLayByEnt(entSel); InitLayer(csLay); XPoint ptStart, ptEnd; GetPipePoint(entSel, ptStart, ptEnd); AcDbObjectId id; acdbGetObjectId(id, entSel); TDbPipeMultDim *pDim = new TDbPipeMultDim; pDim->AddPipe(id); double nAng = ads_angle(ptStart, ptEnd); pDim->SetLayoutRotation(nAng); pDim->setLayer(csLay); pDim->SetStartPoint(ptPick); pDim->SetTextStyleId(idTextStyle); pDim->SetTextLayerId(InitLayer(LAY_TEXT)); pDim->SetDimType(0); pDim->SetTextHeight(g_nPipeDnHeight); pDim->SetTextBaseLen(pDim->GetDefaultTextBaseLen()); TMultPipeDimEdJig jig(pDim); XPoint ptlnMinStart, ptlnMinEnd, ptlnMinStart2, ptlnMinEnd2; ptlnMinEnd = ptEnd; ptlnMinStart = ptStart; ptlnMinEnd2 = ptlnMinEnd; ptlnMinStart2 = ptlnMinStart; ptlnMinStart.z = 0; ptlnMinEnd.z = 0; ptlnMinStart2.z = 0; ptlnMinEnd2.z = 0; jig.m_ptLeftUp = ptlnMinStart; jig.m_ptRightUp = ptlnMinEnd; jig.m_ptLeftDown = ptlnMinStart2; jig.m_ptRightDown = ptlnMinEnd2; jig.SetPrompt(_T("\n请给出标注点<退出>:")); if(jig.DoIt()==RTNORM) { ((TDbEntity *)pDim)->AddToCSpace(Adesk::kTrue); Entity entLast; entLast.GetLast(); // WriteXdata(entLast, _T("TG-LAYER"), szLayer); OPENOBJ_BEGIN(entLast, AcDb::kForWrite, TDbEntity, pEnt) if(pEnt){ pEnt->setLayer(csLay); } OPENOBJ_END() } else { delete pDim; continue; } } else if(dlg.m_iRet == 3){//多点标注 CString csType = dlg.m_csType; int iDn = dlg.m_iRadius; OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TDbPipe, pPipe); if(pPipe){ if(iDn > 0) pPipe->SetDnDiameter(dlg.m_iRadius); else iDn = (int)pPipe->GetDnDiameter(); if(_tcsicmp(dlg.m_csType, _T("自动")) == 0){ int iMaterial = pPipe->GetMaterial(); CString csMat = GetPipeMaterialByIdx(iMaterial); csType = GetDnByMat(csMat); } } OPENOBJ_END(); //cet 2011.2.15 modify 根据选取管线时点的位置自动设置标注位置 //DoDimPipeDn2ByPt(entSel, iDn, csType, dlg.m_nHeight, dlg.m_iPos, Ucs2Wcs(ptPick)); DoDimPipeDn2ByPt(entSel, iDn, csType, dlg.m_nHeight, nPos, Ucs2Wcs(ptPick)); } TPipePerDocData *pData = GetCurPipeDocData(); pData->ApplyUpdates(); // cet 2011.4.27 del // } // else if(ret == RTKWORD){ // continue; // } // else // break; } if (!bExistLayer) { RemoveLayer(LAY_CALC_TEXT); } dlg.DestroyWindow(); } //*************************************************************************************************** // 多管标注 //*************************************************************************************************** extern CString GetDimLayByEnt(Entity ent); extern double GetLayoutRotate(double nRotateIn); // 获取用户选择的管线 zxl 2012.06.26 ADD void GetIntersectPipe(const XPoint &ptStartPick, const XPoint &ptEndPick, PickSet &ss) { AcDbLine line; line.setStartPoint(ptStartPick); line.setEndPoint(ptEndPick); AcGePoint3dArray arryPts; std::map mapPipe; for (long i = 0; i < ss.Length(); i++) { double dDist(0.0); arryPts.setLogicalLength(0); Entity ent = ss[i]; AcDbObjectId id = NULL; acdbGetObjectId(id, ent); OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe) if(pPipe) { AcDbLine linePipe; AcGePoint3d ptS, ptE; ptS = pPipe->StartPoint(); ptS.z = 0; ptE = pPipe->EndPoint(); ptE.z = 0; linePipe.setStartPoint(ptS); linePipe.setEndPoint(ptE); linePipe.intersectWith(&line, AcDb::kOnBothOperands, arryPts); if (pPipe->IsVertical()) { AcGePoint3d ptPipe = pPipe->StartPoint(); ptPipe.z = 0; AcGePoint3d ptOnline; line.getClosestPointTo(ptPipe, ptOnline); if (ptPipe.distanceTo(ptOnline) < pPipe->GetRadius() * DocGetPScale()) { dDist = ptPipe.distanceTo(ptStartPick); mapPipe.insert(std::make_pair(dDist, ent)); } } else if (arryPts.length() > 0) { AcGePoint3d ptOnPipe = arryPts[0]; if (ptOnPipe.distanceTo(ptS) > pPipe->GetRadius() * DocGetPScale() && ptOnPipe.distanceTo(ptE) > pPipe->GetRadius() * DocGetPScale()) { dDist = ptOnPipe.distanceTo(ptStartPick); mapPipe.insert(std::make_pair(dDist, ent)); } } } OPENOBJ_END() } PickSet ssPipe(SS_FREE); ss.Free(); std::map::iterator it; for (it = mapPipe.begin(); it != mapPipe.end(); it++) { ss += it->second; } } void MultiPipeDimDn() { InitLayer(LAY_PIPE_DIM); // zxl 2012.06.27 add 更改选择管线形式 g_ssPickFirst.Free(); PickSet ssAll(SS_FREE); RBList rbMask(RTDXF0, _T("ATS_PIPE"), 8, GetLayerNames(_T("管")), NULL); if(SelectEntities(_T("\n请选择需要标注的管线或立管: <退出>"), ssAll, rbMask) != RTNORM) return; if (ssAll.Length() < 1) { return; } // DocSetText2Base(0.2); // XPushVarStr clayer(_T("CLAYER"), LAY_PIPE_DIM); Entity entLast; TCHAR szLayer[256]; //用户输入参数 adsout<<_T("\n多管标注:") <<_T("\n确定一直线的起点与终点") <<_T("\n用该直线与待标注的管线(可以是多根)相交"); XPoint ptStartPick,ptEndPick; if(ads_getpoint(NULL, _T("\n起点:"), ptStartPick) != RTNORM) return; if(ads_getpoint(ptStartPick, _T("\n终点:"), ptEndPick) != RTNORM) return; PickSet ss(SS_FREE); // zxl 2012.009.21 add ptStartPick.z = 0; ptEndPick.z = 0; UCS2WCS(ptStartPick); UCS2WCS(ptEndPick); GetIntersectPipe(ptStartPick, ptEndPick, ssAll); ss = ssAll; // zxl 2012.06.26 del // struct resbuf *pointlist; // PickSet ss(SS_FREE); // pointlist = ads_buildlist(RTPOINT, &ptStartPick, RTPOINT, &ptEndPick, NULL); // ss.Get(_T("F"), pointlist, NULL, RBList(RTDXF0, _T("ATS_PIPE"), 0)); // ads_relrb(pointlist); if(ss.Length() < 1) return; ss[0L].GetData(8, szLayer); XPoint ptlnMinStart, ptlnMinEnd, ptlnMinStart2, ptlnMinEnd2; XLine line(1); int iDimType = 0; DList lstId; double nDistMax(-1); BOOL bAllVer = TRUE;//看是否全是立管 // BOOL bAllOut = TRUE;//看是否全是室外管线 for(long i=0;i:"), szText); // if(_tcsicmp(szText, _T("N")) == 0){ // iDimType = 1; // } TCHAR szText[256]; int nStatus = 0; INITGET_BEG(0, _T("N Y")); nStatus = acedGetString(0, _T("进行管径标注(键入N进行立管编号标注):"), szText); INITGET_END(); if (nStatus == RTNORM) { if (szText[0] == _T('n') || szText[0] == _T('N')) { iDimType = 1; } } else { return; } } CString csDimLay; BOOL bIsVer = FALSE; XString csFloor; for (i=0;i"), csDim); int ret = ads_getstring(0, csPrompt, szName); if(ret != RTNORM && ret != RTNONE) return; if(_tcsicmp(szName, _T("")) == 0) return; WriteXdata(ent, _T("PIPE-SERIAL"), szName); } lstId.Append(new AcDbObjectId(id)); continue; } double nDn(-1); OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe) if(pPipe){ if(pPipe->IsVertical()) bIsVer = TRUE; if(i == 0){ ptlnMinEnd = pPipe->EndPoint(); ptlnMinStart = pPipe->StartPoint(); ptlnMinEnd2 = ptlnMinEnd; ptlnMinStart2 = ptlnMinStart; } else{ if(i == ss.Length() - 1){ ptlnMinEnd2 = pPipe->EndPoint(); ptlnMinStart2 = pPipe->StartPoint(); } double nTmp = (pPipe->StartPoint()).Distance(&line); if(nTmp > nDistMax) nDistMax = nTmp; } nDn =pPipe->GetDnDiameter(); if(_tcsicmp(pPipe->GetLabel(), _T("")) == 0){ // flag = TRUE; if(pPipe->upgradeOpen()==Acad::eOk) { // 2008-6-23 如果没有标注过,给一个默认的前缀 int iMaterial = pPipe->GetMaterial(); CString csMat = GetPipeMaterialByIdx(iMaterial); pPipe->SetLabel(GetDnByMat(csMat)); pPipe->downgradeOpen(); } } } OPENOBJ_END() lstId.Append(new AcDbObjectId(id)); } if (bAllVer && iDimType == 1) { CString csPrompt; CString sTmp; csPrompt.Format(_T("\n请输入立管所属楼号:")); if(csFloor != _T("")) { sTmp = csFloor; csPrompt.Format(_T("\n请输入立管所属楼号(按ESC设置为空):<%s>"), csFloor); } int ret = ads_getstring(0, csPrompt, csFloor); if(ret != RTNORM && ret != RTNONE && ret != RTCAN) return; if(sTmp != _T("") && csFloor == _T("")) { csFloor = sTmp; } if(ret == RTCAN) csFloor = _T(""); for (i=0;iAddPipe(*lstId[j]); } pDim->setLayer(InitLayer(csDimLay)); pDim->SetLayoutRotation(nRotate); pDim->SetStartPoint(ptStartPick); pDim->SetTurnPoint(ptEndPick); pDim->SetTextLayerId(InitLayer(LAY_TEXT)); if(iDimType == 1) pDim->SetTextStyleId(InitTwtTextStyle(g_csVPipeStyle)); else pDim->SetTextStyleId(InitTwtTextStyle(g_csPipeDnStyle)); pDim->SetDimType(iDimType); pDim->SetTextHeight(g_nPipeDnHeight); // zxl 2013.01.21 add pDim->SetDimAlignType(0); pDim->SetDimDist2Line(2.0); pDim->SetTextBaseLen(pDim->GetDefaultTextBaseLen()); if(bAllVer){ pDim->SetTextBaseLen(pDim->GetDefaultTextBaseLen()); ((TDbEntity *)pDim)->AddToCSpace(Adesk::kTrue); entLast.GetLast(); OPENOBJ_BEGIN(entLast, AcDb::kForWrite, TDbEntity, pEnt) if(pEnt){ pEnt->setLayer(csDimLay); } OPENOBJ_END() return; } TMultPipeDimEdJig jig(pDim); double nAng = ads_angle(ptStartPick, ptEndPick); ptlnMinStart.z = 0; ptlnMinEnd.z = 0; ptlnMinStart2.z = 0; ptlnMinEnd2.z = 0; jig.m_ptLeftUp = ptlnMinStart; jig.m_ptRightUp = ptlnMinEnd; jig.m_ptLeftDown = ptlnMinStart2; jig.m_ptRightDown = ptlnMinEnd2; // cet 2011.4.25 add 标注类型选择 TCHAR szSelChar[10]; int nStatus = 0; INITGET_BEG(0, _T("E F D")); nStatus = acedGetString(0, _T("\n进行管径标注[标高标注(E)/管径、标高同时标注(F)/管代号-管径标注(D)]<管径标注>"), szSelChar); INITGET_END(); if (nStatus == RTNORM) { if (szSelChar[0] == _T('E') || szSelChar[0] == _T('e')) { iDimType = 3; // 标高标注 } else if (szSelChar[0] == _T('f') || szSelChar[0] == _T('F'))// 管径、标高同时标注 zxl 2012.06.28 add { iDimType = 4; } else if (szSelChar[0] == _T('d') || szSelChar[0] == _T('D'))// 管代号-管径标注 zxl 2013.02.21 add { iDimType = 5; CString csText; for (long l = 0l; l < ss.Length(); l++) { Entity entOne = ss[l]; TCHAR szLayer[256]; entOne.GetData(8, szLayer); int idx = GetPipeLayerIdxByName(szLayer); CString sLabel; if(idx >= 0) sLabel = g_csPipeDim[idx]; sLabel += _T(","); csText += sLabel; } pDim->SetPipeLabel(csText); } else { iDimType = 0; // 管径标注 } } else { return; } pDim->SetDimType(iDimType); pDim->SetPipePrefix(_T("")); pDim->SetTextBaseLen(pDim->GetDefaultTextBaseLen()); // zxl modify 2013.04.22 // jig.SetPrompt(_T("\n请给出标注点<退出>:")); // if(jig.DoIt()==RTNORM) { // // ((TDbEntity *)pDim)->setLayer(LAY_PIPE_DIM); // ((TDbEntity *)pDim)->AddToCSpace(Adesk::kTrue); // entLast.GetLast(); // // OPENOBJ_BEGIN(entLast, AcDb::kForWrite, TDbEntity, pEnt) // if(pEnt){ // pEnt->setLayer(csDimLay); // } // OPENOBJ_END() // // } // else { // delete pDim; // return; // } jig.SetPrompt(_T("\n请给出标注点[左右翻转(F)]<退出>:")); jig.SetKeyword(_T("F")); int nKeyIndex; while(true) { int nRet = jig.DoIt(&nKeyIndex); if (nRet == RTKWORD) { pDim->SetTextBaseLen(-pDim->GetTextBaseLen()); } else if(nRet == RTNORM) { ((TDbEntity *)pDim)->setLayer(LAY_PIPE_DIM); ((TDbEntity *)pDim)->AddToCSpace(Adesk::kTrue); entLast.GetLast(); OPENOBJ_BEGIN(entLast, AcDb::kForWrite, TDbEntity, pEnt) if(pEnt) { pEnt->setLayer(csDimLay); } OPENOBJ_END() return; } else { delete pDim; return; } } } ///////////////////////////////////////////////////////////////////////////// // CDimSinglePipeRadiusDlg dialog IMPLEMENT_DYNAMIC(CDimSinglePipeRadiusDlg, CModelessDialog) int CDimSinglePipeRadiusDlg::m_iRet = 0; int CDimSinglePipeRadiusDlg::m_iRadius = 20; CString CDimSinglePipeRadiusDlg::m_csType = _T("DN"); CString CDimSinglePipeRadiusDlg::m_strWndEdtPos = _T("左上"); // cet 2011.4.27 add CDimSinglePipeRadiusDlg::CDimSinglePipeRadiusDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(CDimSinglePipeRadiusDlg::IDD, pParent), m_spinHeight(0.5) { //{{AFX_DATA_INIT(CDimSinglePipeRadiusDlg) m_bAuto = FALSE; m_nHeight = g_nPipeDnHeight; //}}AFX_DATA_INIT m_pMenuPos = NULL; // cet 2011.5.26 add } CDimSinglePipeRadiusDlg::~CDimSinglePipeRadiusDlg() { int len = m_lstDim.Length(); TCHAR strTmpPath[256] = _T(""); GetTempPath(255, strTmpPath); _tcscat(strTmpPath, _T("PipeDim.his")); int n=0; if(len > 10) n = len - 10; for(int j=0;j -1) m_lstDim.Remove(i); m_listDn.DeleteString(idx); } void CDimSinglePipeRadiusDlg::OnPaint() { CPaintDC dc(this); // device context for painting CWnd *pImageBox1 = GetDlgItem(IDC_PREVIEW1); CWnd *pImageBox2 = GetDlgItem(IDC_PREVIEW2); CWnd *pImageBox3 = GetDlgItem(IDC_PREVIEW3); CWnd *pImageBox4 = GetDlgItem(IDC_PREVIEW4); CImageDC img1; CDC *pDC1 = pImageBox1->GetDC(); CRect rc1; pImageBox1->GetClientRect(&rc1); if(m_iRet == 0) img1.InitDC(pDC1, rc1, RGB(255, 255, 255)); else img1.InitDC(pDC1, rc1, GetAcadBackColor()); img1.PaintSlide(_T("TWT(DN1)")); img1.SetDC(NULL); pImageBox1->ReleaseDC(pDC1); CImageDC img2; CDC *pDC2 = pImageBox2->GetDC(); CRect rc2; pImageBox2->GetClientRect(&rc2); if(m_iRet == 1) img2.InitDC(pDC2, rc2, RGB(255, 255, 255)); else img2.InitDC(pDC2, rc2, GetAcadBackColor()); img2.PaintSlide(_T("TWT(DN2)")); img2.SetDC(NULL); pImageBox2->ReleaseDC(pDC2); CImageDC img3; CDC *pDC3 = pImageBox3->GetDC(); CRect rc3; pImageBox3->GetClientRect(&rc3); if(m_iRet == 2) img3.InitDC(pDC3, rc3, RGB(255, 255, 255)); else img3.InitDC(pDC3, rc3, GetAcadBackColor()); img3.PaintSlide(_T("TWT(DN3)")); img3.SetDC(NULL); pImageBox3->ReleaseDC(pDC3); CImageDC img4; CDC *pDC4 = pImageBox4->GetDC(); CRect rc4; pImageBox4->GetClientRect(&rc4); if(m_iRet == 3) img4.InitDC(pDC4, rc4, RGB(255, 255, 255)); else img4.InitDC(pDC4, rc4, GetAcadBackColor()); img4.PaintSlide(_T("TWT(DN4)")); img4.SetDC(NULL); pImageBox4->ReleaseDC(pDC4); } void CDimSinglePipeRadiusDlg::OnClose() { CModelessDialog::OnClose(); acedPostCommand(_T("\33\33")); } int CDimSinglePipeRadiusDlg::GetIndex(CPoint & pt) { CRect rc1,rc2,rc3,rc4; CPoint point = pt; ClientToScreen(&point); CWnd *pImageBox1 = GetDlgItem(IDC_PREVIEW1); CWnd *pImageBox2 = GetDlgItem(IDC_PREVIEW2); CWnd *pImageBox3 = GetDlgItem(IDC_PREVIEW3); CWnd *pImageBox4 = GetDlgItem(IDC_PREVIEW4); pImageBox1->GetWindowRect(&rc1); pImageBox2->GetWindowRect(&rc2); pImageBox3->GetWindowRect(&rc3); pImageBox4->GetWindowRect(&rc4); if (rc1.PtInRect(point)) return 0; if (rc2.PtInRect(point)) return 1; if (rc3.PtInRect(point)) return 2; if (rc4.PtInRect(point)) return 3; return -1; } void CDimSinglePipeRadiusDlg::OnLButtonUp(UINT nFlags, CPoint point) { int idx = GetIndex(point); if(idx > -1){ m_iRet = idx; PostCommand(_T("R "), false); } Invalidate(TRUE); UpdateWindow(); CModelessDialog::OnLButtonUp(nFlags, point); acedGetAcadDwgView()->SetFocus(); } void CDimSinglePipeRadiusDlg::OnButtonType() { RBList rbCmd=ads_buildlist(RTSTR, _T("ISetPipeMatDnType"), NULL); resbuf *rbRes=NULL; if(ads_invoke(rbCmd, &rbRes)==RTNORM && rbRes) { ads_relrb(rbRes); } } void CDimSinglePipeRadiusDlg::OnCheckAuto() { UpdateData(TRUE); CWnd *pWnd1 = GetDlgItem(IDC_COMBO_TYPE); CWnd *pWnd2 = GetDlgItem(IDC_EDIT_RADIUS); if(m_bAuto){ pWnd1->EnableWindow(FALSE); pWnd2->EnableWindow(FALSE); m_iRadius = -1; m_csType = "自动"; } else{ pWnd1->EnableWindow(TRUE); pWnd2->EnableWindow(TRUE); m_iRadius = 25; m_csType = "DN"; } UpdateData(FALSE); } const UINT MenuID = 9500; void CDimSinglePipeRadiusDlg::OnButtonPos() { CWnd *pWnd = GetDlgItem(IDC_BUTTON_POS); CRect rc; pWnd->GetWindowRect(rc); if(m_pMenuPos != NULL) { m_pMenuPos->DestroyMenu(); m_pMenuPos->CreatePopupMenu(); } else { m_pMenuPos = new CMenu; m_pMenuPos->CreatePopupMenu(); } m_pMenuPos->AppendMenu(m_strWndEdtPos.CompareNoCase(_T("屏幕拾取")) == 0 ? MF_CHECKED : MF_UNCHECKED, MenuID + 1, _T("屏幕拾取")); m_pMenuPos->AppendMenu(m_strWndEdtPos.CompareNoCase(_T("左上")) == 0 ? MF_CHECKED : MF_UNCHECKED, MenuID + 2, _T("左上")); m_pMenuPos->AppendMenu(m_strWndEdtPos.CompareNoCase(_T("右下")) == 0 ? MF_CHECKED : MF_UNCHECKED, MenuID + 3, _T("右下")); m_pMenuPos->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL, rc.left, rc.bottom, this, &rc); } BOOL CDimSinglePipeRadiusDlg::OnCommand(WPARAM wParam, LPARAM lParam) { if (m_pMenuPos != NULL) { CString strCmd; m_pMenuPos->GetMenuString(wParam, strCmd, MF_BYCOMMAND); if (!strCmd.IsEmpty()) { m_strWndEdtPos = strCmd; UpdateData(FALSE); } } return CModelessDialog::OnCommand(wParam, lParam); } void CDimSinglePipeRadiusDlg::SetSelDNString() { CString strText; for (int iComType = 0; iComType < m_comboType.GetCount(); iComType++) { m_comboType.GetLBText(iComType,strText); if (strText == m_csType) { m_comboType.SetCurSel(iComType); break; } } }