#include "stdafx.h" #include "TSearchSpaceFromWall.h" #include "TAecSpaceWall.h" #include "TchKernalGlobalFunc.h" #include "TArchCmdReactor.h" #include "OpeningLabelData.h" ACRX_DXF_DEFINE_MEMBERS(ATSBandWin,ATSCornerWin,AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 1, ATS_CORNER_WINDOW, "ATS_CORNER_WINDOW图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); const Adesk::UInt8 TDbBandWin::g_nVersion=0; //add by xlc on 110310 带形窗里忽略墙体材料 BOOL g_bSkipWallMaterial = FALSE; IMPLEMENT_TENTBASE(TDbBandWin); TDbBandWin::TDbBandWin():m_polyFirst(0),m_polyFirstBase(0) { } BOOL TDbBandWin::IsValid()const { if(!TDbCornerWin::IsValid()) return FALSE; if(m_polyFirst.TotalSegments()!=GetWallNum()|| m_polyFirstBase.TotalSegments()!=GetWallNum()) return FALSE; //add by whl on 060210 for(long i=0;i&idWalls) { assertWriteEnabled(); m_idMidWalls.Reset(); for(long i=0;i=GetWallNum()) return; if(i==0) m_idWall1=id; else if(iPathDistance2d(pWall1->MidPoint()); pWall1->close(); } acdbOpenObject(pWall2,*idWall2,AcDb::kForRead); if(pWall2!=NULL) { dist2=g_pPolyOfBase->PathDistance2d(pWall2->MidPoint()); pWall2->close(); } if(dist1>dist2) return 1; else if(dist1 ssWalls; for(long i=0;i lstColu; //GetEntFromBlockByDxf(lstColu, _T("ATS_COLUMN")); XSearchSpaceFromWall aSearch; try { aSearch.InitStart(ssWalls, lstColu); } catch(...) { return FALSE; } int nWallNum=aSearch.walls.Length(); for(i=0; im_ent == eStart) pWallStart=pWall; if(pWall->m_ent == eEnd) pWallEnd = pWall; } if(!pWallStart||!pWallEnd) return FALSE; //add by xlc on 110310 忽略墙体材料 TPushMemVar vTemp1(g_bSkipWallMaterial, TRUE); XPoly2D polyPath; if(aSearch.SearchPath(*pWallStart, *pWallEnd, polyPath, TRUE)==RTNORM) { XPoly2D polyPathOnBase; if(aSearch.SearchPath(*pWallStart, *pWallEnd, polyPathOnBase, FALSE)!=RTNORM) return FALSE; //add by whl on 060215 if(!polyPathOnBase||!polyPath) return FALSE; //add by whl on 060214 m_polyFirst.Reset(); m_polyFirstBase.Reset(); XCurveSegment segStart1, segEnd1, segStart2, segEnd2; polyPath.Nth(0, segStart1); polyPath.Nth(polyPath.TotalSegments()-1, segEnd1); polyPathOnBase.Nth(0, segStart2); polyPathOnBase.Nth(polyPathOnBase.TotalSegments()-1, segEnd2); XPoint ptBrkS1, ptBrkE1, ptBrkS2, ptBrkE2; segStart1.ProjectToMe(ptStart, ptBrkS1); segEnd1.ProjectToMe(ptEnd, ptBrkE1); segStart2.ProjectToMe(ptStart, ptBrkS2); segEnd2.ProjectToMe(ptEnd, ptBrkE2); polyPath.SetFlag(1); //封闭 polyPathOnBase.SetFlag(1); XPoly2D polySecond(0),polySecondBase(0); if(SplitPoly2D(polyPath, ptBrkS1, ptBrkE1, m_polyFirst, polySecond)!=RTNORM) return FALSE; if(SplitPoly2D(polyPathOnBase, ptBrkS2, ptBrkE2, m_polyFirstBase, polySecondBase)!=RTNORM) return FALSE; if(m_polyFirst.TotalSegments()!=GetWallNum()||m_polyFirst.Length()!=m_polyFirstBase.Length()) return FALSE; m_ptStart=ptBrkS1; m_ptEnd=ptBrkE1; m_polyFirstBase.Nth(0,segStart2); m_nWidth1=segStart2.GetLength(); m_polyFirstBase.Nth(GetWallNum()-1,segEnd2); m_nWidth2=segEnd2.GetLength(); } else return FALSE; XPushMemVar vTemp(g_pPolyOfBase,&m_polyFirstBase);; m_idMidWalls.QuickSort(CompareWallByPolyPath); } catch(...) { return FALSE; } return TRUE; } BOOL TDbBandWin::GetKeyCurves(XPoly2D&polyInside,XPoly2D&polyGlass1,XPoly2D&polyGlass2,XPoly2D&polyOutSide)const { if(!IsValid()) return FALSE; polyInside=m_polyFirstBase; polyGlass1=polyGlass2=polyOutSide=m_polyFirst; return TRUE; } //转化为带形窗(T5转角窗),调用程序负责释放delete TDbOpening *TDbBandWin::GetOpening(long n) const { if(n<0||n>=GetWallNum()) return NULL; XCurveSegment seg, segBase; m_polyFirst.Nth(n, seg); //add by xlc on 110311 墙体单侧带保温时,中线不正确 AcDbObjectId idWall = GetWallId(n); OPENOBJ_BEGIN(idWall,AcDb::kForRead, TDbWall, pWall); if (pWall) { seg = pWall->OffsetGeomCenter(LS_INFINITE, TRUE); } OPENOBJ_END(); m_polyFirstBase.Nth(n, segBase); XPoint ptMid0=segBase.MidPoint(); XPoint ptMid; seg.ProjectToMe(ptMid0, ptMid); ptMid.z=GetElevation(); TDbOpening *pOp=new TDbOpening; pOp->setPropertiesFrom(this); pOp->m_ptLocation = ptMid; pOp->SetWidth(segBase.GetLength()); pOp->SetKind(TOpeningData::OP_CORNWIN); pOp->SetLabel(GetLabel()); pOp->SetHeight(GetHeight()); pOp->m_ptLabel = GetLabelPos(); pOp->m_nRotation =(segBase.EndPoint()-segBase.StartPoint()).AsAcGeVector2d().angle(); pOp->m_nIdOfWall =GetWallId(n); pOp->SetTextStyle(m_idTextStyle); pOp->SetTextHeight(GetTextHeight()); return pOp; } void TDbBandWin::ValidateContainership(DList &lstWalls) { assertWriteEnabled(); AcDbObjectIdArray idArray; int validCount=0; for(int idx=0; idxCanContain(*pOp)) { if(pWall->upgradeOpen()==Acad::eOk) { pWall->assertWriteEnabled(); pWall->RemoveReferenceOpening(objectId()); SetWallId(idx,AcDbObjectId::kNull); pWall->downgradeOpen(); } } else { //确保互相引用关系 if(pWall->upgradeOpen()==Acad::eOk) { pWall->AddOpeningId(objectId()); pWall->downgradeOpen(); } validCount++;//到了这里表示状态良好。 } delete pOp; } } OPENOBJ_END(); } // 如果配属关系不全,则重新建立 if(validCountHitTest2d(cvFirst.StartPoint()),nRet2=pWall->HitTest2d(cvFirst.EndPoint()); if(nRet1>2&&nRet1<6&& nRet2>2&&nRet2<6) { m_idWall1=idWall; pWall->AddOpeningId(objectId()); validCount++; } else { int nRet1=pWall->HitTest2d(cvLast.StartPoint()),nRet2=pWall->HitTest2d(cvLast.EndPoint()); if(nRet1>2&&nRet1<6&& nRet2>2&&nRet2<6) { m_idWall2=idWall; pWall->AddOpeningId(objectId()); validCount++; } else { int nRet=m_polyFirstBase.HitTestOnCurve(pWall->MidPoint(),20); if(nRet<0)//命中边 { SetWallId(-nRet-1,idWall); pWall->AddOpeningId(objectId()); validCount++; } } } } OPENOBJ_END(); } } if(validCount>=GetWallNum()) if(UpdateParameters()) return; for(idx=0; idxRemoveReferenceOpening(objectId()); pWall->close(); } } } void TDbBandWin::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag) { assertWriteEnabled(); TDbCornerWin::CopyPropertiesFrom(pSrcEntity, gMatchFlag); TDbBandWin *pSrc=TDbBandWin::cast(pSrcEntity); if(pSrc) { //removed by whl on 060210 //m_idMidWalls.Reset(); //for(long i=0;im_idMidWalls.Length();i++) // m_idMidWalls.Append(new AcDbSoftPointerId(*pSrc->m_idMidWalls[i])); //m_polyFirst=pSrc->m_polyFirst; //m_polyFirstBase=pSrc->m_polyFirstBase; //m_ptStart=pSrc->m_ptStart; //m_ptEnd=pSrc->m_ptEnd; } } Acad::ErrorStatus TDbBandWin::ExplodeOrDraw2d(XExplodeDraw&dc)const { assertReadEnabled(); if(!objectId()&&_tcsicmp(dc.Desc(), XAcGiViewDraw::Descriptor())==0&&!dc.IsPlotGeneration()) dc< vTemp1(g_bSkipWallMaterial, TRUE); //bool bArc = false; double dWidthL(0),dWidthR(0); // 左右墙宽 double dDir; // 带形窗端点处的切向 TADSGePoint3d ptStart,ptEnd; for(long i=0;i vTemp(g_bSubEntity,TRUE); pOpening->SetLabel(_T("")); if(dc.IsFullExplode()) { XPushMemVar vTemp0(g_pCurrentDb,database()); pOpening->ExplodeOrDraw2d(dc); } else dc.DrawEntity(*pOpening); // add by xlc on 100127 带形窗端头封口,捕捉状态就不画了 if (!g_bOsnapExpl) { // modify by xlc on 110517 弧墙计算有误差 //if (i == 0) //{ // //del by xlc on 110406 弧墙添加封口,已在GetOutlinePoly中计算正确 // //modify by xlc on 110325 弧墙不添加封口 // //bArc = false; // //OPENOBJ_BEGIN(m_idWall1,AcDb::kForRead, TDbWall, pWall); // //if (pWall) // //{ // // bArc = pWall->Is(CURVE_ARC); // //} // //OPENOBJ_END(); // //if (!bArc) // { // TGGePoly2D poly; // pOpening->GetOutlinePoly(0, poly); // TGGeCurveSegment cv; // poly.Nth(2, cv); // dc << cv; // } //} //if (i == GetWallNum() - 1) //{ // //del by xlc on 110406 弧墙添加封口,已在GetOutlinePoly中计算正确 // //modify by xlc on 110325 弧墙不添加封口 // //bArc = false; // //OPENOBJ_BEGIN(m_idWall2,AcDb::kForRead, TDbWall, pWall); // //if (pWall) // //{ // // bArc = pWall->Is(CURVE_ARC); // //} // //OPENOBJ_END(); // // // //if (!bArc) // { // TGGePoly2D poly; // pOpening->GetOutlinePoly(0, poly); // TGGeCurveSegment cv; // poly.Nth(0, cv); // dc << cv; // } //} if (i == 0) { OPENOBJ_BEGIN(m_idWall1, AcDb::kForRead, TDbWall, pWall); if (pWall) { dWidthL = dWidthR = (pWall->GetWidth(0) + pWall->GetWidth(1)) * 0.5; if (pWall->IsInsulateOnSide(0)) { dWidthL += pWall->GetInsulateThick(0); } if (pWall->IsInsulateOnSide(1)) { dWidthR += pWall->GetInsulateThick(1); } dDir = pWall->Direction(m_ptStart); ads_polar(TADSGePoint3d(m_ptStart), dDir+PI*0.5, dWidthL, ptStart); ads_polar(TADSGePoint3d(m_ptStart), dDir-PI*0.5, dWidthR, ptEnd); dc << TGGeLine(ptStart, ptEnd); } OPENOBJ_END(); } if (i == GetWallNum() -1) { OPENOBJ_BEGIN(m_idWall2, AcDb::kForRead, TDbWall, pWall); if (pWall) { dWidthL = dWidthR = (pWall->GetWidth(0) + pWall->GetWidth(1)) * 0.5; if (pWall->IsInsulateOnSide(0)) { dWidthL += pWall->GetInsulateThick(0); } if (pWall->IsInsulateOnSide(1)) { dWidthR += pWall->GetInsulateThick(1); } dDir = pWall->Direction(m_ptEnd); ads_polar(TADSGePoint3d(m_ptEnd), dDir+PI*0.5, dWidthL, ptStart); ads_polar(TADSGePoint3d(m_ptEnd), dDir-PI*0.5, dWidthR, ptEnd); dc << TGGeLine(ptStart, ptEnd); } OPENOBJ_END(); } } delete pOpening; } } } if((g_bExplodeSubText||!!m_sLabel) && !!m_idTextStyle) { // bug: 如果设置了图层,则插门的时候出错AcGi-SelectionMarker // sg add 101222,根据8.5需求,带型窗支持隐藏编号 if (!g_bExplodeSubText && IsHideLabel()) return Acad::eOk; TDbText textLabel; textLabel.setPropertiesFrom(this); //XString sStyleName=GetSymbolName(idTextStyle); if(!!m_idLayerText) textLabel.setLayer(m_idLayerText); textLabel.SetStyleId(m_idTextStyle); textLabel.SetLocation(XPoint(m_ptLabel.x, m_ptLabel.y)); textLabel.SetAlignment(XExplodeDraw::kMiddleCenter); textLabel.SetRotation(xg_angle(m_nTextRotation)); textLabel.SetHeight(m_nTextHeight>1.0E-3? m_nTextHeight : 3.5); XString sTemp; sTemp=m_sLabel; //modified by whl on 060223 //strupr(sTemp); TDbConfig *pConfig=GetDwgGlobal(AcDb::kForRead, database()); if(pConfig && pConfig->IsCapLabel()) _tcsupr(sTemp); if(pConfig) pConfig->close(); textLabel.SetText(sTemp); TPushProperty vProp(&textLabel, dc); if(dc.IsFullExplode()) { textLabel.ExplodeOrDraw2d(dc); } else dc.DrawEntity(textLabel); } return Acad::eOk; } void TDbBandWin::GetTips(DList &lstInfo) const { //add by whl AcDbHandle h; getAcDbHandle(h); TCHAR pBuf[1024]; h.getIntoAsciiBuffer(pBuf); lstInfo.Append(new TObjInfoUnit(_T("对象句柄"), pBuf)); lstInfo.Append(new TObjInfoUnit(_T("对象类型"), GetKindString())); lstInfo.Append(new TObjInfoUnit(_T("门窗名称"), m_sLabel)); lstInfo.Append(new TObjInfoUnit(_T("宽度"), Dist2Str(GetWidth()))); lstInfo.Append(new TObjInfoUnit(_T("高度"), Dist2Str(m_nHeight))); lstInfo.Append(new TObjInfoUnit(_T("离地高度"), Dist2Str(m_ptLocation[2]))); lstInfo.Append(new TObjInfoUnit(_T("文字样式"), GetSymbolName(m_idTextStyle))); lstInfo.Append(new TObjInfoUnit(_T("文字图层"), GetSymbolName(m_idLayerText))); lstInfo.Append(new TObjInfoUnit(_T("文字高度"), XString(_T("%.1f"), m_nTextHeight))); if(m_nWinFlag&CWF_PROTRUDE) { lstInfo.Append(new TObjInfoUnit(_T("凸出宽度"), Dist2Str(m_nProtrude))); lstInfo.Append(new TObjInfoUnit(_T("超出窗台板1"), Dist2Str(m_nExtrude1))); lstInfo.Append(new TObjInfoUnit(_T("超出窗台板2"), Dist2Str(m_nExtrude2))); lstInfo.Append(new TObjInfoUnit(_T("窗台板厚"), Dist2Str(m_nSlabThickness))); //double m_nGlassDist; //玻璃距离窗台板边缘 } //Adesk::UInt16 m_style3d; //三维样式 lstInfo.Append(new TObjInfoUnit(_T("玻璃图层"), GetSymbolName(m_idLayerGlass3d))); lstInfo.Append(new TObjInfoUnit(_T("窗框图层"), GetSymbolName(m_idLayerFrame3d))); lstInfo.Append(new TObjInfoUnit(_T("窗板图层"), GetSymbolName(m_idLayerSlab3d))); //double m_uFrame, m_vFrame; //窗框(竖直)高度和窗框(水平)厚度 // ... } Acad::ErrorStatus TDbBandWin::GetGripText(int i,CString &cs)const { if(i==0) cs=_T("改变起点位置"); else if(i==1) cs=_T("改变终点位置"); else cs=_T("改变编号位置"); return Acad::eOk; } #if ADS>15 void TDbBandWin::CreateGrip() { TDbEntity::CreateGrip(); if(m_polyFirst.Length()>2) { if(fabs(m_polyFirst.GetBulge(0))<1E-6)//暂不处理弧段了 GetGrip(0)->AppendDim(new TDbGripDistDim(AcDbDimData::kDimResultantLength)); if(fabs(m_polyFirst.GetBulge(m_polyFirst.TotalSegments()-1))<1E-6)//暂不处理弧段了 GetGrip(1)->AppendDim(new TDbGripDistDim(AcDbDimData::kDimResultantLength)); } } Acad::ErrorStatus TDbBandWin::EntityToDim(long iGrip,long iDim,const AcDbEntity*pEnt) { TDbGripDim*pDim=GetGripDim(iGrip,iDim); if(pDim==NULL) return Acad::eInvalidInput; if(pEnt==NULL) pEnt=this; TDbBandWin *pWin=TDbBandWin::cast(pEnt); if(pWin==NULL) return Acad::eInvalidInput; XPoly2D poly; AcGeVector3d vt; pWin->GetPathPoly(poly,vt); if(poly.Length()<2) return Acad::eInvalidInput; if(iGrip==0)//起点 { TDbGripDistDim*pDistDim=(TDbGripDistDim*)pDim; pDistDim->SetData(poly[1]->AsAcGePoint3d(),poly[0]->AsAcGePoint3d()); } else if(iGrip==1)//终点 { TDbGripDistDim*pDistDim=(TDbGripDistDim*)pDim; pDistDim->SetData(poly[poly.Length()-1]->AsAcGePoint3d(),poly[poly.Length()-2]->AsAcGePoint3d()); } else return Acad::eNotImplementedYet; return Acad::eOk; } Acad::ErrorStatus TDbBandWin::DimToEntity(long iGrip,long iDim,double newValue,const AcGeVector3d& offset) { assertWriteEnabled(); if(m_polyFirst.Length()<2) return Acad::eInvalidInput; if(iGrip==0) { if(newValue<1E-6) return Acad::eInvalidInput; XPoint dir=XPoint(m_ptStart)-*m_polyFirst[1]; dir.Normalize(); dir.Scale(newValue); m_ptStart=*m_polyFirst[0]=*m_polyFirst[1]+dir; } else if(iGrip==1) { if(newValue<1E-6) return Acad::eInvalidInput; XPoint dir=XPoint(m_ptEnd)-*m_polyFirst[m_polyFirst.Length()-2]; dir.Normalize(); dir.Scale(newValue); m_ptEnd=*m_polyFirst[m_polyFirst.Length()-1]=*m_polyFirst[m_polyFirst.Length()-2]+dir; } else return Acad::eNotImplementedYet; return Acad::eOk; } #endif Acad::ErrorStatus TDbBandWin::dwgInFields(AcDbDwgFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbCornerWin::dwgInFields(pFiler); if(es != Acad::eOk) return es; Adesk::UInt8 nVer=0; pFiler->readItem(&nVer); if(nVer>g_nVersion) return Acad::eMakeMeProxy; Adesk::Int32 num; pFiler->readItem(&num); m_idMidWalls.Reset(); for(long i=0;ireadItem(&idWall); m_idMidWalls.Append(new AcDbSoftPointerId(idWall)); } pFiler->readItem(&m_ptStart); pFiler->readItem(&m_ptEnd); ReadPoly2D(pFiler,m_polyFirst); ReadPoly2D(pFiler,m_polyFirstBase); return pFiler->filerStatus(); } // 写出数据到dwg: Acad::ErrorStatus TDbBandWin::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es = TDbCornerWin::dwgOutFields(pFiler); if(es != Acad::eOk) return es; pFiler->writeItem(g_nVersion); pFiler->writeItem((Adesk::Int32)m_idMidWalls.Length()); for(long i=0;iwriteItem(m_idMidWalls[i]); pFiler->writeItem(m_ptStart); pFiler->writeItem(m_ptEnd); WritePoly2D(pFiler,m_polyFirst); WritePoly2D(pFiler,m_polyFirstBase); return pFiler->filerStatus(); } Acad::ErrorStatus TDbBandWin::dxfInFields (AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbCornerWin::dxfInFields(pFiler); if(es!=Acad::eOk) return es; if (!pFiler->atSubclassData(_T("TDbBandWin"))) return Acad::eBadDxfSequence; DList lstIds; AcDbObjectId id; resbuf rb; while ((es == Acad::eOk) && ((es = pFiler->readResBuf(&rb)) == Acad::eOk)) { switch (rb.restype) { case AcDb::kDxfSoftPointerId: acdbGetObjectId(id, rb.resval.rlname); lstIds.Append(new AcDbSoftPointerId(id)); break; default: // An unrecognized group. Push it back so that // the subclass can read it again. pFiler->pushBackItem(); es = Acad::eEndOfFile; break; } } if (es != Acad::eEndOfFile) return Acad::eInvalidResBuf; m_idMidWalls.Reset(); lstIds.SetDelFlag(FALSE); for(int i=0; ifilerStatus(); } Acad::ErrorStatus TDbBandWin::dxfOutFields(AcDbDxfFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es; es = TDbCornerWin::dxfOutFields(pFiler); assert(es == Acad::eOk); es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbBandWin")); assert(es == Acad::eOk); for(int i=0; iwriteItem(AcDb::kDxfSoftPointerId,id); } return es; } Acad::ErrorStatus TDbBandWin::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { assertReadEnabled(); gripPoints.append(m_ptStart); gripPoints.append(m_ptEnd); if(!(!m_sLabel)) gripPoints.append(m_ptLabel); return Acad::eOk; } Acad::ErrorStatus TDbBandWin::subMoveGripPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); TDbBandWin backWin; backWin.copyFrom(this); for (int i = 0; i < indices.length(); i++) switch(indices[i]) { case 0: m_ptStart+=offset; break; case 1: m_ptEnd+=offset; break; case 2: m_ptLabel+=offset; break; } if(!UpdateParameters()||!IsValid()) { copyFrom(&backWin); return Acad::eInvalidInput; } return Acad::eOk; } // Stretch的夹点只有插入点和标号位置 Acad::ErrorStatus TDbBandWin::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const { assertReadEnabled(); if(!!m_sLabel) stretchPoints.append(m_ptLabel); stretchPoints.append(m_ptStart); stretchPoints.append(m_ptEnd); return Acad::eOk; } // 功能: 夹点操作 Acad::ErrorStatus TDbBandWin::subMoveStretchPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); if(indices.length()==1&&indices[0]==0) m_ptLabel += offset; else { AcGeMatrix3d mat; mat.setTranslation(offset); subTransformBy(mat); } return Acad::eOk; } Acad::ErrorStatus TDbBandWin::subTransformBy(const AcGeMatrix3d&xform) { assertWriteEnabled(); TDbCornerWin::subTransformBy(xform); m_ptStart.transformBy(xform); m_ptEnd.transformBy(xform); m_polyFirst.TransformBy(xform); m_polyFirstBase.TransformBy(xform); return Acad::eOk; } // sg add 101119,支持导出XML CString TDbBandWin::GetXml(const AcGeMatrix3d& mat) const { TXmlTree xmlTree; POSITION posRoot = xmlTree.Insert(_T("TCH_BAND_WINDOW"), NULL, NULL); { xmlTree.SetAttribute(posRoot, _T("name"), _T("带形窗")); xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称")); } CString strText; POSITION posItem = NULL; POSITION posItem1 = xmlTree.Insert(_T("Object_ID"), posRoot, NULL); { xmlTree.SetAttribute(posItem1, _T("name"), _T("对象编号")); xmlTree.SetAttribute(posItem1, _T("comment"), _T("当前对象的句柄")); strText.Format(_T("%ld"), objectId()); xmlTree.SetItemText(posItem1, strText); } POSITION posItem2 = xmlTree.Insert(_T("Link_WALL"), posRoot, posItem1); { xmlTree.SetAttribute(posItem2, _T("name"), _T("连接墙体")); posItem = NULL; int iLen = GetWallNum(); for (int i = 0; i < iLen; i++) { posItem = xmlTree.Insert(_T("Link_ID"), posItem2, posItem); { AcDbObjectId id = GetWallId(i); strText.Format(_T("墙体句柄%d"), i + 1); xmlTree.SetAttribute(posItem, _T("name"), strText); strText.Format(_T("%ld"), id.asOldId()); xmlTree.SetItemText(posItem, strText); } } } POSITION posItem3 = xmlTree.Insert(_T("Net_height"), posRoot, posItem2); { xmlTree.SetAttribute(posItem3, _T("name"), _T("门窗高")); xmlTree.SetAttribute(posItem3, _T("comment"), _T("从门窗底起算的窗高")); strText.Format(_T("%f"), GetHeight()); xmlTree.SetItemText(posItem3, strText); } POSITION posItem4 = xmlTree.Insert(_T("Sill_height"), posRoot, posItem3); { xmlTree.SetAttribute(posItem4, _T("name"), _T("窗台高")); xmlTree.SetAttribute(posItem4, _T("comment"), _T("从楼面起算的窗台高")); strText.Format(_T("%f"), GetElevation()); xmlTree.SetItemText(posItem4, strText); } POSITION posItem5 = xmlTree.Insert(_T("Length1"), posRoot, posItem4); { xmlTree.SetAttribute(posItem5, _T("name"), _T("门窗宽1")); xmlTree.SetAttribute(posItem5, _T("comment"), _T("门窗在第一道墙的宽度")); strText.Format(_T("%f"), GetWidth1()); xmlTree.SetItemText(posItem5, strText); } POSITION posItem6 = xmlTree.Insert(_T("Length2"), posRoot, posItem5); { xmlTree.SetAttribute(posItem6, _T("name"), _T("门窗宽2")); xmlTree.SetAttribute(posItem6, _T("comment"), _T("门窗在末一道墙宽度")); strText.Format(_T("%f"), GetWidth2()); xmlTree.SetItemText(posItem6, strText); } POSITION posBaseLine = xmlTree.Insert(_T("Baseline"), posRoot, posItem6); { xmlTree.SetAttribute(posBaseLine, _T("name"), _T("路径")); POSITION posItem = NULL; TADSGePoint3d ptNode; int iLen = m_polyFirstBase.Length(); for (int i = 0; i < iLen; i++) { ptNode = m_polyFirstBase[i]; // 对点进行坐标变换 ptNode.TransformBy(mat); strText.Format(_T("Point_%d"), i + 1); posItem = xmlTree.Insert(strText, posBaseLine, posItem); { strText.Format(_T("第%d点"), i + 1); xmlTree.SetAttribute(posItem, _T("name"), strText); strText.Format(_T("%f,%f,%f"), ptNode.x, ptNode.y, ptNode.z); xmlTree.SetItemText(posItem, strText); } strText.Format(_T("Ang_%d"), i + 1); posItem = xmlTree.Insert(strText, posBaseLine, posItem); { strText.Format(_T("圆心角%d"), i + 1); xmlTree.SetAttribute(posItem, _T("name"), strText); strText.Format(_T("%f"), m_polyFirstBase.GetBulge(i)); xmlTree.SetItemText(posItem, strText); } } } CString strBase = TEntityBase::GetXml(mat); CString strXml = xmlTree.GetXml(); int nIndex = strXml.Find(_T(" idAllWall; idAllWall.Append(new AcDbSoftPointerId(m_idWall1)); int nLength = m_idMidWalls.Length(); for (int i=0; iOffsetGeomCenter(LS_INFINITE, TRUE); // 当前段 } OPENOBJ_END(); segCur.ProjectToMe(m_ptStart, pt); } else // 其他段 { if (segCur.Intersection(segPre, pt1, pt2) != 1) // 考虑平行的情况 { pt1 = segPre.StartPoint(); pt2 = segPre.EndPoint(); } pt = TGGeLine(pt1, pt2).NearPoint(segCur.StartPoint()); } polyGeomCenterPt.AppendNode(pt, segCur.GetBulge()); // 起点 if (i+1 < nLength) // 其他段 { OPENOBJ_BEGIN(*idAllWall[i+1], AcDb::kForRead, TDbWall, pWall); if (pWall != NULL) { segNext = pWall->OffsetGeomCenter(LS_INFINITE, TRUE); // 下一段 } OPENOBJ_END(); } else // 末段 { segCur.ProjectToMe(m_ptEnd, pt); polyGeomCenterPt.AppendNode(pt, 0); // 终点 } segPre = segCur; // 前一段 segCur = segNext; } double dWidth = polyGeomCenterPt.Distance2d(); return dWidth; } // sg add 110224,增加自动编号 CString TDbBandWin::GetAutoLabel(bool &bAddNum)const { TOpeningLabelData data; CStringArray arSubType; // 获得类型数组 data.GetSubType(_T("BandWin"),arSubType); CString csNewName = _T("DC"); if (arSubType.GetSize() > 0) { data.GetOpeningLabel(_T("BandWin"),arSubType[0], csNewName); } // 获得是否需要添加连字符 CString csHypen = _T(""); if (data.HasHypen()) csHypen = _T("-"); bool bRound = data.IsRound(); // 是否进行四舍五入 TOpeningLabelData::ESerialRule nRule = data.GetNumRule(); if (nRule == TOpeningLabelData::kSize) // 按尺寸标注 { bAddNum = false; // 洞口尺寸宽+高 // sg add 120511,根据9.0需求,编号时,根据墙中线长度来作为宽度,GetWidth里面去的是墙基线的长度 // double nWidth = GetWidth(), double nWidth = GetGeomCenterWidth(), nHeight = GetHeight(); int nWidth1 = AS_INT(nWidth/100), nHeight1 = AS_INT(nHeight/100); if (!bRound) // 不进行四舍五入 { nWidth1 = AS_INT(nWidth)/100; nHeight1 = AS_INT(nHeight)/100; } if (nWidth1>9&&nHeight1>9) csNewName.Format(_T("%s%s%d%d"),csNewName, csHypen, nWidth1, nHeight1); else if (nWidth1<10&&nHeight1>9) csNewName.Format(_T("%s%s0%d%d"),csNewName, csHypen, nWidth1, nHeight1); else if (nWidth1>9&&nHeight1<10) csNewName.Format(_T("%s%s%d0%d"),csNewName, csHypen, nWidth1, nHeight1); else csNewName.Format(_T("%s%s0%d0%d"),csNewName, csHypen, nWidth1, nHeight1); } else // 按数序排列 { csNewName.Format(_T("%s%s"), csNewName, csHypen); bAddNum = true; // 由对话框处进行+1工作 } return csNewName; } //////////////////////////////////////////////////////////////////////////////////////////// void InitDbBandWin(BOOL bTrue) { if(bTrue) { TDbBandWin::rxInit(); acrxBuildClassHierarchy(); TDbBandWin::InitMatchProtocol(TRUE); } else { TDbBandWin::InitMatchProtocol(FALSE); deleteAcRxClass(TDbBandWin::desc()); } } void BanOpening() { XPushVar vOsMode(_T("OSMODE"), 512); extern TARCH_IMPEXP BOOL g_bEnableCornWinWarning; XPoint ptStart, ptEnd; if(XGetPoint(NULL, _T("\n起始点"), ptStart)!=RTNORM || XGetPoint(NULL, _T("\n终止点"), ptEnd)!=RTNORM) return; static double nSill=800.0, nHeight=1800.0; Entity eStart, eEnd; PickSet ssWalls(SS_FREE); g_ssPickFirst.Free(); if(SelectEntities(_T("\n选择带形窗经过的墙:"),ssWalls, RBList(RTDXF0, _T("ATS_WALL,ATS_CURTAIN_WALL"), NULL))!=RTNORM) return; BOOL bHas3D=TRUE; DList idMidWalls; AcDbObjectId idStart,idEnd; int nWallCount=int(ssWalls.Length()); for(long i=0; iGetOutlinePoly(ptStart.z, poly); if(!pWall->Has3D()) bHas3D=FALSE; double nDevation= (poly.PathArea()<0.0)? (_DIST_SNAP*2) : -(_DIST_SNAP*2); poly.Offset(nDevation, poly1); bool bTerm=false; if((ptStart&poly1) != PR_OUTSIDE) { if(!!eStart) { adsout << /*UMSG*/ _T("\n起点处发现不止一段墙, 不能完成带形窗!"); return; } eStart=idWall; idStart=objectId; bTerm=true; } if((ptEnd&poly1) != PR_OUTSIDE) { if(!!eEnd) { adsout << /*UMSG*/ _T("\n终点处发现不止一段墙, 不能完成带形窗!"); return; } eEnd=idWall; idEnd=objectId; bTerm=true; } if(!bTerm) idMidWalls.Append(new AcDbObjectId(objectId)); } if(!eStart) { adsout << /*UMSG*/ _T("\n找不到起点处的墙!"); return; } if(!eEnd) { adsout << /*UMSG*/ _T("\n找不到终点处的墙!"); return; } if(eStart==eEnd) { XCurveSegment seg, segBase; OPENOBJ_BEGIN(eStart, AcDb::kForRead, TDbWall, pWall); ASSERT(pWall); segBase = *pWall; seg=pWall->OffsetGeomCenter(LS_INFINITE, TRUE); seg.ProjectToMe(XPoint(ptStart), ptStart); seg.ProjectToMe(XPoint(ptEnd), ptEnd); seg.SetPoints(ptStart, ptEnd); segBase.ProjectToMe(XPoint(ptStart), ptStart); segBase.ProjectToMe(XPoint(ptEnd), ptEnd); if(!segBase.Is(CURVE_LINE)&&//弧段 segBase.PathDistance(ptStart)>segBase.PathDistance(ptEnd)) segBase.SetPoints(ptEnd,ptStart); else segBase.SetPoints(ptStart,ptEnd); OPENOBJ_END(); if(bHas3D) { if(GetReal(_T("\n窗台高"), nSill)==RTCAN || GetReal(_T("\n窗户高"), nHeight)==RTCAN) return; } BOOL bWarn=g_bEnableCornWinWarning; g_bEnableCornWinWarning=FALSE; XPoint ptMid0=segBase.MidPoint(); XPoint ptMid; seg.ProjectToMe(ptMid0, ptMid); ptMid.z = bHas3D? nSill : 0.0; TDbOpening *pOpening= new TDbOpening; pOpening->m_ptLocation = ptMid; pOpening->SetWidth(segBase.GetLength()); pOpening->SetHeight(bHas3D? nHeight : 0.0); pOpening->SetKind(TOpeningData::OP_CORNWIN); // 设定编号位置 ads_polar(ptMid, seg.Direction(ptMid)-PI/2.0, _AS_SYS_UNIT(600.0), pOpening->m_ptLabel); pOpening->m_ptLabel.z = 0; pOpening->InitHardPointerId(); pOpening->AddToMSpace(Adesk::kTrue); TArchCmdReactor::UpdateOpenings(); TArchCmdReactor::ResetAll(); g_bEnableCornWinWarning=bWarn; //adsout << _T("\n起点和终点都在同一墙段上, 没有转角!"); return; } if(GetReal(_T("\n窗台高"), nSill)==RTCAN || GetReal(_T("\n窗户高"), nHeight)==RTCAN) return; BOOL bWarn=g_bEnableCornWinWarning; g_bEnableCornWinWarning=FALSE; TDbBandWin *pWin=new TDbBandWin; pWin->SetHeight(nHeight); pWin->SetElevation(nSill); pWin->SetLayerGlass3d(InitLayer(LAY_3DGLASS, FALSE)); pWin->SetLayerFrame3d(InitLayer(LAY_3DFRAME, FALSE)); pWin->SetLayerSlab3d(InitLayer(LAY_WALL, FALSE)); pWin->SetLayerText(InitLayer(LAY_OPENING_DIM, FALSE)); pWin->SetTextStyle(InitTextStyle(TS_WINDOW)); pWin->SetStartPoint(ptStart); pWin->SetEndPoint(ptEnd); pWin->SetWallId(0,idStart); pWin->SetWallId(1,idEnd); pWin->SetMidWallIds(idMidWalls); if(!pWin->UpdateParameters()) { adsout<<_T("\n未能生成带形窗!"); delete pWin; return; } pWin->UpdateLabelPos(); AcDbObjectId idWin=pWin->AddToMSpace(Adesk::kTrue); for(i=0;iAddOpeningId(idWin); OPENOBJ_END(); } g_bEnableCornWinWarning=bWarn; } bool TDbBandWin::GetSection( const AcDbFace &face, const AcGeVector3d& vtPlaneSecDir, std::vector §ionRecords, AcDbVoidPtrArray& arFillPtrs ) const { TGGeSectionPlane section(face, vtPlaneSecDir); AcDbObjectId id(objectId()), layer(layerId()); TObjSectionRecord::SectionType type = TObjSectionRecord::eTCH_CORNER_WINDOW; double dDist = 0.; TGGePoly2D poly; for(long i = 0; i < GetWallNum(); i++) { TDbOpening *pOpening = GetOpening(i); if (!pOpening) continue; double dDist = .0; poly.Reset(); XCurveSegment segLeftSide, segLeft, segMid, segRight, segRightSide; pOpening->GetBanWinSegs(segLeftSide, segLeft, segMid, segRight, segRightSide); double elev = pOpening->GetElevation(), height = pOpening->GetHeight(); AcGePoint3d pt1(segLeftSide.GetStartPoint()), pt2(segLeftSide.GetEndPoint()), pt3(pt2), pt4(pt1); pt1.z = pt2.z = elev; pt3.z = pt4.z = elev + height; TGGeSectionPlane plane1(pt1, pt2, pt3, pt4, vtPlaneSecDir); dDist = SectionUtility::Projection_plane2plane(section, plane1, poly); if (poly.Length()) sectionRecords.push_back(TObjSectionRecord(id, layer, type, dDist, poly)); pt1 = segRightSide.GetStartPoint(), pt2 = segRightSide.GetEndPoint(), pt3 = pt2, pt4 = pt1; pt1.z = pt2.z = elev; pt3.z = pt4.z = elev + height; poly.Reset(); TGGeSectionPlane plane2(pt1, pt2, pt3, pt4, vtPlaneSecDir); dDist = SectionUtility::Projection_plane2plane(section, plane2, poly); if (poly.Length()) sectionRecords.push_back(TObjSectionRecord(id, layer, type, dDist, poly)); } return true; }