// add by xlc on 071114 消重图元 #include "stdafx.h" #include "resource.h" #include "adui.h" #include "acui.h" #include "actrans.h" // extern GEOAPI int Intersect(const XPoly2D &poly1, const XPoly2D &poly2, DList &lstDest); // extern GEOAPI int HandleCurveDup(PickSet &ss); extern TARCH_IMPEXP BOOL g_bCheckWallDup3D; extern TARCH_IMPEXP BOOL g_bAutoCheckWall; // 添加标记 void ErrorPosition1(const XPoint &ptLowLeft, const XPoint &ptUpRight, const TCHAR *pszMsg) { TDbPromptMark *pEntMsg=new TDbPromptMark(ptLowLeft, ptUpRight, pszMsg); double nW=pEntMsg->GetSizeX(), nH=pEntMsg->GetSizeY(); { /////////////////////////////////////////////////////// // 判断是否已经有相同的符号存在 XDbBlockTableRec objMSpace; ASSERT(!!objMSpace); AcDbBlockTableRecordIterator* pBlockIterator=NULL; Acad::ErrorStatus es = objMSpace.m_pBlockTableRec->newIterator(pBlockIterator); ASSERT(es==Acad::eOk && pBlockIterator!=NULL); BOOL bExist=FALSE; for (pBlockIterator->start(); !pBlockIterator->done(); pBlockIterator->step()) { AcDbEntity *pEntity=NULL; es = pBlockIterator->getEntity(pEntity, AcDb::kForRead); if (es!=Acad::eOk) continue; ASSERT(pEntity); XDbObject vTemp(pEntity); //不处理不可见的实体 if (pEntity->visibility() == AcDb::kInvisible) { continue; } TDbPromptMark *pMsg=TDbPromptMark::cast(pEntity); if (pMsg && pEntMsg->CompareTo(*pMsg)==0) { bExist=TRUE; break; } } delete pBlockIterator; if (bExist) { delete pEntMsg; return; } } if (nW>1.0E-6 && nH>1.0E-6) { nW *= 1.5; nH *= 1.5; XRectAngle rect2(pEntMsg->GetLocation(), nW, nH); XPoint ptLow=rect2.GetLowLeft(), ptUp=rect2.GetUpRight(); pEntMsg->SetTextStyle(InitTextStyle(TS_STANDARD)); pEntMsg->AddToMSpace(Adesk::kTrue); } else { delete pEntMsg; } } // 是否墙体相交,考虑柱子的影响 bool IsWallIntersect(Entity en,Entity ent) { XPoly2D poly1,poly2; // 墙体截面 AcDbObjectId idS1,idE1,idS2,idE2; OPENOBJ_BEGIN(en,AcDb::kForRead,TDbWall,pWall); if (pWall) { pWall->GetOutlinePoly(0,poly1,TRUE); idS1 = pWall->GetStartColumnId(); idE1 = pWall->GetEndColumnId(); } OPENOBJ_END(); OPENOBJ_BEGIN(ent,AcDb::kForRead,TDbWall,pWall); if (pWall) { pWall->GetOutlinePoly(0,poly2,TRUE); idS2 = pWall->GetStartColumnId(); idE2 = pWall->GetEndColumnId(); } OPENOBJ_END(); AcDbObjectId idColS,idColE; if ((idS1 == idE2 || idS1 == idS2) && idS1 != AcDbObjectId::kNull) { idColS = idS1; } if ((idE1 == idE2 || idE1 == idS2) && idE1 != AcDbObjectId::kNull) { idColE = idE1; } XPoly2D colPolyS,colPolyE; if (idColS != AcDbObjectId::kNull) { OPENOBJ_BEGIN(idColS, AcDb::kForRead, TDbColumn, pCol); if (pCol) { pCol->GetOutline(colPolyS); } OPENOBJ_END(); } if (idColE != AcDbObjectId::kNull) { OPENOBJ_BEGIN(idColE, AcDb::kForRead, TDbColumn, pCol); if (pCol) { pCol->GetOutline(colPolyS); } OPENOBJ_END(); } DList lstDest; if (TchSubExport::Intersect(poly1,poly2,lstDest) == RTNORM) { if (lstDest.Length()!= 0) // 有交点 { double area=0.0; // 相交区域面积 for(int i=0;iPathArea()); } if (area > _DIST_SNAP*_DIST_SNAP)//相交精度控制 { if (idColS == AcDbObjectId::kNull&&idColE == AcDbObjectId::kNull)//无柱子 { return true; } for(int i=0;i0) { if ((pt&colPolyS)==PR_OUTSIDE)//点不在柱内 { count = 1; } } if (colPolyE.Length()>0) { if ((pt&colPolyE)==PR_OUTSIDE)//点不在柱内 { count = 1; } else { if (count == 1) { count = 2; //点在另外柱子里 } } } if (count == 1) //柱子外有交点 { return true; } else if (count == 0) //柱子外无交点 { continue; } else //柱子外有交点,且交点在另外柱子里 { DList lstOutSide1, lstOutSide2; DList polyClip; polyClip.Append(&colPolyS); polyClip.Append(&colPolyE); DList poly2d1,poly2d2; poly2d1.Append(&poly1); poly2d2.Append(&poly2); Subtract(poly2d1, polyClip, lstOutSide1); Subtract(poly2d2, polyClip, lstOutSide2); DList result; for(int k=0;k= iNumVerts) { return false; } TGGeCurveSegment curveSeg; // 多段线的一段 AcGeLine3d lineFirst; // 之前的直线 AcGeLine3d lineSecond; // 当前的直线 AcGePoint3d ptVertex; // 多段线的结点 AcGeVector3d vtDirection; // 方向矢量 AcGeTol tol; // 误差精度 tol.setEqualPoint(_DIST_SNAP); tol.setEqualVector(_DIST_SNAP); ptVertex = poly.GetPointListAt(iIndex).AsAcGePoint3d(); vtDirection = AcGeVector3d::kXAxis; // 得到之前的直线 // 如果多段线是闭合的,或者下标不为0,则可以直接得到之前的弧段 if (poly.m_nFlag || iIndex != 0) { poly.Nth((iIndex - 1 + iNumVerts) % iNumVerts, curveSeg); vtDirection.rotateBy(curveSeg.Direction(curveSeg.EndPoint()), AcGeVector3d::kZAxis); } // 否则利用当前的弧段取得直线的方向 else { poly.Nth(iIndex, curveSeg); vtDirection.rotateBy(curveSeg.Direction(curveSeg.StartPoint()) + PI / 2, AcGeVector3d::kZAxis); } lineFirst.set(ptVertex + vtDirection, ptVertex - vtDirection); vtDirection = AcGeVector3d::kXAxis; // 得到当前的直线 // 如果多段线是闭合的,或者下标不是最后一个结点,则可以直接得到当前的弧段 if (poly.m_nFlag || iIndex + 1 != iNumVerts) { poly.Nth(iIndex, curveSeg); vtDirection.rotateBy(curveSeg.Direction(curveSeg.StartPoint()), AcGeVector3d::kZAxis); // 如果平行,取垂直方向 if (vtDirection.isParallelTo(lineFirst.direction(), tol)) { vtDirection.rotateBy(PI / 2, AcGeVector3d::kXAxis); } } // 否则利用之前直线的垂线方向得到当前直线的方向 else { vtDirection.rotateBy(lineFirst.direction().angleTo(AcGeVector3d::kXAxis) + PI / 2, AcGeVector3d::kZAxis); } lineSecond.set(ptVertex + vtDirection, ptVertex - vtDirection); // 判断距离关系 return !(lineFirst.distanceTo(ptCmp) > _DIST_SNAP || lineSecond.distanceTo(ptCmp) > _DIST_SNAP); } // Zyu add on 100708 // 调整多段线,将首尾点相同的多段线调整为闭合,同时保证闭合的多段线方向都是逆时针 void AdjustPoly(TGGePoly3D &poly) { int iLen = poly.Length(); if (iLen < 2) { return; } AcGePoint3d ptStart = poly.GetPointListAt(0)->AsAcGePoint3d(); AcGePoint3d ptEnd = poly.GetPointListAt(iLen - 1)->AsAcGePoint3d(); // 设置误差范围 AcGeTol tol; tol.setEqualPoint(_DIST_SNAP); tol.setEqualVector(_DIST_SNAP); // 调整闭合方式 if (ptStart.isEqualTo(ptEnd, tol)) { poly.m_nFlag = 1; poly.RemoveNode(iLen - 1); } // 压缩 poly.Compress(true); // 调整方向 if (poly.m_nFlag && (poly.PathArea() > 0)) { poly.Reverse(); } } enum TYPE { kNull = -1, //不处理 kOther = 0, //线,弧,圆 kText = 1, //文本 kBlock = 2, //图块 kWall = 3, //墙 kColumn = 4, //柱子 kOpenning = 5, //门窗 kTSpace = 6, //房间 // Zyu add on 100702,添加新的处理类型 kTLine = 7, // 线 kPoly = 8, // 多段线 kArc = 9, // 圆弧 }; class TEntity { public: TEntity(){}; TEntity(Entity en) { m_nType = kNull; AcDbObjectId objId; Acad::ErrorStatus es = acdbGetObjectId(objId, en); if (es != Acad::eOk) return; AcDbObject* obj=NULL; es = acdbOpenObject(obj, objId, AcDb::kForRead); if (es != Acad::eOk) return; CString strClassName = obj->isA()->name(); obj->close(); // Zyu modify on 100702 // 对实体的分类做进一步的划分 // Begin //if((_tcsicmp(strClassName,_T("AcDbLine")) == 0) // ||(_tcsicmp(strClassName,_T("AcDbArc")) == 0) // ||(_tcsicmp(strClassName,_T("AcDbCircle")) == 0)) //直线,弧,圆 //{ // m_nType = kOther; //} if (_tcsicmp(strClassName,_T("AcDbLine")) == 0) { m_nType = kTLine; } else if ((_tcsicmp(strClassName,_T("AcDbArc")) == 0) ||(_tcsicmp(strClassName,_T("AcDbCircle")) == 0)) { m_nType = kArc; } else if (_tcsicmp(strClassName,_T("AcDbPolyLine")) == 0 || _tcsicmp(strClassName,_T("AcDb2dPolyLine")) == 0) // 支持2维多段线,Zyu add on 101206 { m_nType = kPoly; } // End else if (_tcsicmp(strClassName,_T("TDbWall")) == 0 ||_tcsicmp(strClassName,_T("TDbCurtainWall")) == 0) //墙体和幕墙 { m_nType = kWall; } else if (_tcsicmp(strClassName,_T("TDbColumn")) == 0) //柱子 { m_nType = kColumn; } else if (_tcsicmp(strClassName,_T("TDbOpening")) == 0 ||_tcsicmp(strClassName,_T("TDbGroupOpening")) == 0)//门窗,组合门窗 { m_nType = kOpenning; } else if (_tcsicmp(strClassName,_T("TDbSpace")) == 0) //房间 { m_nType = kTSpace; } else if ((_tcsicmp(strClassName,_T("TDbText")) == 0) ||(_tcsicmp(strClassName,_T("TDbMText")) == 0) ||(_tcsicmp(strClassName,_T("AcDbText")) == 0) ||(_tcsicmp(strClassName,_T("AcDbMText")) == 0)) //文本 { m_nType = kText; } else if ((_tcsicmp(strClassName,_T("TDbBlockInsert")) == 0) ||(_tcsicmp(strClassName,_T("AcDbBlockReference")) == 0))//图块 { m_nType = kBlock; } else { return; } m_eName = en; //获得2D下的包围盒 int nOldMode=DocGetDrawMode(); DocSetDrawMode(DRAW_2D); ads_point ptLow,ptUp; en.GetExtend(ptLow,ptUp); DocSetDrawMode(nOldMode); ptLow[2]=ptUp[2]=0; m_ptMin = ptLow; m_ptMax = ptUp; } int m_nType; Entity m_eName; XPoint m_ptMin,m_ptMax; bool operator >(const TEntity& ent)const { if (m_nType == ent.m_nType) { if (m_ptMin == ent.m_ptMin) { if (m_ptMax == ent.m_ptMax) { return false; } return m_ptMax > ent.m_ptMax; } return m_ptMin > ent.m_ptMin; } return m_nType > ent.m_nType; } bool operator <(const TEntity& ent)const{return ent>(*this);} bool operator==(const TEntity& ent) { if ((m_nType == ent.m_nType)) { switch(m_nType) { case kText: return CompareText(ent); break; case kBlock: return CompareBlock(ent); break; case kWall: return CompareWall(ent); break; case kColumn: return CompareColumn(ent); break; case kOpenning: return CompareOpening(ent); break; case kTSpace: return CompareSpace(ent); break; // Zyu add on 100702,比较多段线 case kPoly: return ComparePoly(ent); break; } return true; } return false; } //两段XPoly2D线是否相交 bool IsIntersect(XPoly2D &poly1,XPoly2D &poly2) { DList lstDest; if (TchSubExport::Intersect(poly1,poly2,lstDest) == RTNORM) { if (lstDest.Length()!= 0) // 有交点 { double area=0.0; // 相交区域面积 for(int i=0;iPathArea()); } if (area > _DIST_SNAP*_DIST_SNAP)//相交精度控制 { return true; } } } return false; } //由点ptMin,ptMax构成的XPoly2D和由点ptMin2,ptMax2构成的XPoly2D是否相交 bool IsIntersect(XPoint ptMin,XPoint ptMax,XPoint ptMin2,XPoint ptMax2) { XPoly2D poly1(1),poly2(1); poly1.AppendNode(ptMin); poly1.AppendNode(XPoint(ptMin[0],ptMax[1])); poly1.AppendNode(ptMax); poly1.AppendNode(XPoint(ptMax[0],ptMin[1])); poly2.AppendNode(ptMin2); poly2.AppendNode(XPoint(ptMin2[0],ptMax2[1])); poly2.AppendNode(ptMax2); poly2.AppendNode(XPoint(ptMax2[0],ptMin2[1])); return IsIntersect(poly1,poly2); } //是否在控制精度范围内存在相同点 bool IsPointEqual(AcGePoint3d ptStart1,AcGePoint3d ptEnd1,AcGePoint3d ptStart2,AcGePoint3d ptEnd2) { ptStart1.z=0; ptEnd1.z=0; ptStart2.z=0; ptEnd2.z=0; if ((ptStart1.distanceTo(ptStart2)StartPoint(); ptEnd1=pWall->EndPoint(); bIsArc1 = pWall->Is(CURVE_ARC); if (bIsArc1) { ptCenter1=pWall->GetArc().GetCenterPt(); } else { vect1=pWall->Direction3d(); } } OPENOBJ_END(); OPENOBJ_BEGIN(ent.m_eName,AcDb::kForRead,TDbWall,pWall); if (pWall) { ptStart2=pWall->StartPoint(); ptEnd2=pWall->EndPoint(); bIsArc2 = pWall->Is(CURVE_ARC); if (bIsArc2) { ptCenter2=pWall->GetArc().GetCenterPt(); } else { vect2=pWall->GetLine().Direction3d(); } } OPENOBJ_END(); BOOL bParallel=FALSE; if (!bIsArc1&&!bIsArc2) { if (vect1.isParallelTo(vect2)) bParallel=TRUE; } else if (bIsArc1&&bIsArc2) { if (ptCenter1.Distance2d(ptCenter2)<_DIST_SNAP) bParallel=TRUE; } if (bParallel) { XLine line1(ptStart1,ptEnd1,LS_FINITE),line2(ptStart2,ptEnd2,LS_FINITE); ads_point pts; int num=line1.Intersection(&line2,pts); //modify by xlc on 090206 消除弧墙有唯一顶点相同时的影响 // if (num!=NULL)//弧墙基线有重合 // { // return true; // } // else // { // int a=line1.HitTest2d(ptStart2), // b=line1.HitTest2d(ptEnd2), // c=line2.HitTest2d(ptStart1), // d=line2.HitTest2d(ptEnd2); // // if (line1.HitTest2d(ptStart2)==5 // ||line1.HitTest2d(ptEnd2)==5 // ||line2.HitTest2d(ptStart1)==5 // ||line2.HitTest2d(ptEnd1)==5)//基线有部分重合 // return true; // else if ((line1.HitTest2d(ptStart2)==3&&line1.HitTest2d(ptEnd2)==4) // ||(line1.HitTest2d(ptStart2)==4&&line1.HitTest2d(ptEnd2)==3))//完全重合 // { // return true; // } // } if ((line1.HitTest2d(XPoint(ptStart2))==3&&line1.HitTest2d(XPoint(ptEnd2))==4) ||(line1.HitTest2d(XPoint(ptStart2))==4&&line1.HitTest2d(XPoint(ptEnd2))==3))//完全重合 { return true; } else if (line1.HitTest2d(XPoint(ptStart2))==3 ||line1.HitTest2d(XPoint(ptEnd2))==4 ||line1.HitTest2d(XPoint(ptStart2))==4 ||line1.HitTest2d(XPoint(ptEnd2))==3) //基线有唯一一个相同顶点 { return false; } else if (line1.HitTest2d(XPoint(ptStart2))==5 ||line1.HitTest2d(XPoint(ptEnd2))==5 ||line2.HitTest2d(XPoint(ptStart1))==5 ||line2.HitTest2d(XPoint(ptEnd1))==5)//基线有部分重合 return true; else if (num!=NULL)//弧墙基线有重合 { return true; } } } //if (IsIntersect(m_ptMin,m_ptMax,ent.m_ptMin,ent.m_ptMax)) // 两段墙包围盒是否相交 if (bIntersect) { AcDbCurve *pCurve1=NULL,*pCurve2=NULL; // 墙体的基线 XPoly2D poly1,poly2; // 墙体截面 double elev1(0),elev2(0),height1(0),height2(0); // 墙体标高,高度 AcGePoint3d ptStart1,ptEnd1,ptStart2,ptEnd2; // 墙体起始点 BOOL bIsArc1,bIsArc2; //是否弧墙 XPoint ptCenter1,ptCenter2; AcGeVector3d vect1,vect2; AcDbObjectId idS1,idE1,idS2,idE2; OPENOBJ_BEGIN(m_eName,AcDb::kForRead,TDbWall,pWall); if (pWall) { pWall->GetOutlinePoly(0,poly1,TRUE); elev1 = pWall->GetElevation(); height1=pWall->GetHeight(); pCurve1=pWall->GetAcDbCurve(0); pWall->getStartPoint(ptStart1); pWall->getEndPoint(ptEnd1); bIsArc1 = pWall->Is(CURVE_ARC); if (bIsArc1) { ptCenter1=pWall->GetArc().GetCenterPt(); } else { vect1=pWall->Direction3d(); } } OPENOBJ_END(); OPENOBJ_BEGIN(ent.m_eName,AcDb::kForRead,TDbWall,pWall); if (pWall) { pWall->GetOutlinePoly(0,poly2,TRUE); elev2 = pWall->GetElevation(); height2=pWall->GetHeight(); pCurve2=pWall->GetAcDbCurve(0); pWall->getStartPoint(ptStart2); pWall->getEndPoint(ptEnd2); bIsArc2 = pWall->Is(CURVE_ARC); if (bIsArc2) { ptCenter2=pWall->GetArc().GetCenterPt(); } else { vect2=pWall->Direction3d(); } } OPENOBJ_END(); BOOL flag=FALSE; //基线是否相交标志 if (pCurve1 && pCurve2) { AcGePoint3dArray points; pCurve1->intersectWith(pCurve2,AcDb::kOnBothOperands,AcGePlane(AcGePoint3d(0,0,0),AcGeVector3d::kZAxis),points); if (points.length() == 1) { flag=TRUE; } } if (pCurve1) { delete pCurve1; } if (pCurve2) { delete pCurve2; } if (IsIntersect(poly1,poly2)) //墙体截面是否相交 { if (flag && IsPointEqual(ptStart1,ptEnd1,ptStart2,ptEnd2)) return false; //add by xlc on 090424 else { XLine line1((XPoint)ptStart1,(XPoint)ptEnd1,LS_FINITE),line2((XPoint)ptStart2,(XPoint)ptEnd2,LS_FINITE); ads_point pts; int num=line1.Intersection(&line2,pts); if ((line1.HitTest2d(XPoint(ptStart2))==3&&line1.HitTest2d(XPoint(ptEnd2))==4) ||(line1.HitTest2d(XPoint(ptStart2))==4&&line1.HitTest2d(XPoint(ptEnd2))==3))//完全重合 { return true; } else if ((line1.HitTest2d(XPoint(ptStart2))==3 ||line1.HitTest2d(XPoint(ptEnd2))==4 ||line1.HitTest2d(XPoint(ptStart2))==4 ||line1.HitTest2d(XPoint(ptEnd2))==3) &&(!(line1.HitTest2d(XPoint(ptStart2))==5 ||line1.HitTest2d(XPoint(ptEnd2))==5 ||line2.HitTest2d(XPoint(ptStart1))==5 ||line2.HitTest2d(XPoint(ptEnd1))==5))) //基线有唯一一个相同顶点 { return false; } } BOOL bIntersect=FALSE; // 是否立面上有相交 if (g_bCheckWallDup3D) // 检查三维重叠 { // 考虑标高 if (elev1elev2) // 存在重叠 { bIntersect=TRUE; } } else if (elev1>elev2) { if (elev1GetOutline(colPolyS); } OPENOBJ_END(); } if (idColE != AcDbObjectId::kNull) { OPENOBJ_BEGIN(idColE, AcDb::kForRead, TDbColumn, pCol); if (pCol) { pCol->GetOutline(colPolyS); } OPENOBJ_END(); } DList lstDest; if (Intersect(poly1,poly2,lstDest) == RTNORM) { if (lstDest.Length()!= 0) // 有交点 { double area=0.0; // 相交区域面积 for(int i=0;iPathArea()); } if (area > _DIST_SNAP*_DIST_SNAP)//相交精度控制 { return true; } } } return true;*/ } } else { BOOL bParallel=FALSE; if (!bIsArc1&&!bIsArc2) { if (vect1.isParallelTo(vect2)) bParallel=TRUE; } else if (bIsArc1&&bIsArc2) { if (ptCenter1.Distance2d(ptCenter2)<_DIST_SNAP) bParallel=TRUE; } if (bParallel) { XLine line1(XPoint(ptStart1.x,ptStart1.y,ptStart1.z),XPoint(ptEnd1.x,ptEnd1.y,ptEnd1.z),LS_FINITE); XLine line2(XPoint(ptStart2.x,ptStart2.y,ptStart2.z),XPoint(ptEnd2.x,ptEnd2.y,ptEnd2.z),LS_FINITE); ads_point pts; int num=line1.Intersection(&line2,pts); //modify by xlc on 090120 消除弧墙有唯一顶点相同时的影响 // if (num!=NULL)//弧墙基线有重合 // { // return true; // } // else // { // if (line1.HitTest2d(XPoint(ptStart2))==5 // ||line1.HitTest2d(XPoint(ptEnd2))==5 // ||line2.HitTest2d(XPoint(ptStart1))==5 // ||line2.HitTest2d(XPoint(ptEnd1))==5)//基线有部分重合 // return true; // else if ((line1.HitTest2d(XPoint(ptStart2))==3&&line1.HitTest2d(XPoint(ptEnd2))==4) // ||(line1.HitTest2d(XPoint(ptStart2))==4&&line1.HitTest2d(XPoint(ptEnd2))==3))//完全重合 // { // return true; // } // } if ((line1.HitTest2d(XPoint(ptStart2))==3&&line1.HitTest2d(XPoint(ptEnd2))==4) ||(line1.HitTest2d(XPoint(ptStart2))==4&&line1.HitTest2d(XPoint(ptEnd2))==3))//完全重合 { return true; } else if (line1.HitTest2d(XPoint(ptStart2))==3 ||line1.HitTest2d(XPoint(ptEnd2))==4 ||line1.HitTest2d(XPoint(ptStart2))==4 ||line1.HitTest2d(XPoint(ptEnd2))==3) //基线有唯一一个相同顶点 { return false; } else if (line1.HitTest2d(XPoint(ptStart2))==5 ||line1.HitTest2d(XPoint(ptEnd2))==5 ||line2.HitTest2d(XPoint(ptStart1))==5 ||line2.HitTest2d(XPoint(ptEnd1))==5)//基线有部分重合 return true; else if (num!=NULL)//弧墙基线有重合 { return true; } } } } return false; } // 比较文本是否重合 bool CompareText(const TEntity &ent) { if (m_ptMin == ent.m_ptMin) { if (m_ptMax == ent.m_ptMax) { CString strText=GetTextContent(m_eName), strTextEnt=GetTextContent(ent.m_eName); //if (_tcsicmp(strText,strTextEnt) == 0) if (strText==strTextEnt) { return true; } } } return false; } // 获得文本内容 CString GetTextContent(Entity en) { CString strText(_T("")); OPENOBJ_BEGIN(en, AcDb::kForRead, AcDbEntity, pText); if (pText) { if (pText->isKindOf(AcDbText::desc())) { TCHAR *str=((AcDbText *)pText)->textString(); strText.Format(_T("%s"),((AcDbText *)pText)->textString()); free(str); } else if (pText->isKindOf(AcDbMText::desc())) { TCHAR *str=((AcDbMText *)pText)->contents(); strText.Format(_T("%s"),str); free(str); } else strText.Format(_T("%s"),((TDbText *)pText)->GetText()); } OPENOBJ_END(); return strText; } // 比较图块是否重合 bool CompareBlock(TEntity ent) { if (m_ptMin == ent.m_ptMin) { if (m_ptMax == ent.m_ptMax) { CString strName=GetBlockName(m_eName), strNameEnt=GetBlockName(ent.m_eName); if (strName.CompareNoCase(strNameEnt) == 0) { return true; } } } return false; } // 获得图块名 CString GetBlockName(Entity ent) { CString strText(_T("")); OPENOBJ_BEGIN(ent,AcDb::kForRead,AcDbBlockTableRecord,pBlkTblRec); if (pBlkTblRec) { TCHAR *pchName=NULL; // 块名 pBlkTblRec->getName(pchName); // 得到块名 strText.Format(_T("%s"),pchName); acutDelString(pchName); } OPENOBJ_END(); return strText; } int SpaceAreaCmpType(TDbSpace::AreaType areaType) { switch (areaType) { case TDbSpace::kTotalArea: return 1; case TDbSpace::kHouseArea: case TDbSpace::kShareArea: return 2; case TDbSpace::kUseArea: case TDbSpace::kHoleArea: case TDbSpace::kBalconyArea: return 3; default: return 0; } } inline bool FindType(TDbSpace::AreaType *type, TDbSpace::AreaType areaType, int nLen) { for (int i = 0; i < nLen; i++) { if (areaType == type[i]) return true; } return false; } bool SpaceAreaCmpType(TDbSpace::AreaType areaType1, TDbSpace::AreaType areaType2) { // 组织了三个集合,如果两个类型(可能相同)属于同一个集合,则两个类型需要判断重合 static TDbSpace::AreaType aryTotalSpace[] = {TDbSpace::kTotalArea}; static TDbSpace::AreaType aryHouseSpace[] = {TDbSpace::kHouseArea, TDbSpace::kShareArea}; static TDbSpace::AreaType aryOthers[] = {TDbSpace::kShareArea, TDbSpace::kUseArea, TDbSpace::kHoleArea, TDbSpace::kBalconyArea}; #define _FINDTYPE(arySpace, ntype) \ FindType(arySpace, ntype, sizeof(arySpace)/sizeof(TDbSpace::AreaType)) return (_FINDTYPE(aryTotalSpace, areaType1) && _FINDTYPE(aryTotalSpace, areaType2)) || (_FINDTYPE(aryHouseSpace, areaType1) && _FINDTYPE(aryHouseSpace, areaType2)) || (_FINDTYPE(aryOthers, areaType1) && _FINDTYPE(aryOthers, areaType2)); #undef _FINDTYPE } // 比较房间是否重叠 bool CompareSpace(TEntity ent) { //add by xlc on 090526 BOOL bSpace=FALSE; //是否房间类型 // Zyu add on 100707 TDbSpace::AreaType spaceType = TDbSpace::kOther; // 房间类型 XPoly2D poly1,poly2; OPENOBJ_BEGIN(m_eName,AcDb::kForRead,TDbSpace,pSpace); if (pSpace) { AcGeVector3d normal; pSpace->GetPathPoly(poly1,normal); // Zyu modify on 100707 // Begin //add by xlc on 090526 //if(!(pSpace->m_nType==TDbSpace::kHouseArea // ||pSpace->m_nType==TDbSpace::kTotalArea) // ) //{ // bSpace=TRUE; //} bSpace = TRUE; // 记录房间类型 spaceType = pSpace->m_nType; // End } OPENOBJ_END(); OPENOBJ_BEGIN(ent.m_eName,AcDb::kForRead,TDbSpace,pSpace); if (pSpace) { AcGeVector3d normal; pSpace->GetPathPoly(poly2,normal); // 修改描述:添加对套内与套内,套内与公摊,建筑轮廓与建筑轮廓这几种房间类型之间的消重 // Zyu modify on 100707 // Begin //add by xlc on 090526 //if(bSpace // &&(pSpace->m_nType==TDbSpace::kHouseArea // ||pSpace->m_nType==TDbSpace::kTotalArea) // ) //{ // bSpace=FALSE; //} if (bSpace) { // bSpace = (SpaceAreaCmpType(spaceType) == SpaceAreaCmpType(pSpace->m_nType)); bSpace = SpaceAreaCmpType(spaceType, pSpace->m_nType); // switch (spaceType) // { // case TDbSpace::kHouseArea: // 套内与套内,套内与公摊 // { // if (TDbSpace::kHouseArea != pSpace->m_nType // && TDbSpace::kShareArea != pSpace->m_nType) // { // bSpace = FALSE; // } // } // break; // case TDbSpace::kShareArea: // 公摊与套内 // { // if (TDbSpace::kHouseArea != pSpace->m_nType) // { // bSpace = FALSE; // } // } // break; // case TDbSpace::kTotalArea: // 建筑轮廓与建筑轮廓 // { // if (TDbSpace::kTotalArea != pSpace->m_nType) // { // bSpace = FALSE; // } // } // break; // } } // End } OPENOBJ_END(); if (bSpace) return IsIntersect(poly1,poly2); else return false; } // 比较柱子是否重叠 bool CompareColumn(TEntity ent) { if (IsIntersect(m_ptMin,m_ptMax,ent.m_ptMin,ent.m_ptMax)) { XPoly2D poly1,poly2; OPENOBJ_BEGIN(m_eName,AcDb::kForRead,TDbColumn,pColumn); if (pColumn) { pColumn->GetOutline(poly1); } OPENOBJ_END(); OPENOBJ_BEGIN(ent.m_eName,AcDb::kForRead,TDbColumn,pColumn); if (pColumn) { pColumn->GetOutline(poly2); } OPENOBJ_END(); return IsIntersect(poly1,poly2); } return false; } // 比较门窗是否重叠 bool CompareOpening(TEntity ent) { if (IsIntersect(m_ptMin,m_ptMax,ent.m_ptMin,ent.m_ptMax)) { XPoly2D poly1,poly2; double elev1(0),elev2(0),height1(0),height2(0); OPENOBJ_BEGIN(m_eName,AcDb::kForRead,TDbOpening,pOpening); if (pOpening) { pOpening->GetOutlinePoly(0,poly1); elev1 = pOpening->GetSill(); height1=pOpening->GetHeight(); } OPENOBJ_END(); OPENOBJ_BEGIN(ent.m_eName,AcDb::kForRead,TDbOpening,pOpening1); if (pOpening1) { pOpening1->GetOutlinePoly(0,poly2); elev2 = pOpening1->GetSill(); height2=pOpening1->GetHeight(); } OPENOBJ_END(); // 问题描述:无法消除有重叠的弧窗,因为GetOutlinePoly()函数获得的多段线是非闭合的, // 在TchSubExport::Intersect()中无法对这样的多段线进行处理 // 修改描述:强制多段线闭合 // 修改人,修改时间:Zyu modify on 100707 poly1.m_nFlag = poly2.m_nFlag = 1; if (IsIntersect(poly1,poly2)) { // 考虑高窗 if (elev1elev2) { return true; } } else if (elev1>elev2) { if (elev1vertexIterator(); bool bFlag = true; for (pIter->start(); !pIter->done(); pIter->step()) { OPENOBJ_BEGIN(pIter->objectId(), AcDb::kForRead, AcDb2dVertex, pVertex); if (NULL == pVertex) { delete pIter; return false; } if (bFlag) { dWidth = pVertex->startWidth(); bFlag = false; } if (fabs(dWidth - pVertex->startWidth()) > _DIST_SNAP || fabs(dWidth - pVertex->endWidth()) > _DIST_SNAP) { delete pIter; return false; } OPENOBJ_END(); } delete pIter; OPENOBJ_END(); return true; } else { return false; } } // Zyu add on 100702 // 比较多段线是否重合 bool ComparePoly(TEntity ent) { // 保证是同类型的比较 if (ent.m_nType != kPoly || m_nType != kPoly) { return false; } // 保证只比较全局线宽相同的多段线 double dWidth = 0.0; double dWidthCmp = 0.0; if (!GetPLineWidth(m_eName, dWidth) || !GetPLineWidth(ent.m_eName, dWidthCmp)) { return false; } if (fabs(dWidthCmp - dWidth) > _DIST_SNAP) { return false; } TGGePoly3D poly(m_eName); // 原多段线 TGGePoly3D polyCmp(ent.m_eName); // 用于比较的多段线 AcGePoint3d ptCmp; // 调整多段线 AdjustPoly(poly); AdjustPoly(polyCmp); int iNumVerts = poly.Length(); // 两条多段线的节点数不同,或者节点数小于1个,或者闭合类型不一致,认为不相同 if (iNumVerts != polyCmp.Length() || iNumVerts < 1 || poly.m_nFlag != polyCmp.m_nFlag) { return false; } int iStart = 0; // 记录polyCmp里与line起点相同的点的坐标 double dBulge = 0; double dBulgeCmp = 0; for (int i = 0; i < iNumVerts; i++) { dBulge = poly.GetBulge(i); dBulgeCmp = polyCmp.GetBulge((i + iStart) % iNumVerts); ptCmp = polyCmp.GetPointListAt((i + iStart) % iNumVerts)->AsAcGePoint3d(); // 比较节点以及凸度是否相同 if (!IsVertexEqual(poly, ptCmp, i) || ((i + 1 != iNumVerts) && (fabs(dBulge - dBulgeCmp) > _angSnap))) { // 如果是比较起点,可能多段线的起点不一致,但仍然重合,做进一步判断 if (0 == i) { // 对于闭合多段线,找到对应的起点 if (poly.m_nFlag) { iStart = -1; for (int j = 0; j < iNumVerts; j++) { ptCmp = polyCmp.GetPointListAt(j)->AsAcGePoint3d(); dBulgeCmp = polyCmp.GetBulge(j); if (IsVertexEqual(poly, ptCmp, i) && (fabs(dBulge - dBulgeCmp) < _angSnap)) { iStart = j; break; } } // 找不到对应起点,认为不相同 if (-1 == iStart) { return false; } } // 对于非闭合多段线,进行反转 else { polyCmp.Reverse(); ptCmp = polyCmp.GetPointListAt(i)->AsAcGePoint3d(); dBulgeCmp = polyCmp.GetBulge(i); if (!IsVertexEqual(poly, ptCmp, i) || (fabs(dBulge - dBulgeCmp) > _angSnap)) { return false; } } } else { return false; } } } return true; } }; //add by xlc on 081230 BOOL IsWallEqual(Entity ent1,Entity ent2) { AcGePoint3d ptStart1,ptEnd1,ptStart2,ptEnd2; // 墙体起始点 double dLWidth1,dRWidth1,dLWidth2,dRWidth2; OPENOBJ_BEGIN(ent1,AcDb::kForRead,TDbWall,pWall); if (pWall) { pWall->getStartPoint(ptStart1); pWall->getEndPoint(ptEnd1); dLWidth1=pWall->GetWidth(0); dRWidth1=pWall->GetWidth(1); } OPENOBJ_END(); OPENOBJ_BEGIN(ent2,AcDb::kForRead,TDbWall,pWall); if (pWall) { pWall->getStartPoint(ptStart2); pWall->getEndPoint(ptEnd2); dLWidth2=pWall->GetWidth(0); dRWidth2=pWall->GetWidth(1); } OPENOBJ_END(); if (ptStart1.distanceTo(ptStart2)<_DIST_SNAP &&ptEnd1.distanceTo(ptEnd2)<_DIST_SNAP &&fabs(dLWidth1-dLWidth2)<_DIST_SNAP &&fabs(dRWidth1-dRWidth2)<_DIST_SNAP) { return TRUE; } return FALSE; } BOOL IsColumnEqual(Entity ent1,Entity ent2) { XPoly2D poly1,poly2; OPENOBJ_BEGIN(ent1,AcDb::kForRead,TDbColumn,pEnt); if (pEnt) { pEnt->GetOutline(poly1); } OPENOBJ_END(); OPENOBJ_BEGIN(ent2,AcDb::kForRead,TDbColumn,pEnt); if (pEnt) { pEnt->GetOutline(poly2); } OPENOBJ_END(); if (poly1.Length()>2 &&poly2.Length()>2) { double area1=poly1.PathArea(),area2=poly2.PathArea(); double area=0; DList lstPoly2D; TchSubExport::Union(poly1, poly2, lstPoly2D); // 求并集 if (lstPoly2D.Length() > 0) { area=lstPoly2D[0]->PathArea(); } if (fabs(fabs(area1)+fabs(area2)-fabs(area)*2)<_DIST_SNAP*_DIST_SNAP) { return TRUE; } } return FALSE; } BOOL IsSpaceEqual(Entity ent1,Entity ent2) { XPoly2D poly1,poly2; OPENOBJ_BEGIN(ent1,AcDb::kForRead,TDbSpace,pEnt); if (pEnt) { AcGeVector3d normal; pEnt->GetPathPoly(poly1,normal); } OPENOBJ_END(); OPENOBJ_BEGIN(ent2,AcDb::kForRead,TDbSpace,pEnt); if (pEnt) { AcGeVector3d normal; pEnt->GetPathPoly(poly2,normal); } OPENOBJ_END(); if (poly1.Length()>2 &&poly2.Length()>2) { double area1=poly1.PathArea(),area2=poly2.PathArea(); double area=0; DList lstPoly2D; TchSubExport::Union(poly1, poly2, lstPoly2D); // 求并集 if (lstPoly2D.Length() > 0) { area=lstPoly2D[0]->PathArea(); } if (fabs(fabs(area1)+fabs(area2)-fabs(area)*2)<_DIST_SNAP*_DIST_SNAP) { return TRUE; } } return FALSE; } class TGroup { public: TGroup (){} TGroup (const int nType):m_nType(nType){} int m_nType; Entity m_eEnt1; Entity m_eEnt2; }; class CRemoveDupDlg : public CModelessDialog { public: CRemoveDupDlg(CWnd* pParent = NULL); // standard constructor //{{AFX_DATA(CRemoveDupDlg) enum { IDD = IDD_DIALOG_REMOVEDUP }; int m_iFindRange; CProgressCtrl m_ctrlProgress; //}}AFX_DATA static BOOL bLine; //是否检查直线 static BOOL bArc; //是否检查圆弧 static BOOL bText; //是否检查文本 static BOOL bBlock; //是否检查图块 static BOOL bWall; //是否检查墙体 static BOOL bCol; //是否检查柱子 static BOOL bOpening; //是否检查门窗 static BOOL bSpace; //是否检查房间 // Zyu add on 100701,添加新的控件关联变量 static BOOL bPoly; // 是否检查多段线 static BOOL bLineLayer; // 是否只检查同层直线 static BOOL bPolyLayer; // 是否只检查同层多段线 static BOOL bArcLayer; // 是否只检查同层圆弧 //{{AFX_VIRTUAL(CRemoveDupDlg) public: virtual BOOL PreTranslateMessage(MSG* pMsg); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL protected: // Generated message map functions //{{AFX_MSG(CRemoveDupDlg) afx_msg void OnButtonBegin(); afx_msg void OnButtonSelect(); virtual BOOL OnInitDialog(); afx_msg void OnSelchangeComboFindrange(); afx_msg void OnDestroy(); virtual void OnOK(); afx_msg void OnBnClickedCheckLine(); afx_msg void OnBnClickedCheckPline(); afx_msg void OnBnClickedCheckArc(); afx_msg void OnBnClickedBtnSelectall(); afx_msg void OnBnClickedBtnRemoveall(); afx_msg void OnBnClickedCheckLinelayer(); afx_msg void OnBnClickedCheckPlinelayer(); afx_msg void OnBnClickedCheckArclayer(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: void HideDialog(BOOL bFlag); CString GetEntType(); public: CToolTipCtrl m_wndToolTip; PickSet m_ssEnt; CArray m_textArray; //文本数组 CArray m_blockArray; //图块数组 CArray m_wallArray; //墙体数组 CArray m_spaceArray; //房间数组 CArray m_openArray; //门窗数组 CArray m_columnArray; //柱子数组 CArray m_wallGroup; //墙体组数组 CArray m_openGroup; //门窗组数组 CArray m_colGroup; //柱子组数组 CArray m_spaceGroup; //房间组数组 }; BOOL CRemoveDupDlg::bLine = TRUE; BOOL CRemoveDupDlg::bArc = TRUE; BOOL CRemoveDupDlg::bText = TRUE; BOOL CRemoveDupDlg::bBlock = TRUE; BOOL CRemoveDupDlg::bWall = TRUE; BOOL CRemoveDupDlg::bCol = TRUE; BOOL CRemoveDupDlg::bOpening = TRUE; BOOL CRemoveDupDlg::bSpace = TRUE; BOOL CRemoveDupDlg::bPoly = TRUE; BOOL CRemoveDupDlg::bLineLayer = FALSE; BOOL CRemoveDupDlg::bPolyLayer = FALSE; BOOL CRemoveDupDlg::bArcLayer = FALSE; CRemoveDupDlg::CRemoveDupDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(CRemoveDupDlg::IDD, pParent), m_ssEnt(SS_FREE) { //{{AFX_DATA_INIT(CRemoveDupDlg) m_iFindRange = 1; m_textArray.RemoveAll(); m_blockArray.RemoveAll(); m_wallArray.RemoveAll(); m_spaceArray.RemoveAll(); m_openArray.RemoveAll(); m_columnArray.RemoveAll(); //}}AFX_DATA_INIT } void CRemoveDupDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRemoveDupDlg) DDX_CBIndex(pDX, IDC_COMBO_SEARCH, m_iFindRange); DDX_Check(pDX, IDC_CHECK_LINE, bLine); DDX_Check(pDX, IDC_CHECK_ARC, bArc); DDX_Check(pDX, IDC_CHECK_TEXT, bText); DDX_Check(pDX, IDC_CHECK_BLOCK, bBlock); DDX_Check(pDX, IDC_CHECK_WALL, bWall); DDX_Check(pDX, IDC_CHECK_COL, bCol); DDX_Check(pDX, IDC_CHECK_OPENING, bOpening); DDX_Check(pDX, IDC_CHECK_SPACE, bSpace); DDX_Check(pDX, IDC_CHECK_PLINE, bPoly); DDX_Check(pDX, IDC_CHECK_LINELAYER, bLineLayer); DDX_Check(pDX, IDC_CHECK_PLINELAYER, bPolyLayer); DDX_Check(pDX, IDC_CHECK_ARCLAYER, bArcLayer); DDX_Control(pDX, IDC_PROGRESS_CHECK, m_ctrlProgress); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CRemoveDupDlg, CModelessDialog) //{{AFX_MSG_MAP(CRemoveDupDlg) ON_BN_CLICKED(IDC_BUTTON_BEGIN, OnButtonBegin) ON_BN_CLICKED(IDC_BUTTON_PICK, OnButtonSelect) ON_CBN_SELCHANGE(IDC_COMBO_SEARCH, OnSelchangeComboFindrange) ON_WM_DESTROY() ON_BN_CLICKED(IDC_CHECK_LINE, OnBnClickedCheckLine) ON_BN_CLICKED(IDC_CHECK_PLINE, OnBnClickedCheckPline) ON_BN_CLICKED(IDC_CHECK_ARC, OnBnClickedCheckArc) ON_BN_CLICKED(IDC_BTN_SELECTALL, OnBnClickedBtnSelectall) ON_BN_CLICKED(IDC_BTN_REMOVEALL, OnBnClickedBtnRemoveall) ON_BN_CLICKED(IDC_CHECK_LINELAYER, OnBnClickedCheckLinelayer) ON_BN_CLICKED(IDC_CHECK_PLINELAYER, OnBnClickedCheckPlinelayer) ON_BN_CLICKED(IDC_CHECK_ARCLAYER, OnBnClickedCheckArclayer) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CRemoveDupDlg::OnBnClickedCheckLine() { UpdateData(true); GetDlgItem(IDC_CHECK_LINELAYER)->EnableWindow(bLine); } void CRemoveDupDlg::OnBnClickedCheckPline() { UpdateData(true); GetDlgItem(IDC_CHECK_PLINELAYER)->EnableWindow(bPoly); } void CRemoveDupDlg::OnBnClickedCheckArc() { UpdateData(true); GetDlgItem(IDC_CHECK_ARCLAYER)->EnableWindow(bArc); } void CRemoveDupDlg::OnBnClickedBtnSelectall() { UpdateData(TRUE); bLine = TRUE; bPoly = TRUE; bArc = TRUE; bBlock = TRUE; bText = TRUE; bWall = TRUE; bCol = TRUE; bOpening = TRUE; bSpace = TRUE; UpdateData(FALSE); GetDlgItem(IDC_CHECK_LINELAYER)->EnableWindow(); GetDlgItem(IDC_CHECK_PLINELAYER)->EnableWindow(); GetDlgItem(IDC_CHECK_ARCLAYER)->EnableWindow(); } void CRemoveDupDlg::OnBnClickedBtnRemoveall() { UpdateData(TRUE); bLine = FALSE; bPoly = FALSE; bArc = FALSE; bBlock = FALSE; bText = FALSE; bWall = FALSE; bCol = FALSE; bOpening = FALSE; bSpace = FALSE; UpdateData(FALSE); GetDlgItem(IDC_CHECK_LINELAYER)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK_PLINELAYER)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK_ARCLAYER)->EnableWindow(FALSE); } // Zyu add on 100702 // 消除重合的多段线 int HandlePLineDup(TPickEntSet &ss) { long lLength = ss.Length(); for (long i = 0; i < lLength; i++) { TEntity ent(ss[i]); // 只对多段线进行处理 if (ent.m_nType != kPoly) { continue; } for (long j = i + 1; j < lLength; j++) { TEntity entCmp(ss[j]); if (ent == entCmp) { OPENOBJ_BEGIN(entCmp.m_eName, AcDb::kForWrite, AcDbEntity, pEnt); if(pEnt) { pEnt->erase(); ss -= ss[j]; j--; } OPENOBJ_END(); } } } return RTNORM; } // Zyu add on 100702 // 消除同图层上的重元(直线、多段线和弧) int HandleCurveDupSameLayer(TPickEntSet &ss) { int iRetCode = RTNORM; TPickEntSet ssKeep(SS_FREE); ssKeep += ss; ss.Free(); // 取出选择集中的第一个实体,搜索选择集中与该实体类型和图层相同的所有实体 while (ssKeep.Length() != 0 && RTNORM == iRetCode) { // 备份选择集 TPickEntSet ssTemp(SS_FREE); ssTemp += ssKeep; // 获得一个实体的属性 TEntitySet ent = ssTemp[(long)0]; TCHAR szType[256]=_T(""); TCHAR szLayer[256]=_T(""); ent.GetData(0, szType); ent.GetData(8, szLayer); // 过滤 ssTemp.BaseFilter(TRBList(ads_buildlist(RTDXF0, szType, 8, szLayer, NULL))); ssTemp += ent; ssKeep -= ssTemp; // 消除重元 if (_tcsicmp(szType,_T("LWPOLYLINE")) == 0) { iRetCode = HandlePLineDup(ssTemp); } else { iRetCode = HandleCurveDup(ssTemp); } ss += ssTemp; } return iRetCode; } //开始检查 void CRemoveDupDlg::OnButtonBegin() { if (GetEntType() == _T("")) { MessageBox(_T("未检查到匹配的重合对象!")); return; } if (m_iFindRange == 1) { UpdateData(); CString strType = GetEntType(); RBList entList(RTDXF0, strType, NULL); m_ssEnt.Free(); if ( m_ssEnt.Get(_T("X"), NULL, NULL, entList ) != RTNORM) { MessageBox(_T("检查失败!")); CModelessDialog::OnOK(); return; } } if (m_ssEnt.Length() < 1) { MessageBox(_T("没有检查到对象!")); CModelessDialog::OnOK(); return; } m_textArray.RemoveAll(); m_blockArray.RemoveAll(); m_wallArray.RemoveAll(); m_spaceArray.RemoveAll(); m_openArray.RemoveAll(); m_columnArray.RemoveAll(); long lCount=m_ssEnt.Length(); // Zyu modify on 100702 // 对分类进行进一步的划分 //PickSet ssOther(SS_FREE); TPickEntSet ssLine(SS_FREE); // 直线的选择集 TPickEntSet ssArc(SS_FREE); // 圆弧的选择集 TPickEntSet ssPoly(SS_FREE); // 多段线的选择集 for(long i=0L;i varDistSnap(_DIST_SNAP, _DIST_SNAP * 1.1); TPushMemVar varAngSnap(_angSnap, _angSnap * 1.1); // Zyu modify on 100702 // 对直线和圆弧分开处理,同时添加对同图层消重的支持 // Begin //处理线,弧 //if (bLine || bArc) //{ // HandleCurveDup(ssOther); // XString strPrompt(_T("\n")); // if(bLine&&bArc) // { // adsout<<_T("\n直线,圆弧已处理完毕!"); // } // else if(bLine) // { // adsout<<_T("\n直线已处理完毕!"); // } // else // { // adsout<<_T("\n圆弧已处理完毕!"); // } //} CString sPrompt = _T("\n消除"); if (bLine) { long lLineNum = ssLine.Length(); if (bLineLayer) { // 消除同图层上的重合直线 HandleCurveDupSameLayer(ssLine); } else { // 消除重元 HandleCurveDup(ssLine); } CString sTemp; sTemp.Format(_T("%d个重合直线,"), lLineNum - ssLine.Length()); sPrompt += sTemp; } if (bArc) { long lArcNum = ssArc.Length(); if (bArcLayer) { // 消除同图层上的重合圆弧 HandleCurveDupSameLayer(ssArc); } else { // 消除重元 HandleCurveDup(ssArc); } CString sTemp; sTemp.Format(_T("%d个重合圆弧,"), lArcNum - ssArc.Length()); sPrompt += sTemp; } // 添加对多段线的消重 if (bPoly) { long lPlineNum = ssPoly.Length(); if (bPolyLayer) { HandleCurveDupSameLayer(ssPoly); } else { HandlePLineDup(ssPoly); } CString sTemp; sTemp.Format(_T("%d个重合多段线,"), lPlineNum - ssPoly.Length()); sPrompt += sTemp; } // 输出处理结果提示 if (bLine || bPoly || bArc) { sPrompt.TrimRight(_T(',')); sPrompt += _T('!'); adsout << (LPCTSTR)sPrompt; } // End int nCount=0; //处理文本 if (bText) { nCount=0; for(i=0;ierase(); m_textArray.RemoveAt(j); j--; nCount++; } OPENOBJ_END(); } } } if (nCount==0) { adsout<<_T("\n没有发现重合的文本对象!"); } else { adsout<<_T("\n删除")<erase(); m_blockArray.RemoveAt(j); j--; nCount++; } OPENOBJ_END(); } } } if (nCount==0) { adsout<<_T("\n没有发现重合的图块!"); } else { adsout<<_T("\n删除")<SetBitmap((HBITMAP)bitmap); bitmap.Detach(); */ CButton *pButton = (CButton *)GetDlgItem(IDC_BUTTON_PICK); // Zyu add on 100702,设置初始状态 GetDlgItem(IDC_CHECK_LINELAYER)->EnableWindow(bLine); GetDlgItem(IDC_CHECK_PLINELAYER)->EnableWindow(bPoly); GetDlgItem(IDC_CHECK_ARCLAYER)->EnableWindow(bArc); OnBnClickedCheckLinelayer(); OnBnClickedCheckPlinelayer(); OnBnClickedCheckArclayer(); m_ctrlProgress.SetRange( 0, 100 ); m_ctrlProgress.SetPos(0); if (!m_wndToolTip.Create(pButton)) { return FALSE; } m_wndToolTip.AddTool(pButton, _T("选取对象")); UpdateData(FALSE); return TRUE; } //选择了查找范围后,重新构造图元选择集 void CRemoveDupDlg::OnSelchangeComboFindrange() { UpdateData(TRUE); if ( m_iFindRange == 0 ) { //modify by xlc on 090313 R17平台崩溃 #if ADS<17 OnButtonSelect(); #endif } } //隐藏或者显示对话框 void CRemoveDupDlg::HideDialog(BOOL bFlag) { if (bFlag) { GetParent()->EnableWindow(TRUE); GetParent()->SetFocus(); GetParent()->SetActiveWindow(); ShowWindow(SW_HIDE); GetParent()->RedrawWindow(); } else { GetParent()->EnableWindow(FALSE); EnableWindow(TRUE); SetActiveWindow(); ShowWindow(SW_SHOW); GetParent()->EnableWindow(TRUE); } } BOOL CRemoveDupDlg::PreTranslateMessage(MSG* pMsg) { m_wndToolTip.RelayEvent(pMsg); return CModelessDialog::PreTranslateMessage(pMsg); } void CRemoveDupDlg::OnDestroy() { m_wndToolTip.DestroyWindow(); CModelessDialog::OnDestroy(); } void CRemoveDupDlg::OnOK() { CModelessDialog::OnOK(); } class CRemoveDupPromptDlg : public CModelessDialog { public: CRemoveDupPromptDlg(CWnd* pParent = NULL); // standard constructor //{{AFX_DATA(CRemoveDupPromptDlg) enum { IDD = IDD_DIALOG_REMOVEDUP_PROM }; int m_nWall; //墙体组数目 int m_nOpen; //门窗组数目 int m_nCol; //柱子组数目 int m_nSpace; //房间组数目 CString m_strWall; //墙体提示 CString m_strOpen; //门窗提示 CString m_strCol; //柱子提示 CString m_strSpace; //房间提示 //}}AFX_DATA static BOOL bAutoZoom; void ShowButton(BOOL bShow); void EnableButton(BOOL bEnable,BOOL bDelEnable); //{{AFX_VIRTUAL(CRemoveDupPromptDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL protected: // Generated message map functions //{{AFX_MSG(CRemoveDupPromptDlg) virtual BOOL OnInitDialog(); afx_msg void OnButtonPre(); afx_msg void OnButtonNext(); afx_msg void OnButtonSwitch(); afx_msg void OnButtonMark(); afx_msg void OnButtonDelRed(); afx_msg void OnButtonDelYellow(); afx_msg void OnButtonBreak(); afx_msg void OnClose(); afx_msg void OnButtonZoom(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: int m_nCurPos; }; BOOL CRemoveDupPromptDlg::bAutoZoom=TRUE; void CRemoveDupPromptDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRemoveDupPromptDlg) DDX_Text(pDX, IDC_EDIT_WALL, m_nWall); DDX_Text(pDX, IDC_EDIT_OPEN, m_nOpen); DDX_Text(pDX, IDC_EDIT_COL, m_nCol); DDX_Text(pDX, IDC_EDIT_SPACE, m_nSpace); DDX_Text(pDX, IDC_STATIC_WALL, m_strWall); DDX_Text(pDX, IDC_STATIC_OPEN, m_strOpen); DDX_Text(pDX, IDC_STATIC_COL, m_strCol); DDX_Text(pDX, IDC_STATIC_SPACE, m_strSpace); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CRemoveDupPromptDlg, CModelessDialog) //{{AFX_MSG_MAP(CRemoveDupPromptDlg) ON_BN_CLICKED(IDC_BUTTON_PRE, OnButtonPre) ON_BN_CLICKED(IDC_BUTTON_CHG, OnButtonSwitch) ON_BN_CLICKED(IDC_BUTTON_NEXT, OnButtonNext) ON_BN_CLICKED(IDC_BUTTON_MARK, OnButtonMark) ON_BN_CLICKED(IDC_BUTTON_DELR, OnButtonDelRed) ON_BN_CLICKED(IDC_BUTTON_DELY, OnButtonDelYellow) ON_BN_CLICKED(IDC_BUTTON_BREAK, OnButtonBreak) ON_BN_CLICKED(IDC_BUTTON_ZOOM, OnButtonZoom) ON_WM_CLOSE() //}}AFX_MSG_MAP END_MESSAGE_MAP() CRemoveDupPromptDlg::CRemoveDupPromptDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(CRemoveDupPromptDlg::IDD, pParent) { //{{AFX_DATA_INIT(CRemoveDupPromptDlg) m_nCurPos = 0; m_nWall = 0; m_nOpen = 0; m_nCol = 0; m_nSpace = 0; m_strWall = _T(""); m_strOpen = _T(""); m_strCol = _T(""); m_strSpace= _T(""); //}}AFX_DATA_INIT } BOOL CRemoveDupPromptDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); if (bAutoZoom) { GetDlgItem(IDC_BUTTON_ZOOM)->SetWindowText(_T("关闭缩放")); } else { GetDlgItem(IDC_BUTTON_ZOOM)->SetWindowText(_T("自动缩放")); } return TRUE; } // 关闭 void CRemoveDupPromptDlg::OnClose() { CModelessDialog::OnClose(); acedPostCommand(_T("\n")); } //向上 void CRemoveDupPromptDlg::OnButtonPre() { acedPostCommand(_T("W ")); } //向下 void CRemoveDupPromptDlg::OnButtonNext() { acedPostCommand(_T("Q ")); } void CRemoveDupPromptDlg::OnButtonSwitch() { acedPostCommand(_T("Z ")); } // 添加标记 void CRemoveDupPromptDlg::OnButtonMark() { acedPostCommand(_T("A ")); } // 删除红色 void CRemoveDupPromptDlg::OnButtonDelYellow() { acedPostCommand(_T("E ")); } // 删除红色 void CRemoveDupPromptDlg::OnButtonDelRed() { acedPostCommand(_T("R ")); } // 打断 void CRemoveDupPromptDlg::OnButtonBreak() { acedPostCommand(_T("S ")); } // 显示按钮 void CRemoveDupPromptDlg::ShowButton(BOOL bShow) { GetDlgItem(IDC_BUTTON_BREAK)->EnableWindow(bShow); } // 自动缩放 void CRemoveDupPromptDlg::OnButtonZoom() { bAutoZoom = !bAutoZoom; if (bAutoZoom) { GetDlgItem(IDC_BUTTON_ZOOM)->SetWindowText(_T("关闭缩放")); } else { GetDlgItem(IDC_BUTTON_ZOOM)->SetWindowText(_T("自动缩放")); } } void CRemoveDupDlg::OnBnClickedCheckLinelayer() { UpdateData(TRUE); if (bLineLayer) { SetDlgItemText(IDC_CHECK_LINELAYER, _T("√同图层")); } else { SetDlgItemText(IDC_CHECK_LINELAYER, _T("×同图层")); } } void CRemoveDupDlg::OnBnClickedCheckPlinelayer() { UpdateData(TRUE); if (bPolyLayer) { SetDlgItemText(IDC_CHECK_PLINELAYER, _T("√同图层")); } else { SetDlgItemText(IDC_CHECK_PLINELAYER, _T("×同图层")); } } void CRemoveDupDlg::OnBnClickedCheckArclayer() { UpdateData(TRUE); if (bArcLayer) { SetDlgItemText(IDC_CHECK_ARCLAYER, _T("√同图层")); } else { SetDlgItemText(IDC_CHECK_ARCLAYER, _T("×同图层")); } } // add by xlc on 080814 // 禁用按钮 void CRemoveDupPromptDlg::EnableButton(BOOL bEnable,BOOL bDelEnable) { //GetDlgItem(IDC_BUTTON_BREAK)->EnableWindow(bEnable&&bDelEnable); GetDlgItem(IDC_BUTTON_CHG)->EnableWindow(bEnable&&bDelEnable); GetDlgItem(IDC_BUTTON_DELR)->EnableWindow(bEnable&&bDelEnable); GetDlgItem(IDC_BUTTON_DELY)->EnableWindow(bEnable&&bDelEnable); GetDlgItem(IDC_BUTTON_MARK)->EnableWindow(bDelEnable); if (bEnable) GetDlgItem(IDC_BUTTON_MARK)->SetWindowText(_T("添加标记")); else GetDlgItem(IDC_BUTTON_MARK)->SetWindowText(_T("撤销标记")); } PickSet g_ssShow; //添加的显示对象 CArray g_wallGroup; //墙体组数组 CArray g_openGroup; //门窗组数组 CArray g_colGroup; //柱子组数组 CArray g_spaceGroup; //房间组数组 // Zyu add on 101222,记录删除过的实体数量 int g_nWallDup(0); // 删除的墙体的数量 int g_nOpenDup(0); // 删除的门窗的数量 int g_nColDup(0); // 删除的柱子的数量 int g_nSpaceDup(0); // 删除的房间的数量 int nOldColorIndex1(256),nOldColorIndex2(256);//修改前对象的颜色 void ShowCurGroup(TGroup &curGroup,BOOL bRed,BOOL bAutoZoom); void MakePoly(XPoly2D &poly,BOOL bRed,TGroup &curGroup); // 释放资源 void Release() { g_ssShow.Erase(); g_ssShow.Free(); g_wallGroup.RemoveAll(); g_openGroup.RemoveAll(); g_colGroup.RemoveAll(); g_spaceGroup.RemoveAll(); } // 切换显示 void SwitchEntColor(TGroup &curGroup, //[in]当前组 BOOL bRed, //[in]是否切换 BOOL bAutoZoom //[in]是否自动缩放 ) { ShowCurGroup(curGroup,bRed,bAutoZoom); } // 添加标记 void AddMark(int nCurPos, //[in]当前位置 TGroup &curGroup //[in]当前组 ) { if (nCurPos < 0) return; CString msg; if (curGroup.m_nType == kWall) { msg = _T("重叠的墙体"); } else if (curGroup.m_nType == kColumn) { msg = _T("重叠的柱子"); } else if (curGroup.m_nType == kOpenning) { msg = _T("重叠的门窗"); } else if (curGroup.m_nType == kTSpace) { msg = _T("重叠的房间"); } else { return; } //二维平面下的包围盒 int nOldMode=DocGetDrawMode(); DocSetDrawMode(DRAW_2D); XPoint ptLow,ptUp; PickSet ss(SS_FREE); ss += curGroup.m_eEnt1; ss += curGroup.m_eEnt2; ss.GetExtend(ptLow,ptUp); DocSetDrawMode(nOldMode); ErrorPosition1(ptLow,ptUp,msg); //添加标记 } // 获得组内实体的颜色 void GetGroupEntColor(TGroup group, //[in]当前组 int &nColorIndex1, //[out]第一个实体颜色 int &nColorIndex2 //[out]第二个实体颜色 ) { OPENOBJ_BEGIN(group.m_eEnt1, AcDb::kForRead, AcDbEntity, pEnt); if (pEnt) { nColorIndex1 = pEnt->colorIndex(); } OPENOBJ_END(); OPENOBJ_BEGIN(group.m_eEnt2, AcDb::kForRead, AcDbEntity, pEnt); if (pEnt) { nColorIndex2 = pEnt->colorIndex(); } OPENOBJ_END(); } // 设置组内实体的颜色 void SetGroupEntColor(TGroup group, //[in]当前组 int nColorIndex1, //[in]第一个实体颜色 int nColorIndex2 //[in]第二个实体颜色 ) { OPENOBJ_BEGIN(group.m_eEnt1, AcDb::kForWrite, AcDbEntity, pEnt); if (pEnt) { pEnt->setColorIndex(nColorIndex1); } OPENOBJ_END(); OPENOBJ_BEGIN(group.m_eEnt2, AcDb::kForWrite, AcDbEntity, pEnt); if (pEnt) { pEnt->setColorIndex(nColorIndex2); } OPENOBJ_END(); //刷新 //acedRedraw(NULL,1); actrTransactionManager->flushGraphics(); acedUpdateDisplay(); } // 显示当前组 void ShowCurGroup(TGroup &curGroup, //[in]当前组 BOOL bChange, //[in]是否切换显示 BOOL bAutoZoom //[in]是否自动缩放 ) { XPoly2D poly1,poly2; int count=0; switch(curGroup.m_nType) { case kWall: { OPENOBJ_BEGIN(curGroup.m_eEnt1 ,AcDb::kForRead,TDbWall,pEnt); if (pEnt) { pEnt->GetOutlinePoly(0,poly1,TRUE); count++; } OPENOBJ_END(); OPENOBJ_BEGIN(curGroup.m_eEnt2,AcDb::kForRead,TDbWall,pEnt); if (pEnt) { pEnt->GetOutlinePoly(0,poly2,TRUE); count++; } OPENOBJ_END(); } break; case kColumn: { OPENOBJ_BEGIN(curGroup.m_eEnt1,AcDb::kForRead,TDbColumn,pEnt); if (pEnt) { pEnt->GetOutline(poly1); count++; } OPENOBJ_END(); OPENOBJ_BEGIN(curGroup.m_eEnt2,AcDb::kForRead,TDbColumn,pEnt); if (pEnt) { pEnt->GetOutline(poly2); count++; } OPENOBJ_END(); } break; case kOpenning: { OPENOBJ_BEGIN(curGroup.m_eEnt1,AcDb::kForRead,TDbOpening,pEnt); if (pEnt) { pEnt->GetOutlinePoly(0,poly1); // 问题描述:GetOutlinePoly()函数获得的弧墙的包围盒多段线是非闭合的 // 修改描述:强制多段线闭合 // 修改人,修改时间:Zyu modify on 100707 poly1.m_nFlag = 1; count++; } OPENOBJ_END(); OPENOBJ_BEGIN(curGroup.m_eEnt2,AcDb::kForRead,TDbOpening,pEnt); if (pEnt) { pEnt->GetOutlinePoly(0,poly2); // 修改人,修改时间:Zyu modify on 100707 poly2.m_nFlag = 1; count++; } OPENOBJ_END(); } break; case kTSpace: { OPENOBJ_BEGIN(curGroup.m_eEnt1,AcDb::kForRead,TDbSpace,pEnt); if (pEnt) { AcGeVector3d normal; pEnt->GetPathPoly(poly1,normal); count++; } OPENOBJ_END(); OPENOBJ_BEGIN(curGroup.m_eEnt2,AcDb::kForRead,TDbSpace,pEnt); if (pEnt) { AcGeVector3d normal; pEnt->GetPathPoly(poly2,normal); count++; } OPENOBJ_END(); } break; default:; } if (count==2) { if (bAutoZoom) //自动缩放 { int nOldMode=DocGetDrawMode(); DocSetDrawMode(DRAW_2D); XPoint ptLow,ptUp; if (curGroup.m_nType == kTSpace) { poly1.GetExtend(ptLow,ptUp); XPoly2D poly; poly.AppendNode(ptLow); poly.AppendNode(ptUp); poly2.GetExtend(ptLow,ptUp); poly.AppendNode(ptLow); poly.AppendNode(ptUp); poly.GetExtend(ptLow,ptUp); } else { PickSet ss(SS_FREE); ss += curGroup.m_eEnt1; ss += curGroup.m_eEnt2; ss.GetExtend(ptLow,ptUp); } XVector3D vect = ptUp-ptLow; ptLow[0] = ptLow[0]-vect[0]*0.5; ptLow[1] = ptLow[1]-vect[1]*0.5; ptUp[0]=ptUp[0]+vect[0]*0.5; ptUp[1]=ptUp[1]+vect[1]*0.5; arxZoom(ptLow,ptUp); DocSetDrawMode(nOldMode); } g_ssShow.Erase(); g_ssShow.Free(); g_ssShow.IncludeBegin(); double width(20.0); XPoly2D poly2D1(1),poly2D2(1); poly1.Offset(width,poly2D1); poly2.Offset(-width,poly2D2); if (bChange) { SetGroupEntColor(curGroup,1,2); MakePoly(poly2D1,TRUE,curGroup); MakePoly(poly2D2,FALSE,curGroup); } else { SetGroupEntColor(curGroup,2,1); MakePoly(poly2D2,TRUE,curGroup); MakePoly(poly2D1,FALSE,curGroup); } g_ssShow.IncludeEnd(); } } //画线 void MakePoly(XPoly2D &poly, //[in]显示对象 BOOL bRed, //[in]是否红色 TGroup &curGroup //[in]当前组 ) { double width(40.0); int colorIndex=2; if (bRed) { colorIndex = 1; } AcDbCurve *pCurve=poly.AsAcDbCurve(); ((AcDbPolyline*)pCurve)->setConstantWidth(width); pCurve->setColorIndex(colorIndex); //设置颜色 AddToModelSpace(pCurve, Adesk::kTrue); //del by xlc on 090527 房间填充不易观察 //if (curGroup.m_nType == kTSpace) //{ // XPoly2D poly1(poly); // AcDbHatch *pHatch = NewHatchFromPoly2D(poly1,_T("SOLID"),0.1); // if (pHatch) // { // pHatch->setColorIndex(colorIndex); // AddToModelSpace(pHatch, Adesk::kTrue); // } //} } //获得当前组 void GetCurGroup( int nCurPos, //[in]当前位置 TGroup &curGroup //[out]当前组 ) { // Zyu modify on 100722,支持64位 //int nWall(0),nOpening(0),nColumn(0),nSpace(0); INT_PTR nWall(0),nOpening(0),nColumn(0),nSpace(0); nWall = g_wallGroup.GetSize(); nOpening = g_openGroup.GetSize(); nColumn = g_colGroup.GetSize(); nSpace = g_spaceGroup.GetSize(); curGroup.m_nType = -1; if (nWall > 0 && (nWall > nCurPos)) { curGroup.m_nType = g_wallGroup[nCurPos].m_nType; curGroup.m_eEnt1 = g_wallGroup[nCurPos].m_eEnt1; curGroup.m_eEnt2 = g_wallGroup[nCurPos].m_eEnt2; } else if (nOpening > 0 && ((nOpening+nWall) > nCurPos)) { curGroup.m_nType =g_openGroup[nCurPos-nWall].m_nType; curGroup.m_eEnt1 = g_openGroup[nCurPos-nWall].m_eEnt1; curGroup.m_eEnt2 = g_openGroup[nCurPos-nWall].m_eEnt2; } else if (nColumn > 0 && ((nColumn +nOpening+nWall) > nCurPos)) { curGroup.m_nType =g_colGroup[nCurPos-nWall-nOpening].m_nType; curGroup.m_eEnt1 = g_colGroup[nCurPos-nWall-nOpening].m_eEnt1; curGroup.m_eEnt2 = g_colGroup[nCurPos-nWall-nOpening].m_eEnt2; } else if (nSpace > 0 && ((nSpace + nColumn +nOpening+nWall) > nCurPos)) { curGroup.m_nType =g_spaceGroup[nCurPos-nWall-nOpening-nColumn].m_nType; curGroup.m_eEnt1 = g_spaceGroup[nCurPos-nWall-nOpening-nColumn].m_eEnt1; curGroup.m_eEnt2 = g_spaceGroup[nCurPos-nWall-nOpening-nColumn].m_eEnt2; } } //向上 void ShowPre(int &nCurPos, //[in/out]当前位置 TGroup &curGroup, //[in/out]当前组 BOOL bChange, //[in]是否切换 BOOL bAutoZoom //[in]是否自动缩放 ) { // Zyu modify on 100722,支持64位 //int nWall(0),nOpening(0),nColumn(0),nSpace(0); INT_PTR nWall(0),nOpening(0),nColumn(0),nSpace(0); nWall = g_wallGroup.GetSize(); nOpening = g_openGroup.GetSize(); nColumn = g_colGroup.GetSize(); nSpace = g_spaceGroup.GetSize(); // Zyu modify on 100722,支持64位 //int num=nWall+nOpening+nColumn+nSpace; INT_PTR num=nWall+nOpening+nColumn+nSpace; if ( num > 0 && nCurPos < num && nCurPos > 0) { nCurPos--; } else if ( num > 0 && nCurPos == 0) { // Zyu modify on 100723,消除64位编译警告 //nCurPos = num-1; nCurPos = (int)num-1; } else { return; } SetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); GetCurGroup(nCurPos,curGroup); if (curGroup.m_nType != kNull) { GetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); } ShowCurGroup(curGroup,bChange,bAutoZoom); } //向下 void ShowNext(int &nCurPos, //[in/out]当前位置 TGroup &curGroup, //[in/out]当前组 BOOL bChange, //[in]是否切换 BOOL bAutoZoom //[in]是否自动缩放 ) { // Zyu modify on 100722,支持64位 //int nWall(0),nOpening(0),nColumn(0),nSpace(0); INT_PTR nWall(0),nOpening(0),nColumn(0),nSpace(0); nWall = g_wallGroup.GetSize(); nOpening = g_openGroup.GetSize(); nColumn = g_colGroup.GetSize(); nSpace = g_spaceGroup.GetSize(); // Zyu modify on 100722,支持64位 //int num=nWall+nOpening+nColumn+nSpace; INT_PTR num=nWall+nOpening+nColumn+nSpace; if ( num > 0 && nCurPos < num) { if (nCurPos == num-1) { nCurPos=0; } else { nCurPos++; } } else { return; } SetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); GetCurGroup(nCurPos,curGroup); if (curGroup.m_nType != kNull) { GetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); } ShowCurGroup(curGroup,bChange,bAutoZoom); } // 判断墙是否平行 BOOL IsWallParalle(Entity ent1, //[in]实体1 Entity ent2 //[in]实体2 ) { AcGeVector3d dir1,dir2; BOOL bArcWall1=FALSE,bArcWall2=FALSE; XPoint ptCen1,ptCen2; OPENOBJ_BEGIN(ent1, AcDb::kForRead, TDbWall, pWall); if (pWall) { bArcWall1=pWall->Is(CURVE_ARC); dir1 = pWall->Direction3d(); ptCen1 = pWall->GetArc().GetCenterPt(); } else return FALSE; OPENOBJ_END(); OPENOBJ_BEGIN(ent2, AcDb::kForRead, TDbWall, pWall); if (pWall) { bArcWall2=pWall->Is(CURVE_ARC); dir2 = pWall->Direction3d(); ptCen2 = pWall->GetArc().GetCenterPt(); } else return FALSE; OPENOBJ_END(); if (!bArcWall1 && !bArcWall2) { return dir1.isParallelTo(dir2); } else if (bArcWall1 && bArcWall2) { return (ptCen1.AsAcGePoint3d()).isEqualTo(ptCen2.AsAcGePoint3d()); } else { return FALSE; } return FALSE; } //删除对象 void DeleteEnt(int &nCurPos, //[in/out]当前位置 BOOL bFirst, //[in]是否第一个对象 TGroup curGroup //[in]当前组 ) { int type = curGroup.m_nType; Entity ent; if (bFirst) { ent = curGroup.m_eEnt1; } else { ent = curGroup.m_eEnt2; } switch(type) { case kWall: { for(int i=0;iupgradeOpen(); pEnt->erase(); } OPENOBJ_END(); } else { OPENOBJ_BEGIN(ent,AcDb::kForRead,TDbWall,pEnt); if (pEnt) { idLeftS = pEnt->GetLeftStart(FALSE); idRightS = pEnt->GetRightStart(FALSE); idLeftE = pEnt->GetLeftEnd(FALSE); idRightE = pEnt->GetRightEnd(FALSE); pEnt->upgradeOpen(); pEnt->erase(); } OPENOBJ_END(); } //是否存在可能减少墙体的邻接墙 if (type == kWall) { if (idLeftS!=AcDbObjectId::kNull && idRightS!=AcDbObjectId::kNull) { if (acdbGetAdsName(eLeftS,idLeftS)==Acad::eOk) { if (acdbGetAdsName(eRightS,idRightS)==Acad::eOk) { bSLink=TRUE; } } } if (idLeftE!=AcDbObjectId::kNull && idRightE!=AcDbObjectId::kNull) { if (acdbGetAdsName(eLeftE,idLeftE)==Acad::eOk) { if (acdbGetAdsName(eRightE,idRightE)==Acad::eOk) { bELink=TRUE; } } } if (bSLink) { bSLink=IsWallParalle(eLeftS,eRightS); } if (bELink) { bELink=IsWallParalle(eLeftE,eRightE); } } //处理墙体删除后,相邻墙体减少的情况 if (type == kWall) { TArchCmdReactor::UpdateCorners(); TArchCmdReactor::ResetAll(); if (bSLink) //起点处有邻接墙 { TEntity els(eLeftS),ers(eRightS); if ((els.m_nType!=kWall&&ers.m_nType==kWall) ||(els.m_nType==kWall&&ers.m_nType!=kWall)) { Entity find,replace; if (els.m_nType!=kWall&&ers.m_nType==kWall) { find = eLeftS; replace=eRightS; } else if (els.m_nType==kWall&&ers.m_nType!=kWall) { find = eRightS; replace=eLeftS; } for(int i=0;iflushGraphics(); acedUpdateDisplay(); } //更新对话框 void Update(CRemoveDupPromptDlg &dlg, //[in]对话框对象 int nCurPos //[in]当前位置 ) { int nWall(0),nOpening(0),nColumn(0),nSpace(0); // Zyu modify on 100723,消除64位编译警告 //nWall = g_wallGroup.GetSize(); //nOpening = g_openGroup.GetSize(); //nColumn = g_colGroup.GetSize(); //nSpace = g_spaceGroup.GetSize(); nWall = (int)g_wallGroup.GetSize(); nOpening = (int)g_openGroup.GetSize(); nColumn = (int)g_colGroup.GetSize(); nSpace = (int)g_spaceGroup.GetSize(); dlg.m_nWall = nWall; dlg.m_nOpen = nOpening; dlg.m_nCol = nColumn; dlg.m_nSpace= nSpace; dlg.m_strWall = _T(""); dlg.m_strOpen = _T(""); dlg.m_strCol = _T(""); dlg.m_strSpace = _T(""); if (nCurPos < nWall) { dlg.m_strWall.Format(_T("当前正在处理第 %d 处"),nCurPos+1); } else if (nCurPos < nWall+nOpening) { dlg.m_strOpen.Format(_T("当前正在处理第 %d 处"),nCurPos-nWall+1); } else if (nCurPos < nWall+nOpening+nColumn) { dlg.m_strCol.Format(_T("当前正在处理第 %d 处"),nCurPos-nWall-nOpening+1); } else if (nCurPos < nWall+nOpening+nColumn+nSpace) { dlg.m_strSpace.Format(_T("当前正在处理第 %d 处"),nCurPos-nWall-nOpening-nColumn+1); } dlg.UpdateData(FALSE); } // 修墙角 BOOL BreakWall(TGroup curGroup, //[in]当前组 PickSet &ssAdd //[in/out]新增加对象集 ) { PickSet ssWalls(SS_FREE); ssWalls += curGroup.m_eEnt1; ssWalls += curGroup.m_eEnt2; int nOldMode=DocGetDrawMode(); DocSetDrawMode(DRAW_2D); XPoint pt1,pt2; ssWalls.GetExtend(pt1,pt2); DocSetDrawMode(nOldMode); XPoint ptMid; Midpoint(pt1, pt2, ptMid); ptMid=Ucs2Wcs(ptMid); long lCount=ssWalls.Length(); if (lCount==2) { XCurveSegment seg[2]; for(long i=0L; i<2L; i++) { Entity ent=ssWalls[i]; OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbWall, pWall); if (pWall) { pWall->assertWriteEnabled(); seg[i]=*pWall; } else return FALSE; OPENOBJ_END(); } // [2010-3-16 9:22 wubo] 移植到新Geo库 // seg[0].flag=seg[1].flag=LS_FINITE; seg[0].SetLineFlag(LS_FINITE); seg[1].SetLineFlag(LS_FINITE); XPoint ptInter[2], ptInt; int nIntNum=seg[0].Intersection(seg[1], ptInter[0], ptInter[1]); if (nIntNum==0) { seg[0].SetLineFlag(LS_INFINITE); seg[1].SetLineFlag(LS_INFINITE); XPoint ptInter1[2], ptInt1; int nIntNum1=seg[0].Intersection(seg[1], ptInter1[0], ptInter1[1]); if (nIntNum1 != 0) { if (nIntNum1==1) { ptInt=ptInter1[0]; } else { ptInt=XLine(ptInter1[0], ptInter1[1]).NearPoint(ptMid); } seg[0].SetLineFlag(LS_FINITE); seg[1].SetLineFlag(LS_FINITE); for(long i=0L; i<2L; i++) { int nRet=seg[i].HitTest2d(ptInt); if (nRet == 6) //起始端延长线 { Entity ent=ssWalls[i]; OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbWall, pWall); if (pWall) { pWall->assertWriteEnabled(); pWall->SetPoints(ptInt,seg[i].EndPoint()); } OPENOBJ_END(); } else if (nRet == 7) //终端延长线 { Entity ent=ssWalls[i]; OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbWall, pWall); if (pWall) { pWall->assertWriteEnabled(); pWall->SetPoints(seg[i].StartPoint(),ptInt); } OPENOBJ_END(); } } } else return FALSE; } else { if (nIntNum==1) ptInt=ptInter[0]; else ptInt=XLine(ptInter[0], ptInter[1]).NearPoint(ptMid); } for(i=0L; iassertWriteEnabled(); if (i==0) { pWall->setColorIndex(nOldColorIndex1); } else { pWall->setColorIndex(nOldColorIndex2); } AcDbObjectId id=AcDbObjectId::kNull; pWall->BreakAt(ptInt, id); if (id != AcDbObjectId::kNull) { ads_name en; if (acdbGetAdsName(en,id)==Acad::eOk) { Entity e=en; ssAdd += e; } } } OPENOBJ_END(); } } TArchCmdReactor::UpdateCorners(); TArchCmdReactor::ResetAll(); return TRUE; } // 修墙角 void BreakWall(int &nCurPos, //[in/out]当前位置 TGroup curGroup //[in]当前组 ) { PickSet ssAdd(SS_FREE); if (BreakWall(curGroup,ssAdd)) { CArray wallGroup; g_wallGroup.RemoveAt(nCurPos); for(int i=0;i0) { g_wallGroup.RemoveAll(); g_wallGroup.Append(wallGroup); if (g_wallGroup.GetSize() == nCurPos && nCurPos != 0) { nCurPos--; } } } else { if (g_wallGroup.GetSize()>nCurPos) { g_wallGroup.RemoveAt(nCurPos); // Zyu modify on 100722,支持64位 //int num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); INT_PTR num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); if(nCurPos == g_wallGroup.GetSize() && nCurPos == num) { nCurPos--; } } } //刷新 actrTransactionManager->flushGraphics(); acedUpdateDisplay(); } //去除当前组 void RemoveCurGroup( int nCurPos, //[in]当前位置 TGroup &curGroup //[in]当前组 ) { // Zyu modify on 100722,支持64位 //int nWall(0),nOpening(0),nColumn(0),nSpace(0); INT_PTR nWall(0),nOpening(0),nColumn(0),nSpace(0); nWall = g_wallGroup.GetSize(); nOpening = g_openGroup.GetSize(); nColumn = g_colGroup.GetSize(); nSpace = g_spaceGroup.GetSize(); if (nWall > 0 && (nWall > nCurPos)) { g_wallGroup.RemoveAt(nCurPos); } else if (nOpening > 0 && ((nOpening+nWall) > nCurPos)) { g_openGroup.RemoveAt(nCurPos-nWall); } else if (nColumn > 0 && ((nColumn +nOpening+nWall) > nCurPos)) { g_colGroup.RemoveAt(nCurPos-nWall-nOpening); } else if (nSpace > 0 && ((nSpace + nColumn +nOpening+nWall) > nCurPos)) { g_spaceGroup.RemoveAt(nCurPos-nWall-nOpening-nColumn); } } //add by xlc on 080814 //更新当前组 BOOL UpdateCurGroup( int nCurPos, //[in]当前位置 BOOL bChange, //[in]是否切换显示 BOOL bAutoZoom, //[in]是否自动缩放 TGroup &curGroup //[in]当前组 ) { // Zyu modify on 100722,支持64位 //int num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); INT_PTR num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); if (nCurPos < 0 || num == 0 || nCurPos == num) { //adsout<<_T("\n处理完毕!"); return FALSE; } SetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); GetCurGroup(nCurPos,curGroup); if (curGroup.m_nType!=kNull) { GetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); } //ShowCurGroup(curGroup,bChange,bAutoZoom); return TRUE; } //删除墙的同时,删除墙上的门窗数组 void RemoveOpeningWithWall(Entity entWall) { OPENOBJ_BEGIN(entWall,AcDb::kForRead,TDbWall,pWall); if (pWall) { const DList &lstWin=pWall->GetOpeningIdList(); // Zyu modify on 100722,支持64位 //for(long i=g_openGroup.GetSize()-1;i>=0;i--) for (LONG_PTR i = g_openGroup.GetSize() - 1; i >= 0; i--) { Entity ent1=g_openGroup.GetAt(i).m_eEnt1, ent2=g_openGroup.GetAt(i).m_eEnt2; for(int n = 0;n < lstWin.Length();n++) { AcDbObjectId id = lstWin[n]; ads_name eOpen; if (acdbGetAdsName(eOpen,id)==Acad::eOk) { if (eOpen==ent1 ||eOpen==ent2) { g_openGroup.RemoveAt(i); } } } } } OPENOBJ_END(); } // 完全消重 BOOL RemoveAllDup(BOOL &bEnd, //[in/out]是否结束完全消重 int &nCurPos, //[in]当前位置 TGroup &curGroup //[in]当前组 ) { if (bEnd) return FALSE; SetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); // Zyu modify on 100722,支持64位 //for(long i=g_wallGroup.GetSize()-1;i>=0;i--) for(LONG_PTR i = g_wallGroup.GetSize() - 1; i >= 0; i--) { if (IsWallEqual(g_wallGroup.GetAt(i).m_eEnt1,g_wallGroup.GetAt(i).m_eEnt2)) { Entity ent1=g_wallGroup.ElementAt(i).m_eEnt1, ent2=g_wallGroup.ElementAt(i).m_eEnt2; g_wallGroup.RemoveAt(i); // Zyu add on 101222,计数增加 g_nWallDup++; RemoveOpeningWithWall(ent2); OPENOBJ_BEGIN(ent2,AcDb::kForRead,AcDbEntity,pEnt); if (pEnt) { pEnt->upgradeOpen(); pEnt->erase(); } OPENOBJ_END(); // Zyu modify on 100722,支持64位 //for(long n=g_wallGroup.GetSize()-1;n>=0;n--) for(LONG_PTR n = g_wallGroup.GetSize() - 1; n >= 0; n--) { if (g_wallGroup.GetAt(n).m_eEnt1==ent2 ||g_wallGroup.GetAt(n).m_eEnt2==ent2) { g_wallGroup.RemoveAt(n); if (n=0;i--) { if (IsColumnEqual(g_colGroup.GetAt(i).m_eEnt1,g_colGroup.GetAt(i).m_eEnt2)) { Entity ent1=g_colGroup.ElementAt(i).m_eEnt1, ent2=g_colGroup.ElementAt(i).m_eEnt2; g_colGroup.RemoveAt(i); // Zyu add on 101222,计数增加 g_nColDup++; OPENOBJ_BEGIN(ent2,AcDb::kForRead,AcDbEntity,pEnt); if (pEnt) { pEnt->upgradeOpen(); pEnt->erase(); } OPENOBJ_END(); // Zyu modify on 100722,支持64位 //for(long n=g_colGroup.GetSize()-1;n>=0;n--) for (LONG_PTR n = g_colGroup.GetSize() - 1; n >= 0; n--) { if (g_colGroup.GetAt(n).m_eEnt1==ent2 ||g_colGroup.GetAt(n).m_eEnt2==ent2) { g_colGroup.RemoveAt(n); if (n=0;i--) { if (IsSpaceEqual(g_spaceGroup.GetAt(i).m_eEnt1,g_spaceGroup.GetAt(i).m_eEnt2)) { Entity ent1=g_spaceGroup.ElementAt(i).m_eEnt1, ent2=g_spaceGroup.ElementAt(i).m_eEnt2; g_spaceGroup.RemoveAt(i); // Zyu add on 101222,计数增加 g_nSpaceDup++; OPENOBJ_BEGIN(ent2,AcDb::kForRead,AcDbEntity,pEnt); if (pEnt) { pEnt->upgradeOpen(); pEnt->erase(); } OPENOBJ_END(); // Zyu modify on 100722,支持64位 //for(long n=g_spaceGroup.GetSize()-1;n>=0;n--) for(LONG_PTR n = g_spaceGroup.GetSize() - 1; n >= 0; n--) { if (g_spaceGroup.GetAt(n).m_eEnt1==ent2 ||g_spaceGroup.GetAt(n).m_eEnt2==ent2) { g_spaceGroup.RemoveAt(n); if (nflushGraphics(); acedUpdateDisplay(); if (g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize()>0) { nCurPos=0; GetCurGroup(nCurPos,curGroup); if (curGroup.m_nType != kNull) { GetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); } bEnd=TRUE; return TRUE; } return TRUE; } void RemoveDupEnt() { XPushMemVar vTemp(g_bAutoCheckWall,FALSE); // 判断当前是否为模型空间 int iTileMode = 0; xg_getvar(_T("TILEMODE"), &iTileMode); if (iTileMode == 0) { adsout << _T("\n请切换到模型空间使用该命令!"); return; } CRemoveDupDlg dlg; { CAcModuleResourceOverride vTemp; if (dlg.DoModal()!=IDOK) { return; } } g_wallGroup.Append(dlg.m_wallGroup); g_openGroup.Append(dlg.m_openGroup); g_colGroup.Append(dlg.m_colGroup); g_spaceGroup.Append(dlg.m_spaceGroup); // Zyu add on 101222,清零 g_nWallDup = 0; g_nOpenDup = 0; g_nColDup = 0; g_nSpaceDup = 0; // Zyu modify on 100722,支持64位 //int nCount=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); INT_PTR nCount=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); if (nCount <= 0 ) { Release(); return; } extern GEOAPI double g_nAcadVer; int nOldDynMode=0; if (g_nAcadVer>16.19) //2006以上动态输入 { xg_getvar(_T("DYNMODE"), &nOldDynMode); xg_setvar(_T("DYNMODE"), 0); } CRemoveDupPromptDlg dlgPrompt; { CAcModuleResourceOverride vTemp; dlgPrompt.Create(IDD_DIALOG_REMOVEDUP_PROM,acedGetAcadFrame()); dlgPrompt.ShowWindow(SW_SHOW); } BOOL bAddMark=FALSE; //添加标记操作 BOOL bDelOrBreak=FALSE; //删除或打断 int nCurPos=0; TGroup curGroup; BOOL bChange=FALSE; BOOL bEnd=FALSE; //是否结束完全消重 GetCurGroup(nCurPos,curGroup); if (curGroup.m_nType!=kNull) { GetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); } ShowCurGroup(curGroup,bChange,dlgPrompt.bAutoZoom); Update(dlgPrompt,nCurPos); PickSet ssMark(SS_FREE); BOOL bCheckEnd=FALSE; while(true) { int nRet; BOOL bShow=FALSE; BOOL bUpdate=FALSE; if (curGroup.m_nType==kWall) { bShow=IsWallParalle(curGroup.m_eEnt1,curGroup.m_eEnt2); bShow=!bShow; } if (bShow&&(!(bAddMark||bDelOrBreak))) { dlgPrompt.ShowButton(TRUE); } else { dlgPrompt.ShowButton(FALSE); } dlgPrompt.EnableButton(!bAddMark,!bDelOrBreak); TCHAR buf[256]; if (bAddMark) { INITGET_BEG(0, _T("Q W A")); nRet = acedGetKword(_T("\n选择操作[下一处(Q)/上一处(W)/撤销标记(A)]<退出>:"),buf); INITGET_END(); } else if (bDelOrBreak) { INITGET_BEG(0, _T("Q W")); nRet = acedGetKword(_T("\n选择操作[下一处(Q)/上一处(W)]<退出>:"),buf); INITGET_END(); } else { if (bShow) { INITGET_BEG(0, _T("Q W E R A Z S D")); nRet = acedGetKword(_T("\n选择操作[下一处(Q)/上一处(W)/删除黄色(E)/删除红色(R)/添加标记(A)/切换显示(Z)/修墙角(S)/完全消重(D)]<退出>:"),buf); INITGET_END(); } else { INITGET_BEG(0, _T("Q W E R A Z D")); nRet = acedGetKword(_T("\n选择操作[下一处(Q)/上一处(W)/删除黄色(E)/删除红色(R)/添加标记(A)/切换显示(Z)/完全消重(D)]<退出>:"),buf); INITGET_END(); } } if (nRet==RTCAN ||nRet == RTNONE) break; else if (nRet == RTNORM) { if (buf[0]==_T('Q')) //下一个 { //add by xlc on 080814 if (bAddMark) { RemoveCurGroup( nCurPos,curGroup); // Zyu modify on 100722,支持64位 //int num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); INT_PTR num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); if (nCurPos>0) nCurPos--; if (num == nCurPos) { nCurPos--; } if (!UpdateCurGroup(nCurPos,bChange,dlgPrompt.bAutoZoom,curGroup)) break; ShowCurGroup(curGroup,bChange,dlgPrompt.bAutoZoom); Update(dlgPrompt,nCurPos); } else if (bDelOrBreak) { // Zyu modify on 100722,支持64位 //int num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); INT_PTR num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); if (nCurPos < 0 || num == 0 || nCurPos == num) { adsout<<_T("\n处理完毕!"); break; } ShowCurGroup(curGroup,bChange,dlgPrompt.bAutoZoom); Update(dlgPrompt,nCurPos); bDelOrBreak=FALSE; continue; } bAddMark=FALSE; ShowNext(nCurPos,curGroup,bChange,dlgPrompt.bAutoZoom); Update(dlgPrompt,nCurPos); continue; } else if (buf[0]==_T('W')) //上一个 { //add by xlc on 080814 if (bAddMark) { RemoveCurGroup( nCurPos,curGroup); // Zyu modify on 100722,支持64位 //int num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); INT_PTR num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); if (num == nCurPos) { nCurPos--; } if (!UpdateCurGroup(nCurPos,bChange,dlgPrompt.bAutoZoom,curGroup)) break; ShowCurGroup(curGroup,bChange,dlgPrompt.bAutoZoom); Update(dlgPrompt,nCurPos); } else if (bDelOrBreak) { // Zyu modify on 100722,支持64位 //int num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); INT_PTR num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); if (nCurPos < 0 || num == 0 || nCurPos == num) { adsout<<_T("\n处理完毕!"); break; } ShowCurGroup(curGroup,bChange,dlgPrompt.bAutoZoom); Update(dlgPrompt,nCurPos); } bDelOrBreak=FALSE; bAddMark=FALSE; ShowPre(nCurPos,curGroup,bChange,dlgPrompt.bAutoZoom); Update(dlgPrompt,nCurPos); continue; } else if (buf[0]==_T('E')) //删除黄色 { DeleteEnt(nCurPos,!bChange,curGroup); //删除实体和相关组 g_ssShow.Erase(); bUpdate=TRUE; bDelOrBreak=TRUE; } else if (buf[0]==_T('R')) //删除红色 { DeleteEnt(nCurPos,bChange,curGroup); //删除实体和相关组 g_ssShow.Erase(); bUpdate=TRUE; bDelOrBreak=TRUE; } else if (buf[0]==_T('A')) //添加标记 { //modify by xlc on 080814 if (!bAddMark) { ssMark.Free(); ssMark.IncludeBegin(); AddMark(nCurPos,curGroup); ssMark.IncludeEnd(); bAddMark=TRUE; } else { ssMark.Erase(); bAddMark=FALSE; } /*RemoveCurGroup( nCurPos,curGroup); int num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); if (num == nCurPos) { nCurPos--; } bUpdate=TRUE;*/ } else if (buf[0]==_T('Z')) //切换显示 { bChange = !bChange; SwitchEntColor(curGroup,bChange,dlgPrompt.bAutoZoom); continue; } else if (buf[0]==_T('S')) //修墙角 { BreakWall(nCurPos,curGroup); g_ssShow.Erase(); bUpdate=TRUE; bDelOrBreak=TRUE; } //add by xlc on 090105 else if (buf[0]==_T('D')) { if (RemoveAllDup(bEnd,nCurPos,curGroup)) { bUpdate=FALSE; // Zyu modify on 100722,支持64位 //int num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); INT_PTR num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); if(nCurPos < 0 || num == 0 || nCurPos == num) { adsout << _T("\n完全消重处理完毕!"); break; } Update(dlgPrompt,nCurPos); ShowCurGroup(curGroup,bChange,dlgPrompt.bAutoZoom); } adsout << _T("\n完全消重处理完毕!"); break; } if (bUpdate) //更新当前显示 { //modify by xlc on 080814 /* int num=g_wallGroup.GetSize()+g_openGroup.GetSize()+g_spaceGroup.GetSize()+g_colGroup.GetSize(); if (nCurPos < 0 || num == 0 || nCurPos == num) { adsout<<_T("\n处理完毕!"); break; } SetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); GetCurGroup(nCurPos,curGroup); if (curGroup.m_nType!=kNull) { GetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); } ShowCurGroup(curGroup,bChange,dlgPrompt.bAutoZoom); Update(dlgPrompt,nCurPos);*/ //if (!UpdateCurGroup(nCurPos,bChange,dlgPrompt.bAutoZoom,curGroup)) // break; //Update(dlgPrompt,nCurPos); UpdateCurGroup(nCurPos,bChange,dlgPrompt.bAutoZoom,curGroup); } } } SetGroupEntColor(curGroup,nOldColorIndex1,nOldColorIndex2); // Zyu add on 101206,输出消重图元处理结果 CString sPrompt = _T("\n消除"); if (dlg.bWall) { CString sTemp; sTemp.Format(_T("%d个重合墙体,"), g_nWallDup); sPrompt += sTemp; } if (dlg.bOpening) { CString sTemp; sTemp.Format(_T("%d个重合门窗,"), g_nOpenDup); sPrompt += sTemp; } if (dlg.bCol) { CString sTemp; sTemp.Format(_T("%d个重合柱子,"), g_nColDup); sPrompt += sTemp; } if (dlg.bSpace) { CString sTemp; sTemp.Format(_T("%d个重合房间,"), g_nSpaceDup); sPrompt += sTemp; } sPrompt.TrimRight(_T(',')); sPrompt += _T('!'); adsout<<(LPCTSTR)sPrompt; Release(); if (::IsWindow(dlgPrompt.m_hWnd)) dlgPrompt.DestroyWindow(); if (g_nAcadVer>16.19) //2006以上动态输入 { xg_setvar(_T("DYNMODE"), nOldDynMode); } TArchCmdReactor::UpdateCorners(); TArchCmdReactor::ResetAll(); }