#include "stdafx.h" #include "AecDbRoof.h" #include "MFCDbDwgFiler.h" #include "CoreTools.h" #include "Geom.h" #include "AcGiViewDraw.h" //系统单位相对于毫米的数值比例 #define _UNIT_SCALE (IsMeterfUnitDraw() ? 0.001 : 1.0) //把MM单位换算为系统单位 #define _AS_SYS_UNIT(nMM) (nMM * _UNIT_SCALE) BOOL g_bCtrlToggle1[] = {0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0}; //============================================================================================= Adesk::UInt32 AecDbXRoof::kCurrentVersionNumber = 1; ACRX_DXF_DEFINE_MEMBERS (AecDbXRoof, AecDbEntityBase, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, AcDbProxyEntity::kNoOperation | AcDbProxyEntity::kDisableProxyWarning, AEC_DBXROOF, "AecDbXRoof" "|Product Desc: shanghua earthworm app obj" "|Company: shanghua inc" "|WEB Address: www.shanghuasoft.com") AecDbXRoof::AecDbXRoof(void) { m_dSlabThick = 200;//mm m_mapSpecXData.SetAt(KEY_NAME,_T("屋顶")); m_SlopeRoofImpl = new TSlopeRoof; m_nRoofType = 0; } AecDbXRoof::~AecDbXRoof(void) { if (m_SlopeRoofImpl != NULL) delete m_SlopeRoofImpl; deleteContainerOfStd(m_solids); deleteContainerOfStd(m_pipes); } void AecDbXRoof::SetRidgeStyle(AecDbXRoof::RidgeStyle rStyle) { assertWriteEnabled(); m_nRidgeStyle = rStyle; } AecDbXRoof::RidgeStyle AecDbXRoof::GetRidgeStyle() const { assertReadEnabled(); return m_nRidgeStyle; } void AecDbXRoof::SetRoofStyle(AecDbXRoof::RoofStyle rStyle) { assertWriteEnabled(); m_nRoofStyle = rStyle; } AecDbXRoof::RoofStyle AecDbXRoof::GetRoofStyle() const { assertReadEnabled(); return m_nRoofStyle; } void AecDbXRoof::subList() const { assertReadEnabled(); AecDbEntityBase::subList(); switch(m_nRoofStyle) { case kSlopeRoof: { acutPrintf(_T("\n任意坡顶:")); break; } case kDualRoof: { acutPrintf(_T("\n人字屋顶:")); break; } case kMountRoof: { acutPrintf(_T("\n山脊屋顶:")); break; } case kCuspRoof: { acutPrintf(_T("\n攒尖屋顶:")); break; } default: break; } } Acad::ErrorStatus AecDbXRoof::copyFrom(const AcRxObject* pSrc) { assertWriteEnabled(); if (pSrc != NULL) { AecDbXRoof* pXRoof = AecDbXRoof::cast(pSrc); if (pXRoof != NULL) { m_nRidgeStyle = pXRoof->m_nRidgeStyle; m_nRoofStyle = pXRoof->m_nRoofStyle; m_arAssocPartEntIds = pXRoof->m_arAssocPartEntIds; if (m_SlopeRoofImpl != NULL) { *((TSlopeRoof*)m_SlopeRoofImpl) = *((TSlopeRoof*)pXRoof->m_SlopeRoofImpl); } m_dSlabThick = pXRoof->m_dSlabThick; m_dRidgeWidth = pXRoof->m_dRidgeWidth; m_dRidgeHeight = pXRoof->m_dRidgeHeight; m_idTopFaceLayer = pXRoof->m_idTopFaceLayer; m_idBotFaceLayer = pXRoof->m_idBotFaceLayer; m_idSlabLayer = pXRoof->m_idSlabLayer; m_idRidgeLayer = pXRoof->m_idRidgeLayer; m_ptRidge1 = pXRoof->m_ptRidge1; m_ptRidge2 = pXRoof->m_ptRidge2; m_dAngleLeft = pXRoof->m_dAngleLeft; m_dAngleRight = pXRoof->m_dAngleRight; m_bEqualAngle = pXRoof->m_bEqualAngle; m_bHeightLim = pXRoof->m_bHeightLim; m_dRoofHeight = pXRoof->m_dRoofHeight; m_ptLocation = pXRoof->m_ptLocation; m_dRotation = pXRoof->m_dRotation; m_dLength = pXRoof->m_dLength; m_dWidth = pXRoof->m_dWidth; m_dEavesLen = pXRoof->m_dEavesLen; m_dMountLen = pXRoof->m_dMountLen; m_dSlopeAngle1 = pXRoof->m_dSlopeAngle1; m_dSlopeAngle2 = pXRoof->m_dSlopeAngle2; m_dMountHeight = pXRoof->m_dMountHeight; m_bShowSide = pXRoof->m_bShowSide; m_ptCenter = pXRoof->m_ptCenter; m_dRadius = pXRoof->m_dRadius; m_nSideNum = pXRoof->m_nSideNum; m_mapSpecXData.CopyFrom(&pXRoof->m_mapSpecXData); //发送提资需要相同的ID extern CString IDCreate(); Adesk::Int16 nVal = acdbCurDwg()->useri4(); if (nVal != KEY_NOPROTECT) { int nVt = 0; CString sID = IDCreate(); if (m_mapSpecXData.HasKey(KEY_NO, nVt)) m_mapSpecXData.SetAt(KEY_NO, sID); } } } return Acad::eOk; } const AecDbObjXDataMap* AecDbXRoof::GetSpecialtyData() const { assertReadEnabled(); return &m_mapSpecXData; } AecDbObjXDataMap* AecDbXRoof::GetSpecialtyData(AcDb::OpenMode bMode/* = AcDb::kForWrite*/) { switch(bMode) { case AcDb::kForRead: { assertReadEnabled(); break; } case AcDb::kForWrite: { if (!isWriteEnabled()) { upgradeOpen(); } assertWriteEnabled(); break; } case AcDb::kForNotify: { if (!isWriteEnabled()) { upgradeOpen(); } } default: break; } return &m_mapSpecXData; } void AecDbXRoof::UnionScale(double nScale) { assertWriteEnabled(); m_dSlabThick *= nScale;//板厚 m_dRidgeWidth *= nScale; m_dRidgeHeight *= nScale;//屋脊大小 m_dRoofHeight*=nScale; if (m_SlopeRoofImpl != NULL) { double nOldElev = ((TSlopeRoof*)m_SlopeRoofImpl)->GetElevation(); ((TSlopeRoof*)m_SlopeRoofImpl)->SetElevation(nOldElev*nScale); ((TSlopeRoof*)m_SlopeRoofImpl)->m_fMaxHeight *= nScale; } if (m_nRoofStyle == AecDbXRoof::kMountRoof) { double nOldElev=GetElevation(); AcGeMatrix3d mat; mat.setToScaling(nScale); subTransformBy(mat); SetElevation(nOldElev*nScale); m_dWidth*=nScale; //屋顶宽 m_dLength*=nScale; //屋顶长 m_dRoofHeight*=nScale; //高度 m_dEavesLen*=nScale; //出檐长 m_dMountLen*=nScale; //出山长 m_dMountHeight*=nScale; //歇山高 } else if (m_nRoofStyle == kCuspRoof) { double nOldElev=GetElevation(); AcGeMatrix3d mat; mat.setToScaling(nScale); subTransformBy(mat); SetElevation(nOldElev*nScale); m_dSlabThick*=nScale;//板厚 m_dRidgeWidth*=nScale; m_dRidgeHeight*=nScale;//屋脊大小 m_dRoofHeight*=nScale;//高度 m_dRadius*=nScale;//半径 m_dEavesLen*=nScale; } } bool AecDbXRoof::UnifyElevation(double dElevation/* = 0.0*/) { assertWriteEnabled(); m_mapSpecXData.SetAt(KEY_EL,dElevation); if (m_SlopeRoofImpl != NULL) { ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline.SetElevation(dElevation); } return true; } bool AecDbXRoof::InitEqualSlope(AcDbPolyline* pPl,double dEl,double dAng) { AssertWriteEnabled(); XPoly2D poly; poly.SetAcDbCurve(pPl); //确保逆时针 if (poly.PathArea() >0 ) { poly.Reverse(); } poly.Compress(); XPoly2D polyDest(1); poly.Disperse(polyDest); polyDest.SetElevation(dEl); if (m_SlopeRoofImpl != NULL) { ((TSlopeRoof*)m_SlopeRoofImpl)->InitEqualSlope(polyDest,dAng); } return true; } //设置轮廓Init方式 Acad::ErrorStatus AecDbXRoof::SetPathPoly(AcDbPolyline* pPl,const AcGeVector3d&normal) { AssertWriteEnabled(); if (pPl == NULL) return Acad::eOk; if (m_SlopeRoofImpl != NULL) { XPoly2D polyPath1; polyPath1.SetAcDbCurve(pPl); if(polyPath1.PathArea()>0) polyPath1.Reverse(); ((TSlopeRoof*)m_SlopeRoofImpl)->InitEqualSlope(polyPath1,PI/6); } return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::GetPathPoly(AcDbPolyline*& pPl,AcGeVector3d&normal) const { assertReadEnabled(); assertReadEnabled(); if (m_SlopeRoofImpl != NULL) { if (((TSlopeRoof *)m_SlopeRoofImpl)->m_polyOutline.Length() > 0) pPl = (AcDbPolyline *)((TSlopeRoof *)m_SlopeRoofImpl)->m_polyOutline.AsAcDbCurve(); normal = AcGeVector3d::kZAxis; } if (m_nRoofStyle == kMountRoof) { normal=AcGeVector3d::kZAxis; GetPolyPath(pPl); } return Acad::eOk; } void AecDbXRoof::SetPolyPath(AcDbPolyline* pPl) { AssertWriteEnabled(); if (pPl == NULL) return; if (m_SlopeRoofImpl != NULL) { if (m_nRoofStyle == AecDbXRoof::kDualRoof) { XPoly2D poly; poly.SetAcDbCurve(pPl); if (poly.PathArea()>0) { poly.Reverse(); } poly.Compress(); ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline = poly; } else { XPoly2D polyPath; polyPath.SetAcDbCurve(pPl); XPoly2D polyDest(1); polyPath.Disperse(polyDest); ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline = polyDest; } } } bool AecDbXRoof::GetPolyPath(AcDbPolyline*& pPl) const { assertReadEnabled(); if (m_SlopeRoofImpl != NULL) { if (((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline.Length() > 0) pPl = (AcDbPolyline*)((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline.AsAcDbCurve(); } if (m_nRoofStyle == kMountRoof) { XPoly2D poly; poly.SetFlag(1); poly.Reset(); double dHeight=0;//屋檐产生的高差 dHeight=GetEavesLen()*tan(GetSlopeAngle1()); XPoint pt=GetLocation(); pt.z -= (dHeight+m_dSlabThick); ads_polar(pt,m_dRotation+PI,GetMountLen(),pt); ads_polar(pt,m_dRotation-PI*0.5,GetEavesLen(),pt); poly.AppendNode(pt); //屋顶左下角点 ads_polar(pt,m_dRotation,GetMountLen()*2+GetLength(),pt); poly.AppendNode(pt); //屋顶右下角点 ads_polar(pt,m_dRotation+PI*0.5,GetEavesLen()*2+GetWidth(),pt); poly.AppendNode(pt); //屋顶右上角点 ads_polar(pt,m_dRotation+PI,GetMountLen()*2+GetLength(),pt); poly.AppendNode(pt); //屋顶左上角点 pPl = (AcDbPolyline*)poly.AsAcDbCurve(); } else if (m_nRoofStyle == kCuspRoof) { XPoly2D poly; poly.SetFlag(1); poly.Reset(); double nAngle=PI*2.0/m_nSideNum; if(GetRadius()<_DIST_SNAP || m_nSideNum < 2) return false; double dEaves=GetEavesLen()/cos(PI/GetSideNum()); XPoint ptCenter=m_ptCenter; ptCenter.z-=((GetRoofHeight()-m_dSlabThick)*GetEavesLen()/(GetRadius()*cos(PI/GetSideNum()))+m_dSlabThick); for(long i=0;im_polyOutline; if (pl.Length() > 0) { return pl[0].z; } if (m_nRoofStyle == kMountRoof) return m_ptLocation.z; if (m_nRoofStyle == kCuspRoof) return m_ptCenter.z; return 0.0; } void AecDbXRoof::SetElevation(double dE) { AssertWriteEnabled(); ((TSlopeRoof*)m_SlopeRoofImpl)->SetElevation(dE); m_ptLocation.z = dE; m_ptCenter.z = dE; } void AecDbXRoof::SetEqualAngle(Adesk::Boolean bEqual) { AssertWriteEnabled(); m_bEqualAngle=bEqual; } Adesk::Boolean AecDbXRoof::IsEqualAngle() const { assertReadEnabled(); return m_bEqualAngle; } double AecDbXRoof::GetAngleLeft() const { assertReadEnabled(); return m_dAngleLeft; } double AecDbXRoof::GetAngleRight() const { assertReadEnabled(); return m_dAngleRight; } void AecDbXRoof::SetAngle(double a1,double a2) { AssertWriteEnabled(); m_dAngleLeft=a1;m_dAngleRight=a2; } AcGePoint3d AecDbXRoof::GetLocation() const { assertReadEnabled(); return m_ptLocation; } void AecDbXRoof::SetLocation(const AcGePoint3d &pt) { AssertWriteEnabled(); m_ptLocation = pt; } double AecDbXRoof::GetRotation() const { assertReadEnabled(); return m_dRotation; } void AecDbXRoof::SetRotation(double dRot) { AssertWriteEnabled(); m_dRotation = dRot; } double AecDbXRoof::GetEavesLen()const { assertReadEnabled(); return m_dEavesLen; } void AecDbXRoof::SetEavesLen(double dE) { AssertWriteEnabled(); m_dEavesLen=dE; } void AecDbXRoof::SetRoofType(Adesk::UInt16 nRoofType) { AssertWriteEnabled(); m_nRoofType = nRoofType; } Adesk::UInt16 AecDbXRoof::GetRoofType() const { assertReadEnabled(); return m_nRoofType; } double AecDbXRoof::GetMountLen() const { assertReadEnabled(); double dMountLen=0; if (GetRoofHeight() - GetMountHeight() < _DIST_SNAP || fabs(cos(GetSlopeAngle2()))< 1E-3 )//人字坡 { return m_dMountLen; } else { dMountLen = GetEavesLen()*tan(GetSlopeAngle1()) / tan(GetSlopeAngle2()); } return dMountLen; } void AecDbXRoof::SetMountLen(double dL) { AssertWriteEnabled(); m_dMountLen = dL; } double AecDbXRoof::GetLength()const { assertReadEnabled(); return m_dLength; } void AecDbXRoof::SetLength(double dL) { AssertWriteEnabled(); if(dL>_DIST_SNAP) m_dLength=dL; } double AecDbXRoof::GetWidth()const { assertReadEnabled(); return m_dWidth; } void AecDbXRoof::SetWidth(double dW) { AssertWriteEnabled(); if(dW>_DIST_SNAP) m_dWidth=dW; } double AecDbXRoof::GetRadius() const { assertReadEnabled(); return m_dRadius; } void AecDbXRoof::SetRadius(double r) { AssertWriteEnabled(); m_dRadius=r; } void AecDbXRoof::SetSideNum(Adesk::UInt8 num) { AssertWriteEnabled(); m_nSideNum = num; } long AecDbXRoof::GetSideNum()const { assertReadEnabled(); return m_nSideNum; } double AecDbXRoof::GetSlopeAngle(int idx) const { assertReadEnabled(); return ((TSlopeRoof*)m_SlopeRoofImpl)->GetSlopeAngle(idx); } void AecDbXRoof::SetSlopeAngle(int idx, double nAngle) { AssertWriteEnabled(); ((TSlopeRoof*)m_SlopeRoofImpl)->SetSlopeAngle(idx,nAngle); } double AecDbXRoof::GetSlopeAngle1()const { assertReadEnabled(); double nSlopeAngle1=PI/6.0; if(GetWidth()>_DIST_SNAP) { nSlopeAngle1=atan(GetRoofHeight()*2/GetWidth()); } return nSlopeAngle1; } void AecDbXRoof::SetSlopeAngle1(double dA) { AssertWriteEnabled(); if(dA>0) m_dSlopeAngle1=dA; } double AecDbXRoof::GetSlopeAngle2()const { assertReadEnabled(); return m_dSlopeAngle2; } void AecDbXRoof::SetSlopeAngle2(double dA) { AssertWriteEnabled(); if(dA>0) m_dSlopeAngle2=dA; } double AecDbXRoof::GetMountHeight() const { assertReadEnabled(); return m_dMountHeight; } void AecDbXRoof::SetMountHeight(double dH) { assertWriteEnabled(); m_dMountHeight=dH; } double AecDbXRoof::GetTopLength() const { assertReadEnabled(); double dTopLength=0; if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP||fabs(cos(GetSlopeAngle2()))<1E-3) { dTopLength=GetMountLen()*2+GetLength(); } else { double dDist=(GetRoofHeight()-GetMountHeight())/tan(GetSlopeAngle2()); if (GetLength()-dDist*2>_DIST_SNAP) { dTopLength=GetLength()-dDist*2; } } return dTopLength; } void AecDbXRoof::SetShowSide(Adesk::Boolean bTrue) { AssertWriteEnabled(); m_bShowSide=bTrue; } Adesk::Boolean AecDbXRoof::IsShowSide()const { assertReadEnabled(); return m_bShowSide; } AcGePoint3d AecDbXRoof::GetCenter() const { assertReadEnabled(); return m_ptCenter; } void AecDbXRoof::SetCenter(AcGePoint3d pt) { AssertWriteEnabled(); m_ptCenter=pt; } void AecDbXRoof::CallFromJigUpdate(int nRoofType,int nPromptCounter,const AcGePoint3d& ptLoc,const AcGePoint3d& ptRightDown,const AcGePoint3d& ptRightUp) { switch (nPromptCounter) { case 0: { AcGePoint3d pt1,pt2; pt1=ptRightDown; pt2=ptLoc; pt1.z=pt2.z=0; XVector3D vtRot=pt1-pt2; vtRot.z=0; double rot=CT_std_angle(ads_angle(XPoint(),vtRot)-ads_angle(XPoint(),XVector3D(1,0,0))); this->SetRotation(rot); double length=pt1.distanceTo(pt2); this->SetLength(length); this->SetWidth(length*0.5); if (nRoofType == 3 && length > 0 ) { this->SetSlopeAngle2(atan(this->GetRoofHeight()*2.0/length)); } break; } case 1: { AcGeVector3d offset=ptRightUp-ptRightDown; XVector3D vtOffset=ptRightUp-ptRightDown; vtOffset.z = 0; double nVtRot=CT_std_angle(ads_angle(XPoint(), vtOffset)-this->GetRotation()); double nIncLen=ads_distance(XPoint(), vtOffset) * sin(nVtRot); if (nIncLen>_DIST_SNAP) { this->SetWidth(nIncLen); } break; } default: break; } } bool AecDbXRoof::ExploreToFaces(AcDbVoidPtrArray& arFacePtrs) const { switch(m_nRoofStyle) { case kSlopeRoof: { DrawSlopeRoof3d(NULL,&arFacePtrs); break; } case kDualRoof: { DrawDualRoof3d(NULL,&arFacePtrs); break; } case kMountRoof: { DrawMountRoof3d(NULL,&arFacePtrs); break; } case kCuspRoof: { DrawCuspRoof3d(NULL,&arFacePtrs); break; } default: break; } return true; } bool AecDbXRoof::HitGetPlane(AcGePoint3d& ptHit,AcDbVoidPtrArray& entSet,AcGePlane& plane) { return TSlopeRoof::HitGetPlane(ptHit,entSet,plane); } Acad::ErrorStatus AecDbXRoof::Draw2d(AcGiDraw &dc) const { assertReadEnabled(); //管线系统屏蔽掉 if ( dc.IsDragging() ) { //return Acad::eOk; } AcDbObjectId idCurLay = dc.GetLayerId(); Adesk::UInt16 nCrBk = colorIndex(); dc.SetLayer(layerId()); if (Has2DBuffer()) { AcDbEntity* pEnt = NULL; const AcDbVoidPtrArray &ar2D = Get2DBuffer(); for (int i = 0;i < ar2D.length();i++) { pEnt = (AcDbEntity*)ar2D.at(i); dc.SetColor(pEnt->colorIndex()); dc.DrawEntity(*pEnt); } dc.SetColor(nCrBk); return Acad::eOk; } switch(m_nRoofStyle) { case kSlopeRoof: { DrawSlopeRoof2d(dc); break; } case kDualRoof: { DrawDualRoof2d(dc); break; } case kMountRoof: { DrawMountRoof2d(dc); break; } case kCuspRoof: { DrawCuspRoof2d(dc); break; } default: break; } return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::Draw3d(AcGiDraw &dc) const { assertReadEnabled(); //管线系统屏蔽掉 if ( dc.IsDragging() ) { //return Acad::eOk; } //图层 AcDbObjectId idLay = dc.GetLayerId(); dc.SetLayer(layerId()); int nCrBk = dc.GetColor(); if (Has3DBuffer()) { //Clean3DBuffer(); AcDbEntity* pEnt = NULL; const AcDbVoidPtrArray &ar3D = Get3DBuffer(); for (int i = 0;i < ar3D.length();i++) { pEnt = (AcDbEntity*)ar3D.at(i); dc.SetColor(pEnt->colorIndex()); dc.DrawEntity(*pEnt); } dc.SetLayer(idLay); dc.SetColor(nCrBk); return Acad::eOk; } deleteContainerOfStd(m_solids); deleteContainerOfStd(m_pipes); switch(m_nRoofStyle) { case kSlopeRoof: { DrawSlopeRoof3d(&dc); break; } case kDualRoof: { DrawDualRoof3d(&dc); break; } case kMountRoof: { DrawMountRoof3d(&dc); break; } case kCuspRoof: { DrawCuspRoof3d(&dc); break; } default: break; } return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::dwgInFields (AcDbDwgFiler* pFiler) { AssertWriteEnabled(); //----- Read parent class information first. Acad::ErrorStatus es = Acad::eOk; if ( !pFiler->isKindOf(CMFCDbDwgFiler::desc())) { es = AecDbEntityBase::dwgInFields (pFiler) ; if ( es != Acad::eOk ) return (es) ; } //----- Object version number needs to be read first Adesk::UInt32 version =0 ; if ( (es = pFiler->readUInt32 (&version)) != Acad::eOk ) return (es) ; if ( version > AecDbXRoof::kCurrentVersionNumber ) return (Acad::eMakeMeProxy); Adesk::UInt8 nStyle = 0; pFiler->readItem(&nStyle); m_nRoofStyle=(RoofStyle)nStyle; RoofBaseDwgin(pFiler); switch(m_nRoofStyle) { case kSlopeRoof: { SlopeRoofDwgIn(pFiler); break; } case kDualRoof: { DualRoofDwgIn(pFiler); break; } case kMountRoof: { MountRoofDwgIn(pFiler); break; } case kCuspRoof: { CuspRoofDwgIn(pFiler); break; } default: break; } m_mapSpecXData.dwgInFields(pFiler); return pFiler->filerStatus(); } Acad::ErrorStatus AecDbXRoof::RoofBaseDwgin(AcDbDwgFiler* pFiler) { pFiler->readItem(&m_idTopFaceLayer); pFiler->readItem(&m_idBotFaceLayer); pFiler->readItem(&m_idSlabLayer); pFiler->readItem(&m_idRidgeLayer); pFiler->readItem(&m_dSlabThick); pFiler->readItem(&m_dRidgeWidth); pFiler->readItem(&m_dRidgeHeight); Adesk::UInt8 nStyle; pFiler->readItem(&nStyle); m_nRidgeStyle=(RidgeStyle)nStyle; Adesk::Int32 nLen = 0; pFiler->readItem(&nLen); m_arAssocPartEntIds.removeAll(); for(int i=0;ireadItem(&id); m_arAssocPartEntIds.append(id); } return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::SlopeRoofDwgIn(AcDbDwgFiler* pFiler) { double nElev=0.0; pFiler->readItem(&nElev); Adesk::UInt16 nEdgeNum=0; pFiler->readItem(&nEdgeNum); ((TSlopeRoof*)m_SlopeRoofImpl)->Reset(); for(Adesk::UInt16 i=0; ireadItem(&ptVertex); pFiler->readItem(&nSlope); ptVertex[2]=nElev; ((TSlopeRoof*)m_SlopeRoofImpl)->AppendEdge(XPoint(ptVertex), nSlope); } double fMaxHeight = 0.0; pFiler->readItem(&fMaxHeight); ((TSlopeRoof*)m_SlopeRoofImpl)->m_fMaxHeight = fMaxHeight; //出檐长 pFiler->readItem(&m_dEavesLen); return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::DualRoofDwgIn(AcDbDwgFiler* pFiler) { assertWriteEnabled(); XPoly2D& pl = ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline; double nElev; pFiler->readItem(&nElev); ReadPoly2D(pFiler,pl); pl.SetElevation(nElev); pFiler->readItem(&m_ptRidge1); pFiler->readItem(&m_ptRidge2); pFiler->readItem(&m_dAngleLeft); pFiler->readItem(&m_dAngleRight); pFiler->readItem(&m_bEqualAngle); pFiler->readItem(&m_bHeightLim); pFiler->readItem(&m_dRoofHeight); return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::MountRoofDwgIn(AcDbDwgFiler* pFiler) { assertWriteEnabled(); pFiler->readItem(&m_ptLocation); pFiler->readItem(&m_dRotation); pFiler->readItem(&m_dLength); pFiler->readItem(&m_dWidth); pFiler->readItem(&m_dSlopeAngle2); pFiler->readItem(&m_dEavesLen); pFiler->readItem(&m_dMountLen); pFiler->readItem(&m_dRoofHeight); pFiler->readItem(&m_dMountHeight); pFiler->readItem(&m_bShowSide); pFiler->readUInt16(&m_nRoofType); return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::CuspRoofDwgIn(AcDbDwgFiler* pFiler) { assertReadEnabled(); pFiler->readItem(&m_ptCenter); pFiler->readItem(&m_dRotation); pFiler->readItem(&m_dRoofHeight); pFiler->readItem(&m_dRadius); pFiler->readItem(&m_nSideNum); pFiler->readItem(&m_dEavesLen); return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); //----- Save parent class information first. Acad::ErrorStatus es = Acad::eOk; if ( !pFiler->isKindOf(CMFCDbDwgFiler::desc())) { es = AecDbEntityBase::dwgOutFields (pFiler) ; if ( es != Acad::eOk ) return (es) ; } //----- Object version number needs to be saved first if ( (es =pFiler->writeUInt32 (AecDbXRoof::kCurrentVersionNumber)) != Acad::eOk ) return (es) ; Adesk::UInt8 nStyle = (Adesk::UInt8)m_nRoofStyle; pFiler->writeItem(nStyle); RoofBaseDwgOut(pFiler); switch(m_nRoofStyle) { case kSlopeRoof: { SlopeRoofDwgOut(pFiler); break; } case kDualRoof: { DualRoofDwgOut(pFiler); break; } case kMountRoof: { MountRoofDwgOut(pFiler); break; } case kCuspRoof: { CuspRoofDwgOut(pFiler); break; } default: break; } m_mapSpecXData.dwgOutFields(pFiler); return pFiler->filerStatus(); } Acad::ErrorStatus AecDbXRoof::RoofBaseDwgOut(AcDbDwgFiler* pFiler) const { pFiler->writeItem(m_idTopFaceLayer); pFiler->writeItem(m_idBotFaceLayer); pFiler->writeItem(m_idSlabLayer); pFiler->writeItem(m_idRidgeLayer); pFiler->writeItem(m_dSlabThick); pFiler->writeItem(m_dRidgeWidth); pFiler->writeItem(m_dRidgeHeight); pFiler->writeItem((Adesk::UInt8)m_nRidgeStyle); Adesk::Int32 nLen = m_arAssocPartEntIds.length(); pFiler->writeInt32(nLen); AcDbSoftPointerId id; for(int i=0;i < nLen;i++) { id = m_arAssocPartEntIds.at(i); pFiler->writeItem(id); } return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::SlopeRoofDwgOut(AcDbDwgFiler* pFiler) const { double nElev=0.0; if(!!((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline) { const XPoly2D& pl = ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline; nElev = pl[0].z; } pFiler->writeItem(nElev); Adesk::UInt16 nTotalEdge = ((TSlopeRoof*)m_SlopeRoofImpl)->GetEdgeNum(); pFiler->writeItem(nTotalEdge); const XPoly2D& pl = ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline; int nLen = pl.Length(); const DList& slope = ((TSlopeRoof*)m_SlopeRoofImpl)->m_slope; double dSlope = 0.0; for(int i =0; i< nTotalEdge; i++) { pFiler->writeItem( pl[i].AsAcGePoint3d()); dSlope = slope[i]; pFiler->writeItem( dSlope ); } pFiler->writeItem(((TSlopeRoof*)m_SlopeRoofImpl)->m_fMaxHeight); //出檐长 pFiler->writeItem(m_dEavesLen); return Acad::eOk; } extern BOOL IsMirrorMatrix(ads_matrix mat); Acad::ErrorStatus AecDbXRoof::subTransformBy(const AcGeMatrix3d& xform) { AssertWriteEnabled(); if (m_nRoofStyle == kSlopeRoof) { ads_matrix mat; memcpy(mat, &xform, sizeof(ads_matrix)); double nElev=0.0; for(int i=0; i<((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline.Length(); i++) { XPoint *pt=((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline[i]; pt->TransformBy(mat); //以第一个顶点的z坐标为基准 if(i==0) { nElev = pt->z; } else { pt->z = nElev; } } if( IsMirrorMatrix(mat) && ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline.PathArea()>0) { ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline.Reverse(); ((TSlopeRoof*)m_SlopeRoofImpl)->m_slope.Reverse(); } } else if (m_nRoofStyle == kDualRoof) { ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline.TransformBy(xform); m_ptRidge1.transformBy(xform); m_ptRidge2.transformBy(xform); } else if (m_nRoofStyle == kMountRoof) { ads_point ptX,ptY; ads_polar(asDblArray(m_ptLocation), m_dRotation, GetLength(), ptX); ads_polar(asDblArray(m_ptLocation), m_dRotation+PI/2.0, GetWidth(), ptY); asPnt3d(ptX).transformBy(xform); asPnt3d(ptY).transformBy(xform); m_ptLocation.transformBy(xform); double dAng = CT_std_angle(ads_angle(asDblArray(m_ptLocation), ptY) - ads_angle(asDblArray(m_ptLocation), ptX)); if(fabs(dAng-PI*1.5)<_angSnap) { Exchange(m_ptLocation, asPnt3d(ptX)); } m_dRotation = ads_angle(asDblArray(m_ptLocation), ptX); } else if (m_nRoofStyle == kCuspRoof) { m_ptCenter.transformBy(xform); AcGeVector3d vt(cos(m_dRotation),sin(m_dRotation),0); vt.transformBy(xform); AcGeVector2d vt2d(vt.x,vt.y); m_dRotation=vt2d.angle(); } return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::DualRoofDwgOut(AcDbDwgFiler* pFiler) const { assertReadEnabled(); const XPoly2D& pl = ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline; int nLen = pl.Length(); double nElev=0; if(nLen > 0 ) nElev = pl[0].z; pFiler->writeItem(nElev); WritePoly2D(pFiler,pl); pFiler->writeItem(m_ptRidge1); pFiler->writeItem(m_ptRidge2); pFiler->writeItem(m_dAngleLeft); pFiler->writeItem(m_dAngleRight); pFiler->writeItem(m_bEqualAngle); pFiler->writeItem(m_bHeightLim); pFiler->writeItem(m_dRoofHeight); return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::MountRoofDwgOut(AcDbDwgFiler* pFiler) const { assertReadEnabled(); pFiler->writeItem(m_ptLocation); pFiler->writeItem(m_dRotation); pFiler->writeItem(m_dLength); pFiler->writeItem(m_dWidth); pFiler->writeItem(m_dSlopeAngle2); pFiler->writeItem(m_dEavesLen); pFiler->writeItem(m_dMountLen); pFiler->writeItem(m_dRoofHeight); pFiler->writeItem(m_dMountHeight); pFiler->writeItem(m_bShowSide); pFiler->writeUInt16(m_nRoofType); return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::CuspRoofDwgOut(AcDbDwgFiler* pFiler) const { pFiler->writeItem(m_ptCenter); pFiler->writeItem(m_dRotation); pFiler->writeItem(m_dRoofHeight); pFiler->writeItem(m_dRadius); pFiler->writeItem(m_nSideNum); pFiler->writeItem(m_dEavesLen); return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::dxfInFields (AcDbDxfFiler* pFiler) { return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::dxfOutFields(AcDbDxfFiler* pFiler) const { return Acad::eOk; } void AecDbXRoof::GetMountLine(AcGeLineSeg3d &leftLine,AcGeLineSeg3d &rightLine,AcGeLineSeg3d &midLine) const { XPoint pt = m_ptLocation; pt.z+=(GetRoofHeight()-m_dSlabThick); if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP||fabs(cos(GetSlopeAngle2()))<1E-3)//人字屋顶 { ads_polar(pt,m_dRotation+PI*0.5,GetWidth()*0.5,pt); ads_polar(pt,m_dRotation+PI,GetMountLen(),pt); XPoint ptS = pt; ads_polar(pt,m_dRotation,GetTopLength(),pt); midLine.set(ptS.AsAcGePoint3d(),pt.AsAcGePoint3d()); //屋脊线终点 } else if (GetMountHeight()<_DIST_SNAP) //四坡屋顶或攒尖屋顶 { double dDist=GetRoofHeight()/tan(GetSlopeAngle2());//侧坡在平面上的间距 ads_polar(pt,m_dRotation+PI*0.5,GetWidth()*0.5,pt); ads_polar(pt,m_dRotation,dDist,pt); XPoint ptS = pt; ads_polar(pt,m_dRotation,GetTopLength(),pt); midLine.set(ptS.AsAcGePoint3d(),pt.AsAcGePoint3d()); //屋脊线终点 } else //歇山屋顶 { double dWidth=GetMountHeight()/tan(GetSlopeAngle1());//歇山半宽 double dDist=(GetRoofHeight()-GetMountHeight())/tan(GetSlopeAngle2());//侧坡在平面上的间距 pt.z-=GetMountHeight(); ads_polar(pt,m_dRotation,dDist,pt); ads_polar(pt,m_dRotation+PI*0.5,GetWidth()*0.5-dWidth,pt); XPoint ptS = pt; ads_polar(pt,m_dRotation+PI*0.5,dWidth*2,pt); leftLine.set(ptS.AsAcGePoint3d(),pt.AsAcGePoint3d()); //歇山左上角点 ads_polar(asDblArray(leftLine.startPoint()),m_dRotation,GetLength()-dDist*2,pt); ptS = pt; ads_polar(asDblArray(leftLine.endPoint()),m_dRotation,GetLength()-dDist*2,pt); rightLine.set(ptS.AsAcGePoint3d(),pt.AsAcGePoint3d()); //歇山右上角点 Midpoint(asDblArray(leftLine.startPoint()),asDblArray(leftLine.endPoint()),pt); pt.z=GetLocation().z+GetRoofHeight()-m_dSlabThick; ptS = pt; ads_polar(pt,m_dRotation,GetLength()-dDist*2,pt); midLine.set(ptS.AsAcGePoint3d(),pt.AsAcGePoint3d()); //屋脊线终点 } } Acad::ErrorStatus AecDbXRoof::subGetGripPoints(AcGePoint3dArray& gripPoints,AcDbIntArray& osnapModes,AcDbIntArray& geomIds) const { assertReadEnabled(); AcGeVector3d vtNormal; XPoly2D polyPath; ((TSlopeRoof*)m_SlopeRoofImpl)->GetPathPoly(polyPath,vtNormal); int nVertexCount = polyPath.Length(); for(int i=0; i_DIST_SNAP) //四坡,歇山 { gripPoints.append(midLine.StartPoint()); //脊线长 gripPoints.append(midLine.EndPoint()); //脊线长 } } } else if (m_nRoofStyle == kCuspRoof) { gripPoints.append(m_ptCenter); ads_point ptFirst; ads_polar(asDblArray(m_ptCenter),m_dRotation,m_dRadius,ptFirst); gripPoints.append(asPnt3d(ptFirst)); ads_polar(asDblArray(m_ptCenter),m_dRotation+PI/m_nSideNum,m_dRadius*cos(PI/m_nSideNum)+m_dEavesLen,ptFirst); gripPoints.append(asPnt3d(ptFirst)); } return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::subMoveGripPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset) { AssertWriteEnabled(); if (m_nRoofStyle == kDualRoof) { AcDbIntArray indices2; for(long i=0;im_polyOutline.Length()*2; if(iGrip>=0) { if(iGrip==0) m_ptRidge1+=offset; else if(iGrip==1) m_ptRidge2+=offset; else { m_ptRidge1+=offset; m_ptRidge2+=offset; } } else indices2.append(indices[i]); } AcGeVector3d offset1=offset; offset1.z=0; } //RoofBase XVector3D vtNormal; XPoly2D polyPath; ((TSlopeRoof*)m_SlopeRoofImpl)->GetPathPoly(polyPath,vtNormal); int nVertexCount = polyPath.Length(); if (nVertexCount > 0) { XPoint vtOffset=Wcs2Ecs(*(XPoint *)&offset, vtNormal); for (int i = 0; i < indices.length(); i++) { int idx = indices[i]; if(idx=0 && nPrev=0 && nNext1.0E-5) { XArc prevArc=prevSeg.GetArc(); double nAngBeg=ads_angle(prevArc.GetCenterPt(), prevSeg.StartPoint()); double nAngEnd=ads_angle(prevArc.GetCenterPt(), ptStart); if(prevSeg.IsMinusArc()) { nPrevBulge=-CT_std_angle(nAngBeg-nAngEnd); } else { nPrevBulge=CT_std_angle(nAngEnd-nAngBeg); } } if(fabs(nextSeg.GetBulge())>1.0E-5) { XArc nextArc=nextSeg.GetArc(); double nAngBeg=ads_angle(nextArc.GetCenterPt(), ptEnd); double nAngEnd=ads_angle(nextArc.GetCenterPt(), nextSeg.EndPoint()); if(nextSeg.IsMinusArc()) { nNextBulge=-CT_std_angle(nAngBeg-nAngEnd); } else { nNextBulge=CT_std_angle(nAngEnd-nAngBeg); } } *poly2d[nEdgeIndex] = ptStart; if(nNext>=0 && nNext=0 && nPrevz = polyPath[n]->z; } polyPath = poly2d; } } } ((TSlopeRoof*)m_SlopeRoofImpl)->SetPathPoly(polyPath,vtNormal); } if( m_bHeightLim && m_dRoofHeight >_DIST_SNAP) { double angLeft(0),angRight(0); if(CalAngle(angLeft,angRight)) { m_dAngleLeft=angLeft; m_dAngleRight=angRight; } } if (m_nRoofStyle == kMountRoof) { XPoint vtOffset=*(XPoint *)&offset; vtOffset.z = 0; double nVtRot=CT_std_angle(ads_angle(XPoint(), vtOffset)-m_dRotation); double nIncWidth=ads_distance(XPoint(), vtOffset) * cos(nVtRot); double nIncLen=ads_distance(XPoint(), vtOffset) * sin(nVtRot); int nLen=indices.length(); for (int i = 0; i < nLen; i++) { int idx = indices[i]; switch(idx) { case 0: if( g_bCtrlToggle1[5] ) //移动 { m_ptLocation += vtOffset; } else //旋转 { XPoint ptCenter=GetLocation(); ptCenter.z=0; ads_polar(ptCenter,m_dRotation,0.5*GetLength(),ptCenter); ads_polar(ptCenter,m_dRotation+PI*0.5,0.5*GetWidth(),ptCenter); ads_matrix mat; ptCenter.GetRotationMatrix(AcGeVector2d(offset.x,offset.y).angle(),mat); subTransformBy(AsAcGeMatrix3d(mat)); } break; case 1: //拉伸 { if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP ||fabs(cos(GetSlopeAngle2()))<1E-3) //人字坡 { if(((m_dLength-nIncWidth)>_DIST_SNAP) //脊线长度>0 &&(m_dWidth-nIncLen)>_DIST_SNAP) { m_ptLocation += vtOffset; m_dLength -= nIncWidth; m_dWidth -= nIncLen; } } else //四坡,歇山,攒尖 { if (GetTopLength()<_DIST_SNAP //攒尖 &&m_dLength-nIncWidth>_DIST_SNAP &&m_dWidth-nIncLen>_DIST_SNAP ) { m_ptLocation += vtOffset; m_dLength -= nIncWidth; m_dWidth -= nIncLen; m_dSlopeAngle2=atan(GetRoofHeight()*2/GetLength()); } else if((((m_dLength-nIncWidth)*0.5)>(m_dRoofHeight-m_dMountHeight)/tan(GetSlopeAngle2())) //脊线长度>0 &&(m_dWidth-nIncLen)>_DIST_SNAP) { m_ptLocation += vtOffset; m_dLength -= nIncWidth; m_dWidth -= nIncLen; } } } break; case 2: //拉伸 { if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP ||fabs(cos(GetSlopeAngle2()))<1E-3) //人字坡 { if(((m_dLength+nIncWidth)>_DIST_SNAP) //脊线长度>0 &&(m_dWidth-nIncLen)>_DIST_SNAP) { ads_polar(asDblArray(m_ptLocation),m_dRotation+PI*0.5,nIncLen,asDblArray(m_ptLocation)); m_dLength += nIncWidth; m_dWidth -= nIncLen; } } else //四坡,歇山,攒尖 { if (GetTopLength()<_DIST_SNAP //攒尖 &&m_dLength+nIncWidth>_DIST_SNAP &&m_dWidth-nIncLen>_DIST_SNAP) { ads_polar(asDblArray(m_ptLocation),m_dRotation+PI*0.5,nIncLen,asDblArray(m_ptLocation)); m_dLength += nIncWidth; m_dWidth -= nIncLen; m_dSlopeAngle2=atan(GetRoofHeight()*2/GetLength()); } else if((((m_dLength+nIncWidth)*0.5)>(m_dRoofHeight-m_dMountHeight)/tan(GetSlopeAngle2())) //脊线长度>0 &&(m_dWidth-nIncLen)>_DIST_SNAP) { ads_polar(asDblArray(m_ptLocation),m_dRotation+PI*0.5,nIncLen,asDblArray(m_ptLocation)); m_dLength += nIncWidth; m_dWidth -= nIncLen; } } } break; case 3: //拉伸 { if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP ||fabs(cos(GetSlopeAngle2()))<1E-3) //人字坡 { if(((m_dLength+nIncWidth)>_DIST_SNAP) //脊线长度>0 &&(m_dWidth+nIncLen)>_DIST_SNAP) { m_dLength += nIncWidth; m_dWidth += nIncLen; } } else //四坡,歇山,攒尖 { if (GetTopLength()<_DIST_SNAP //攒尖 &&m_dLength+nIncWidth>_DIST_SNAP &&m_dWidth+nIncLen>_DIST_SNAP ) { m_dLength += nIncWidth; m_dWidth += nIncLen; m_dSlopeAngle2=atan(GetRoofHeight()*2/GetLength()); } else if((((m_dLength+nIncWidth)*0.5)>(m_dRoofHeight-m_dMountHeight)/tan(GetSlopeAngle2())) //脊线长度>0 &&(m_dWidth+nIncLen)>_DIST_SNAP) { m_dLength += nIncWidth; m_dWidth += nIncLen; } } } break; case 4: //拉伸 { if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP ||fabs(cos(GetSlopeAngle2()))<1E-3) //人字坡 { if(((m_dLength-nIncWidth)>_DIST_SNAP) //脊线长度>0 &&(m_dWidth+nIncLen)>_DIST_SNAP) { ads_polar(asDblArray(m_ptLocation),m_dRotation,nIncWidth,asDblArray(m_ptLocation)); m_dLength -= nIncWidth; m_dWidth += nIncLen; } } else //四坡,歇山,攒尖 { if (GetTopLength()<_DIST_SNAP //攒尖 &&m_dLength-nIncWidth>_DIST_SNAP &&m_dWidth+nIncLen>_DIST_SNAP ) { ads_polar(asDblArray(m_ptLocation),m_dRotation,nIncWidth,asDblArray(m_ptLocation)); m_dLength -= nIncWidth; m_dWidth += nIncLen; m_dSlopeAngle2=atan(GetRoofHeight()*2/GetLength()); } else if((((m_dLength-nIncWidth)*0.5)>(m_dRoofHeight-m_dMountHeight)/tan(GetSlopeAngle2())) //脊线长度>0 &&(m_dWidth+nIncLen)>_DIST_SNAP) { ads_polar(asDblArray(m_ptLocation),m_dRotation,nIncWidth,asDblArray(m_ptLocation)); m_dLength -= nIncWidth; m_dWidth += nIncLen; } } } break; case 5: //调整出檐长 case 6: { double dIncLen=nIncLen; if(idx==6) dIncLen=-nIncLen; if(m_dEavesLen-dIncLen>_DIST_SNAP) { m_dEavesLen -= dIncLen; } else { m_dEavesLen = 0; } } break; case 7: //调整出山长 case 8: { double dIncWidth=nIncWidth; if(idx==8) dIncWidth=-nIncWidth; if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP ||fabs(cos(GetSlopeAngle2()))<1E-3) //人字坡 { if(m_dMountLen-dIncWidth>_DIST_SNAP) { m_dMountLen -= dIncWidth; } else if(m_dMountLen-dIncWidth<-_DIST_SNAP&&m_dMountLen-dIncWidth>-GetLength()*0.5-_DIST_SNAP)//可能改变为歇山或四坡或攒尖屋顶 { if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP)//仍为人字坡 { m_dMountLen = 0; } else if (fabs(cos(GetSlopeAngle2()))<1E-3) { if ( (fabs(m_dMountLen-dIncWidth)<_DIST_SNAP&&GetMountHeight()<_DIST_SNAP) //变为攒尖屋顶 ||(fabs(m_dMountLen-dIncWidth)>_DIST_SNAP ) ) //变为四坡或歇山屋顶) { m_dSlopeAngle2=atan((GetRoofHeight()-GetMountHeight())*2/fabs(m_dMountLen-dIncWidth)); } } } else { m_dMountLen = 0; } } else { double dLen=dIncWidth*tan(GetSlopeAngle2())/tan(GetSlopeAngle1()); if(m_dEavesLen-dLen>_DIST_SNAP) { m_dEavesLen -= dLen; } else { m_dEavesLen = 0; } } } break; case 9: case 10: { double dIncWidth=nIncWidth; if (idx==10) { dIncWidth=-nIncWidth; } if (!(GetRoofHeight()-GetMountHeight()<_DIST_SNAP ||fabs(cos(GetSlopeAngle2()))<1E-3)) //四坡,歇山,攒尖 { XLine leftLine, rightLine, midLine; AcGeLineSeg3d lLn,rLn,mLn; GetMountLine(lLn,rLn,mLn); leftLine.SetPoints(lLn.startPoint(),lLn.endPoint()); rightLine.SetPoints(rLn.startPoint(),rLn.endPoint()); midLine.SetPoints(mLn.startPoint(),mLn.endPoint()); midLine.SetElevation(0); if (GetMountHeight()<_DIST_SNAP) //四坡 { if (midLine.GetLength()-dIncWidth*2<_DIST_SNAP)//变为攒尖屋顶 { m_dSlopeAngle2=atan(GetRoofHeight()*2/GetLength()); } else if(midLine.GetLength()-dIncWidth*2>GetLength()-_DIST_SNAP)//变为人字屋顶 { m_dSlopeAngle2=PI*0.5; m_dMountLen=0; } else { m_dSlopeAngle2=atan(GetRoofHeight()/(0.5*GetLength()-midLine.GetLength()*0.5+dIncWidth)); } } else //歇山 { if (midLine.GetLength()-dIncWidth*2<_DIST_SNAP)//歇山屋顶脊线长为0时不能直接变为攒尖屋顶 { //m_nSlopeAngle2=atan(GetRoofHeight()*2/GetLength()); } else if(midLine.GetLength()-dIncWidth*2>GetLength()-_DIST_SNAP)//变为人字屋顶 { m_dSlopeAngle2=PI*0.5; m_dMountLen=0; } else { m_dSlopeAngle2=atan((GetRoofHeight()-GetMountHeight())/(0.5*GetLength()-midLine.GetLength()*0.5+dIncWidth)); } } } } break; default: break; } } } else if (m_nRoofStyle == kCuspRoof) { for(long i=0;i_DIST_SNAP) { m_dEavesLen+=nIncWidth; } else if(fabs(m_dEavesLen+nIncWidth)<_DIST_SNAP) { m_dEavesLen = 0; } } } } return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const { assertReadEnabled(); AcGeVector3d vtNormal; XPoly2D polyPath; ((TSlopeRoof*)m_SlopeRoofImpl)->GetPathPoly(polyPath,vtNormal); int nVertexCount=polyPath.Length(); if (nVertexCount > 0) { for(int i=0; iGetPathPoly(polyPath,vtNormal); int nVertexCount = polyPath.Length(); if (nVertexCount > 0) { XPoint vtOffset=Wcs2Ecs(*(XPoint *)&offset, vtNormal); for (int i = 0; i < indices.length(); i++) { int idx = indices[i]; if(idxSetPathPoly(polyPath,vtNormal); } if (m_nRoofStyle == kMountRoof) { XPoint vtOffset=*(XPoint *)&offset; vtOffset.z = 0; double nVtRot=CT_std_angle(ads_angle(XPoint(), vtOffset)-m_dRotation); double nIncWidth=ads_distance(XPoint(), vtOffset) * cos(nVtRot); double nIncLen=ads_distance(XPoint(), vtOffset) * sin(nVtRot); int nLen=indices.length(); if(nLen>1) { m_ptLocation += vtOffset; } else if(nLen==1) { int idx=indices[0]; switch(idx) { case 1: { if(m_dWidth-nIncLen>_DIST_SNAP) { m_dWidth -= nIncLen; ads_polar(asDblArray(m_ptLocation),m_dRotation+PI*0.5,nIncLen,asDblArray(m_ptLocation)); } } break; case 2: { if(m_dWidth+nIncLen>_DIST_SNAP) { m_dWidth += nIncLen; } } break; case 3: { if(m_dLength-nIncWidth>_DIST_SNAP) { if ( GetRoofHeight()-GetMountHeight()<_DIST_SNAP ||fabs(cos(GetSlopeAngle2()))<1E-3) //人字坡 { m_dLength -= nIncWidth; ads_polar(asDblArray(m_ptLocation),m_dRotation,nIncWidth,asDblArray(m_ptLocation)); } else //四坡,歇山,攒尖 { if (GetTopLength()<_DIST_SNAP) //攒尖 { m_dLength -= nIncWidth; m_dSlopeAngle2=atan(GetRoofHeight()*2/GetLength()); ads_polar(asDblArray(m_ptLocation),m_dRotation,nIncWidth,asDblArray(m_ptLocation)); } else if((((m_dLength-nIncWidth)*0.5)>(m_dRoofHeight-m_dMountHeight)/tan(GetSlopeAngle2())) //脊线长度>0 ) { m_dLength -= nIncWidth; ads_polar(asDblArray(m_ptLocation),m_dRotation,nIncWidth,asDblArray(m_ptLocation)); } } } } break; case 4: if(m_dLength+nIncWidth>_DIST_SNAP) { if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP ||fabs(cos(GetSlopeAngle2()))<1E-3) //人字坡 { m_dLength += nIncWidth; } else //四坡,歇山,攒尖 { if (GetTopLength()<_DIST_SNAP) //攒尖 { m_dLength += nIncWidth; m_dSlopeAngle2=atan(GetRoofHeight()*2/GetLength()); } else if((((m_dLength+nIncWidth)*0.5)>(m_dRoofHeight-m_dMountHeight)/tan(GetSlopeAngle2()))) //脊线长度>0 { m_dLength += nIncWidth; } } } break; default: m_ptLocation += vtOffset; } } } return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::subGetOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& ptPick, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const { assertReadEnabled(); if(osnapMode==AcDb::kOsModeNode) { XPoly2D polyPath; AcGeVector3d normal; ((TSlopeRoof*)m_SlopeRoofImpl)->GetPathPoly(polyPath,normal); for(int i=0; iGetPolyPath(poly); poly.SetElevation(0); XPoint pt; double dLowLeft = 0.0,dLowRight = 0.0; //到屋脊线的水平距离 for (long i = 0;i < poly.Length();i++) //距脊线的最远点 { pt = *poly[i]; int nSide=xLine.OnWhichSide(pt); double dTemp; if (nSide==0) //左侧 { dTemp = pt.Distance(&xLine); if (dLowLeft < dTemp) { dLowLeft = dTemp; } } else if(nSide==1) //右侧 { dTemp = pt.Distance(&xLine); if (dLowRight < dTemp) { dLowRight = dTemp; } } } if (fabs(dLowLeft-0.0) <= 1E-6 &&fabs(dLowRight-0.0) <= 1E-6) //没有左右坡 { return bRet; } if (fabs(dLowLeft-0.0) <= 1E-6) //没有左坡 { double dTempLow = 0.0; for (long i = 0;i < poly.Length();i++) { pt = *poly[i]; double dTemp = pt.Distance(&xLine); if (fabs(dTempLow-0.0) <= 1E-6) { dTempLow = dTemp; } else if (dTempLow > dTemp) { dTempLow = dTemp; } } dLowRight = dLowRight - dTempLow; if(dLowRight>_DIST_SNAP) { angLeft=angRight=atan(GetRoofHeight() / dLowRight); bRet = TRUE; } } else if(fabs(dLowRight-0.0) <= 1E-6) //没有右坡 { double dTempLow = 0.0; for (long i = 0;i < poly.Length();i++) { pt = *poly[i]; double dTemp = pt.Distance(&xLine); if (fabs(dTempLow-0.0) <= 1E-6) { dTempLow = dTemp; } else if (dTempLow > dTemp) { dTempLow = dTemp; } } dLowLeft = dLowLeft - dTempLow; if(dLowLeft>_DIST_SNAP) { angLeft=angRight=atan(GetRoofHeight() / dLowLeft); bRet = TRUE; } } else //左右坡都有 { angLeft=atan(GetRoofHeight() / dLowLeft); angRight=atan(GetRoofHeight() / dLowRight); bRet = TRUE; } return bRet; } void AecDbXRoof::CalAngle(ads_name entPl,ads_point ptFirst,ads_point ptSecond,double &dLeftAng,double &dRightAng,double dHeight) { XPoly2D poly(entPl); XLine xLine(ptFirst,ptSecond); xLine.SetElevation(0); poly.SetElevation(0); XPoint pt; double dLowLeft = 0.0,dLowRight = 0.0; for (long i = 0;i < poly.Length();i++) { pt = *poly[i]; double dTemp; if (!xLine.OnWhichSide(pt)) { dTemp = pt.Distance(&xLine); if (fabs(dLowLeft-0.0) <= 1E-6) { dLowLeft = dTemp; } else if (dLowLeft < dTemp) { dLowLeft = dTemp; } } else { dTemp = pt.Distance(&xLine); if (fabs(dLowRight-0.0) <= 1E-6) { dLowRight = dTemp; } else if (dLowRight < dTemp) { dLowRight = dTemp; } } } if (fabs(dLowLeft-0.0) <= 1E-6) { double dTempLow = 0.0; for (long i = 0;i < poly.Length();i++) { pt = *poly[i]; double dTemp; dTemp = pt.Distance(&xLine); if (fabs(dTempLow-0.0) <= 1E-6) { dTempLow = dTemp; } else if (dTempLow > dTemp) { dTempLow = dTemp; } } dLowRight = dLowRight - dTempLow; { double dTemp = dHeight / dLowRight; dTemp = atan(dTemp); dLeftAng = dRightAng = (dTemp * 180.0) / PI; } } else if (fabs(dLowRight-0.0) <= 1E-6) { double dTempLow = 0.0; for (long i = 0;i < poly.Length();i++) { pt = *poly[i]; double dTemp; dTemp = pt.Distance(&xLine); if (fabs(dTempLow-0.0) <= 1E-6) { dTempLow = dTemp; } else if (dTempLow > dTemp) { dTempLow = dTemp; } } dLowLeft = dLowLeft - dTempLow; { double dTemp = dHeight/ dLowLeft; dTemp = atan(dTemp); dRightAng = dLeftAng = (dTemp * 180.0) / PI; } } else { double dTemp; { dTemp = dHeight / dLowLeft; dTemp = atan(dTemp); dLeftAng = (dTemp * 180.0) / PI; } { dTemp = dHeight / dLowRight; dTemp = atan(dTemp); dRightAng = (dTemp * 180.0) / PI; } } } //2D Acad::ErrorStatus AecDbXRoof::DrawSlopeRoof2d(AcGiDraw &dc) const { const XPoly2D& pl = ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline; if (pl.Length() == 0) { acutPrintf(_T("屋顶多义线没有设置!")); return Acad::eOk; } XDraw xDc; ((TSlopeRoof*)m_SlopeRoofImpl)->GetGeometry2d(xDc, TRUE); AcDbVoidPtrArray arEntPtrs; xDc.GetDraw(arEntPtrs); AcDbObjectId idLayOld = dc.GetLayerId(); AcDbObjectId idLay = layerId(); dc.SetLayer(idLay); AcDbEntity* pEnt = NULL; for (int i = 0;i < arEntPtrs.length();i++) { pEnt = (AcDbEntity*)arEntPtrs.at(i); pEnt->setLayer(idLay); dc.DrawEntity(pEnt); Add2DBuffer(pEnt); } dc.SetLayer(idLayOld); return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::DrawDualRoof2d(AcGiDraw &dc) const { AcDbObjectId idLayOld = dc.GetLayerId(); AcDbObjectId idLay = layerId(); dc.SetLayer(idLay); Acad::ErrorStatus es=Acad::eOk; XPoly2D poly= ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline; const XPoly2D& pl = ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline; if (pl.Length() == 0) { acutPrintf(_T("屋顶多义线没有设置!")); return Acad::eOk; } poly.SetElevation(0); DList lstLnDraw,lstIn,lstOut; XLine line( asDblArray(m_ptRidge1),asDblArray(m_ptRidge2)); line.SetElevation(0); AcDbLine acLine(line.StartPoint(),line.EndPoint()); AcDbCurve* pCurveOutline=poly.AsAcDbCurve(); AcGePoint3dArray pts; pCurveOutline->intersectWith(&acLine,AcDb::kExtendArg,pts); delete pCurveOutline; if(pts.length()>1) { XPoint ptR1=m_ptRidge1; XPoint ptR2=m_ptRidge2; ptR1.z=ptR2.z=0; XPoint vt=ptR2-ptR1; vt.Normalize(); vt.Scale(_AS_SYS_UNIT(1E7)); PointList ptList(ptR1-vt,ptR2+vt); for(long i=0;i3) { line.StartPoint()=*ptList[1]; line.EndPoint()=*ptList[ptList.Length()-2]; line.SetElevation(0); XCurveSegment* pXCurSeg = new XCurveSegment; *pXCurSeg = line; lstLnDraw.Append(pXCurSeg); } } PolyClip(lstLnDraw,poly,lstIn,lstOut); AcDbCurve* pPl = poly.AsAcDbCurve(); if (pPl != NULL) { pPl->setLayer(idLay); dc.DrawEntity(pPl); Add2DBuffer(pPl); } for (int i = 0;i < lstIn.Length();i++) { XCurveSegment* pLn = lstIn.GetAt(i); AcDbCurve* pCrv = pLn->AsAcDbCurve(); if (pCrv != NULL) { pCrv->setLayer(idLay); dc.DrawEntity(pCrv); Add2DBuffer(pCrv); } } dc.SetLayer(idLayOld); return es; } Acad::ErrorStatus AecDbXRoof::DrawMountRoof2d(AcGiDraw &dc) const { assertReadEnabled(); if(GetLength()<_DIST_SNAP || GetWidth()<_DIST_SNAP) return Acad::eOk; AcDbObjectId idLayOld = dc.GetLayerId(); AcDbObjectId idLay = layerId(); dc.SetLayer(idLay); XDraw xDc; XPoly2D poly; AcDbPolyline* pPl = NULL; GetPolyPath(pPl); if (pPl != NULL) { poly.SetAcDbCurve(pPl); } poly.SetElevation(0); if (pPl != NULL) { pPl->setLayer(idLay); dc.DrawEntity(pPl); Add2DBuffer(pPl); } XLine leftLine, rightLine, midLine; AcGeLineSeg3d lLn,rLn,mLn; GetMountLine(lLn,rLn,mLn); leftLine.SetPoints(lLn.startPoint(),lLn.endPoint()); rightLine.SetPoints(rLn.startPoint(),rLn.endPoint()); midLine.SetPoints(mLn.startPoint(),mLn.endPoint()); midLine.SetElevation(0); if(midLine.GetLength()>_DIST_SNAP) xDc.DrawLine(midLine); if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP ||fabs(cos(GetSlopeAngle2()))<1E-3) //人字屋顶 { } else if (GetMountHeight()<_DIST_SNAP) //四坡屋顶或攒尖屋顶 { if(poly.Length()==4) { xDc.DrawLine(XLine(midLine.StartPoint(),*poly[0])); xDc.DrawLine(XLine(midLine.EndPoint(),*poly[1])); xDc.DrawLine(XLine(midLine.EndPoint(),*poly[2])); xDc.DrawLine(XLine(midLine.StartPoint(),*poly[3])); } } else //歇山屋顶 { leftLine.SetElevation(0); if(leftLine.GetLength()>_DIST_SNAP) xDc.DrawLine(XLine(leftLine.StartPoint(),leftLine.EndPoint())); rightLine.SetElevation(0); if(rightLine.GetLength()>_DIST_SNAP) xDc.DrawLine(rightLine); if(poly.Length()==4) { xDc.DrawLine(XLine(leftLine.StartPoint(),*poly[0])); xDc.DrawLine(XLine(leftLine.EndPoint(),*poly[3])); xDc.DrawLine(XLine(rightLine.StartPoint(),*poly[1])); xDc.DrawLine(XLine(rightLine.EndPoint(),*poly[2])); } } AcDbVoidPtrArray arEntPtrs; xDc.GetDraw(arEntPtrs); AcDbEntity* pEnt = NULL; for (int i = 0;i < arEntPtrs.length();i++) { pEnt = (AcDbEntity*)arEntPtrs.at(i); pEnt->setLayer(idLay); dc.DrawEntity(pEnt); Add2DBuffer(pEnt); } dc.SetLayer(idLayOld); return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::DrawCuspRoof2d(AcGiDraw &dc) const { assertReadEnabled(); AcDbObjectId idLayOld = dc.GetLayerId(); AcDbObjectId idLay = layerId(); dc.SetLayer(idLay); XDraw xDc; Acad::ErrorStatus es=Acad::eOk; XPoly2D poly; AcDbPolyline* pPl = NULL; GetPolyPath(pPl); if (pPl != NULL) { poly.SetAcDbCurve(pPl); } poly.SetElevation(0); if (pPl != NULL) { pPl->setLayer(idLay); dc.DrawEntity(pPl); Add2DBuffer(pPl); } for(long i=0;isetLayer(idLay); dc.DrawEntity(pEnt); Add2DBuffer(pEnt); } dc.SetLayer(idLayOld); return Acad::eOk; } //此两个函数待定有AcDbX3dSolid转换 extern AcDb3dSolid* FaceToSolid(AcDbFace* pFace, std::vector *pSos = NULL); AcDb3dSolid* SubDMeshToSolid(AcDbSubDMesh* pSDMesh , std::vector *pSos = NULL) { double dthick(5.0); AcDb3dSolid* pSolid = NULL; if (pSDMesh != NULL) { AcDbSurface* pSurface = NULL; pSDMesh->convertToSurface(false,false,pSurface); if (pSurface != NULL) { pSurface->thicken(dthick, false, pSolid); if (pSos) { AcArray regs; pSurface->convertToRegion(regs); if (!regs.isEmpty()) { // 只取第一个 for (int i(0); i < regs.length(); ++i) { AcDbRegion *pReg = AcDbRegion::cast(regs[i]->clone()); if (pReg) { double d; AcGePlane pln; AcGePoint3d pt; AcGeVector3d vt; pReg->getNormal(vt); CoreTools::getRegionInfo(pReg, pt, d, pln); vt.normalize(); vt *= dthick; AcDbX3dSolid *pSo = new AcDbX3dSolid(); pSo->CreateExtrude(pReg, AcDbLine(pt, pt + vt)); pSos->push_back(pSo); DELETE_PTR(pReg); } } deleteContainerOfArx(regs); } } delete pSurface; } } return pSolid; } Acad::ErrorStatus AecDbXRoof::DrawEntsToSolid(AcGiDraw* pDC,AcDbVoidPtrArray* pGetFaces,AcDbVoidPtrArray& arEntPtrs) const { AcDbEntity* pEnt = NULL; AcDb3dSolid* pSolid = NULL; for (int i = 0;i < arEntPtrs.length();i++) { pEnt = (AcDbEntity*)arEntPtrs.at(i); //Face,SubMesh To Solid !!! AcDbFace* pFace = AcDbFace::cast(pEnt); if (pFace != NULL) { pSolid = FaceToSolid(pFace, &m_solids); if (pSolid != NULL && pDC != NULL) { pSolid->setTransparency(transparency()); pDC->DrawEntity(pSolid); Add3DBuffer(pSolid); } //ASSERT(pDC != NULL && pGetFaces != NULL); if (pGetFaces != NULL) { pGetFaces->append(pFace); pEnt = NULL; } } AcDbSubDMesh* pSDMesh = AcDbSubDMesh::cast(pEnt); if (pSDMesh != NULL) { pSolid = SubDMeshToSolid(pSDMesh, &m_solids); if (pSolid != NULL && pDC != NULL) { pSolid->setTransparency(transparency()); pDC->DrawEntity(pSolid); Add3DBuffer(pSolid); } else { if (pSolid) delete pSolid; pSolid = NULL; } if (pGetFaces != NULL) { pSDMesh->explode(*pGetFaces); pEnt = NULL; } } if (pEnt != NULL) delete pEnt; } return Acad::eOk; } //3D Acad::ErrorStatus AecDbXRoof::DrawSlopeRoof3d(AcGiDraw* pDC,AcDbVoidPtrArray* pGetFaces) const { const XPoly2D& pl = ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline; if (pl.Length() == 0) { acutPrintf(_T("屋顶多义线没有设置!")); return Acad::eOk; } XDraw xDc; ((TSlopeRoof*)m_SlopeRoofImpl)->GetGeometry(xDc, TRUE); AcDbVoidPtrArray arEntPtrs; xDc.GetDraw(arEntPtrs); AcDbObjectId idLayOld; AcDbObjectId idLay = layerId(); if (pDC != NULL) { idLayOld = pDC->GetLayerId(); pDC->SetLayer(idLay); } // DrawEntsToSolid(pDC,pGetFaces,arEntPtrs); if (pDC != NULL) pDC->SetLayer(idLayOld); return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::DrawDualRoof3d(AcGiDraw* pDC,AcDbVoidPtrArray* pGetFaces) const { Acad::ErrorStatus es = Acad::eOk; XDraw xdc; XPoint vt=m_ptRidge2-m_ptRidge1; vt.Normalize(); vt.Scale(_AS_SYS_UNIT(5E6)); XPoint ptT1 = m_ptRidge1-vt.AsAcGeVector3d(); XPoint ptT2 = m_ptRidge2+vt.AsAcGeVector3d(); XCurveSegment line(ptT1,ptT2,0); line.SetElevation(0); const XPoly2D& pl = ((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline; if (pl.Length() == 0) { acutPrintf(_T("屋顶多义线没有设置!")); return Acad::eOk; } double dEl = pl[0].z; DList lstLeft,lstRight; Split(lstLeft,lstRight,m_ptRidge1,m_ptRidge2,((TSlopeRoof*)m_SlopeRoofImpl)->m_polyOutline); AcGeVector3d vtAxis=(m_ptRidge2-m_ptRidge1); { AcGeVector3d vt(AcGeVector3d::kZAxis); vt.rotateBy(-m_dAngleLeft,vtAxis); XPlane planeLeft(XPoint(m_ptRidge1.x,m_ptRidge1.y,dEl),vt); for(long i=0;iLength();j++) { XPoint *pPt=(*pPoly)[j]; pPt->z=-1*(planeLeft.GetParaA()*pPt->x+planeLeft.GetParaB()*pPt->y+planeLeft.GetParaD())/planeLeft.GetParaC(); poly1[j]->z=pPt->z-m_dSlabThick; } xdc.DrawShell(*pPoly); for(long k=0;kNth(k,e0); poly1.Nth(k,e1); X3DFace face; face.SetFlag(0); face.GetVertex(0)=e1.StartPoint(); face.GetVertex(1)=e1.EndPoint(); face.GetVertex(2)=e0.EndPoint(); face.GetVertex(3)=e0.StartPoint(); e0.SetElevation(0); int nRet0=line.HitTest2d(e0.StartPoint()); int nRet1=line.HitTest2d(e0.EndPoint()); if(nRet0==1||nRet0==2||nRet1==1||nRet1==2||lstRight.Length()==0) xdc.DrawFace(face); } poly1.Reverse(); xdc.DrawShell(poly1); } } { AcGeVector3d vt(AcGeVector3d::kZAxis); vt.rotateBy(m_dAngleRight,vtAxis); XPlane planeRight(XPoint(m_ptRidge1.x,m_ptRidge1.y,dEl),vt); for(long i=0;iLength();j++) { XPoint *pPt=(*pPoly)[j]; pPt->z=-1*(planeRight.GetParaA()*pPt->x+planeRight.GetParaB()*pPt->y+planeRight.GetParaD())/planeRight.GetParaC(); poly1[j]->z=pPt->z-m_dSlabThick; } xdc.DrawShell(*pPoly); for(long k=0;kNth(k,e0); poly1.Nth(k,e1); X3DFace face; face.SetFlag(0); face.GetVertex(0)=e1.StartPoint(); face.GetVertex(1)=e1.EndPoint(); face.GetVertex(2)=e0.EndPoint(); face.GetVertex(3)=e0.StartPoint(); e0.SetElevation(0); int nRet0=line.HitTest2d(e0.StartPoint()); int nRet1=line.HitTest2d(e0.EndPoint()); if(nRet0==1||nRet0==2||nRet1==1||nRet1==2||lstLeft.Length()==0) xdc.DrawFace(face); } poly1.Reverse(); xdc.DrawShell(poly1); } } AcDbVoidPtrArray arEntPtrs; xdc.GetDraw(arEntPtrs); AcDbObjectId idLay = layerId(); AcDbObjectId idLayOld = layerId(); if (pDC != NULL) { idLayOld = pDC->GetLayerId(); pDC->SetLayer(idLay); } DrawEntsToSolid(pDC,pGetFaces,arEntPtrs); if (pDC != NULL) pDC->SetLayer(idLayOld); return es; } Acad::ErrorStatus AecDbXRoof::DrawMountRoof3d(AcGiDraw* pDC,AcDbVoidPtrArray* pGetFaces) const { if(GetLength()<_DIST_SNAP || GetWidth()<_DIST_SNAP) return Acad::eOk; XDraw xDc; XPoly2D poly; AcDbPolyline* pPl = NULL; GetPolyPath(pPl); if (pPl != NULL) { poly.SetAcDbCurve(pPl); delete pPl; } XLine leftLine, rightLine, midLine; AcGeLineSeg3d lLn,rLn,mLn; GetMountLine(lLn,rLn,mLn); leftLine.SetPoints(lLn.startPoint(),lLn.endPoint()); rightLine.SetPoints(rLn.startPoint(),rLn.endPoint()); midLine.SetPoints(mLn.startPoint(),mLn.endPoint()); XLine midLine0; midLine0=midLine; midLine0.StartPoint().z+=m_dSlabThick; midLine0.EndPoint().z+=m_dSlabThick; if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP ||fabs(cos(GetSlopeAngle2()))<1E-3 ||GetMountHeight()<_DIST_SNAP) //人字屋顶,四坡屋顶,攒尖屋顶 { if (poly.Length()!=4) return Acad::eOk; XCurveSegment e0,e1; poly.Nth(0,e0); e1=e0; e1.StartPoint().z+=m_dSlabThick; e1.EndPoint().z+=m_dSlabThick; //前后檐屋顶面 X3DFace face; face.SetFlag(0); face.GetVertex(0)=midLine.EndPoint(); face.GetVertex(1)=e0.EndPoint(); face.GetVertex(2)=e0.StartPoint(); face.GetVertex(3)=midLine.StartPoint(); xDc.DrawFace(face); //主坡内面 face.GetVertex(0)=midLine0.StartPoint(); face.GetVertex(1)=e1.StartPoint(); face.GetVertex(2)=e1.EndPoint(); face.GetVertex(3)=midLine0.EndPoint(); xDc.DrawFace(face); //主坡外面 face.GetVertex(0)=e0.StartPoint(); face.GetVertex(1)=e0.EndPoint(); face.GetVertex(2)=e1.EndPoint(); face.GetVertex(3)=e1.StartPoint(); xDc.DrawFace(face); //主坡立面 poly.Nth(2,e0); e1=e0; e1.StartPoint().z+=m_dSlabThick; e1.EndPoint().z+=m_dSlabThick; face.GetVertex(0)=midLine.StartPoint(); face.GetVertex(1)=e0.EndPoint(); face.GetVertex(2)=e0.StartPoint(); face.GetVertex(3)=midLine.EndPoint(); xDc.DrawFace(face); //主坡内面 face.GetVertex(0)=midLine0.EndPoint(); face.GetVertex(1)=e1.StartPoint(); face.GetVertex(2)=e1.EndPoint(); face.GetVertex(3)=midLine0.StartPoint(); xDc.DrawFace(face); //主坡外面 face.GetVertex(0)=e0.StartPoint(); face.GetVertex(1)=e0.EndPoint(); face.GetVertex(2)=e1.EndPoint(); face.GetVertex(3)=e1.StartPoint(); xDc.DrawFace(face); //主坡立面 //山墙屋顶面 if (GetRoofHeight()-GetMountHeight()<_DIST_SNAP ||fabs(cos(GetSlopeAngle2()))<1E-3) //人字屋顶 { if (IsShowSide()) //显示侧坡 { poly.Nth(1,e0); e1=e0; e1.StartPoint().z+=m_dSlabThick; e1.EndPoint().z+=m_dSlabThick; X3DFace face1; face1.SetFlag(0); face1.GetVertex(0)=midLine0.EndPoint(); face1.GetVertex(1)=e1.StartPoint(); face1.GetVertex(2)=e1.EndPoint(); face1.GetVertex(3)=midLine0.EndPoint(); xDc.DrawFace(face1); //侧坡面 face1.GetVertex(0)=e1.StartPoint(); face1.GetVertex(1)=e0.StartPoint(); face1.GetVertex(2)=e0.EndPoint(); face1.GetVertex(3)=e1.EndPoint(); xDc.DrawFace(face1); //侧坡立面 poly.Nth(3,e0); e1=e0; e1.StartPoint().z+=m_dSlabThick; e1.EndPoint().z+=m_dSlabThick; face1.GetVertex(0)=midLine0.StartPoint(); face1.GetVertex(1)=e1.StartPoint(); face1.GetVertex(2)=e1.EndPoint(); face1.GetVertex(3)=midLine0.StartPoint(); xDc.DrawFace(face1); //侧坡面 face1.GetVertex(0)=e1.StartPoint(); face1.GetVertex(1)=e0.StartPoint(); face1.GetVertex(2)=e0.EndPoint(); face1.GetVertex(3)=e1.EndPoint(); xDc.DrawFace(face1); //侧坡立面 } } else //四坡屋顶,攒尖屋顶 { poly.Nth(1,e0); e1=e0; e1.StartPoint().z+=m_dSlabThick; e1.EndPoint().z+=m_dSlabThick; X3DFace face1; face1.SetFlag(0); face1.GetVertex(0)=midLine0.EndPoint(); face1.GetVertex(1)=e1.StartPoint(); face1.GetVertex(2)=e1.EndPoint(); face1.GetVertex(3)=midLine0.EndPoint(); xDc.DrawFace(face1); //侧坡外面 face1.GetVertex(0)=midLine.EndPoint(); face1.GetVertex(1)=e0.EndPoint(); face1.GetVertex(2)=e0.StartPoint(); face1.GetVertex(3)=midLine.EndPoint(); xDc.DrawFace(face1); //侧坡内面 face1.GetVertex(0)=e1.StartPoint(); face1.GetVertex(1)=e0.StartPoint(); face1.GetVertex(2)=e0.EndPoint(); face1.GetVertex(3)=e1.EndPoint(); xDc.DrawFace(face1); //侧坡立面 poly.Nth(3,e0); e1=e0; e1.StartPoint().z+=m_dSlabThick; e1.EndPoint().z+=m_dSlabThick; face1.GetVertex(0)=midLine0.StartPoint(); face1.GetVertex(1)=e1.StartPoint(); face1.GetVertex(2)=e1.EndPoint(); face1.GetVertex(3)=midLine0.StartPoint(); xDc.DrawFace(face1); //侧坡外面 face1.GetVertex(0)=midLine.StartPoint(); face1.GetVertex(1)=e0.EndPoint(); face1.GetVertex(2)=e0.StartPoint(); face1.GetVertex(3)=midLine.StartPoint(); xDc.DrawFace(face1); //侧坡内面 face1.GetVertex(0)=e1.StartPoint(); face1.GetVertex(1)=e0.StartPoint(); face1.GetVertex(2)=e0.EndPoint(); face1.GetVertex(3)=e1.EndPoint(); xDc.DrawFace(face1); //侧坡立面 } } else //歇山屋顶 { XPoly2D poly0(1); poly0.AppendNode(leftLine.StartPoint()); poly0.AppendNode(rightLine.StartPoint()); poly0.AppendNode(rightLine.EndPoint()); poly0.AppendNode(leftLine.EndPoint()); for(int i=0;i_DIST_SNAP&&poly0.TotalSegments()==4) { XCurveSegment e0,e1; poly0.Nth(0,e0); e1=e0; e1.StartPoint().z+=m_dSlabThick; e1.EndPoint().z+=m_dSlabThick; X3DFace face; face.SetFlag(0); face.GetVertex(0)=e0.StartPoint(); face.GetVertex(1)=midLine.StartPoint(); face.GetVertex(2)=midLine.EndPoint(); face.GetVertex(3)=e0.EndPoint(); face.SetVisible(3,FALSE); xDc.DrawFace(face); //坡内面 X3DFace face1; face1.SetFlag(0); face1.GetVertex(0)=e1.StartPoint(); face1.GetVertex(1)=e1.EndPoint(); face1.GetVertex(2)=midLine0.EndPoint(); face1.GetVertex(3)=midLine0.StartPoint(); face1.SetVisible(0,FALSE); xDc.DrawFace(face1); //坡外面 poly0.Nth(2,e0); e1=e0; e1.StartPoint().z+=m_dSlabThick; e1.EndPoint().z+=m_dSlabThick; X3DFace face2; face2.SetFlag(0); face2.GetVertex(0)=e0.StartPoint(); face2.GetVertex(1)=midLine.EndPoint(); face2.GetVertex(2)=midLine.StartPoint(); face2.GetVertex(3)=e0.EndPoint(); face2.SetVisible(3,FALSE); xDc.DrawFace(face2); //坡内面 X3DFace face3; face3.SetFlag(0); face3.GetVertex(0)=e1.StartPoint(); face3.GetVertex(1)=e1.EndPoint(); face3.GetVertex(2)=midLine0.StartPoint(); face3.GetVertex(3)=midLine0.EndPoint(); face3.SetVisible(0,FALSE); xDc.DrawFace(face3); //坡外面 poly0.Nth(1,e0); e1=e0; e1.StartPoint().z+=m_dSlabThick; e1.EndPoint().z+=m_dSlabThick; X3DFace face4; face4.SetFlag(0); face4.GetVertex(0)=midLine0.EndPoint(); face4.GetVertex(1)=e1.StartPoint(); face4.GetVertex(2)=e1.EndPoint(); face4.GetVertex(3)=midLine0.EndPoint(); xDc.DrawFace(face4); //山头面 poly0.Nth(3,e0); e1=e0; e1.StartPoint().z+=m_dSlabThick; e1.EndPoint().z+=m_dSlabThick; face4.GetVertex(0)=midLine0.StartPoint(); face4.GetVertex(1)=e1.StartPoint(); face4.GetVertex(2)=e1.EndPoint(); face4.GetVertex(3)=midLine0.StartPoint(); xDc.DrawFace(face4); //山头面 } } AcDbVoidPtrArray arEntPtrs; xDc.GetDraw(arEntPtrs); AcDbObjectId idLayOld = layerId(); AcDbObjectId idLay = layerId(); if (pDC != NULL) { idLayOld = pDC->GetLayerId(); pDC->SetLayer(idLay); } DrawEntsToSolid(pDC,pGetFaces,arEntPtrs); if (pDC != NULL) pDC->SetLayer(idLayOld); return Acad::eOk; } Acad::ErrorStatus AecDbXRoof::DrawCuspRoof3d(AcGiDraw* pDC,AcDbVoidPtrArray* pGetFaces) const { XDraw xDc; Acad::ErrorStatus es = Acad::eOk; XPoly2D poly; AcDbPolyline* pPl = NULL; GetPolyPath(pPl); if (pPl != NULL) { poly.SetAcDbCurve(pPl); delete pPl; } XPoint ptTop=m_ptCenter,ptTop1=m_ptCenter; ptTop.z += m_dRoofHeight-m_dSlabThick; ptTop1.z += m_dRoofHeight; for(long i=0;iGetLayerId(); pDC->SetLayer(idLay); } DrawEntsToSolid(pDC,pGetFaces,arEntPtrs); if (pDC != NULL) pDC->SetLayer(idLayOld); return es; } void AecDbXRoof::subList() { return AecDbEntityBase::subList(); } SHJson::WValue &AecDbXRoof::ToJson(bool bExprotGeo) const { using namespace SHJson; assertReadEnabled(); // 如果没有3D缓存,则绘制 if (!Has3DBuffer()) { AcGiViewDraw dc; Draw3d(dc); } using namespace SHJson; WValue &v = AecDbEntityBase::ToJson(bExprotGeo); WValue ar; ar.SetArray(); for (size_t i(0); i < m_solids.size(); ++i) { AcDbX3dSolid *pSolid(m_solids[i]); if (!pSolid) continue; WValue &x = pSolid->ToJson(); pushBack(ar, x); } addMember(v, _T("__solids__"), ar); ar.SetArray(); for (size_t i(0); i < m_pipes.size(); ++i) { AecDbEwPipeBase *pPipe(m_pipes[i]); if (!pPipe) continue; WValue &x = pPipe->ToJson(); pushBack(ar, x); } addMember(v, _T("__pipes__"), ar); return v; }