#include "StdAfx.h" #include "GeRectAngle.h" #include "AcDbObjectPtr.h" #include "globalFunc.h" #include "globalDefine.h" #include "ADSGePointList.h" #include "PickEntSet.h" #include "AecDbText.h" #include "aecdbdimension.h" #include "EntityEdJig.h" #include "DimOptionDlg.h" #include "DbEquipment.h" #include "AecDbRadiusDim.h" #include "AecDbSymbSymmetry.h" #include "AecDbSymbRupture.h" #include "AecDbSymbSection.h" #include "AecDbSymbCoord.h" #include "AecDbSymbMultiLeader.h" #include "AecDbSymbDrawingIndex.h" #include "AecDbSymbElevation.h" #include "AecDbSymbModi.h" #include "AecDbDrawingName.h" #include "AecDbSymbIndexPointer.h" #include "AecDbSymbComposing.h" #include "coretools.h" #include "DbPipe.h" #include "DimOptionData.h" #include "layerdef.h" #include "modifydimdlg.h" #include "ktcadutility.h" AECDLLIMPEXP bool GetDoubleClickEnt(LPCTSTR pszCmd, AcDbObjectId &id); extern AcDbObjectId InitDimStyle(TDimStyle ds); extern AcDbObjectId InitLayer(const TCHAR *szLayer, BOOL bApplyChange = TRUE); extern AcDbObjectId InitTextStyle(TTextStyle ts, AcDbDatabase *pDb = NULL); extern AcDbObjectId InitTextStyle(const TCHAR *pszStyle, AcDbDatabase *pDb = NULL); extern TCHAR* LAY_DIM; extern TCHAR* LAY_TEXT; namespace { int BatchDim(CBatchDimDlg &dlg, ads_matrix mat) { BOOL bIsWcs = GlobalFunc::IsWCS(); while (TRUE) { PickSet entSet; RBList maskList(RTDXF0, _T("LINE,ARC,CIRCLE,LWPOLYLINE,POINT,AEC_BIAOGAOBIAOZHU"), NULL); TCHAR szKey[132] = _T("SQ"); TCHAR key; int nRet = GlobalFunc::SelectEnts(_T("\n请选择需标注坐标的对象或 [设置(S)\\单点标注(Q)]<退出>:"), _T("\n请选择需标注坐标的对象: "), maskList, entSet, szKey, key); if (nRet == RTKWORD) { if (key == _T('S') || key == _T('s')) // 设置 { double nNorthAngle = PI / 2; PickSet ssNorth(SS_FREE); if (ssNorth.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("AEC_ZHIBEIZHEN"), 67, 0, NULL)) == RTNORM) // 模型空间指北针 { Entity ent0 = ssNorth[0L]; ent0.GetData(50, &nNorthAngle); } CCoordDlg dlg(IDD_COORD); dlg.m_fAngle = nNorthAngle * 180 / PI; { CTemporaryResourceOverride vTemp; if (dlg.DoModal() != IDOK) { continue; } } nNorthAngle = dlg.m_fAngle * PI / 180; XPoint().GetRotationMatrix(-nNorthAngle + PI / 2.0, mat); if (CCoordDlg::s_iUnitType == 0) { g_Option::instance().adsout << _T("\n当前绘图单位:mm;标注单位:M;"); } else { g_Option::instance().adsout << _T("\n当前绘图单位:M;标注单位:M;"); } if (CCoordDlg::IsWcsPoint()) { g_Option::instance().adsout << _T("以世界坐标取值;北向角度") << dlg.m_fAngle << _T("度"); } else if (CCoordDlg::IsUcsPoint()) { g_Option::instance().adsout << _T("以用户坐标取值"); } else if (CCoordDlg::IsRedLinePoint()) { g_Option::instance().adsout << _T("以场地坐标取值"); } } else { return nRet; // 返回调用处,重新循环 } } else if (nRet != RTNORM) { if (dlg.m_bPost) // 拾取实体 { dlg.SelectEntInDraw(); dlg.OnClickSelectInDraw(); continue; } return nRet; // 返回调用处,结束命令 } entSet.Redraw(4); // UnHighLight // 分类存储,减少后续循环和判断的次数 PickSet plineSet(SS_FREE), lineSet(SS_FREE), arcSet(SS_FREE), circleSet(SS_FREE), ptSet(SS_FREE), elevSet(SS_FREE); { if (dlg.GetIsAppointLayer()) // 若勾选了图层过滤,只保留指定图层上的对象 { CString strLayerName = dlg.GetStrLayerName(); strLayerName.Replace(_T("&"), _T(",")); strLayerName.TrimLeft(_T(",")); strLayerName.TrimRight(_T(",")); RBList rb(RTDXF0, _T("*"), 8, (const TCHAR *)strLayerName, NULL); entSet.BaseFilter(rb); } plineSet += entSet; // PLINE RBList rb(RTDXF0, _T("LWPOLYLINE"), NULL); plineSet.BaseFilter(rb); entSet -= plineSet; lineSet += entSet; // LINE rb = RBList(RTDXF0, _T("LINE"), NULL); lineSet.BaseFilter(rb); entSet -= lineSet; circleSet += entSet; // CIRCLE rb = RBList(RTDXF0, _T("CIRCLE"), NULL); circleSet.BaseFilter(rb); entSet -= circleSet; arcSet += entSet; // ARC rb = RBList(RTDXF0, _T("ARC"), NULL); arcSet.BaseFilter(rb); entSet -= arcSet; ptSet += entSet; // POINT rb = RBList(RTDXF0, _T("POINT"), NULL); ptSet.BaseFilter(rb); entSet -= ptSet; elevSet = entSet; // 标高标注 } XPointList lstPts; DList listCvSegment; { if (dlg.GetIsPolyVertex()) // 获得所有多段线的端点 { long lLength = plineSet.Length(); for (long l = 0; l < lLength; l++) { XPoly2D poly(plineSet[l]); int nPtNums = poly.Length(); for (int k = 0; k < nPtNums; k++) lstPts.NewAppend(poly.GetPointListAt(k)->AsAcGePoint3d()); } } if (dlg.GetIsPoint()) // 获得所有点 { long lLength = ptSet.Length(); for (long l = 0; l < lLength; l++) { OPENOBJ_BEGIN(ptSet[l], AcDb::kForRead, AcDbPoint, pPoint); if (pPoint != NULL) { lstPts.NewAppend(pPoint->position()); } OPENOBJ_END(); } } if (dlg.GetIsLineVertex()) // 获得所有直线、弧线端点 { long lLength = lineSet.Length(), l(0); for (l = 0; l < lLength; l++) { OPENOBJ_BEGIN(lineSet[l], AcDb::kForRead, AcDbLine, pLine); if (pLine != NULL) { lstPts.NewAppend(pLine->startPoint()); lstPts.NewAppend(pLine->endPoint()); listCvSegment.Append(new XCurveSegment(pLine->startPoint(), pLine->endPoint(), 0)); } OPENOBJ_END(); } lLength = arcSet.Length(); for (l = 0; l < lLength; l++) { XCurveSegment arc(arcSet[l]); lstPts.NewAppend(arc.StartPoint()); lstPts.NewAppend(arc.EndPoint()); listCvSegment.Append(new XCurveSegment(arc)); } } if (dlg.GetIsElevLoc()) // 获得所有标高符号的插入点 { long lLength = elevSet.Length(); for (long l = 0; l < lLength; l++) { OPENOBJ_BEGIN(elevSet[l], AcDb::kForRead, AecXDbSymbElevation, pElevation); if (pElevation != NULL) { lstPts.NewAppend(pElevation->GetLocation()); } OPENOBJ_END(); } } if (dlg.GetIsCirclePt()) // 获得所有圆心点 { long lLength = circleSet.Length(), l(0); for (l = 0; l < lLength; l++) { OPENOBJ_BEGIN(circleSet[l], AcDb::kForRead, AcDbCircle, pCircle); if (pCircle != NULL) { lstPts.NewAppend(pCircle->center()); // 圆 } OPENOBJ_END(); } lLength = arcSet.Length(); for (l = 0; l < lLength; l++) { OPENOBJ_BEGIN(arcSet[l], AcDb::kForRead, AcDbArc, pArc); if (pArc != NULL) { lstPts.NewAppend(pArc->center()); // 弧线 } OPENOBJ_END(); } lLength = plineSet.Length(); for (l = 0; l < lLength; l++) { XPoly2D poly(plineSet[l]); int nSegNums = poly.TotalSegments(); for (int k = 0; k < nSegNums; k++) { XCurveSegment seg; poly.Nth(k, seg); listCvSegment.Append(new XCurveSegment(seg)); if (seg.Is(CURVE_ARC)) { XArc arc = seg.GetArc(); lstPts.NewAppend(arc.GetCenterPt()); // 多段线中的弧段 } } } } if (dlg.GetIsIntersectPt()) // 标注交点 { if (!dlg.GetIsLineVertex()) // 不需要标注直线、弧线端点的时候 { long lLength = lineSet.Length(), l(0); for (l = 0; l < lLength; l++) { OPENOBJ_BEGIN(lineSet[l], AcDb::kForRead, AcDbLine, pLine); if (pLine != NULL) { listCvSegment.Append(new XCurveSegment(pLine->startPoint(), pLine->endPoint(), 0)); } OPENOBJ_END(); } lLength = arcSet.Length(); for (l = 0; l < lLength; l++) { XCurveSegment arc(arcSet[l]); listCvSegment.Append(new XCurveSegment(arc)); } } long lLength = circleSet.Length(), l(0); for (l = 0; l < lLength; l++) { XCurveSegment circle(circleSet[l]); listCvSegment.Append(new XCurveSegment(circle)); } if (!dlg.GetIsCirclePt()) // 不需要标注圆心的时候 { lLength = plineSet.Length(); for (l = 0; l < lLength; l++) { XPoly2D poly(plineSet[l]); int nSegNums = poly.TotalSegments(); for (int k = 0; k < nSegNums; k++) { XCurveSegment seg; poly.Nth(k, seg); listCvSegment.Append(new XCurveSegment(seg)); } } } int nSegments = listCvSegment.Length(); for (int m = 0; m < nSegments; m++) { XCurveSegment segThis = *listCvSegment[m]; for (int n = m + 1; n < listCvSegment.Length(); n++) { XCurveSegment segOther = *listCvSegment[n]; XPoint ptInter[2]; int nIntNum = segThis.Intersection(segOther, ptInter[0], ptInter[1]); switch (nIntNum) { case 1: lstPts.NewAppend(ptInter[0]); break; case 2: lstPts.NewAppend(ptInter[0]); lstPts.NewAppend(ptInter[1]); break; case 0: break; } } } } } { int nPts = lstPts.Length(); for (int j = 0; j < nPts; j++) { XPoint ptDim = *lstPts[j], ptValue = ptDim; if (CCoordDlg::IsUcsPoint()) ptValue = GlobalFunc::Wcs2Ucs(ptValue); else if (CCoordDlg::IsWcsPoint()) ptValue.TransformBy(mat); //else if (CCoordDlg::IsRedLinePoint()) // ptValue = TranslatePtFromRedline(ptValue); double dX(0), dY(0); if (CCoordDlg::s_iUnitType == 0) // mm-M { dX = _AS_METER(ptValue.y); dY = _AS_METER(ptValue.x); } else // M-M { dX = ptValue.y; dY = ptValue.x; } if (fabs(dX) < 1E-6) dX = 0; if (fabs(dY) < 1E-6) dY = 0; AecXDbSymbCoord *pCoord = new AecXDbSymbCoord; pCoord->SetTextStyleId(InitTextStyle(TS_SYMBOL)); pCoord->SetTextLayerId(InitLayer(LAY_TEXT, TRUE)); pCoord->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); pCoord->SetAB(g_Option::instance().g_bABCoord); pCoord->SetStyle((AecXDbSymbMultiLeader::TArrowStyle)g_Option::instance().g_nCoordArrowStyle); pCoord->SetPrecNum(g_Option::instance().g_nCoordPrec); if (CCoordDlg::IsUcsPoint()) pCoord->setColorIndex(4); else if (CCoordDlg::IsWcsPoint()) pCoord->setColorIndex(3); //else if (CCoordDlg::IsRedLinePoint()) // pCoord->setColorIndex(2); pCoord->SetLocation(ptDim); pCoord->SetValue(XPoint(dY, dX)); ads_polar(ptDim, GlobalFunc::Ucs2Wcs(0.0) + PI / 4, 6 * GlobalFunc::DocGetPScale(), ptDim); pCoord->SetTurnPoint(ptDim); GlobalFunc::AddToSpace(Adesk::kTrue, pCoord); } } } return RTNORM; } BOOL Is2LineIntersection(const GeLine* pLine1, const GeLine* pLine2, ads_point ptrp) { ADSGePoint3d ptGe; AcDbLine line1, line2; line1.setStartPoint(pLine1->StartPoint().AsAcGePoint3d()); line1.setEndPoint(pLine1->EndPoint().AsAcGePoint3d()); line2.setStartPoint(pLine2->StartPoint().AsAcGePoint3d()); line2.setEndPoint(pLine2->EndPoint().AsAcGePoint3d()); AcDb::Intersect intType; if (pLine1->GetLineFlag() == LS_FINITE && pLine2->GetLineFlag() == LS_FINITE) // 都不延长 intType = AcDb::kOnBothOperands; else if (pLine1->GetLineFlag() == LS_FINITE && pLine2->GetLineFlag() == LS_INFINITE) intType = AcDb::kExtendThis; else if (pLine1->GetLineFlag() == LS_INFINITE && pLine2->GetLineFlag() == LS_FINITE) intType = AcDb::kExtendArg; else intType = AcDb::kExtendBoth; AcGePoint3dArray points; Acad::ErrorStatus es = line1.intersectWith(&line2, intType, points); if (es != Acad::eOk || points.logicalLength() < 1) { return FALSE; } ptGe = points[0]; ptrp[X] = ptGe.x; ptrp[Y] = ptGe.y; ptrp[Z] = ptGe.z; return TRUE; } } void LoadConfig() { GlobalFunc::LoadConfig(); } void Option() { int bOldMeterForSH = g_DimOption::instance().g_bMeterUnitDraw; CAcModuleResourceOverride vres; CDimOptionDlg dimdlg; if (dimdlg.DoModal() == IDOK) { // 在这里处理一下“绘图单位”,如果“绘图单位”改变,要对系统变量“INSUNITS” 做一致性修改 LoadConfig(); if (g_DimOption::instance().g_bMeterUnitDraw != bOldMeterForSH && g_DimOption::instance().g_bMeterUnitDraw != (CoreTools::IsMetersUnit() ? 1 : 0)) { // 有变化,且与系统变量不一致 if (g_DimOption::instance().g_bMeterUnitDraw == 0) CKTCadUtility::SetSystemVar(_T("INSUNITS"), AcDb::kUnitsMillimeters); else CKTCadUtility::SetSystemVar(_T("INSUNITS"), AcDb::kUnitsMeters); } SHacedCommand(RTSTR, _T("REGEN"), RTNONE); if (g_Option::instance().g_bAutoLTScale) { int nTileMode = 0; VERIFY(GlobalFunc::TGGetVar(_T("TILEMODE"), &nTileMode) == RTNORM); double ltscale = nTileMode ? g_Option::instance().g_nLtMScale : g_Option::instance().g_nLtPScale; GlobalFunc::TGSetVar(_T("LTSCALE"), ltscale); } } } void DimRadOrDia(BOOL bDia) { InitLayer(LAY_DIM, TRUE); EntitySet ent; ADSGePoint3d ptPick; RBList rb; if (GlobalFunc::SelectEntity1(_T("\n请选择待标注的圆弧<退出>: "), ent, ptPick, rb) == RTNORM) { ptPick = GlobalFunc::Ucs2Wcs(ptPick); GeCircle cir; if (ent.Is(_T("ARC")) || ent.Is(_T("CIRCLE"))) { cir = GeCircle(ent); } else { bool bFoundArc = false; AcDbVoidPtrArray subEnt; OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); GlobalFunc::ExplodeEx((AcDbEntity*)pEnt->clone(), subEnt); OPENOBJ_END(); for (long i = 0; i < subEnt.length(); i++) { AcDbEntity *pEnt = (AcDbEntity*)subEnt[i]; if (pEnt->isKindOf(AcDbArc::desc())) { AcDbArc* pArc = AcDbArc::cast(pEnt); ads_point c; GeArc arc(c, pArc->radius(), pArc->startAngle(), pArc->endAngle()); arc.SetCenterPt(pArc->center()); int flag = arc.HitTest2d(ptPick); if (flag > 2) { bFoundArc = true; cir.SetCenterPt(arc.GetCenterPt()); cir.SetRadius(arc.GetRadius()); break; } } else if (pEnt->isKindOf(AcDbCircle::desc())) { AcDbCircle *pCir = AcDbCircle::cast(pEnt); cir.SetRadius(pCir->radius()); cir.SetCenterPt(pCir->center()); if (cir.HitTest2d(ptPick) > 2) { bFoundArc = true; break; } } } GlobalFunc::ReleaseEntSet(subEnt); if (!bFoundArc) { ads_printf(_T("\n请选择弧线!")); return; } } ADSGePoint3d ptOnCir; ptPick.Project(&cir, ptOnCir); AecXDbRadiusDim *pDim = new AecXDbRadiusDim; // jsx add 160914,增加布局转角的设置,解决UCS下,文字方向错误的问题 pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); pDim->SetStyleId(InitDimStyle(DS_RADIUS)); pDim->SetDimCenter(cir.GetCenterPt()); pDim->SetDimEndPoint(ptOnCir); if (!bDia) { double nDimDist = pDim->GetDimLen(FALSE); if (nDimDist > cir.GetCenterPt().Distance2d(ptOnCir)) pDim->SetDimLen(-nDimDist, FALSE); } else { AecXDbText text; pDim->GetDimText(text); // if is default, then it is empty TCString sText = pDim->GetText(); text.SetText(sText); ADSGePoint3d ptExt = text.GetExtents(); if (pDim->GetRadius() < ptExt.x) pDim->SetDimLen(-ptExt.x * 1.5, FALSE); } pDim->SetDiameter(bDia); // modify by xly on 110107 支持图层切换 //pDim->AddToCSpace(Adesk::kTrue); GlobalFunc::AddToSpace(Adesk::kTrue, pDim); } } void DI_Radius() { DimRadOrDia(FALSE); } void DI_Diameter() { DimRadOrDia(TRUE); } extern void LoadConfig(); void DI_LoadConfig() { LoadConfig(); } extern void Option(); void DI_Option() { Option(); } void DimContinue() { //add by lgy 20120507 保存当前空间是模型空间还是图纸空间 int iTitleMode = 0; if (GlobalFunc::TGGetVar(_T("TILEMODE"), &iTitleMode) != RTNORM)//模型空间 { return; } BOOL b = FALSE; InitLayer(LAY_DIM, TRUE); AecDbDimension dim; ADSGePoint3d ptStart; ADSGePointList lstAddPoint; //wcs ADSGePointList lstBasePoint;//ucs GlobalFunc::PushAcadVar osmode(_T("OSMODE"), GlobalFunc::GetFullOsMode(OS_INT | OS_END)); if (GlobalFunc::GetPickPoint(NULL, _T("\n起点"), ptStart) == RTNORM) { GlobalFunc::PushAcadVar osmode1(_T("OSMODE"), GlobalFunc::GetFullOsMode(OS_PER | OS_INT | OS_END)); lstBasePoint.Append(new ADSGePoint3d(ptStart)); ptStart = GlobalFunc::Ucs2Wcs(ptStart); AecDbDimension *pDim = &dim; //add by cwk on 060915 if (pDim->GetSegmentNum() >= 1) { pDim->RemoveSegment(1); } // modify by xly on 110107 支持图层切换 //pDim->setLayer(LAY_DIM); pDim->SetDist2DimLine(6.0); pDim->SetLocation(ptStart); pDim->AppendSegment(2.0 * g_Option::instance()._DIST_SNAP); //modify by lgy 20120507 保存标注样式id,以用来在视口空间中是否需要转换 //pDim->SetStyleId(InitDimStyle(DS_LINEAR)); AcDbObjectId idDimStyle = InitDimStyle(DS_LINEAR); pDim->SetStyleId(idDimStyle); // sg add 120410,增加布局转角的设置,解决UCS下,文字方向错误的问题 pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); DimensionEdJig jig(pDim, _T("\n第二点<退出>: ")); //add by lgy 20120507 如果当前是图纸空间 BOOL bExist = FALSE; //如果添加的新的标注样式已经存在,默认不添加不存在 if (iTitleMode == 0) //当前空间是图纸空间 { PickEntSet entSet; entSet.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("VIEWPORT"), NULL)); double dScale = 1.0; BOOL bOnEnt = FALSE; int nNum = GlobalFunc::GetPtOnWhichPort(ptStart, dScale, bOnEnt, entSet); //得到视口编号和视口比例 if (nNum > 1 && bOnEnt) //不是最外层的大视口 { jig.m_bInView = TRUE; jig.m_entSet = entSet; jig.m_nPortNum = nNum; jig.m_idDimOld = idDimStyle; //获得原来标注样式在标注样式表中的名字 CString strName; AcDbDimStyleTableRecord *pNewDimStyle = NULL; OPENOBJ_BEGIN(idDimStyle, AcDb::kForRead, AcDbDimStyleTableRecord, pDimStyle); if (pDimStyle != NULL) { const TCHAR *pName = NULL; pDimStyle->getName(pName); strName = pName; strName.Format(_T("%s_%.0f"), strName, 1 / dScale); pNewDimStyle = (AcDbDimStyleTableRecord*)pDimStyle->clone(); } OPENOBJ_END(); AcDbDimStyleTable *pDimStyleTbl = NULL; Acad::ErrorStatus es = Acad::eOk; es = acdbHostApplicationServices()->workingDatabase()->getDimStyleTable(pDimStyleTbl, AcDb::kForWrite); if (es != Acad::eOk) { delete pNewDimStyle; pNewDimStyle = NULL; return; } AcDbObjectId id; if (!pDimStyleTbl->has(strName)) { if (pNewDimStyle != NULL) { pNewDimStyle->setName(strName); pNewDimStyle->setDimlfac(1 / dScale); pDimStyleTbl->add(id, pNewDimStyle); pDim->SetStyleId(id); jig.m_idDimNew = id; pNewDimStyle->close(); } } else { if (pNewDimStyle != NULL) { delete pNewDimStyle; pNewDimStyle = NULL; } pDimStyleTbl->getAt(strName, id); pDim->SetStyleId(id); jig.m_idDimNew = id; bExist = TRUE; } pDimStyleTbl->close(); } } jig.Step();//add by whl jig.m_nFlag = 0; jig.doIt(); //modify by lgy 20120510 逐点标注jig时如果退出了命令需要删除添加的标注样式 //if(jig.GetRetCode()!=RTNORM) // return; if (jig.GetRetCode() != RTNORM) { if (!bExist) { OPENOBJ_BEGIN(jig.m_idDimNew, AcDb::kForWrite, AcDbDimStyleTableRecord, pRecord); if (pRecord) { pRecord->erase(); } OPENOBJ_END(); } return; } if (!pDim->IsValid()) { g_Option::instance().adsout << _T("请正确点取!"); return; } //add by lgy 20120509 如果标注样式没有考虑视口,需要将之前添加到标注样式表中的 //标注样式删除掉 if (!jig.m_bSaveStyle && !bExist) { OPENOBJ_BEGIN(jig.m_idDimNew, AcDb::kForWrite, AcDbDimStyleTableRecord, pRecord); if (pRecord) { pRecord->erase(); } OPENOBJ_END(); } /* static int nAnswer=Q_NO; nAnswer=YesNoQuestion(_T("\n是否同时作为标注点"), nAnswer); if(nAnswer==RTCAN) return; */ ADSGePoint3d ptSec = jig.m_ptDim; ADSGePoint3d ptAdd; ADSGePoint3d ptBase; ptAdd = ptSec; lstAddPoint.Append(new ADSGePoint3d(ptAdd)); ptBase = GlobalFunc::Wcs2Ucs(ptAdd); lstBasePoint.Append(new ADSGePoint3d(ptAdd)); LAB_REINPUT: jig.m_pszPrompt = _T("\n请点取尺寸线位置或 [更正尺寸线方向(D)]<退出>: "); jig.Step();//add by whl jig.m_nFlag = 1; jig.m_pszKeyword = _T("D"); int nKeywordIndex = 0; INITGET_BEG(-1, _T("D")); jig.doIt(); INITGET_END(); int nRetCode = jig.GetRetCode(); //modify by lgy 20120510 //if(nRetCode==RTCAN) // return; if (nRetCode == RTCAN) { if (!bExist) { OPENOBJ_BEGIN(jig.m_idDimNew, AcDb::kForWrite, AcDbDimStyleTableRecord, pRecord); if (pRecord) { pRecord->erase(); } OPENOBJ_END(); } return; } else if (nRetCode == RTKWORD) { EntitySet entDir; double nDirection = 0.0; if (entDir.FilterSelect(_T("\n选择墙或线确定尺寸方向<退出>:"), //RBList(RTDXF0, _T("LINE,TCH_WALL,TCH_CURTAIN_WALL"), NULL), ADSGePoint3d()) == RTNORM) RBList(RTDXF0, _T("LINE"), NULL), ADSGePoint3d()) == RTNORM) { if (entDir.Is(_T("LINE"))) { GeLine ln(entDir); nDirection = ln.Direction(); } else { //OPENOBJ_BEGIN(entDir, AcDb::kForRead, TDbWall, pWall); //if (pWall) // nDirection = pWall->GeLine::Direction(); //OPENOBJ_END(); } } else return; Vector3D vt = ptSec - ptStart; using namespace GlobalFunc; double nVal = (vt & Vector3D(cos(nDirection), sin(nDirection))); pDim->SetRotation(nDirection); pDim->SetSegment(0, nVal); goto LAB_REINPUT; } LAB_RE: AcDbObjectId m_id; if (pDim->IsValid() && jig.GetRetCode() != RTCAN) { AecDbDimension *pDimNew = (AecDbDimension *)pDim->clone(); ASSERT(pDimNew); if (g_Option::instance().g_nDimAdjust) pDimNew->AdjustDim(g_Option::instance().g_nDimAdjust != 2); // sg add 120410,增加布局转角的设置,解决UCS下,文字方向错误的问题 pDimNew->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); // modify by xly on 110107 支持图层切换 //m_id = pDimNew->AddToCSpace(Adesk::kTrue); m_id = GlobalFunc::AddToSpace(Adesk::kTrue, pDimNew); } AecDbDimension *pDimTemp; acdbOpenObject(pDimTemp, m_id, AcDb::kForRead); int nRet; TCString szPrompt; while (1) { pDimTemp->getEndPoint(ptBase); ptBase = GlobalFunc::Wcs2Ucs(ptBase); int nLen = lstAddPoint.Length(); _stprintf(szPrompt, _T("\n请输入其他标注点或 [撤消上一标注点(U)]<退出>: ")); INITGET_BEG(0, _T("U R")); nRet = acedGetPoint(ptBase, szPrompt, ptAdd); INITGET_END(); if (nRet == RTNORM) { ptBase = ptAdd; ptAdd = GlobalFunc::Ucs2Wcs(ptAdd); if (pDimTemp->upgradeOpen() == Acad::eOk) { if (!pDimTemp->AddSegment(ptAdd)) g_Option::instance().adsout << _T("\n点取位置不合适!"); else { lstAddPoint.Append(new ADSGePoint3d(ptAdd)); lstBasePoint.Append(new ADSGePoint3d(ptBase)); if (g_Option::instance().g_nDimAdjust)//add by whl on 050530 pDimTemp->AdjustDim(g_Option::instance().g_nDimAdjust != 2); } pDimTemp->downgradeOpen(); } } else if (nRet == RTKWORD) { TCString sKey; acedGetInput(sKey); if (sKey[0] == _T('R')) acedGetPoint(NULL, _T("\n参考点:"), ptBase); else if (sKey[0] == _T('U')) { if (pDimTemp->upgradeOpen() == Acad::eOk) { if (nLen > 0) { ptAdd = *lstAddPoint.Tail(); lstAddPoint.Remove(nLen - 1); pDimTemp->HitTestOnPoint(ptAdd); pDimTemp->FindAndRemoveSegment(ptAdd); lstBasePoint.Remove(nLen); ptBase = *lstBasePoint.Tail(); if (g_Option::instance().g_nDimAdjust)//add by whl on 050530 pDimTemp->AdjustDim(g_Option::instance().g_nDimAdjust != 2); } pDimTemp->downgradeOpen(); } } if (lstAddPoint.Length() <= 0) { b = FALSE; if (pDimTemp->upgradeOpen() == Acad::eOk) { pDimTemp->erase(); } jig.m_pszKeyword = NULL; BOOL bFirst = TRUE; jig.m_nFlag = 3; jig.m_pTemp = (AecDbDimension *)pDim->clone(); jig.Undo(); //add by cwk on 060918 jig.m_pszKeyword = _T("U"); jig.m_pszPrompt = _T("\n请输入第二标注点<退出>: "); int nRet = jig.doIt(); if (nRet == RTNORM) { jig.Swap(); jig.Step(); ptAdd = jig.m_ptDim; lstAddPoint.Append(new ADSGePoint3d(ptAdd)); ptBase = GlobalFunc::Wcs2Ucs(ptAdd); lstBasePoint.Append(new ADSGePoint3d(ptBase)); if (g_Option::instance().g_nDimAdjust)//add by whl on 050530 pDimTemp->AdjustDim(g_Option::instance().g_nDimAdjust != 2); } else break; goto LAB_RE; } } else if (nRet == RTCAN) { if (pDimTemp->upgradeOpen() == Acad::eOk) { pDimTemp->erase(); pDimTemp->downgradeOpen(); } return; } else break; } pDimTemp->close(); } } void DimAngle() { ADSGePoint3d pt1, pt2; EntitySet ent1, ent2; RBList rb; if (GlobalFunc::SelectEntity1(_T("\n请选择第一条直线<退出>: "), ent1, pt1, rb) != RTNORM) return; pt1 = GlobalFunc::Ucs2Wcs(pt1); GeLine ln1(ent1, LS_INFINITE); if (!ent1.Is(_T("LINE"))) { bool bFoundLine = false; AcDbVoidPtrArray subEnt; OPENOBJ_BEGIN(ent1, AcDb::kForRead, AcDbEntity, pEnt); GlobalFunc::ExplodeEx((AcDbEntity*)pEnt->clone(), subEnt); OPENOBJ_END(); for (long i = 0; i < subEnt.length(); i++) { AcDbEntity *pEnt = (AcDbEntity*)subEnt[i]; if (pEnt->isKindOf(AcDbLine::desc())) { AcDbLine* pLine = AcDbLine::cast(pEnt); ln1.StartPoint() = pLine->startPoint(); ln1.EndPoint() = pLine->endPoint(); int flag = ln1.HitTest2d(pt1); if (flag > 2 && flag < 6) { bFoundLine = true; break; } } } GlobalFunc::ReleaseEntSet(subEnt); if (!bFoundLine) { g_Option::instance().adsout << _T("\n请选择直线!"); return; } } if (GlobalFunc::SelectEntity1(_T("\n请选择第二条直线<退出>: "), ent2, pt2, rb) != RTNORM) return; pt2 = GlobalFunc::Ucs2Wcs(pt2); GeLine ln2(ent2, LS_INFINITE); if (!ent2.Is(_T("LINE"))) { bool bFoundLine = false; AcDbVoidPtrArray subEnt; OPENOBJ_BEGIN(ent2, AcDb::kForRead, AcDbEntity, pEnt); GlobalFunc::ExplodeEx((AcDbEntity*)pEnt->clone(), subEnt); OPENOBJ_END(); for (long i = 0; i < subEnt.length(); i++) { AcDbEntity *pEnt = (AcDbEntity*)subEnt[i]; if (pEnt->isKindOf(AcDbLine::desc())) { AcDbLine* pLine = AcDbLine::cast(pEnt); ln2.StartPoint() = pLine->startPoint(); ln2.EndPoint() = pLine->endPoint(); int flag = ln2.HitTest2d(pt2); if (flag > 2 && flag < 6) { bFoundLine = true; break; } } } GlobalFunc::ReleaseEntSet(subEnt); if (!bFoundLine) { g_Option::instance().adsout << _T("\n请选择直线!"); return; } } //add by lxb on 2011/11/24 //顶点 ADSGePoint3d ptCen; //#ifndef _WIN64 // if(!ln1.Intersection(&ln2, ptCen)) //#else if (!Is2LineIntersection(&ln1, &ln2, ptCen)) //#endif { g_Option::instance().adsout << _T("\n两条线互相平行!"); return; } AecDbDimension *pDim = new AecDbDimension; pDim->SetAngular(TRUE); pDim->SetDist2DimLine(2.0); pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0)); pDim->SetStyleId(InitDimStyle(DS_ANGLE)); AcGePoint2d pt01 = pt1.AsAcGePoint2d(); AcGePoint2d pt02 = pt2.AsAcGePoint2d(); AcGePoint2d ptCenter = ptCen.AsAcGePoint2d(); AcGeLine2d line1(ptCenter, pt01); AcGeLine2d line2(ptCenter, pt02); DimAngleJig jig(pDim, line1, line2, ptCen, const_cast(_T("\n请确定尺寸线位置<退出>: ")), NULL); if (jig.doIt() != AcEdJig::kNormal) { delete pDim; return; } // sg add 120410,增加布局转角的设置,解决UCS下,文字方向错误的问题 pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); // modify by xly on 110107 支持图层切换 //pDim->AddToMSpace(TRUE); GlobalFunc::AddToSpace(Adesk::kTrue, pDim); } void DimArcLen() { EntitySet ent; ADSGePoint3d ptPick; int nRetCode = 0; GeArc arDim; RBList rb; for (;;) { if (GlobalFunc::SelectEntity1(_T("\n请选择要标注的弧段<退出>:"), ent, ptPick, rb) != RTNORM) return; ptPick = GlobalFunc::Ucs2Wcs(ptPick); if (ent.Is(_T("ARC"))) { arDim = GeArc(ent); break; } else { bool bFoundArc = false; AcDbVoidPtrArray subEnt; OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); GlobalFunc::ExplodeEx((AcDbEntity*)pEnt->clone(), subEnt); OPENOBJ_END(); for (long i = 0; i < subEnt.length(); i++) { AcDbEntity *pEnt = (AcDbEntity*)subEnt[i]; if (pEnt->isKindOf(AcDbArc::desc())) { AcDbArc* pArc = AcDbArc::cast(pEnt); arDim.SetCenterPt(pArc->center()); arDim.SetRadius(pArc->radius()); arDim.SetStarAngle(pArc->startAngle()); arDim.SetEndAngle(pArc->endAngle()); int flag = arDim.HitTest2d(ptPick); if (flag > 2) { bFoundArc = true; break; } } } GlobalFunc::ReleaseEntSet(subEnt); if (!bFoundArc) { g_Option::instance().adsout << _T("\n请选择弧段!"); continue; } else break; } } // 已经取得标注弧 InitLayer(LAY_DIM, TRUE); AecDbDimension dim; GeCurveSegment segDim; segDim = arDim; GlobalFunc::PushAcadVar osmode1(_T("OSMODE"), GlobalFunc::GetFullOsMode(OS_PER | OS_INT | OS_END)); AecDbDimension *pDim = &dim; pDim->m_bInJig = true; // modify by xly on 110107 支持图层切换 //pDim->setLayer(LAY_DIM); pDim->SetStyleId(InitDimStyle(DS_ANGLE)); pDim->SetDist2DimLine(-6.0); ADSGePoint3d ptFix; ads_polar(segDim.StartPoint(), segDim.IDirection(0) - PI / 2, 2.0 * GlobalFunc::DocGetPScale(), ptFix); pDim->SetLocation(segDim.StartPoint()); pDim->SetRotation(segDim.IDirection(0)); pDim->SetAngular(TRUE); pDim->SetDimArcLen(TRUE); pDim->SetDimChord(FALSE); pDim->SetObjRadius(arDim.GetRadius()); pDim->SetDimRadius(arDim.GetRadius() + 6.0 * GlobalFunc::DocGetPScale()); GeArc arDimLine = arDim; arDimLine.SetRadius(arDimLine.GetRadius() + 6.0 * GlobalFunc::DocGetPScale()); pDim->AppendSegment(arDimLine.GetLength()); //((AecDbDimension *)pDim->clone())->AddToCSpace(Adesk::kTrue); //return; DimensionEdJig jig(pDim, _T("\n请移动光标位置确定要标注的尺寸类型<退出>: ")); jig.m_ObjarDim = arDim; jig.m_nFlag = 5; jig.SetIsArcDim(); jig.doIt(); if (jig.m_nRetCode != AcEdJig::kNormal) { return; } jig.m_pszPrompt = _T("\n请指定标注点: "); jig.m_nFlag = 1; jig.doIt(); if (jig.m_nRetCode == AcEdJig::kCancel) { return; } BOOL bFirst = TRUE; jig.m_nFlag = 4; jig.m_pszPrompt = _T("\n请输入其他标注点<退出>: "); jig.m_pTemp = (AecDbDimension *)pDim->clone(); while (jig.doIt() == RTNORM) { jig.Swap(); //更新pDim jig.m_nFlag = 4; } if (pDim->IsValid() && jig.GetRetCode() != RTCAN) { AecDbDimension *pDimNew = (AecDbDimension *)pDim->clone(); ASSERT(pDimNew); pDimNew->m_bInJig = false; // sg add 120410,增加布局转角的设置,解决UCS下,文字方向错误的问题 pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); // modify by xly on 110107 支持图层切换 //pDimNew->AddToCSpace(Adesk::kTrue); GlobalFunc::AddToSpace(Adesk::kTrue, pDimNew); } } void QuickDim() { RBList mask(-4, _T(""), NULL); PickEntSet ss(SS_FREE); if (GlobalFunc::SelectEntities(_T("\n选择要标注的几何图形:"), ss, mask) != RTNORM) return; ADSGePoint3d lowPt, upPt; double dAngle = GlobalFunc::Ucs2Wcs(0.0) * 180 / PI; ADSGePoint3d ptWcsBase = GlobalFunc::Wcs2Ucs(ADSGePoint3d()); BOOL bUcs = FALSE; if (fabs(dAngle) > 1E-6 || ptWcsBase.Distance2d(ADSGePoint3d()) > 1E-6) { bUcs = TRUE; ADSGePoint3d basePt; GlobalFunc::PushAcadVar osmode(_T("OSMODE"), 0);//add by whl on 060223 // Zyu modify on 100726,支持64位 //ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""), // RT3DPOINT, &basePt, RTREAL, -dAngle, RTNONE); //ads_command(RTSTR, _T(".MOVE"), RTPICKS, (long *)ss, RTSTR, _T(""), // RT3DPOINT, &basePt, RT3DPOINT,&ptWcsBase, RTNONE); SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (LONG_PTR *)ss, RTSTR, _T(""), RT3DPOINT, &basePt, RTREAL, -dAngle, RTNONE); SHads_command(RTSTR, _T(".MOVE"), RTPICKS, (LONG_PTR *)ss, RTSTR, _T(""), RT3DPOINT, &basePt, RT3DPOINT, &ptWcsBase, RTNONE); ss.GetExtend(lowPt, upPt); lowPt = GlobalFunc::Ucs2Wcs(lowPt); upPt = GlobalFunc::Ucs2Wcs(upPt); // Zyu modify on 100726,支持64位 //ads_command(RTSTR, _T(".MOVE"), RTPICKS, (long *)ss, RTSTR, _T(""), // RT3DPOINT, &ptWcsBase, RT3DPOINT,&basePt, RTNONE); //ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""), // RT3DPOINT, &basePt, RTREAL, dAngle, RTNONE); SHads_command(RTSTR, _T(".MOVE"), RTPICKS, (LONG_PTR *)ss, RTSTR, _T(""), RT3DPOINT, &ptWcsBase, RT3DPOINT, &basePt, RTNONE); SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (LONG_PTR *)ss, RTSTR, _T(""), RT3DPOINT, &basePt, RTREAL, dAngle, RTNONE); } else ss.GetExtend(lowPt, upPt); long i, j; AcGePoint3dArray dimPoints; RBList rb(RTDXF0, _T("LINE,POLYLINE,LWPOLYLINE,ARC,CIRCLE"), NULL); ss.BaseFilter(rb); for (i = 0; i < ss.Length(); i++) { EntitySet ent = ss[i]; OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEntity, pEnt); if (pEnt == NULL) continue; AcGePoint3dArray stretchPoints; pEnt->getStretchPoints(stretchPoints); dimPoints.append(stretchPoints); OPENOBJ_END(); } AcGePoint3d ptBack, ptFront; long lCount = dimPoints.length(); for (i = lCount - 1; i > 0; i--) { ptBack = dimPoints[i]; for (j = i - 1; j >= 0; j--) { ptFront = dimPoints[j]; double dDist(ptBack.distanceTo(ptFront)); double dPrec(g_DimOption::instance().g_dFreedomDimPrec); if (g_DimOption::instance().g_bMeterUnitDim) { dPrec = g_DimOption::instance().g_dFreedomDimPrec * .001; dDist *= .001; } if (dDist < dPrec) { dimPoints.removeAt(i); break; } } } static int s_iFlag = 2; InitLayer(LAY_DIM, TRUE); QuickDimensionJig jig; jig.SetKeyword(_T("T C A")); TCString szState; while (1) { jig.SetDimType(s_iFlag); jig.SetExtents(lowPt, upPt); jig.SetMidPoints(dimPoints); if (s_iFlag == 0) szState = _T("整体"); else if (s_iFlag == 1) szState = _T("连续"); else szState = _T("连续加整体"); jig.setDispPrompt(_T("\n请指定尺寸线位置(当前标注方式:%s)或 [整体(T)/连续(C)/连续加整体(A)]<退出>:"), szState); int nRet; INITGET_BEG(-1, _T("T C A")); nRet = jig.doIt(); INITGET_END(); if (nRet == RTNORM) { jig.AddToDataBase(); break; } else if (nRet == RTKWORD) { #if ARX > 25 AcString ss; jig.acquireString(ss); if (_tcscmp(ss, _T("T")) == 0) s_iFlag = 0; else if (_tcscmp(ss, _T("C")) == 0) s_iFlag = 1; else s_iFlag = 2; #else TCHAR sKey[2049]; jig.acquireString(sKey); if (_tcscmp(sKey, _T("T")) == 0) s_iFlag = 0; else if (_tcscmp(sKey, _T("C")) == 0) s_iFlag = 1; else s_iFlag = 2; #endif } else { if (jig.m_dimbEntity.m_pDrawEnt != NULL) delete jig.m_dimbEntity.m_pDrawEnt; break; } } //add by whl on 060223 if (bUcs) SHacedCommand(RTSTR, _T(""), RTSTR, _T(""), RTNONE); } void SymbNorthThumb() { acDocManager->disableDocumentActivation(); AecXDbSymbNorthThumb ent; ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); NorthThumbEdJig jig(&ent); jig.SetPrompt(_T("\n指北针位置<退出>:")); jig.SetOperCode(NorthThumbEdJig::kCenter); if (jig.DoIt() != RTNORM) { acDocManager->enableDocumentActivation(); return; } jig.SetPrompt(_T("\n指北针方向<90.0>:")); jig.SetOperCode(NorthThumbEdJig::kDirection); if (jig.DoIt() == RTNORM) { GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbNorthThumb*)ent.clone()); } acDocManager->enableDocumentActivation(); } void DBL_AEC_ZHIBEIZHEN(){} void SymbSymmetry() { XPoint ptStart; if (GlobalFunc::GetPickPoint(NULL, _T("\n起点"), ptStart) != RTNORM) return; ptStart = GlobalFunc::Ucs2Wcs(ptStart); AecXDbSymbSymmetry *pEnt = new AecXDbSymbSymmetry; pEnt->SetStartPoint(ptStart); SymmetryEdJig jig(pEnt); jig.SetPrompt(_T("\n终点<退出>:")); if (jig.DoIt() == RTNORM) { GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbSymmetry*)pEnt->clone()); DELETE_PTR(pEnt); } else { delete pEnt; } } void DBL_AEC_DUICHENZHOU() {} void RuptureLine() { static bool bExt = true; XPoint pt1, pt2; if (ads_getpoint(NULL, _T("\n点取折断线起点<退出>: "), pt1) != RTNORM) return; static int nRupNum = 1; int nRetCode; LAB_REPEAT: g_Option::instance().adsout << _T("\n点取折断线终点或 [折断数目,当前=") << nRupNum << _T("(N)/自动外延,当前=") << (bExt ? _T("开") : _T("关")) << _T("(O)]<退出>: "); INITGET_BEG(0, _T("N O")) nRetCode = ads_getpoint(pt1, _T(""), pt2); INITGET_END(); if (nRetCode == RTKWORD) { XString sKeyInp; ads_getinput(sKeyInp); if (sKeyInp[0] == _T('N')) { g_Option::instance().adsout << _T("\n折断数目<") << nRupNum << _T(">:"); ads_initget(RSG_NOZERO | RSG_NONEG, NULL); if (ads_getint(_T(""), &nRupNum) == RTCAN) return; } else { bExt = !bExt; } goto LAB_REPEAT; } else if (nRetCode == RTNORM) { AecXDbSymbRupture *pRupture = new AecXDbSymbRupture; pt1 = GlobalFunc::Ucs2Wcs(pt1); pt2 = GlobalFunc::Ucs2Wcs(pt2); XPoint ptA = pt1, ptB = pt2; if (bExt) { // sg add 090512,设置折断线两端伸出连接区间的距离 // ads_polar(pt1, ads_angle(pt2, pt1), 3.0*DocGetPScale(), ptA); // ads_polar(pt2, ads_angle(pt1, pt2), 3.0*DocGetPScale(), ptB); double dDist = pt1.Distance(pt2); if (dDist > g_DimOption::instance().g_dRuptureLenLimit - g_Option::instance()._DIST_SNAP) // 大于界限值时 { ads_polar(pt1, ads_angle(pt2, pt1), g_DimOption::instance().g_dMoreRuptureLimit * GlobalFunc::DocGetPScale(), ptA); ads_polar(pt2, ads_angle(pt1, pt2), g_DimOption::instance().g_dMoreRuptureLimit * GlobalFunc::DocGetPScale(), ptB); } else // 小于界限值时 { ads_polar(pt1, ads_angle(pt2, pt1), g_DimOption::instance().g_dLessRuptureLimit * GlobalFunc::DocGetPScale(), ptA); ads_polar(pt2, ads_angle(pt1, pt2), g_DimOption::instance().g_dLessRuptureLimit * GlobalFunc::DocGetPScale(), ptB); } } pRupture->SetStartPoint(ptA); pRupture->SetEndPoint(ptB); pRupture->SetRuptureNum(nRupNum); GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbRupture*)pRupture->clone()); DELETE_PTR(pRupture); } } void DBL_AEC_ZHEDUANXIAN() { } void SymbCut() { XPoint pt0; int nRet = 0; while (nRet != RTNORM && nRet != RTNONE && nRet != RTCAN) { nRet = ads_getpoint(NULL, _T("\n点取折断线起点<退出>:"), pt0); } if (nRet == RTNORM) { pt0 = GlobalFunc::Ucs2Wcs(pt0); SymbCutJig jig(pt0); jig.m_bIsTwo = FALSE; // add by lgy 20120511 设置是否是单折断线还是双折断线 int nCode = jig.DoIt(); // add by lgy 20120514 保存添加到模型空间中的折断线的ID AcDbObjectId idRupture; if (nCode == RTNORM) { XPoint ptA = jig.pt0; // 初始化默认值的大小 XPoint ptB = jig.pt1; double dDist = ptA.Distance(ptB); if (dDist > g_DimOption::instance().g_dRuptureLenLimit - g_Option::instance()._DIST_SNAP) // 大于界限值时 { ads_polar(ptA, ads_angle(ptB, ptA), g_DimOption::instance().g_dMoreRuptureLimit * GlobalFunc::DocGetPScale(), ptA); ads_polar(ptB, ads_angle(ptA, ptB), g_DimOption::instance().g_dMoreRuptureLimit * GlobalFunc::DocGetPScale(), ptB); } else // 小于界限值时 { ads_polar(ptA, ads_angle(ptB, ptA), g_DimOption::instance().g_dLessRuptureLimit * GlobalFunc::DocGetPScale(), ptA); ads_polar(ptB, ads_angle(ptA, ptB), g_DimOption::instance().g_dLessRuptureLimit * GlobalFunc::DocGetPScale(), ptB); } AecXDbSymbRupture *pRupture = new AecXDbSymbRupture; pRupture->SetStartPoint(ptA); pRupture->SetEndPoint(ptB); pRupture->SetRuptureNum(jig.m_nRupNum); // modify by xly 101110设置打断线的图层设置,支持默认图层和当前图层 //pRupture->AddToCSpace(Adesk::kTrue); GlobalFunc::AddToSpace(Adesk::kTrue, pRupture); return; } } } void SymbSectionArg(BOOL bViewLine) { XString sName; //add by lgy 20120319 9.0需求将剖面剖切,剖面转折正交剖切,剖面非转折正交剖切,断面剖切 //修改为对话框选取功能 //int rc=ads_getstring(0, _T("\n请输入剖切编号<1>:"), sName); AcDbObjectId id = InitTextStyle(TS_SECTION); AcDbObjectId id1 = InitTextStyle(TS_INDEXSCALE); CSectionDlg dlg; { CAcModuleResourceOverride vTemp; if (!dlg.Create(CSectionDlg::IDD, acedGetAcadFrame())) { return; } dlg.m_bModeless = TRUE; } acedGetAcadDwgView()->SetFocus(); dlg.ShowWindow(SW_SHOW); //add by lgy 20120411 添加while循环实现通过对话框切换命令 while (TRUE) { sName = dlg.GetSectionNum(); if (!_tcscmp(sName, _T(""))) { _tcscpy(sName, _T("1")); } XPoint ptFirst; //modify by lgy 20120412 要判断是否应该退出命令 //if(ads_getpoint(NULL,_T("\n点取第一个剖切点<退出>: "),ptFirst)!=RTNORM) // return; int iRet = 0; iRet = ads_getpoint(NULL, _T("\n点取第一个剖切点<退出>: "), ptFirst); if ((iRet == RTCAN && !dlg.GetIsChangeType()) || iRet == RTNONE) { dlg.DestroyWindow(); return; } dlg.SetIsChangeType(FALSE); if (iRet != RTNORM) { continue; } ptFirst = GlobalFunc::Ucs2Wcs(ptFirst); XPoly2D poly(0); poly.AppendNode(ptFirst); poly.AppendNode(ptFirst); AecXDbSymbSection ent; ent.m_bInJig = true; ent.SetText(sName); //ent.SetTextRotation(Ucs2Wcs(0.0));old ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));//modified by whl // delete by xly on 100915 实体图层设置放在AddToSpace中 //ent.setLayer(ent.GetDefaultLayer()); // sg modify 120106,给“TS_SECTION”独立出来一个文字样式 // ent.SetTextStyleId(InitTextStyle(TS_LABEL)); ent.SetTextStyleId(InitTextStyle(TS_SECTION)); ent.SetTextLayerId(InitLayer(LAY_TEXT, FALSE)); ent.SetViewLine(bViewLine); ent.SetPoly2D(poly); //modify by lgy 20120320 对话框中要判断是点取的是那种方式绘制剖面剖切 ent.SetTextHeight(dlg.GetNumHeight()); ent.SetText(dlg.GetSectionNum()); AcDbObjectId idScaleStyle = InitTextStyle(dlg.GetNumStyle()); ent.SetTextStyleId(idScaleStyle); if (dlg.GetIsShowDrawText()) { if (dlg.GetLocal() == 0) //两端显示 { ent.SetIsHasIndexS(TRUE); ent.SetIsHasIndexE(TRUE); } else if (dlg.GetLocal() == 1)//始端显示 { ent.SetIsHasIndexS(TRUE); ent.SetIsHasIndexE(FALSE); } else if (dlg.GetLocal() == 2)//末端显示 { ent.SetIsHasIndexS(FALSE); ent.SetIsHasIndexE(TRUE); } if (!dlg.GetDirect()) { ent.SetDimDirection(0); //剖切方向 } else { ent.SetDimDirection(1); //剖视方向 } ent.SetDrawingIndex(dlg.GetDrawNum()); ent.SetIndexHeight(dlg.GetDrawHeight()); ent.SetIndexStyleId(InitTextStyle(dlg.GetDrawingStyle())); } else //不显示文字时,默认仍要有文字样式 { ent.SetDrawingIndex(_T("1")); //如果不显示文字,为标注设置默认文字为1 ent.SetIndexStyleId(id1); ent.SetIndexHeight(3.5); } int nMode = dlg.GetSectionMode(); if (nMode == 4) { ent.SetViewLine(FALSE); } SectionEdJig jig(&ent); jig.SetPrompt(_T("\n点取第二个剖切点<退出>:")); jig.SetOperCode(SectionEdJig::kSectPoint); //modify by lgy 20120412 判断是否真需要返回 //if(jig.DoIt()!=RTNORM) //return; jig.SetJigMode(nMode); jig.SetJigDlg(&dlg); iRet = jig.DoIt(); if ((iRet == RTCAN && !dlg.GetIsChangeType()) || iRet == RTNONE) { dlg.DestroyWindow(); return; } dlg.SetIsChangeType(FALSE); if (iRet != RTNORM) { continue; } int nRet; //modify by lgy 20120320 对话框中要判断是点取的是那种方式绘制剖面剖切 //if(bViewLine) if (bViewLine && (nMode == 2 || nMode == 3)) { XPushVar orthomode(_T("ORTHOMODE"), 0); jig.SetPrompt(_T("\n点取下一个剖切点<结束>:")); jig.SetOperCode(SectionEdJig::kSectPointOther); while ((nRet = jig.DoIt()) == RTNORM); if (nRet == RTNONE) //by fxj { if (jig.GetiFlag2() == 0) { XPoly2D poly; ent.GetPoly2D(poly); poly.RemoveNode(poly.Length() - 1); if (nMode != 3) { poly.RemoveNode(poly.Length() - 1); } ent.SetPoly2D(poly); } } else //modify by lgy 20120412 判断是否真需要返回 //return; { continue; } } jig.SetPrompt(_T("\n点取剖视方向<当前>:")); jig.SetOperCode(SectionEdJig::kViewDirection); nRet = jig.DoIt(); if ((nRet == RTNORM || nRet == RTNONE) && ent.IsValid()) { ent.SetTextLocation(0, ent.GetDefaultTextLocation(0)); ent.SetTextLocation(1, ent.GetDefaultTextLocation(1)); // modify by xly on 100915 实体是否设置在默认层 //((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue); ent.m_bInJig = false; //ent.setLastPoint(jig.GetPickPoint()); GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbSection*)ent.clone()); } } } void SymbSection() { SymbSectionArg(TRUE); } void DBL_AEC_POQIE() { AcDbObjectId id; bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_POQIE"), id); OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbSection, pSection); if (!pSection) return; CTemporaryResourceOverride vTemp; CEditSectionDlg dlg(acedGetAcadFrame()); //add by lgy 20120525 将实体参数传给对话框 dlg.Obj2Dlg(pSection); INT_PTR nResult = dlg.DoModal(); if (nResult == IDOK) { if (pSection->upgradeOpen() == Acad::eOk) { dlg.Dlg2Obj(pSection); pSection->downgradeOpen(); } } else { pSection->close(); return; } OPENOBJ_END(); } void SymbArrow() { // sg modify 120106,给“TS_SYMBOL”独立出来一个文字样式 //AcDbObjectId idTextStyle = InitTextStyle(TS_DIM); AcDbObjectId idTextStyle = InitTextStyle(TS_SYMBOL); if (!idTextStyle) return; CArrowTextDlg dlg(acedGetAcadFrame()); //modify by lgy 20120206 要求文字样式要有记忆功能 //dlg.m_strFontStyle = (const TCHAR *)GetSymbolName(idTextStyle); if (dlg.m_strFontStyle == _T("")) { dlg.m_strFontStyle = (const TCHAR *)GlobalFunc::GetSymbolName(idTextStyle); } { CTemporaryResourceOverride vTemp; if (!dlg.Create(dlg.IDD, acedGetAcadFrame())) return; } dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); AecXDbSymbArrow ent; // delete by xly on 100915 实体图层设置放在AddToSpace中 //ent.setLayer(ent.GetDefaultLayer()); ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); ent.SetTextLayerId(InitLayer(LAY_TEXT, TRUE)); while (1) { int nRet; XPoint ptStart; XPoly2D poly2d; INITGET_BEG(0, _T("P R")); nRet = ads_getpoint(NULL, _T("\n箭头起点或 [点取图中曲线(P)/点取参考点(R)]<退出>: "), ptStart); INITGET_END(); if (nRet == RTKWORD) { XString sKeyword; VERIFY(ads_getinput(sKeyword) == RTNORM); if (sKeyword[0] == _T('R')) { XPoint ptRef; if (ads_getpoint(NULL, _T("\n输入参考点<退出>:"), ptRef) != RTNORM) break; if (ads_getpoint(ptRef, _T("\n曲线起点<退出>:"), ptStart) != RTNORM) break; ptStart = GlobalFunc::Ucs2Wcs(ptStart); poly2d.InsertNodeAt(0, ptStart); } else { int nCode; Entity ent; RBList mask(RTDXF0, _T("POLYLINE,LWPOLYLINE,LINE,ARC"), NULL); while (1) { nCode = ent.FilterSelect(_T("\n选择一曲线(LINE/ARC/PLINE):"), mask); if (nCode != RTNORM) break; if (ent.Is(_T("LINE")) || ent.Is(_T("ARC"))) { XCurveSegment cv(ent); poly2d.Reset(); cv.AsPoly2D(poly2d); } else { XPoly2D poly(ent); if (!!poly) poly2d = poly; else { g_Option::instance().adsout << _T("\n无效的选择!"); continue; } } break; } if (nCode == RTNORM) { } else if (nCode == RTNONE) continue; else break; } } else if (nRet == RTNORM) { ptStart = GlobalFunc::Ucs2Wcs(ptStart); poly2d.InsertNodeAt(0, ptStart); } else break; poly2d.Reverse(); ent.SetPoly2D(poly2d); ent.SetTextLocation(ent.GetDefaultTextLocation()); ent.SetText2Location(ent.GetDefaultText2Location()); // sg add 090106 ent.SetText(_T("")); // add by [1/11/2008 nsh] // dlg.Dlg2Obj(&ent); // [12/28/2007 nsh] // sg modify 090225,不知道NSH当时为什么删除 // 恢复的目的是为了解决:首次设置后,无法预览箭头大小、字高等信息 dlg.Dlg2Obj(&ent); dlg.m_bPost = TRUE; ArrowEdJig jig(&ent); jig.SetKeyword(_T("` A U")); jig.SetOperCode(ArrowEdJig::kLinePoint); jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>:")); while (1) { int nKeyIndex; int nRet = jig.DoIt(&nKeyIndex); if (nRet == RTNORM) { ent.GetPoly2D(poly2d); if (jig.GetOperCode() == ArrowEdJig::kArcPoint) { ArrowEdJig jig1(&ent); jig1.SetOperCode(ArrowEdJig::kArcMidPoint); jig1.SetPrompt(_T("\n点取弧上一点或 [输入半径(R)]:")); jig1.SetKeyword(_T("` R")); int nKeyIdx; while (1) { int nRetCode1 = jig1.DoIt(&nKeyIdx); if (nRetCode1 == RTNORM) { ent.GetPoly2D(poly2d); break; } else if (nRetCode1 == RTKWORD) { if (nKeyIdx == 0) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else { ArrowEdJig jig2(&ent); jig2.SetOperCode(ArrowEdJig::kArcRadius); jig2.SetPrompt(_T("\n输入半径(光标位置确定弧的方向):")); jig2.SetKeyword(_T("`")); while (1) { int nRetCode2 = jig2.DoIt(); if (nRetCode2 == RTNORM) { ent.GetPoly2D(poly2d); break; } else if (nRetCode2 == RTKWORD) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } break; } } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } } jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>: ")); jig.SetOperCode(ArrowEdJig::kLinePoint); jig.SetKeyword(_T("` A U")); } else if (nRet == RTKWORD) { if (jig.GetOperCode() == ArrowEdJig::kLinePoint) { if (nKeyIndex == 0) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else if (nKeyIndex == 1) { jig.SetOperCode(ArrowEdJig::kArcPoint); jig.SetPrompt(_T("\n弧段下一点或 [直段(L)/回退(U)]<结束>: ")); jig.SetKeyword(_T("` L U")); } else if (nKeyIndex == 2) { int nLen = poly2d.Length(); if (nLen > 1) { poly2d.Remove(0); poly2d.RemoveBugle(0); } } } else if (jig.GetOperCode() == ArrowEdJig::kArcPoint) { if (nKeyIndex == 0) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else if (nKeyIndex == 1) { jig.SetOperCode(ArrowEdJig::kLinePoint); jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>: ")); jig.SetKeyword(_T("` A U")); } else if (nKeyIndex == 2) { int nLen = poly2d.Length(); if (nLen > 1) { poly2d.Remove(0); poly2d.RemoveBugle(0); } } } ent.SetPoly2D(poly2d); ent.SetTextLocation(ent.GetDefaultTextLocation()); ent.SetText2Location(ent.GetDefaultText2Location()); // sg add 090106 } else if (nRet == RTNONE) { ent.SetPoly2D(poly2d); ent.SetTextLocation(ent.GetDefaultTextLocation()); ent.SetText2Location(ent.GetDefaultText2Location()); // sg add 090106 dlg.Dlg2Obj(&ent);// add by nsh 20071228 break; } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } // modify by xly on 100915 实体是否设置在默认层 //((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue); GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbWithText*)ent.clone()); dlg.AddToRecent(); if (!dlg.m_bContinue) break; dlg.m_bPost = FALSE; } if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); } void DBL_AEC_JIANTOUYINZHU() { AcDbObjectId id; bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_JIANTOUYINZHU"), id); OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbArrow, pArrow) if (!pArrow) return; CArrowTextDlg dlg(acedGetAcadFrame()); dlg.Obj2Dlg(pArrow); { CTemporaryResourceOverride vTemp; if (dlg.DoModal() != IDOK) return; } if (pArrow->upgradeOpen() == Acad::eOk) { dlg.Dlg2Obj(pArrow); pArrow->downgradeOpen(); } OPENOBJ_END() } void SymbCoord() { CCoordDlg::s_iUnitType = GlobalFunc::DocGetMeterUnitDraw(); double nNorthAngle = PI / 2; // 默认为90度 PickSet ssNorth(SS_FREE); if (ssNorth.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("AEC_ZHIBEIZHEN"), 67, 0, NULL)) == RTNORM) // 模型空间指北针 { Entity ent0 = ssNorth[0L]; ent0.GetData(50, &nNorthAngle); } XPoint ptLoc, ptLastUcs; ads_matrix mat; XPoint().GetRotationMatrix(-nNorthAngle + PI / 2.0, mat); if (CCoordDlg::s_iUnitType == 0) g_Option::instance().adsout << _T("\n当前绘图单位:mm,标注单位:M;"); else g_Option::instance().adsout << _T("\n当前绘图单位:M,标注单位:M;"); if (CCoordDlg::IsWcsPoint()) g_Option::instance().adsout << _T("以世界坐标取值;北向角度") << GlobalFunc::Angle2Str(nNorthAngle * 180 / PI) << _T("度"); else if (CCoordDlg::IsUcsPoint()) g_Option::instance().adsout << _T("以用户坐标取值"); else if (CCoordDlg::IsRedLinePoint()) g_Option::instance().adsout << _T("以场地坐标取值"); bool bFirst = true; while (true) { if (bFirst) { if (CCoordDlg::m_bFixAngle) { dAngle = CCoordDlg::m_strAngle; } int nRet; //modify by lgy 20120330 9.0要求特征点批量标注功能 //INITGET_BEG(0,_T("S")); //nRet=ads_getpoint(NULL, _T("\n请点取标注点或 [设置(S)]<退出>:"),ptLoc); //INITGET_END(); INITGET_BEG(0, _T("S Q")); nRet = ads_getpoint(NULL, _T("\n请点取标注点或 [设置(S)\\批量标注(Q)]<退出>:"), ptLoc); INITGET_END(); if (nRet == RTKWORD) { // modify by lgy 20120330,增加条件判断,是应为9.0中增加了批量标注 TCHAR szKey[132]; if (acedGetInput(szKey) != RTNORM) { continue; } if (szKey[0] == _T('S') || szKey[0] == _T('s')) // 设置 { CCoordDlg dlg(IDD_COORD); dlg.m_fAngle = nNorthAngle * 180 / PI; //add tyj 20160901:添加精度设置,防止指北针设置角度与坐标标注显示的北向角度不一致的问题 int luprec, auprec; VERIFY(xg_getvar(_T("LUPREC"), &luprec) == RTNORM && xg_getvar(_T("AUPREC"), &auprec) == RTNORM); if (auprec == 0)//保留整数 { dlg.m_fAngle = int(dlg.m_fAngle + 0.5); } else { double dPrecisionCompute = 1.0;//计算精度的辅助变量 while (auprec != 0) { dPrecisionCompute = dPrecisionCompute * 10.0; auprec--; } dlg.m_fAngle = int((dlg.m_fAngle + 0.5 / dPrecisionCompute) * dPrecisionCompute) / dPrecisionCompute; } { CTemporaryResourceOverride vTemp; if (dlg.DoModal() != IDOK) continue; } nNorthAngle = dlg.m_fAngle * PI / 180; XPoint().GetRotationMatrix(-nNorthAngle + PI / 2.0, mat); if (CCoordDlg::s_iUnitType == 0) g_Option::instance().adsout << _T("\n当前绘图单位:mm;标注单位:M;"); else g_Option::instance().adsout << _T("\n当前绘图单位:M;标注单位:M;"); if (CCoordDlg::IsWcsPoint()) g_Option::instance().adsout << _T("以世界坐标取值;北向角度") << dlg.m_fAngle << _T("度"); else if (CCoordDlg::IsUcsPoint()) g_Option::instance().adsout << _T("以用户坐标取值"); //else if (CCoordDlg::IsRedLinePoint()) // g_Option::instance().adsout << _T("以场地坐标取值"); continue; } else if (szKey[0] == _T('Q') || szKey[0] == _T('q')) // 批量标注,add by lgy 20120330,9.0新增功能 { CBatchDimDlg dlgDim; { CTemporaryResourceOverride vTemp; dlgDim.Create(dlgDim.IDD, acedGetAcadFrame()); } dlgDim.ShowWindow(TRUE); int nRetBatchDim = BatchDim(dlgDim, mat); if (nRetBatchDim == RTKWORD) // 切换到单点标注 { dlgDim.DestroyWindow(); // add by lgy 20120531,引起cad无法打开图纸,创建图纸 continue; } else // 结束命令 { dlgDim.DestroyWindow(); return; } } } else if (nRet != RTNORM) return; } else { if (RTNORM != ads_getpoint(ptLastUcs, _T("\n请点取标注点<退出>:"), ptLoc)) return; } // [10/22/2007 nsh] // sg modify 120618,解决设置固定度角后,坐标文字位置不正确的问题 XPoint saveFirstPoint; // savePoint = ptLoc; // 对保存第一点的初始化 saveFirstPoint = ptLoc; // 对保存第一点的初始化 //--end-- bFirst = false; ptLastUcs = ptLoc; ptLoc = GlobalFunc::Ucs2Wcs(ptLoc); XPoint ptLocWcs = ptLoc; if (CCoordDlg::IsUcsPoint()) ptLoc = GlobalFunc::Wcs2Ucs(ptLoc); else if (CCoordDlg::IsWcsPoint()) ptLoc.TransformBy(mat); //else if (CCoordDlg::IsRedLinePoint()) // ptLoc = TranslatePtFromRedline(ptLoc); double x, y; if (CCoordDlg::s_iUnitType == 0) // mm-M { x = _AS_METER(ptLoc.y); y = _AS_METER(ptLoc.x); } else // M-M { x = ptLoc.y; y = ptLoc.x; } if (fabs(x) < 1E-6) x = 0; if (fabs(y) < 1E-6) y = 0; AecXDbSymbCoord *pCoord = new AecXDbSymbCoord; pCoord->m_bInJig = true; pCoord->SetLocation(ptLocWcs); pCoord->SetValue(XPoint(y, x)); // sg modify 120106,给“TS_SYMBOL”独立出来一个文字样式 // pCoord->SetTextStyleId(InitTextStyle(TS_DIM)); pCoord->SetTextStyleId(InitTextStyle(TS_SYMBOL)); // delete by xly on 100915 实体图层设置放在AddToSpace中 // pCoord->setLayer(pElev->GetDefaultLayer()); pCoord->SetAB(g_Option::instance().g_bABCoord); pCoord->SetStyle((AecXDbSymbMultiLeader::TArrowStyle)g_Option::instance().g_nCoordArrowStyle); pCoord->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));//modified by whl pCoord->SetTextLayerId(InitLayer(LAY_TEXT, TRUE)); pCoord->SetPrecNum(g_Option::instance().g_nCoordPrec); if (CCoordDlg::IsUcsPoint()) pCoord->setColorIndex(4); // 与WCS区别 else if (CCoordDlg::IsWcsPoint()) pCoord->setColorIndex(3); else if (CCoordDlg::IsRedLinePoint()) pCoord->setColorIndex(2); CoordEdJig jig(pCoord); // --------------------------------------------------- [10/22/2007 nsh] // 以下是判断是否是有固定角度的限制 { // 给jig加固定角度 if (CCoordDlg::m_bFixAngle) { jig.m_dFixAngle = ::_tstof(CCoordDlg::m_strAngle); // sg modify 120618,解决设置固定度角后,坐标文字位置不正确的问题 jig.m_saveFirstPt = saveFirstPoint; } } // --end-- jig.SetPrompt(_T("\n点取坐标标注方向<退出>:")); int nRet = jig.DoIt(); // modify by xly on 100915 实体是否设置在默认层 // if(nRet==RTNORM) // pCoord->AddToCSpace(Adesk::kTrue); if (nRet == RTNORM) { pCoord->m_bInJig = false; GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbCoord*)pCoord->clone()); DELETE_PTR(pCoord); } else delete pCoord; } } AcDbObjectId SymbElev() { BOOL bOrderCon = FALSE; AcDbObjectId idRet; DList lstElevId; // 获得前次绘制的最后一个点,并获得数据 GlobalFunc::GetEntFromBlockByDxf(lstElevId, _T("AEC_BIAOGAOBIAOZHU")); AcDbObjectId *pLast = lstElevId.Tail(); XPoint ptLast; double *pLastLoc = NULL; double nLastElev = 0.0; if (pLast) { OPENOBJ_BEGIN(*pLast, AcDb::kForRead, AecXDbSymbElevation, pLastElev); if (pLastElev) { ptLast = pLastElev->GetLocation(); nLastElev = _tstof(pLastElev->GetText()); pLastLoc = &ptLast.x; bOrderCon = TRUE; } OPENOBJ_END(); } XPoint ptLoc; // 建立标注实体 AecXDbSymbElevation *pElev = new AecXDbSymbElevation; pElev->SetTextStyleId(GlobalFunc::GetTextStyleId(_T("STANDARD")));//20160920 wlw 防止出现字体形文件错误 pElev->SetLocation(ptLoc); pElev->SetBaseLine(g_bHasBase); pElev->SetLeader(g_bHasLeader); pElev->SetBaseLen(g_nBaseLen); pElev->SetLeaderLen(g_nLeaderLen); // sg delete 090209,文字样式的处理,放在SymbElev2函数中 // pElev->SetTextStyleId(InitTextStyle(TS_DIM)); pElev->SetTextHeight(g_dTextHeight); // sg add 090212,增加文字高度设置 pElev->SetTextLayerId(InitLayer(LAY_TEXT, TRUE)); pElev->SetTextBaseLen(pElev->GetDefaultTextBaseLen()); // delete by xly on 100915 设实体图层放在AddToSpace函数中 //pElev->setLayer(pElev->GetDefaultLayer()); pElev->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); // modified by whl // sg modify 090212,增加文字齐线端、是否规范样式,是否加括号的设置 pElev->SetParentheses(g_bParentheses); pElev->SetAtLineSide(g_bElevSideText); pElev->SetStandard(g_bStandard); CElevDlg::g_pElevDlg->SetEntPoint(pElev); // 获得精度 const TCHAR *szFormat1; extern int g_iPrecision; switch (g_iPrecision) { case 0: pElev->SetPrec2(TRUE); szFormat1 = _T("%.2f"); break; case 1: pElev->SetPrec2(FALSE); szFormat1 = _T("%.3f"); break; default: break; } // 点取标注点或参考点 ElevEdJig jig(pElev); jig.m_ptBase = ptLast; jig.m_fBaseElev = nLastElev; if (!bOrderCon) CElevDlg::g_pElevDlg->m_bOrderTou = TRUE; else jig.m_dPointX = GlobalFunc::Wcs2Ucs(ptLast).x; CString ss; int nIdx = 0; CTemporaryResourceOverride vTemp(acedGetAcadResourceInstance()); while (1) { jig.SetOperCode(ElevEdJig::kMove); jig.SetPrompt(_T("\n请点取标高点或 [参考标高(R)]<退出>:")); // jig.SetKeyword(_T("R")); // sg modify 090217,增加了从屏幕拾取“字高”功能 jig.SetKeyword(_T("` R")); int nRetCode = jig.DoIt(&nIdx); if (CElevDlg::g_pElevDlg != NULL) CElevDlg::g_pElevDlg->m_bOrderTou = FALSE; if (nRetCode == RTNORM && nRetCode != RTKWORD) { pElev->SetLocation(jig.GetDragPoint()); break; } else if (nRetCode == RTKWORD) { if (nIdx == 0) // sg add 090217 { CElevDlg::g_pElevDlg->GetTextHeight(); CElevDlg::g_pElevDlg->UpdataEnt(); continue; } Entity entRef; if (entRef.FilterSelect(_T("\n点取参考标高<退出>: "), RBList(RTDXF0, _T("AEC_BIAOGAOBIAOZHU"), NULL)) == RTNORM) { OPENOBJ_BEGIN(entRef, AcDb::kForRead, AecXDbSymbElevation, pLastElev); if (pLastElev) { ptLoc = pLastElev->GetLocation(); ss = pLastElev->GetText(); jig.m_ptBase = ptLoc; jig.m_fBaseElev = _tstof(ss); pElev->SetText(ss); pElev->SetLocation(ptLoc); jig.m_dPointX = GlobalFunc::Wcs2Ucs(ptLoc).x; } OPENOBJ_END(); continue; } } else { delete pElev; pElev = NULL; return NULL; } } // 对实体进行拖动循环 while (1) { int nRet; if (CElevDlg::g_pElevDlg != NULL) { // sg add 120608,对话框类和这些全局静态成员移植到ElevDlg.h类中,要求全部使用CElevDlg::g_pElevDlg->UpdataEnt();来更新对象数据 CElevDlg::g_pElevDlg->UpdataEnt(); CElevDlg::g_pElevDlg->m_bUpdateText = TRUE; } acedGetAcadDwgView()->SetFocus(); jig.SetOperCode(ElevEdJig::kDirection); jig.SetPrompt(_T("\n请点取标高方向<退出>:")); // jig.SetKeyword(_T("")); // sg modify 090217,增加了从屏幕拾取“字高”功能 // nRet = jig.DoIt(); // if (nRet != RTNORM) jig.SetKeyword(_T("`")); nRet = jig.DoIt(&nIdx); if (nRet != RTNORM && nRet != RTKWORD) { delete pElev; return NULL; } else if (nRet == RTKWORD) // sg add 090217 { CElevDlg::g_pElevDlg->GetTextHeight(); CElevDlg::g_pElevDlg->UpdataEnt(); continue; } if (CElevDlg::g_pElevDlg != NULL) { CElevDlg::g_pElevDlg->m_bUpdateText = FALSE; // if (!g_bHightWrite) // sg add 120609,不能直接使用静态变量 } // if (g_bHasBase) // sg add 120609,不能直接使用静态变量 if (CElevDlg::g_pElevDlg != NULL && CElevDlg::g_pElevDlg->IsHasBase()) { while (1) // sg modify 090217,增加了从屏幕拾取“字高”功能 { if (CElevDlg::g_pElevDlg != NULL) CElevDlg::g_pElevDlg->m_bHatchTou = TRUE; // 此时填充、圆点按钮不可用 jig.SetOperCode(ElevEdJig::kBaseLine); jig.SetPrompt(_T("\n点取基线位置<退出>:")); // jig.SetKeyword(_T("")); // nRet = jig.DoIt(); jig.SetKeyword(_T("`")); nRet = jig.DoIt(&nIdx); if (CElevDlg::g_pElevDlg != NULL) CElevDlg::g_pElevDlg->m_bHatchTou = FALSE; // if (nRet != RTNORM) if (nRet != RTNORM && nRet != RTKWORD) { delete pElev; return NULL; } else if (nRet == RTKWORD) // sg add 090217 { CElevDlg::g_pElevDlg->GetTextHeight(); CElevDlg::g_pElevDlg->UpdataEnt(); continue; } break; } } //if (g_bHasLeader) // sg add 120609,不能直接使用静态变量 if (CElevDlg::g_pElevDlg != NULL && CElevDlg::g_pElevDlg->IsHasLeader()) { while (1) // sg modify 090217,增加了从屏幕拾取“字高”功能 { if (CElevDlg::g_pElevDlg != NULL) CElevDlg::g_pElevDlg->m_bHatchTou = TRUE; // 此时填充按钮不可用 jig.SetOperCode(ElevEdJig::kLeader); jig.SetPrompt(_T("\n点取引线位置<退出>:")); // jig.SetKeyword(_T("")); // nRet = jig.DoIt(); jig.SetKeyword(_T("`")); nRet = jig.DoIt(&nIdx); if (CElevDlg::g_pElevDlg != NULL) CElevDlg::g_pElevDlg->m_bHatchTou = FALSE; // if (nRet != RTNORM) if (nRet != RTNORM && nRet != RTKWORD) { delete pElev; return NULL; } else if (nRet == RTKWORD) // sg add 090217 { CElevDlg::g_pElevDlg->GetTextHeight(); CElevDlg::g_pElevDlg->UpdataEnt(); continue; } break; } } break; } //g_nLeaderLen = pElev->GetLeaderLen(); // sg add 120609,不能直接使用静态变量 //g_nBaseLen = pElev->GetBaseLen(); if (CElevDlg::g_pElevDlg != NULL) { CElevDlg::g_pElevDlg->SetLeaderLen(pElev->GetLeaderLen()); CElevDlg::g_pElevDlg->SetBaseLen(pElev->GetBaseLen()); CElevDlg::g_pElevDlg->UpdateEntText(); // modify by xly on 100915 设置实体是否添加在默认图层 //idRet = pElev->AddToCSpace(Adesk::kTrue); idRet = GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbElevation*)pElev->clone()); DELETE_PTR(pElev); } else delete pElev; return idRet; } void SymbElev3()//总图标高 { AcDbObjectId idTextStyle = InitTextStyle(TS_SYMBOL); if (!idTextStyle) return; CTemporaryResourceOverride vTemp; CMDIFrameWnd* pParent = (CMDIFrameWnd*)acedGetAcadFrame(); if (CElevDlg::g_pElevDlg != NULL) { CElevDlg::g_pElevDlg->DestroyWindow(); CElevDlg::g_pElevDlg = NULL; } if (!CElevDlg::g_pElevDlg) CElevDlg::g_pElevDlg = new CElevDlg(pParent); CElevDlg::g_pElevDlg->SetSitePlanDlg(TRUE);//总图标高 //注释 by lgy 20120111 文字样式必须有记忆功能 // sg add 090309,标高标注,默认绘制文字样式为“_TCH_DIM” //CElevDlg::g_pElevDlg->m_csFontStyle = (const TCHAR*)GetSymbolName(idTextStyle); CElevDlg::g_pElevDlg->Create(IDD_ELEV, (CWnd*)pParent); CElevDlg::g_pElevDlg->ShowWindow(SW_SHOW); BOOL bContinue = TRUE; acedGetAcadDwgView()->SetFocus(); AecXDbSymbElevation *pLastElev = NULL; while (CElevDlg::g_pElevDlg != NULL && CElevDlg::g_pElevDlg->GetSafeHwnd() != NULL) { if (!bContinue) break; AcDbObjectId idRet = SymbElev(); if (!idRet) { bContinue = FALSE; break; } XPoint ptLast; double nLastElev; OPENOBJ_BEGIN(idRet, AcDb::kForRead, AecXDbSymbElevation, pLastElev); ASSERT(pLastElev); ptLast = pLastElev->GetLocation(); nLastElev = _tstof(pLastElev->GetText()); OPENOBJ_END(); if (!g_bContinue) break; XPoint ptLoc; CTemporaryResourceOverride vTemp(acedGetAcadResourceInstance()); while (1) { int nIdx = 0; ptLoc = GlobalFunc::Ucs2Wcs(ptLoc); nLastElev = nLastElev + _AS_METER(ptLoc.y - ptLast.y); // [12/4/2007 nsh] OPENOBJ_BEGIN(idRet, AcDb::kForRead, AecXDbSymbElevation, pLastElev); ASSERT(pLastElev); AecXDbSymbElevation *pNewElev = (AecXDbSymbElevation *)pLastElev->clone(); ASSERT(pNewElev); XPoint pt = pNewElev->GetLocation(); CElevDlg::g_pElevDlg->SetEntPoint(pNewElev); ElevEdJig jig(pNewElev); jig.m_ptBase = pt; jig.m_fBaseElev = _tstof(pLastElev->GetText()); pt = GlobalFunc::Wcs2Ucs(pt); jig.m_dPointX = pt.x; jig.SetOperCode(ElevEdJig::kMove); jig.SetPrompt(_T("\n下一点或 [第一点(F)]<退出>:")); // jig.SetKeyword(_T("F")); // sg modify 090305,解决从标第二个符号起,无法点取字高 jig.SetKeyword(_T("` F")); int nRet = jig.DoIt(&nIdx); if (nRet == RTKWORD) { if (nIdx == 0) // sg add 090305,解决从标第二个符号起,无法点取字高 { CElevDlg::g_pElevDlg->GetTextHeight(); CElevDlg::g_pElevDlg->UpdataEnt(); continue; } delete pNewElev; break; } if (nRet != RTNORM) { delete pNewElev; bContinue = FALSE; break; } pNewElev->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); // add by whl pNewElev->SetText(XString(_T("%f"), nLastElev)); if (CElevDlg::g_pElevDlg != NULL) { CElevDlg::g_pElevDlg->UpdateEntText(); } // modify by xly on 100915 设置实体是否添加在默认图层 //idRet = pNewElev->AddToCSpace(Adesk::kTrue); idRet = GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbElevation*)pNewElev->clone()); DELETE_PTR(pNewElev); OPENOBJ_END(); ptLast = ptLoc; if (!g_bContinue) { bContinue = FALSE; break; } } } if (CElevDlg::g_pElevDlg != NULL) { CElevDlg::g_pElevDlg->DestroyWindow(); CElevDlg::g_pElevDlg = NULL; } }; void DBL_AEC_BIAOGAOBIAOZHU() { AcDbObjectId id; bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_BIAOGAOBIAOZHU"), id); OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbElevation, pElev); if (pElev != NULL) { CString sElv = pElev->GetText(); CElevDlg dlg(pElev); CTemporaryResourceOverride vTemp; dlg.DoModal(); } OPENOBJ_END(); } XPoint pptfirst; void SymbLeader() { BOOL bSideText = FALSE; CLeaderDlg dlg(FALSE, acedGetAcadFrame()); // sg modify 120106,给“TS_SYMBOL”独立出来一个文字样式 //AcDbObjectId idTextStyle = InitTextStyle(TS_DIM); AcDbObjectId idTextStyle = InitTextStyle(TS_SYMBOL); if (!idTextStyle) return; //modify by lgy 20120206 要求记录上次退出命令时设置的文字样式,切换图纸时原本没有的样式时初始化样式 //dlg.m_strFontStyle = (const TCHAR *)GetSymbolName(idTextStyle); if (dlg.m_strFontStyle == _T("")) { dlg.m_strFontStyle = (const TCHAR *)GlobalFunc::GetSymbolName(idTextStyle); } { CTemporaryResourceOverride vTemp; if (!dlg.Create(dlg.IDD, acedGetAcadFrame())) return; } dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); AecXDbSymbMultiLeader ent; // delete by xly on 100915 实体图层设置放在AddToSpace中 //ent.setLayer(ent.GetDefaultLayer()); ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); ent.SetTextLayerId(InitLayer(LAY_TEXT, TRUE)); ent.SetTextBaseLen(ent.GetDefaultTextBaseLen()); ent.SetSideText(bSideText); XPoint ptFirst, ptLeader; AecXDbSymbMultiLeader::TArrowStyle ar = AecXDbSymbMultiLeader::kNone; while (ads_getpoint(NULL, _T("\n请给出标注第一点<退出>: "), ptFirst) == RTNORM) { pptfirst = ptFirst; // [10/18/2007 nsh] XPointList lstVertexes; lstVertexes.Append(new XPoint(GlobalFunc::Ucs2Wcs(ptFirst))); ent.SetLeaderVertexes(lstVertexes); dlg.Dlg2Obj(&ent); dlg.m_bPost = TRUE; sAngle = ::_tstof(dlg.m_sFixAngle); // [10/18/2007 nsh] LeaderEdJig jig(&ent); //add by lgy 20120206 固定角度修改后不起作用 jig.SetDlg(&dlg); jig.SetOperCode(LeaderEdJig::kLeader); jig.SetPrompt(_T("\n输入引线位置或 [更改箭头型式(A)]<退出>: ")); jig.SetKeyword(_T("` A")); jig.setUserInputControls(AcEdJig::kNullResponseAccepted); int nRet = RTNORM; while (1) { if (!dlg.m_bFixAngle) { jig.m_bFixAngle = FALSE; } else { jig.m_bFixAngle = TRUE; jig.m_dFixAngle = _tstof(LPCTSTR(dlg.m_sFixAngle)); sAngle = _tstof(LPCTSTR(dlg.m_sFixAngle)); // [10/18/2007 nsh] } int kwd(0); nRet = jig.DoIt(&kwd); if (nRet == RTNORM) break; else if (nRet == RTKWORD) { if (kwd == 0) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else { if (ar == AecXDbSymbMultiLeader::kNone) ar = AecXDbSymbMultiLeader::kDote; else if (ar == AecXDbSymbMultiLeader::kDote) ar = AecXDbSymbMultiLeader::kArrow; else if (ar == AecXDbSymbMultiLeader::kArrow) ar = AecXDbSymbMultiLeader::kCrossing; else ar = AecXDbSymbMultiLeader::kNone; ent.SetArrow(ar); } } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } jig.SetKeyword(_T("`")); jig.SetOperCode(LeaderEdJig::kTextLine); jig.SetPrompt(_T("\n点取文字基线位置<退出>: ")); while (1) { nRet = jig.DoIt(); if (nRet == RTNORM) break; else if (nRet == RTKWORD) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } // modify by xly on 100915 实体是否设置在默认层 //AcDbObjectId newId = ((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue); AcDbObjectId newId = GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbMultiLeader *)ent.clone()); XPushVar orthomode(_T("ORTHOMODE"), 0); // jig.SetOperCode(LeaderEdJig::kVertex); // sg delete 090320,防止闪烁问题 // jig.SetPrompt(_T("\n输入其他的标注点<结束>: ")); // sg modify 090320 OPENOBJ_BEGIN(newId, AcDb::kForRead, AecXDbSymbMultiLeader, pLeader); if (pLeader != NULL) { XPoint ptBase = pLeader->GetLeaderPoint(); while (1) { // nRet = jig.DoIt(); // sg delete 090320,防止闪烁问题 XPoint ptAdd; // sg delete 090330,还原为JIG算法,解决与正交的矛盾问题 // nRet = ads_getpoint(Wcs2Ucs(ptBase), _T("\n输入其他的标注点<结束>: "), ptAdd); // sg modify 120612,接口使用错误,布局转角的接口是GetLayoutRotation // TLeaderAddOtherPtJig jig2(&dlg, Ucs2Wcs(ptFirst), ptBase, pLeader->GetTextRotation()); LeaderAddOtherPtJig jig2(&dlg, GlobalFunc::Ucs2Wcs(ptFirst), ptBase, pLeader->GetLayoutRotation()); jig2.SetPrompt(_T("\n输入其他的标注点<结束>: ")); jig2.SetKeyword(_T("`")); nRet = jig2.DoIt(); if (nRet == RTNORM) { //复选框置灰 dlg.SetCheckBoxStatus(FALSE); // ptAdd = Ucs2Wcs(ptAdd); ptAdd = jig2.GetPickPoint(); XPointList pts; pLeader->GetLeaderVertexes(pts); pts.Append(new XPoint(ptAdd)); if (pLeader->upgradeOpen() == Acad::eOk) { //add by lgy 20120206 引线平行在点取引线点的时候不好使 dlg.Dlg2Obj(pLeader); // pLeader->SetLeaderVertexes(pts); // sg modify 120104,根据修接口修改函数,这种情况下,不需要修改点m_ptLeaderDirection pLeader->SetLeaderVertexes(pts, FALSE); pLeader->downgradeOpen(); } } else if (nRet == RTKWORD) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else if (nRet == RTNONE) { break; } else { if (::IsWindow(dlg.m_hWnd)) { // sg add 090324,记忆是否启用“固定角度”,以及“固定角度”值 g_sLeadFixAngle = dlg.m_sFixAngle; g_bLeadFixAngle = dlg.m_bFixAngle; dlg.DestroyWindow(); } return; } } //复选框还原 dlg.SetCheckBoxStatus(); } OPENOBJ_END(); dlg.AddToRecent(); if (!dlg.m_bContinue) break; dlg.m_bPost = FALSE; } if (::IsWindow(dlg.m_hWnd)) { g_sLeadFixAngle = dlg.m_sFixAngle; g_bLeadFixAngle = dlg.m_bFixAngle; dlg.DestroyWindow(); } } void DBL_AEC_YINCHUBIAOZU() { AcDbObjectId id; bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_YINCHUBIAOZU"), id); OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbMultiLeader, pLeader); if (!pLeader) return; OPENOBJ_END() OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbMultiLeader, pLeader); if (!pLeader) return; CEditLeaderDlg dlg(acedGetAcadFrame()); dlg.Obj2Dlg(pLeader); CTemporaryResourceOverride vTemp; INT_PTR nResult = dlg.DoModal(); if (nResult == IDOK) { if (pLeader->upgradeOpen() == Acad::eOk) { dlg.Dlg2Obj(pLeader); pLeader->downgradeOpen(); } } else if (nResult == 1000) { int nRet = RTNORM; while (nRet == RTNORM) { XPointList lstPts; // sg add 090330,为调用JIG类做准备 pLeader->GetLeaderVertexes(lstPts); AcGePoint3d ptBase = pLeader->GetLeaderPoint().AsAcGePoint3d(), ptVertexes1; if (lstPts.Length() > 0) ptVertexes1 = lstPts[0]->AsAcGePoint3d(); XPoint ptAdd; // sg modify 090330,改为JIG类 // nRet = ads_getpoint(Wcs2Ucs(pLeader->GetLeaderPoint()), _T("\n请点取要增加的标注点<退出>: "), ptAdd); LeaderAddOtherPtJig jig(dlg.m_bAllPtsOnLine, pLeader->GetLeaderDirection(), ptBase, pLeader->GetTextRotation(), pLeader->IsLeaderParall()); jig.SetPrompt(_T("\n请点取要增加的标注点<退出>: ")); nRet = jig.DoIt(); if (nRet == RTNORM) { // ptAdd = Ucs2Wcs(ptAdd); // sg modify 090330 ptAdd = jig.GetPickPoint(); if (pLeader->upgradeOpen() == Acad::eOk) { XPointList pts; pLeader->GetLeaderVertexes(pts); pts.Append(new XPoint(ptAdd)); // pLeader->SetLeaderVertexes(pts); // sg modify 120104,根据修接口修改函数,这种情况下,不需要修改点m_ptLeaderDirection pLeader->SetLeaderVertexes(pts, FALSE); dlg.Dlg2Obj(pLeader); // sg add 090220,解决了需求平台275 pLeader->downgradeOpen(); } } } } else { pLeader->close(); return; } OPENOBJ_END(); } void DrawCloud() { XPushVar vOsMode(_T("OSMODE"), 0); extern TCHAR* LAY_MODI_DIM; InitTextStyle(TS_SECTION); AcDbObjectId idModi = InitLayer(LAY_MODI_DIM), idTextLayer = InitLayer(LAY_TEXT); OPENOBJ_BEGIN(idModi, AcDb::kForWrite, AcDbLayerTableRecord, pLayer); if (pLayer != NULL) { pLayer->setIsPlottable(false); // 设置图层不打印 } OPENOBJ_END(); CCloudLineDlg dlg; { CAcModuleResourceOverride vTemp; if (!dlg.Create(dlg.IDD, (CWnd*)acedGetAcadFrame())) return; } acedGetAcadDwgView()->SetFocus(); dlg.ShowWindow(SW_SHOW); BOOL bHasModi(FALSE); XPoly2D polyModi; AcDbObjectId idEnt; while (TRUE) { dlg.SetIsChangeType(false); polyModi.Reset(); bHasModi = FALSE; int iType = dlg.GetDrawLineStyle(); if (iType == 0) // 圆形云线 { XPoint ptCenter; if (acedGetPoint(NULL, _T("\n请指定圆形云线的圆心<退出>:"), ptCenter) != RTNORM) { if (!dlg.GetIsChangeType()) { dlg.DestroyWindow(); return; } continue; } static double dRadius = 0.0; static bool bFirstDrawCloud = true; // 是否第一次进入云线命令 if (bFirstDrawCloud) { if (acedGetDist(ptCenter, _T("\n请指定圆形云线的半径<退出>:"), &dRadius) != RTNORM) { if (!dlg.GetIsChangeType()) { dlg.DestroyWindow(); return; } continue; } bFirstDrawCloud = false; } else { CString csTemp; csTemp.Format(_T("\n请指定圆形云线的半径<%.0f>:"), dRadius); int nRet = acedGetDist(ptCenter, csTemp, &dRadius); if (nRet != RTNORM && nRet != RTNONE) { if (!dlg.GetIsChangeType()) { dlg.DestroyWindow(); return; } continue; } if (fabs(dRadius) < 1.0E-3) { acutPrintf(_T("输入的半径不能为0!")); continue; } } ptCenter = GlobalFunc::Ucs2Wcs(ptCenter); // 生成路径线polyModi,必须是逆时针的 XArc arc1(ptCenter, dRadius, 0, PI), // 逆弧 arc2(ptCenter, dRadius, PI, 2 * PI); XCurveSegment seg; seg = arc1; dlg.GetCloudLinePoly(seg, polyModi); seg = arc2; dlg.GetCloudLinePoly(seg, polyModi); polyModi.SetClosed(); } else if (iType == 1) // 矩形云线 { // sg modify 120612,如果是矩形云线,强制正交关闭 XPushVar orthomode(_T("ORTHOMODE"), 0); XPoint pt1, pt2; if (acedGetPoint(NULL, _T("\n请指定第一个角点<退出>:"), pt1) != RTNORM) { if (!dlg.GetIsChangeType()) { dlg.DestroyWindow(); return; } continue; } if (acedGetPoint(pt1, _T("\n请指定另一个角点<退出>:"), pt2) != RTNORM) { if (!dlg.GetIsChangeType()) { dlg.DestroyWindow(); return; } continue; } // 生成路径线polyModi,必须是逆时针的 XPoly2D poly; XPoint pt3(pt2.x, pt1.y, 0), pt4(pt1.x, pt2.y, 0); poly.AppendNode(GlobalFunc::Ucs2Wcs(pt1)); poly.AppendNode(GlobalFunc::Ucs2Wcs(pt3)); poly.AppendNode(GlobalFunc::Ucs2Wcs(pt2)); poly.AppendNode(GlobalFunc::Ucs2Wcs(pt4)); poly.SetClosed(); if (poly.PathArea() > 0) poly.Reverse(); dlg.GetCloudLinePoly(poly, polyModi); polyModi.SetClosed(); } else if (iType == 2) //任意形状弧线 { bHasModi = TRUE; XPoint ptFirst; if (acedGetPoint(NULL, _T("\n指定起点 <退出>:"), ptFirst) != RTNORM) { if (!dlg.GetIsChangeType()) { dlg.DestroyWindow(); return; } continue; } acutPrintf(_T("\n沿云线路径引导十字光标...")); double dMaxValue = dlg.GetMaxValue(), dMinValue = dlg.GetMinValue(); AecXDbSymbModi *pEnt = new AecXDbSymbModi; pEnt->SetEndWidth(dlg.GetEndWidth()); CloudLineJig jig(pEnt, GlobalFunc::Ucs2Wcs(ptFirst), dMaxValue, dMinValue); int nKeyIndex(0), nRet = jig.DoIt(&nKeyIndex); if (nRet != RTNORM) { delete pEnt; if (!dlg.GetIsChangeType()) { dlg.DestroyWindow(); return; } continue; } pEnt->SetEndWidth(dlg.GetEndWidth()); pEnt->SetArcAngle(0.5); // 弧线的凸度固定为0.5 pEnt->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0)); pEnt->setLayer(idModi); idEnt = GlobalFunc::AddToCurrentSpace((AecXDbSymbModi*)pEnt->clone(), TRUE); DELETE_PTR(pEnt); acutPrintf(_T("\n修订云线完成")); } else if (iType == 3) //指定对象 { //int iCursorType = g_nOsnapType; //DocSetWallOsnapType(1); Entity ent; RBList mask(RTDXF0, _T("POLYLINE,LWPOLYLINE,CIRCLE"), NULL); if (ent.FilterSelect(_T("\n请选择要转换为云线的闭合对象<退出>:"), mask) != RTNORM) { if (!dlg.GetIsChangeType()) { //DocSetWallOsnapType(iCursorType); dlg.DestroyWindow(); return; } continue; } //DocSetWallOsnapType(iCursorType); if (ent.Is(_T("LWPOLYLINE")) || ent.Is(_T("POLYLINE"))) { XPoly2D poly(ent); if (!poly.IsClosed()) { acutPrintf(_T("无法将此对象转换为修订云线,请重新选择闭合对象!")); continue; } // 生成路径线polyModi,必须是逆时针的 if (poly.PathArea() > 0) poly.Reverse(); dlg.GetCloudLinePoly(poly, polyModi); polyModi.SetClosed(); ent.Erase(); } else if (ent.Is(_T("CIRCLE"))) { XCircle circle(ent); XPoint ptCenter = circle.GetCenterPt(); double dDistance = circle.GetRadius(); // 生成路径线polyModi,必须是逆时针的 XArc arc1(ptCenter, dDistance, 0, PI), arc2(ptCenter, dDistance, PI, 2 * PI); XCurveSegment seg; seg = arc1; dlg.GetCloudLinePoly(seg, polyModi); seg = arc2; dlg.GetCloudLinePoly(seg, polyModi); polyModi.SetClosed(); ent.Erase(); } } // 创建实体 if (!bHasModi) { AecXDbSymbModi *pEnt = new AecXDbSymbModi; pEnt->SetModiPoly(polyModi); pEnt->SetEndWidth(dlg.GetEndWidth()); pEnt->SetArcAngle(0.5); // 弧线的凸度固定为0.5 pEnt->setLayer(idModi); pEnt->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0)); idEnt = GlobalFunc::AddToCurrentSpace(pEnt, TRUE); } // 处理版次文字 CString csText; double dHeight(0.0); AcDbObjectId idTextStyle; BOOL bShowText(FALSE); dlg.GetTextParam(bShowText, csText, dHeight, idTextStyle); if (!bShowText) { OPENOBJ_BEGIN(idEnt, AcDb::kForWrite, AecXDbSymbModi, pModi); if (pModi != NULL) { pModi->SetIsShowEdition(FALSE); pModi->SetTextLayerId(idTextLayer); // 增加对文字通用图层的设置 pModi->SetTextStyleId(idTextStyle); pModi->SetEditionText(csText); pModi->SetTextHeight(dHeight); pModi->SetEditLocal(pModi->GetDefaultTextLocation()); } OPENOBJ_END(); continue; } XPoint ptEditLocal; if (acedGetPoint(NULL, _T("\n请指定版次标志的位置<取消>:"), ptEditLocal) != RTNORM) { dlg.GetTextParam(bShowText, csText, dHeight, idTextStyle); OPENOBJ_BEGIN(idEnt, AcDb::kForWrite, AecXDbSymbModi, pModi); if (pModi != NULL) { pModi->SetIsShowEdition(FALSE); pModi->SetTextStyleId(idTextStyle); pModi->SetTextLayerId(idTextLayer); // 增加对文字通用图层的设置 pModi->SetEditionText(csText); pModi->SetTextHeight(dHeight); pModi->SetEditLocal(pModi->GetDefaultTextLocation()); } OPENOBJ_END(); continue; } ptEditLocal = GlobalFunc::Ucs2Wcs(ptEditLocal); dlg.GetTextParam(bShowText, csText, dHeight, idTextStyle); OPENOBJ_BEGIN(idEnt, AcDb::kForWrite, AecXDbSymbModi, pModi); if (pModi != NULL) { pModi->SetTextStyleId(idTextStyle); pModi->SetIsShowEdition(bShowText); pModi->SetEditLocal(ptEditLocal); pModi->SetTextHeight(dHeight); pModi->SetEditionText(csText); pModi->SetTextLayerId(idTextLayer); // 增加对文字通用图层的设置 } OPENOBJ_END(); } } void DBL_AEC_YUNXIAN() { return; } void SymbDrawingName() { // sg add 120706,9.0起图面标注给出一个独立的文字样式 AcDbObjectId idTextStyle = InitTextStyle(TS_DRAWINGNAME); if (!idTextStyle) return; //int nDrawMode = DocGetDrawMode(); //DocSetDrawMode(DRAW_2D); CDrawingNameDlg dlg(FALSE, acedGetAcadFrame()); { CTemporaryResourceOverride vTemp; if (!dlg.Create(dlg.IDD, acedGetAcadFrame())) { //DocSetDrawMode(nDrawMode); return; } } dlg.ShowWindow(SW_SHOW); while (1) { acedGetAcadDwgView()->SetFocus(); AecXDbDrawingName *pEnt = new AecXDbDrawingName; dlg.Dlg2Obj(pEnt); dlg.m_bPost = TRUE; // sg modify 090320,8.0起,不再使用“文字转角”,转化为“布局转角” // pEnt->SetRotation(Ucs2Wcs(0.0)); pEnt->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); // delete by xly on 100915 实体图层设置放在AddToSpace中 //pEnt->setLayer(pEnt->GetDefaultLayer()); if (g_Option::instance().g_bTextDefaultLayer) { pEnt->setLayer(pEnt->GetDefaultLayer()); } pEnt->m_bInJig = true; DrawingNameJig jig(pEnt); jig.SetKeyword(_T("`")); jig.SetPrompt(_T("\n请点取插入位置<退出>:")); int nRet = jig.start(); if (nRet == RTNORM) { dlg.AddToRecent(); if (!dlg.m_bContinue) break; dlg.m_bPost = FALSE; pEnt->m_bInJig = false; } else if (nRet == RTKWORD) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); } void DBL_AEC_TUMINGBIAOZHU() { AcDbObjectId id; bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_TUMINGBIAOZHU"), id); OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbDrawingName, pDrawingName); if (!pDrawingName) return; CTemporaryResourceOverride vTemp; CDrawingNameDlg dlg(TRUE, acedGetAcadFrame()); dlg.Obj2Dlg(pDrawingName); INT_PTR nRet = dlg.DoModal(); if (nRet == IDOK) { if (pDrawingName->upgradeOpen() == Acad::eOk) { dlg.Dlg2Obj(pDrawingName); pDrawingName->downgradeOpen(); } } else { pDrawingName->close(); return; } OPENOBJ_END(); } void SymbIndex() { //add by lxb on 2011/12/21 CTemporaryResourceOverride vTemp; //非模式对话框 AcDbObjectId idText = InitTextStyle(TS_LABEL); // sg modify 120106,给“TS_INDEXSCALE”独立出来一个文字样式,传给索引图面外的文字 AcDbObjectId idScaleStyle = InitTextStyle(TS_INDEXSCALE); CDrawingIndexDlg dlg; if (!dlg.Create(dlg.IDD, acedGetAcadFrame())) { return; } dlg.ShowWindow(SW_SHOW); bool bExit = false; while (TRUE) { acedGetAcadDwgView()->SetFocus(); AecXDbSymbDrawingIndex *pIndex = new AecXDbSymbDrawingIndex; pIndex->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); pIndex->SetTextLayerId(InitLayer(LAY_TEXT, TRUE)); //JIG DrawingIndexEdJig jig(pIndex, const_cast(_T("\n请点取标注位置<退出>: ")), const_cast(_T("`"))); while (TRUE) { //获取对话框数据 dlg.Dlg2Obj(pIndex); int istat = jig.doIt(); if (istat == AcEdJig::kNormal) { AcDbObjectId id = GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbDrawingIndex*)pIndex->clone()); DELETE_PTR(pIndex); break; } else if (istat == AcEdJig::kKW1)//PostCommand(_T("` ") { if (dlg.IsOpTextHeight()) { dlg.TextHight(); } } else//PostCommand(_T(" ")或其他退出操作 { bExit = true; break; } }//end of Jig if (bExit) { if (pIndex) { delete pIndex; } break; } }//end of true if (::IsWindow(dlg.m_hWnd)) { dlg.DestroyWindow(); } } void DBL_AEC_SUOYINTUMING() { AcDbObjectId id; bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_SUOYINTUMING"), id); OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbDrawingIndex, pIndex); if (pIndex == NULL) return; //模态对话框 add by lxb on 2011/12/21 CDrawingIndexDlg dlg(acedGetAcadFrame()); dlg.Obj2Dlg(pIndex); if (dlg.DoModal() == IDOK) { if (pIndex->upgradeOpen() == Acad::eOk) { double dTextHight = 0; BOOL bDrawScale = false; XString sDrawingLabel(_T("")), sIndexLabel(_T("")), sTextStyle(_T("")), sScaleText(_T("")); //add by lgy 20120111 添加比例文字样式 XString sScaleStyle(_T("")); dTextHight = dlg.GetTextHight(); bDrawScale = dlg.IsDrawScale(); sDrawingLabel = dlg.GetDrawingLabel(); sIndexLabel = dlg.GetIndexLabel(); sTextStyle = dlg.GetTextStyle(); //add by lgy 20120111 获得比例文字样式字符串 sScaleStyle = dlg.GetScaleStyle(); sScaleText = dlg.GetScaleText(); AcDbObjectId idTextStyle = InitTextStyle(sTextStyle); //add by lgy 20120111 获得比例文字样式字符串 AcDbObjectId idScaleStyle = InitTextStyle(sScaleStyle); //修改属性 if ((sDrawingLabel == _T("-"))) { sDrawingLabel = _T(""); } pIndex->SetDrawingLabel(sDrawingLabel); //图号 pIndex->SetIndexLabel(sIndexLabel); //编号 pIndex->SetTextStyleId(idTextStyle); //文字样式 //modify by lgy 20120111 设置比例文字样式 //pIndex->SetScaleStyleId(idTextStyle); pIndex->SetScaleStyleId(idScaleStyle); pIndex->SetScaleTextHeight(dTextHight); //字高 pIndex->SetDrawScale(bDrawScale); //是否画比例 pIndex->SetScaleText(sScaleText); //比例内容 pIndex->downgradeOpen(); } } OPENOBJ_END(); } extern BOOL g_bIndexDimFixAngle; extern CString g_sIndexDimFixAngle; XPoint pptfirst_; // [11/12/2007 nsh] double sAngle_; // Modify by lcf on 2005/06/24 void SymbIndexPointer() { AcDbObjectId idTextStyle = InitTextStyle(TS_LABEL); // 圆圈文字样式 // sg modify 120106,给“TS_DRAWINGNAME”独立出来一个文字样式 // AcDbObjectId idDimStyle = InitTextStyle(TS_DIM); // 标注文字样式 AcDbObjectId idDimStyle = InitTextStyle(TS_SYMBOL); // 线上文字样式 if (!idTextStyle) return; CIndexDimDlg dlg(FALSE, acedGetAcadFrame()); //注释 by lgy 20120111 命令启动要求记录上次命令设置的文字样式 //dlg.m_strFontStyle = (const TCHAR *)GetSymbolName(idTextStyle); //dlg.m_strDimStyle = (LPCTSTR)GetSymbolName(idDimStyle); // lgh add 20101216 ,标注文字样式 { CTemporaryResourceOverride vTemp; if (!dlg.Create(dlg.IDD, acedGetAcadFrame())) return; } dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); AecXDbSymbIndexPointer ent; // 索引符号 // delete by xly on 100915 实体图层设置放在AddToSpace中 //ent.setLayer(ent.GetDefaultLayer()); ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); ent.SetTextLayerId(InitLayer(LAY_TEXT, TRUE)); ent.SetTextBaseLen(ent.GetDefaultTextBaseLen()); // 默认为6.0*出图比例 ent.m_bInJig = true; XPoint ptDim; while (ads_getpoint(NULL, _T("\n请给出索引节点的位置<退出>: "), ptDim) == RTNORM) { pptfirst_ = ptDim; // [11/12/2007 nsh],固定角度使用 ptDim = GlobalFunc::Ucs2Wcs(ptDim); ent.SetStartPoint(ptDim); // 起点 ent.ClearCutLine(); ent.ClearAddedPoint(); dlg.UpdateVisible(FALSE); // 索引符号类型,不可改 dlg.Dlg2Obj(&ent); dlg.m_bPost = TRUE; dlg.SetSectRunView(FALSE); IndexPointerEdJig jig(&ent); jig.AttachDlg(&dlg); jig.SetKeyword(_T("`")); // 屏幕取字高、词 int nRet = RTNORM; if (ent.IsIndexPointer()) // 指向索引 { if (!dlg.m_bAddIndex) // sg modify 090429,支持钩选不添加索引范围 ent.SetSourceExtent(0.0); else { dlg.SetSourceExtentVisible(FALSE); // sg add 090416,是否添加索引范围,不可改 jig.SetPrompt(_T("\n请给出索引节点的范围<0.0>: ")); jig.SetOperCode(IndexPointerEdJig::kSourceExtent); while (1) { nRet = jig.DoIt(); if (nRet == RTNONE) { ent.SetSourceExtent(0.0); break; } else if (nRet == RTNORM) break; else if (nRet == RTKWORD) { if (dlg.m_nOperCode == 0) // 屏幕拾取字高 dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); // 屏幕拾取文字 dlg.Dlg2Obj(&ent); } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } } } else // 剖切索引 ent.SetSourceExtent(AecXDbSymbIndexPointer::GetDefaultCutLineLen()); dlg.SetSourceExtentVisible(FALSE); // sg add 090416,是否添加索引范围,不可改 // 把这两个数据初始一下。 if (dlg.m_bAddTurn && !ent.IsIndexPointer()) { ent.SetAddedPoint(ent.GetStartPoint()); } ent.SetTurnPoint(ent.GetStartPoint()); if (dlg.m_bAddTurn && !ent.IsIndexPointer()) { //剖切索引,并且需要绘制两个转折点 jig.SetPrompt(_T("\n请给出转折点位置<退出>:")); jig.SetOperCode(IndexPointerEdJig::kAddedTurn); while (1) { nRet = jig.DoIt(); if (nRet == RTNORM) { break; } else if (nRet == RTKWORD) { if (dlg.m_nOperCode == 0) // 屏幕拾取字高 dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); // 屏幕拾取文字 dlg.Dlg2Obj(&ent); } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } } jig.SetPrompt(_T("\n请给出转折点位置<退出>:")); jig.SetOperCode(IndexPointerEdJig::kTurnPoint); while (1) { if (!dlg.m_bFixAngle) // 不固定角度 { jig.m_bFixAngle = FALSE; } else // 固定角度 { jig.m_bFixAngle = TRUE; jig.m_dFixAngle = _tstof(LPCTSTR(dlg.m_sFixAngle)); sAngle_ = _tstof(LPCTSTR(dlg.m_sFixAngle)); // [11/12/2007 nsh] } nRet = jig.DoIt(); if (nRet == RTNORM) { break; } else if (nRet == RTKWORD) { if (dlg.m_nOperCode == 0) // 屏幕拾取字高 dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) // 屏幕拾取文字 dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } jig.SetPrompt(_T("\n请给出文字索引号位置<退出>:")); jig.SetOperCode(IndexPointerEdJig::kTextBasePoint); while (1) { nRet = jig.DoIt(); if (nRet == RTNORM) { if (!ent.IsIndexPointer()) { jig.SetPrompt(_T("\n请给出剖视方向<当前>:")); jig.SetOperCode(IndexPointerEdJig::kViewDirection); while (1) { int nRet1 = jig.DoIt(); if (nRet1 == RTNORM) break; else if (nRet1 == RTNONE) { dlg.Dlg2Obj(&ent); break; } else if (nRet1 == RTKWORD) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } if (nRet != RTNORM && nRet != RTNONE) return; } break; } else if (nRet == RTKWORD) { if (dlg.m_nOperCode == 0) // 屏幕拾取字高 dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) // 屏幕拾取文字 dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } // lgh add 101217,设置多个剖切线位置 if (!ent.IsIndexPointer() && dlg.m_bMoreCut) { // 多个剖切线 jig.SetPrompt(_T("\n请给出其它剖切线位置: ")); jig.SetOperCode(IndexPointerEdJig::kMoreCuts); while (1) { nRet = jig.DoIt(); if (nRet == RTNORM) {// 继续添加剖切线 // continue } else if (nRet == RTCAN) { // 退出 if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } else if (nRet == RTKWORD) { if (dlg.m_nOperCode == 0) // 屏幕拾取字高 dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); // 屏幕拾取文字 dlg.Dlg2Obj(&ent); } else { // 结束添加剖切线, break; } } } dlg.UpdateData(); // modify by xly on 100915 实体是否设置在默认层 //((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue); ent.m_bInJig = false; GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbIndexPointer *)ent.clone()); ent.m_bInJig = true; dlg.AddToRecent(); if (!dlg.m_bContinue) // 是否连续标注 break; dlg.UpdateVisible(TRUE); dlg.SetSectRunView(TRUE);// lgh add 101223, 设置剖切对话框窗口 dlg.SetSourceExtentVisible(TRUE); // sg add 090416,是否添加索引范围,可见 dlg.m_bPost = FALSE; } if (::IsWindow(dlg.m_hWnd)) { g_sIndexDimFixAngle = dlg.m_sFixAngle; g_bIndexDimFixAngle = dlg.m_bFixAngle; dlg.DestroyWindow(); } } void DBL_AEC_SUOYINFUHAO() { AcDbObjectId id; bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_SUOYINFUHAO"), id); OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbIndexPointer, pIndex); if (!pIndex) return; CEditIndexDimDlg dlg(acedGetAcadFrame()); dlg.Obj2Dlg(pIndex); dlg.AttachObject(pIndex); { CTemporaryResourceOverride vTemp; if (dlg.DoModal() != IDOK) return; } if (pIndex->upgradeOpen() == Acad::eOk) { dlg.Dlg2Obj(pIndex); dlg.AdjustExtentProp(); pIndex->downgradeOpen(); } OPENOBJ_END(); } void SymbComposing() { // sg modify 120106,给“TS_SYMBOL”独立出来一个文字样式 // AcDbObjectId idTextStyle = InitTextStyle(TS_DIM); AcDbObjectId idTextStyle = InitTextStyle(TS_SYMBOL); if (!idTextStyle) return; CComposingDlg dlg(acedGetAcadFrame()); //注释 by lgy 20120111 文字样式具有记忆功能 //dlg.m_strFontStyle = (const TCHAR *)GetSymbolName(idTextStyle); { CTemporaryResourceOverride vTemp; if (!dlg.Create(dlg.IDD, acedGetAcadFrame())) return; } dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); AecXDbSymbComposing ent; // delete by xly on 100915 实体图层设置放在AddToSpace中 //ent.setLayer(ent.GetDefaultLayer()); ent.SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0)); ent.SetTextLayerId(InitLayer(LAY_TEXT, TRUE)); // ent.SetTextBaseLen(ent.GetDefaultTextBaseLen()); ent.SetTextBaseLen(30); // modified by whl on 060210 // delete by xly on 100917 不干涉用户捕捉 //XPushVar vOrthoMode(_T("ORTHOMODE"), 1); // sg add 080918,强制打开正交 XPoint ptDim; while (ads_getpoint(NULL, _T("\n请给出标注第一点<退出>: "), ptDim) == RTNORM) { ptDim = GlobalFunc::Ucs2Wcs(ptDim); ent.SetStartPoint(ptDim); ent.SetTurnPoint(ptDim); dlg.Dlg2Obj(&ent); dlg.m_bPost = TRUE; // add by xly on 100916 有原点时,第一部操作结束,圆点标签不可用 if (dlg.m_bHasCirPoint) { dlg.SetLableEnable(!dlg.m_bHasCirPoint); } ComposingEdJig jig(&ent); jig.SetKeyword(_T("`")); // modify by xly on 100916 根据8.5需求更改提示语 //jig.SetPrompt(_T("\n请给出标注第二点<退出>:")); jig.SetPrompt(_T("\n请给出文字基线位置<退出>:")); jig.SetOperCode(ComposingEdJig::kTurnPoint); while (1) { int nRet1 = jig.DoIt(); if (nRet1 == RTNORM) break; else if (nRet1 == RTKWORD) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } // modify by xly on 100916 根据8.5需求更改提示语 //jig.SetPrompt(_T("\n请给出文字线方向和长度<退出>:")); jig.SetPrompt(_T("\n请给出文字基线方向和长度<退出>:")); jig.SetOperCode(ComposingEdJig::kTextLine); while (1) { int nRet2 = jig.DoIt(); if (nRet2 == RTNORM) break; else if (nRet2 == RTKWORD) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else { if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); return; } } // modify by xly on 100915 实体是否设置在默认层 //((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue); AcDbObjectId newId = GlobalFunc::AddToSpace(Adesk::kTrue, (AecXDbSymbComposing *)ent.clone()); // add by xly 0n 100916 如果有圆点标注 /////////////////////////////////////Start///////////////////////////////////////// if (!dlg.m_bHasCirPoint) { continue; } // 打开已经存在的做法标注 OPENOBJ_BEGIN(newId, AcDb::kForRead, AecXDbSymbComposing, pComposing); if (pComposing != NULL) { AcGePoint3d ptBase = pComposing->GetTurnPoint(); // 反复提示“请输入其他标注点<结束>”添加标注点 while (1) { // add by xly on 101221 及时更新对象数据 if (pComposing->upgradeOpen() == Acad::eOk) { dlg.Dlg2Obj(pComposing); pComposing->downgradeOpen(); } // jig // modify by xly on 110314 支持用户坐标系 //TComposingAddOtherPtJig jig2(Ucs2Wcs(ptDim),ptBase); ComposingAddOtherPtJig jig2(ptDim, ptBase); jig2.SetPrompt(_T("\n请输入其他标注点<结束>:")); jig2.SetKeyword(_T("`")); XPoint ptNew; int nRet = jig2.DoIt(); if (nRet == RTNORM) { // 将其他标注点添加到实体中 ptNew = jig2.GetPickPoint(); AcGePoint3d ptS = pComposing->GetStartPoint(), ptTurn = pComposing->GetTurnPoint(); // 引线长度 double dLineLen = ptS.distanceTo(ptTurn); // 新进入点的长度 double dNewLineLen = ptNew.Distance(ptTurn); if (pComposing->upgradeOpen() == Acad::eOk) { // 新进入点的长度大于引线长度,更新m_ptStart if (dLineLen < dNewLineLen) { pComposing->SetStartPoint(ptNew); pComposing->AddDotLoc(ptS); } else { pComposing->AddDotLoc(ptNew); } pComposing->downgradeOpen(); } } else if (nRet == RTKWORD) { if (dlg.m_nOperCode == 0) dlg.GetTextHeight(); else if (dlg.m_nOperCode == 1) dlg.GetPickText(); dlg.Dlg2Obj(&ent); } else if (nRet == RTNONE) { break; } else { if (::IsWindow(dlg.m_hWnd)) { dlg.DestroyWindow(); } return; } } } OPENOBJ_END(); /////////////////////////////////////End///////////////////////////////////////// if (!dlg.m_bContinue) break; dlg.m_bPost = FALSE; // add by xly on 100916 恢复对话框标签显示 dlg.SetLableEnable(TRUE); } if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); } int DBL_AEC_CHICUNBIAOZHU(AcDbObjectId id) { AcAxDocLock lock; OPENOBJ_BEGIN(id, AcDb::kForRead, AecDbDimension, pDim); if (pDim!=NULL) { XPoint ptBase = GlobalFunc::Wcs2Ucs(pDim->GetLocation()); int nRet; XPoint ptAdd; XString szPrompt; XPointList lstAddPoint, lstBasePoint; lstBasePoint.Append(new XPoint(ptBase)); while (1) { int nLen = lstAddPoint.Length(); if (nLen == 0) _stprintf(szPrompt, _T("\n点取待增补的标注点的位置或 [参考点(R)]<退出>:")); else _stprintf(szPrompt, _T("\n点取待增补的标注点的位置或 [参考点(R)/撤消上一标注点(U)]<退出>:")); INITGET_BEG(0, _T("U R")); nRet = acedGetPoint(ptBase, szPrompt, ptAdd); INITGET_END(); if (nRet == RTNORM) { ptBase = ptAdd; ptAdd = GlobalFunc::Ucs2Wcs(ptAdd); if (pDim->upgradeOpen() == Acad::eOk) { if (!pDim->AddSegment(ptAdd)) g_Option::instance().adsout << _T("\n点取位置不合适!"); else { lstAddPoint.Append(new XPoint(ptAdd)); lstBasePoint.Append(new XPoint(ptBase)); if (g_Option::instance().g_nDimAdjust)//add by whl on 050530 pDim->AdjustDim(g_Option::instance().g_nDimAdjust!=2); } pDim->downgradeOpen(); } } else if (nRet == RTKWORD) { XString sKey; acedGetInput(sKey); if (sKey[0] == _T('R')) acedGetPoint(NULL, _T("\n参考点:"), ptBase); else if (sKey[0] == _T('U')) { if (pDim->upgradeOpen() == Acad::eOk) { if (nLen > 0) { ptAdd = *lstAddPoint.Tail(); lstAddPoint.Remove(nLen-1); pDim->HitTestOnPoint(ptAdd); pDim->FindAndRemoveSegment(ptAdd); lstBasePoint.Remove(nLen); ptBase = *lstBasePoint.Tail(); } pDim->downgradeOpen(); } } } else break; } } OPENOBJ_END(); return RTNORM; } void DBL_AEC_ZUOFABIAOZHU() { AcDbObjectId id; bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_ZUOFABIAOZHU"), id); OPENOBJ_BEGIN(id, AcDb::kForRead, AecXDbSymbComposing, pComposing); if (pComposing == NULL) return; BOOL bOldIsSide = pComposing->IsSideText(); // 记录旧位置,sg add 081007 CComposingDlg dlg(acedGetAcadFrame()); dlg.Obj2Dlg(pComposing); { CTemporaryResourceOverride vTemp; if (dlg.DoModal() != IDOK) return; } if (pComposing->upgradeOpen() == Acad::eOk) { double dNewLineLen = pComposing->GetTextBaseLen(TRUE), // sg modify 081112 dPageWidth = pComposing->GetPageWidth(TRUE); dlg.Dlg2Obj(pComposing); BOOL bNewIsSide = pComposing->IsSideText(); // 记录新位置,sg add 081007 if (bOldIsSide && !bNewIsSide) // “文字在线端”改为“文字在线上” { double dDist2Line = pComposing->GetDist2Line(TRUE, TRUE); dNewLineLen = dPageWidth + 2 * dDist2Line; // 新线长=页宽+起始距线距离 pComposing->SetPageWidth(dPageWidth, TRUE); } else if (!bOldIsSide && bNewIsSide) // “文字在线上”改为“文字在线端” { dNewLineLen = pComposing->GetTextHeight(); // 新线长=字高 double dOldLineLen = pComposing->GetTextBaseLen(TRUE); dNewLineLen *= dOldLineLen / fabs(dOldLineLen); } pComposing->SetTextBaseLen(dNewLineLen, TRUE); pComposing->SetAlignBySymbol(); // 设置对齐方式,sg add 081104 pComposing->downgradeOpen(); } OPENOBJ_END(); } void DI_XGBL() { CModifyDimDlg::start(); } void DI_CCZH() { //RBList rbMaskDim(RTDXF0, _T("AEC_DUICHENZHOU,AEC_POQIE,AEC_SUOYINTUMING,AEC_SUOYINFUHAO,AEC_ZUOFABIAOZHU,AEC_YINCHUBIAOZU,AEC_TUMINGBIAOZHU,AEC_ZHEDUANXIAN,AEC_ZHIBEIZHEN,AEC_CHICUNBIAOZHU,AEC_ZUOBIAOBIAOZHU,AEC_BIAOGAOBIAOZHU,AEC_JIANTOUYINZHU,"), NULL); if (AfxMessageBox(_T("是否将图中所有“尺寸标注”转换为AutoCAD的原生标注?此过程不可逆!"), MB_YESNO) != IDYES) return; ads_name ss, ent; struct resbuf *pRb = acutBuildList(RTDXF0, _T("AEC_CHICUNBIAOZHU"), 0); acedSSGet(_T("A"), NULL, NULL, pRb, ss); Adesk::Int32 nLen = 0; acedSSLength(ss, &nLen); AcDbVoidPtrArray ar; AcDbObjectId id, idStyle; for (int i(0); i < nLen; ++i) { acedSSName(ss, i, ent); OPENOBJ_BEGIN(ent, AcDb::kForWrite, AecDbDimension, pDim) if (pDim) { pDim->explode(ar); for (int i(0); i < ar.length(); ++i) { id = GlobalFunc::AddToModelSpace((AcDbDimension *)ar[i]); OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbDimension, pCadDim) if (pCadDim) idStyle = pCadDim->dimensionStyle(); OPENOBJ_END() OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbDimension, pCadDim) if (pCadDim && idStyle.isValid()) pCadDim->setDimensionStyle(idStyle); OPENOBJ_END() } pDim->erase(); } OPENOBJ_END() } acedSSFree(ss); acutRelRb(pRb); } void GetDisadvantage2Head(PickSet &ssTmp, SSearchPipeList *pDisadvantage) { AcDbObjectId id = NULL; id = pDisadvantage->m_ID; if (pDisadvantage->m_iType == 0) ssTmp += id; if (pDisadvantage->m_pPrevious != NULL) GetDisadvantage2Head(ssTmp, pDisadvantage->m_pPrevious); } SSearchPipeList *GetDisadvantageNode(SSearchPipeList *pListAll, SSearchPipeList *pDisadvantage) { AcDbObjectId id = NULL; id = pListAll->m_ID; double nCurPipeLength(0); nCurPipeLength = pListAll->m_nLength; if (GlobalFunc::IsSprinkler(id)) { if (!pDisadvantage || (pDisadvantage && nCurPipeLength > pDisadvantage->m_nLength)) pDisadvantage = pListAll; } int len = pListAll->m_lstNode.Length(); for (long i = 0; im_lstNode[i]; pDisadvantage = GetDisadvantageNode(pList, pDisadvantage); } return pDisadvantage; } void FindLongPath() { RBList rbMaskPipe = ads_buildlist(-4, _T(""), -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); Entity entMain; PickSet ss(SS_FREE); if (GlobalFunc::SelectEntity(_T("\n请选择主干管(搜索指定干管所连最远路径):<指定范围搜索>"), entMain, rbMaskPipe) == RTNORM) { ss += entMain; } else { PickSet ssAllDwg(SS_FREE); // ZXL 2013.11.15 ADD RBList rbMaskAllPipe = ads_buildlist(-4, _T(""), -4, _T(""), -4, _T(""), -4, _T(""), -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); if (GlobalFunc::SelectEntities(_T("\n请选择搜索范围:<整图搜索>"), ssAllDwg, rbMaskAllPipe) != RTNORM) ssAllDwg.Get(_T("X"), NULL, NULL, rbMaskAllPipe); int len = ssAllDwg.Length(); //仅仅要连1根直管的立管,排除扣弯 for (long i = 0; iIsVertical()) { AcDbObjectId id1 = pPipe->GetNode(0); AcDbObjectId id2 = pPipe->GetNode(1); int count(0); OPENOBJ_BEGIN(id1, AcDb::kForRead, CDbPipeNode, pNode); if (pNode) { int num = pNode->GetInterfaceNum(); if (num == 1) count++; } OPENOBJ_END(); OPENOBJ_BEGIN(id2, AcDb::kForRead, CDbPipeNode, pNode); if (pNode) { int num = pNode->GetInterfaceNum(); if (num == 1) count++; } OPENOBJ_END(); XPoint ptTmp1 = pPipe->StartPoint(); ptTmp1.z = 0; if (count == 1) { BOOL bFlag = TRUE; for (long j = 0; jLength(); } OPENOBJ_END(); } if (nDist > nLongDist) { ssLong.Free(); nLongDist = nDist; ssLong += ssTmp; } } delete pListAll; } acedRestoreStatusBar(); g_Option::instance().adsout << XString(_T("\n立管距最不利点距离:%.2f!"), nLongDist); ads_sssetfirst(ssLong, ssLong); int len2 = ssLong.Length(); if (len2 < 1) return; XPoint ptCen, ptLow, ptUp; double x, y, z; ssLong.GetExtend(ptCen, &x, &y, &z); ptLow = ptUp = ptCen; ptLow.x -= x; ptLow.y -= y; ptUp.x += x; ptUp.y += y; GlobalFunc::AssureInCurrentView(ptLow, ptUp); } void DBL_AEC_ZT_EQUIPMENT() { AcDbObjectId id; if (!GetDoubleClickEnt(_T("DBL_AEC_ZT_EQUIPMENT"), id)) return; if (GlobalFunc::IsSprinkler(id)) { extern int EditSprinkler(AcDbObjectId id); EditSprinkler(id); return; } if (GlobalFunc::IsHydrant(id)) { extern int EditHydrant(AcDbObjectId id); EditHydrant(id); return; } } void DBL_AEC_ZT_FIRE_EXTINGUISHER() { AcDbObjectId id; if (!GetDoubleClickEnt(_T("DBL_AEC_ZT_FIRE_EXTINGUISHER"), id)) return; extern int EditFireExtinguisher(AcDbObjectId id); EditFireExtinguisher(id); }