#include "stdafx.h" #include "TGPLine2d.h" using namespace TchSubExport; using namespace TchSubPrivate; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// ACRX_DXF_DEFINE_MEMBERS(ATSLandform, ATSEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 1, ATS_LANDFORM, "ATS_LANDFORM图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); IMPLEMENT_TENTBASE(TDbLandform); const Adesk::UInt8 TDbLandform::g_nVersion = 2; AcCmColor GetGradientColor(int minColor,int maxColor,double minData,double maxData,double data) { COLORREF color0=acedGetRGB(minColor),color1=acedGetRGB(maxColor); double r0=GetRValue(color0),r1=GetRValue(color1); double g0=GetGValue(color0),g1=GetGValue(color1); double b0=GetBValue(color0),b1=GetBValue(color1); double dr=r1-r0,dg=g1-g0,db=b1-b0; double dm=maxData-minData; AcCmColor c; if(dm<1E-6) c.setColorIndex(minColor); else { double dc=(data-minData)/dm; Adesk::UInt8 r=(Adesk::UInt8)(r0+dr*dc); Adesk::UInt8 g=(Adesk::UInt8)(g0+dg*dc); Adesk::UInt8 b=(Adesk::UInt8)(b0+db*dc); c.setRGB(r,g,b); } return c; } TDbLandform::TDbLandform():m_nMinColor(9),m_nMaxColor(1),m_nDistX(_AS_SYS_UNIT(5000)),m_nDistY(_AS_SYS_UNIT(5000)),m_nCMFlag(0)//ok { } void TDbLandform::CreateLandform(GLandform&land)const { GPLine2D *pCurve=new GPLine2D; XPoly2D2GPLine2D(m_polyOutline,*pCurve); land.Append(pCurve); for(long i=0;i0) return m_polyOutline[0].z; else return 0; } void TDbLandform::SetOutline(const XPoly2D& poly) { assertWriteEnabled(); m_polyOutline=poly; } void TDbLandform::AppendPoly(const XPoly2D& poly)//ok { assertWriteEnabled(); m_lstEqHeightCurve.Append(new XPoly2D(poly)); } BOOL TDbLandform::Has2D() const//ok { assertReadEnabled(); return (m_nCMFlag&CMF_NO2D)==0; } void TDbLandform::SetHas2D(BOOL bHas)//ok { assertWriteEnabled(); if(!bHas) m_nCMFlag |= CMF_NO2D; else m_nCMFlag &= ~CMF_NO2D; } BOOL TDbLandform::Has3D() const//ok { assertReadEnabled(); return (m_nCMFlag&CMF_NO3D)==0; } void TDbLandform::SetHas3D(BOOL bHas)//ok { assertWriteEnabled(); if(!bHas) m_nCMFlag |= CMF_NO3D; else m_nCMFlag &= ~CMF_NO3D; } void TDbLandform::SetNoGrid3D(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nCMFlag|=_CMF_NO_GRID3D; else m_nCMFlag&=~_CMF_NO_GRID3D; }//ok void TDbLandform::SetHasCurve3D(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nCMFlag|=_CMF_HAS_CURVE3D; else m_nCMFlag&=~_CMF_HAS_CURVE3D; }//ok void TDbLandform::SetNoCurve2D(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nCMFlag|=_CMF_NO_CURVE2D; else m_nCMFlag&=~_CMF_NO_CURVE2D; }//ok void TDbLandform::SetSqFit(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nCMFlag|=_CMF_SQFIT; else m_nCMFlag&=~_CMF_SQFIT; }//ok void TDbLandform::SetGradient3D(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nCMFlag|=_CMF_GRADIENT3D; else m_nCMFlag&=~_CMF_GRADIENT3D; }//ok void TDbLandform::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag)//ok { assertWriteEnabled(); TDbEntity::CopyPropertiesFrom(pSrcEntity, gMatchFlag); TDbLandform *pSrc=TDbLandform::cast(pSrcEntity); if(pSrc) { m_nCMFlag=pSrc->m_nCMFlag; } } BOOL TDbLandform::IsValid() const//ok { if(!TDbEntity::IsValid()) return FALSE; GLandform land; CreateLandform(land); return land.IsValid(); } Acad::ErrorStatus TDbLandform::dwgInFields (AcDbDwgFiler* pFiler)//ok { assertWriteEnabled(); Acad::ErrorStatus es = TDbEntity::dwgInFields(pFiler); if(es != Acad::eOk) return es; Adesk::UInt8 nVer; pFiler->readItem(&nVer); if(nVer>g_nVersion) return Acad::eMakeMeProxy; m_lstEqHeightCurve.Reset(); ReadPoly2D(pFiler,m_polyOutline); double nElev=0; pFiler->readDouble(&nElev); m_polyOutline.SetElevation(nElev); Adesk::Int32 num=0; pFiler->readInt32(&num); for(long i=0;ireadDouble(&nElev); pNew->SetElevation(nElev); m_lstEqHeightCurve.Append(pNew); } pFiler->readItem(&m_nMinColor); pFiler->readItem(&m_nMaxColor); pFiler->readItem(&m_nDistX); pFiler->readItem(&m_nDistY); pFiler->readItem(&m_nCMFlag); return pFiler->filerStatus(); } Acad::ErrorStatus TDbLandform::dwgOutFields(AcDbDwgFiler* pFiler) const//ok { assertReadEnabled(); Acad::ErrorStatus es = TDbEntity::dwgOutFields(pFiler); if(es != Acad::eOk) return es; pFiler->writeItem(g_nVersion); WritePoly2D(pFiler,m_polyOutline); pFiler->writeDouble(GetElevation()); Adesk::Int32 num=m_lstEqHeightCurve.Length(); pFiler->writeInt32(num); for(long i=0;iwriteDouble(nElev); } pFiler->writeItem(m_nMinColor); pFiler->writeItem(m_nMaxColor); pFiler->writeItem(m_nDistX); pFiler->writeItem(m_nDistY); pFiler->writeItem(m_nCMFlag); return pFiler->filerStatus(); } Acad::ErrorStatus TDbLandform::dxfInFields (AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es=TDbEntity::dxfInFields(pFiler); if(es!=Acad::eOk) return es; if (!pFiler->atSubclassData(_T("TDbLandform"))) return Acad::eBadDxfSequence; return pFiler->filerStatus(); } Acad::ErrorStatus TDbLandform::dxfOutFields(AcDbDxfFiler* pFiler) const { Acad::ErrorStatus es; es = TDbEntity::dxfOutFields(pFiler); assert(es == Acad::eOk); es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbLandform")); return es; } Acad::ErrorStatus TDbLandform::subGetClassID(CLSID* pClsid) const { return Acad::eOk; } void TDbLandform::UnionScale(double nScale) { assertWriteEnabled(); AcGeMatrix3d mat; mat.setToScaling(nScale); m_polyOutline.TransformBy(mat); for(long i=0;iTransformBy(mat); m_nDistX*=nScale; m_nDistY*=nScale; } //修改原因:移动、复制等操作,坡地的标高不随基点标高变化而变,这与平板等建筑其他对象都不同,造成坡地与其他模型同时移动后相对位置发生变化 //by fxj 090826 Acad::ErrorStatus TDbLandform::subTransformBy(const AcGeMatrix3d& xform) { assertWriteEnabled(); if(!IsValid()) return Acad::eOk; // double nElev=m_polyOutline[0l]->z; m_polyOutline.TransformBy(xform); // m_polyOutline.SetElevation(nElev); for(long i=0;iz; m_lstEqHeightCurve[i]->TransformBy(xform); // m_lstEqHeightCurve[i]->SetElevation(nElev); } return Acad::eOk; } Acad::ErrorStatus TDbLandform::subGetOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& ptPick, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const { Acad::ErrorStatus es=Acad::eOk; AcDbCurve *pCurve=m_polyOutline.AsAcDbCurve(); if(pCurve!=NULL) { es = pCurve->getOsnapPoints(osnapMode, gsSelectionMark, ptPick, lastPoint, viewXform, snapPoints, geomIds); delete pCurve; } return es; } Acad::ErrorStatus TDbLandform::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { double nElev=GetElevation(); for(long i=0;imaxHeight) maxHeight=e; } maxHeight+=_AS_SYS_UNIT(1000); TMasterProperties prop; dc.BackUpProperties(prop); //绘制外边界 AcDbCurve* pCurve=m_polyOutline.AsAcDbCurve(); if(pCurve!=NULL) { prop.SetTo(pCurve); pCurve->setColor(GetGradientColor(m_nMinColor,m_nMaxColor,minHeight,maxHeight,m_polyOutline[0].z)); dc.DrawEntity(*pCurve); delete pCurve; } //绘制等高线 if(HasCurve2D()) { for(i=0;isetColor(GetGradientColor(m_nMinColor,m_nMaxColor,minHeight,maxHeight,m_lstEqHeightCurve[i][0].z)); dc.DrawEntity(*pCurve); delete pCurve; } } } dc.RestoreProperties(prop); } return Acad::eOk; } Acad::ErrorStatus TDbLandform::ExplodeOrDraw3d(XExplodeDraw &dc) const { if(Has3D()) { double minHeight,maxHeight; minHeight=maxHeight=GetElevation(); for(long i=0;imaxHeight) maxHeight=e; } maxHeight+=_AS_SYS_UNIT(1000); TMasterProperties prop; dc.BackUpProperties(prop); //绘制曲面 GLandform land; CreateLandform(land); if(land.IsValid()&&UP_ZEROD(m_nDistX)&&UP_ZEROD(m_nDistY)) { GObjectList mlines; land.CreateGridData(m_nDistX,m_nDistY,mlines,IsSqFit()?1:0); AcDbVoidPtrArray entSet; for(mlines.MoveToFirst();!mlines.IsOut();mlines.MoveToNext()) { GMLine2D& mline2D=(GMLine2D&)mlines.GetCurPData(); //分解三维凸多边形 GPoint pt0=mline2D[0]; for(long i=1;i<(mline2D.GetVertexNum()-1);i++) { GPoint pt1=mline2D[i]; GPoint pt2=mline2D[i+1]; if(mline2D.GetVertexNum()==3) entSet.append(new AcDbFace(GP3AP(pt0),GP3AP(pt1),GP3AP(pt2),Adesk::kTrue,Adesk::kTrue,Adesk::kFalse,Adesk::kTrue)); else if(i==1) entSet.append(new AcDbFace(GP3AP(pt0),GP3AP(pt1),GP3AP(pt2),Adesk::kTrue,Adesk::kTrue,Adesk::kFalse,Adesk::kFalse)); else if(i==mline2D.GetVertexNum()-2) entSet.append(new AcDbFace(GP3AP(pt0),GP3AP(pt1),GP3AP(pt2),Adesk::kFalse,Adesk::kTrue,Adesk::kFalse,Adesk::kTrue)); else entSet.append(new AcDbFace(GP3AP(pt0),GP3AP(pt1),GP3AP(pt2),Adesk::kFalse,Adesk::kTrue,Adesk::kFalse,Adesk::kFalse)); } } for(long i=0;igetGeomExtents(ext); prop.SetTo(pEnt); if((m_nCMFlag&_CMF_GRADIENT3D)!=0) pEnt->setColor(GetGradientColor(m_nMinColor,m_nMaxColor,minHeight,maxHeight,(ext.minPoint().z+ext.maxPoint().z)/2)); if((m_nCMFlag&_CMF_NO_GRID3D)!=0) { pEnt->makeEdgeInvisibleAt(0); pEnt->makeEdgeInvisibleAt(1); pEnt->makeEdgeInvisibleAt(2); pEnt->makeEdgeInvisibleAt(3); } dc.DrawEntity(*pEnt); } ReleaseEntSet(entSet); } //绘制等高线 if(HasCurve3D()) { //绘制外边界 AcDbCurve* pCurve=m_polyOutline.AsAcDbCurve(); if(pCurve!=NULL) { prop.SetTo(pCurve); pCurve->setColor(GetGradientColor(m_nMinColor,m_nMaxColor,minHeight,maxHeight,m_polyOutline[0].z)); dc.DrawEntity(*pCurve); delete pCurve; } //内等高线 for(i=0;isetColor(GetGradientColor(m_nMinColor,m_nMaxColor,minHeight,maxHeight,m_lstEqHeightCurve[i][0].z)); dc.DrawEntity(*pCurve); delete pCurve; } } } dc.RestoreProperties(prop); } return Acad::eOk; } void TDbLandform::GetTips(DList &lstInfo) const { lstInfo.Append(new TObjInfoUnit(_T("对象类型"), _T("坡面"))); } void InitDbLandform(BOOL bTrue) { if(bTrue) { TDbLandform::rxInit(); acrxBuildClassHierarchy(); TDbLandform::InitMatchProtocol(TRUE); } else { TDbLandform::InitMatchProtocol(FALSE); deleteAcRxClass(TDbLandform::desc()); } }