Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

560 lines
12 KiB
C++

#include "stdafx.h"
#include "AecDbPoolCell.h"
#include "MFCDbDwgFiler.h"
#include "CoreTools.h"
namespace
{
AcDbRegion* CreateRegion(const AcGePoint3d &ptS
, const AcGePoint3d &ptE
, const double &wallHeight
, const double &halfWallThickness)
{
AcGeVector3d vt(ptE - ptS);
vt.rotateBy(PI * .5, AcGeVector3d::kZAxis);
vt.normalize();
AcGePoint3d pt0(AcGePoint3d::kOrigin)
, pt1(AcGePoint3d::kOrigin)
, pt2(AcGePoint3d::kOrigin)
, pt3(AcGePoint3d::kOrigin);
pt0 = ptS + vt * halfWallThickness;
pt1 = ptS - vt * halfWallThickness;
pt2 = pt1 + AcGeVector3d::kZAxis * wallHeight;
pt3 = pt2 + vt * 2 * halfWallThickness;
AcDbVoidPtrArray arr(0);
arr.append(new AcDbLine(pt0, pt1));
arr.append(new AcDbLine(pt1, pt2));
arr.append(new AcDbLine(pt2, pt3));
arr.append(new AcDbLine(pt3, pt0));
AcDbRegion *pReg = CoreTools::createRegion(arr);
deleteArrayVoidPtrs< AcDbEntity>(arr);
return pReg;
}
}
IMP_XDATA_KEY(AecDbPoolCell,_H_);
IMP_XDATA_KEY(AecDbPoolCell,_W_);
IMP_XDATA_KEY(AecDbPoolCell,_L_);
IMP_XDATA_KEY(AecDbPoolCell,_R_);
IMP_XDATA_KEY(AecDbPoolCell,_A_);
IMP_XDATA_KEY(AecDbPoolCell,_PT_);
IMP_XDATA_KEY(AecDbPoolCell,_TS_);
IMP_XDATA_KEY(AecDbPoolCell,_TH_);
IMP_XDATA_KEY(AecDbPoolCell,_NAME_);
Adesk::UInt32 AecDbPoolCell::kCurrentVersionNumber = 1;
ACRX_DXF_DEFINE_MEMBERS (AecDbPoolCell, AecDbEntityBase,
AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
AcDbProxyEntity::kNoOperation | AcDbProxyEntity::kDisableProxyWarning,
AEC_DBPOOLCELL,
"AecDbPoolCell"
"|Product Desc: shanghua earthworm app obj"
"|Company: shanghua inc"
"|WEB Address: www.shanghuasoft.com")
AecDbPoolCell::AecDbPoolCell(void)
{
SetTH(3.);
SetTStyle(_T("standard"));
SetName(_T(""));
}
AecDbPoolCell::~AecDbPoolCell(void) { }
const AecDbObjXDataMap* AecDbPoolCell::GetSpecialtyData() const
{
assertReadEnabled();
return &m_mapSpecXData;
}
AecDbObjXDataMap* AecDbPoolCell::GetSpecialtyData(AcDb::OpenMode bMode)
{
return &m_mapSpecXData;
}
Acad::ErrorStatus AecDbPoolCell::subExplode(AcDbVoidPtrArray& entitySet) const
{
if (IsCircle())
{
AcDbCircle cir;
GetCircle(cir);
entitySet.append(cir.clone());
}
else
{
AcDbPolyline poly;
GetPolyline(poly);
entitySet.append(poly.clone());
}
AcDbText txt;
GetText(txt);
entitySet.append(txt.clone());
return Acad::eOk;
}
Acad::ErrorStatus AecDbPoolCell::copyFrom(const AcRxObject* pSrc)
{
assertReadEnabled();
AecDbPoolCell *pCell = AecDbPoolCell::cast(pSrc);
if (!pCell) return Acad::eInvalidInput;
m_mapSpecXData.CopyFrom(pCell->GetSpecialtyData());
//发送提资需要相同的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;
}
Acad::ErrorStatus AecDbPoolCell::subTransformBy(const AcGeMatrix3d& xform)
{
AssertWriteEnabled();
AcGePoint3d pt(GetPt());
pt.transformBy(xform);
SetPt(pt);
return Acad::eOk;
}
Acad::ErrorStatus AecDbPoolCell::subGetGripPoints(AcDbGripDataPtrArray & grips
, const double curViewUnitSize
, const int gripSize
, const AcGeVector3d & curViewDir
, const int bitflags) const
{
return Acad::eNotImplementedYet;
}
Acad::ErrorStatus AecDbPoolCell::subGetGripPoints(AcGePoint3dArray & gripPoints
, AcDbIntArray & osnapModes
, AcDbIntArray & geomIds) const
{
assertReadEnabled();
if (IsCircle())
{
gripPoints.append(GetPt());
}
else
{
AcDbPolyline poly;
GetPolyline(poly);
AcDbExtents ext;
poly.getGeomExtents(ext);
gripPoints.append(CoreTools::MidPt(ext.maxPoint(), ext.minPoint()));
AcGePoint2d pt2d(AcGePoint2d::kOrigin);
for (int i = 0; i < poly.numVerts(); ++i)
{
poly.getPointAt(i, pt2d);
gripPoints.append(AcGePoint3d(pt2d.x, pt2d.y, .0));
}
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbPoolCell::subMoveGripPointsAt(const AcDbIntArray & indices
, const AcGeVector3d & offset)
{
AssertWriteEnabled();
AcGePoint3d pt(GetPt());
AcDbPolyline poly;
GetPolyline(poly);
bool bIsCircle(IsCircle());
double a(GetA());
int idx(0);
for (int i = 0; i < indices.length(); ++i)
{
idx = indices[i];
if (bIsCircle)
{
pt += offset;
SetPt(pt);
}
else
{
if (idx == 0) // 转
{
a += AcGeVector3d::kXAxis.angleTo(offset, AcGeVector3d::kZAxis);
SetA(a);
}
else
{
pt += offset;
SetPt(pt);
}
}
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbPoolCell::subGetOsnapPoints(AcDb::OsnapMode osnapMode
, INT_PTR gsSelectionMark
, const AcGePoint3d & pickPoint
, const AcGePoint3d & lastPoint
, const AcGeMatrix3d & viewXform
, AcGePoint3dArray & snapPoints
, AcDbIntArray & geomIds) const
{
assertReadEnabled();
if (IsCircle())
{
AcDbCircle Cir;
GetCircle(Cir);
return Cir.getOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds);
}
else
{
AcDbPolyline PLine;
GetPolyline(PLine);
return PLine.getOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds);
}
return Acad::eInvalidInput;
}
Acad::ErrorStatus AecDbPoolCell::subGetGeomExtents(AcDbExtents & extents) const
{
assertReadEnabled();
if (IsCircle())
{
AcDbCircle Cir;
GetCircle(Cir);
return Cir.getGeomExtents(extents);
}
else
{
AcDbPolyline PLine;
GetPolyline(PLine);
return PLine.getGeomExtents(extents);
}
return Acad::eInvalidInput;
}
Acad::ErrorStatus AecDbPoolCell::subIntersectWith(const AcDbEntity * pEnt
, AcDb::Intersect intType
, AcGePoint3dArray & points
, INT_PTR thisGsMarker
, INT_PTR otherGsMarker) const
{
assertReadEnabled();
if (IsCircle())
{
AcDbCircle Cir;
GetCircle(Cir);
return Cir.intersectWith(pEnt, intType, points, thisGsMarker, otherGsMarker);
}
else
{
AcDbPolyline PLine;
GetPolyline(PLine);
return PLine.intersectWith(pEnt, intType, points, thisGsMarker, otherGsMarker);
}
return Acad::eInvalidInput;
}
Acad::ErrorStatus AecDbPoolCell::subIntersectWith(const AcDbEntity * pEnt
, AcDb::Intersect intType
, const AcGePlane & projPlane
, AcGePoint3dArray & points
, INT_PTR thisGsMarker
, INT_PTR otherGsMarker) const
{
assertReadEnabled();
if (IsCircle())
{
AcDbCircle Cir;
GetCircle(Cir);
return Cir.intersectWith(pEnt, intType, projPlane, points, thisGsMarker, otherGsMarker);
}
else
{
AcDbPolyline PLine;
GetPolyline(PLine);
return PLine.intersectWith(pEnt, intType, projPlane, points, thisGsMarker, otherGsMarker);
}
return Acad::eInvalidInput;
}
Acad::ErrorStatus AecDbPoolCell::Draw2d(AcGiDraw &dc) const
{
assertReadEnabled();
int prec(1);
AcDbExtents ext;
getGeomExtents(ext);
dc.DrawText(GetString()
, CoreTools::MidPt(ext.maxPoint() , ext.minPoint())
, AcGiDraw::kMiddleCenter
, GetTH()
, 1.
, .0
, GetTStyle());
if (Has2DBuffer())
{
Draw2DBuffers(dc);
return Acad::eOk;
}
if (IsCircle())
{
AcDbCircle *pCir = new AcDbCircle();
GetCircle(*pCir);
dc.DrawEntity(*pCir);
Add2DBuffer(pCir);
}
else
{
AcDbPolyline *pLine = new AcDbPolyline();
GetPolyline(*pLine);
dc.DrawEntity(*pLine);
Add2DBuffer(pLine);
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbPoolCell::Draw3d(AcGiDraw &dc) const
{
return Draw2d(dc);
}
Acad::ErrorStatus AecDbPoolCell::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 > AecDbPoolCell::kCurrentVersionNumber)
return Acad::eMakeMeProxy;
m_mapSpecXData.dwgInFields(pFiler);
return Acad::eOk;
}
Acad::ErrorStatus AecDbPoolCell::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(AecDbPoolCell::kCurrentVersionNumber)) != Acad::eOk)
return (es);
m_mapSpecXData.dwgOutFields(pFiler);
return Acad::eOk;
}
Acad::ErrorStatus AecDbPoolCell::dxfInFields (AcDbDxfFiler* pFiler)
{
return Acad::eNotImplementedYet;
}
Acad::ErrorStatus AecDbPoolCell::dxfOutFields(AcDbDxfFiler* pFiler) const
{
return Acad::eNotImplementedYet;
}
void AecDbPoolCell::subList() const
{
acutPrintf(_T("\n水池格子对象:"));
acutPrintf(_T("\n\t名称:"), GetName());
if (!IsCircle())
{
acutPrintf(_T("\n\t形状:方形"));
acutPrintf(_T("\n\t长:%.2f毫米"), GetL());
acutPrintf(_T("\n\t宽:%.2f毫米"), GetW());
acutPrintf(_T("\n\t插入角度:%.2f度"), CoreTools::R2A(GetA()));
}
else
{
acutPrintf(_T("\n\t形状:圆形"));
acutPrintf(_T("\n\t半径:%.2f毫米"), GetR());
}
acutPrintf(_T("\n\t深:%.2f毫米"), GetH());
acutPrintf(_T("\n\t体积:%.2f立方米"), GetV() *10e-9);
AcGePoint3d pt(GetPt());
acutPrintf(_T("\n\t位置:(%.2f, %.2f, %.2f)"), pt.x, pt.y, pt.z);
}
CString AecDbPoolCell::ToScript() const
{
assertReadEnabled();
CString str;
m_mapSpecXData.Write(str, false);
return str;
}
void AecDbPoolCell::FromScript(LPCTSTR psz)
{
AssertWriteEnabled();
if (!psz) return;
m_mapSpecXData.Empty();
m_mapSpecXData.Read(psz, false);
}
bool AecDbPoolCell::IsCircle() const
{
if (EQUAL_ZERO(GetR())) return false;
return true;
}
void AecDbPoolCell::GetCircle(AcDbCircle & cir) const
{
double r(GetR());
AcGePoint3d pt0(GetPt());
cir.setCenter(pt0);
cir.setNormal(AcGeVector3d::kZAxis);
cir.setRadius(r);
}
void AecDbPoolCell::GetPolyline(AcDbPolyline & poly) const
{
double a(GetA()), w(GetW()), l(GetL());
AcGePoint3d pt0(GetPt());
AcGeVector3d vt(AcGeVector3d::kXAxis);
vt.rotateBy(a, AcGeVector3d::kZAxis);
vt.normalize();
AcGeVector3d vtN(vt);
vtN.rotateBy(PI * .5, AcGeVector3d::kZAxis);
vtN.normalize();
pt0 -= vt * l * .5;
pt0 += vtN * w * .5;
poly.addVertexAt(0, pt0.convert2d(AcGePlane::kXYPlane));
pt0 += vt * l;
poly.addVertexAt(1, pt0.convert2d(AcGePlane::kXYPlane));
pt0 -= vtN * w;
poly.addVertexAt(2, pt0.convert2d(AcGePlane::kXYPlane));
pt0 -= vt * l;
poly.addVertexAt(3, pt0.convert2d(AcGePlane::kXYPlane));
poly.setClosed(true);
}
void AecDbPoolCell::GetText(AcDbText & txt) const
{
AcDbExtents ext;
getGeomExtents(ext);
AcGePoint3d pt(CoreTools::MidPt(ext.maxPoint(), ext.minPoint()));
int prec(1);
CString sName(GetString());
txt.setTextString(sName);
txt.setTextStyle(CoreTools::findTextStyleId(GetTStyle()));
txt.setHeight(GetTH());
txt.setHorizontalMode(AcDb::kTextMid);
txt.setVerticalMode(AcDb::kTextVertMid);
txt.setPosition(pt);
txt.setAlignmentPoint(pt);
}
CString AecDbPoolCell::GetString() const
{
int prec(2);
CString str(_T(""));
if (!GetName().IsEmpty())
{
str = (GetName() + _T(" ")) + TypeConvert::d2s(GetV() * 10e-9, &prec) + _T("立方米");
}
return str;
//return CString(GetName().IsEmpty() ? _T("") : (GetName() + _T(" ")) + TypeConvert::d2s(GetV() * 10e-9, &prec) + _T("立方米"));
}
double AecDbPoolCell::GetV() const
{
double a(GetA()), w(GetW()), l(GetL()), r(GetR()), h(GetH());
if (IsCircle())
return PI * r * r * h;
else
return w * l * h;
return .0;
}
void AecDbPoolCell::GetKeyPoints(AcGePoint2dArray & ar, const double &dWallT)
{
ar.removeAll();
double dH(GetH());
if (IsCircle())
{
double dR(GetR() + dWallT * .5);
ar.append(AcGePoint2d::kOrigin);
}
else
{
double dA(GetA())
, dL(GetL() + dWallT * .5)
, dW(GetW() + dWallT * .5);
AcGeVector2d vt(AcGeVector2d::kXAxis);
vt.rotateBy(dA);
AcGeVector2d vtN(vt);
vtN.rotateBy(PI * .5);
vt.normalize();
vtN.normalize();
// 围绕原点生成四个墙
AcGePoint2d pt0(GetPt().convert2d(AcGePlane::kXYPlane))
, pt1(AcGePoint2d::kOrigin)
, pt2(AcGePoint2d::kOrigin)
, pt3(AcGePoint2d::kOrigin);
pt0 -= vt * dL * .5;
pt0 += vtN * dW * .5;
pt1 = pt0 + vt * dL;
pt2 = pt1 - vtN * dW;
pt3 = pt2 - vt * dL;
ar.append(pt0);
ar.append(pt1);
ar.append(pt2);
ar.append(pt3);
}
}
void AecDbPoolCell::GetSimplyPoolCell(AcDbPolyline *pPoly, const double & dWallT)
{
AcGePoint2dArray ar(0);
GetKeyPoints(ar, dWallT);
for (size_t i = 0; i < ar.length(); ++i)
{
pPoly->addVertexAt((int)i, ar[(int)i]);
}
pPoly->setClosed(1);
}