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

980 lines
22 KiB
C++

#include "stdafx.h"
#include "AecOutDrawingJig.h"
#include "KTTempTol.h"
#include "aecdbObjXDataMap.h"
#include "KTCADUtilityEx.h"
#include "EarThwormDef.h"
extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt,AcDbDatabase* pDb,bool bClose);
static void FreeBuffer(int n,const AcDbVoidPtrArray& arEntPtrs)
{
AcDbEntity* pEnt = NULL;
for (int i = n;i < arEntPtrs.length();i++)
{
pEnt = (AcDbEntity*)arEntPtrs.at(i);
DELETE_PTR(pEnt);
}
}
AecDrawingFrmsEntity::AecDrawingFrmsEntity()
{}
AecDrawingFrmsEntity::~AecDrawingFrmsEntity()
{}
void AecDrawingFrmsEntity::AppendDrawFrame(AcGePoint3d* pptGe,int nCount)
{
if (nCount == 5 && pptGe != NULL)
{
DrawFrame frm;
memcpy(frm.ptGe,pptGe,nCount * sizeof(AcGePoint3d));
frm.ptPick.set(0,0,0);
m_arDrawFrames.append(frm);
}
}
int AecDrawingFrmsEntity::GetDrawFrames(AcArray<DrawFrame>& arDrawFrames)
{
arDrawFrames.append(m_arDrawFrames);
return arDrawFrames.length();
}
void AecDrawingFrmsEntity::SetDrawingEnts(const AcDbVoidPtrArray& arEntPtrs)
{
m_arEntPtrs.append(arEntPtrs);
}
#if ARX < 18
Adesk::Boolean AecDrawingFrmsEntity::worldDraw (AcGiWorldDraw *mode)
{
return worldDraw2d(mode);
}
#else
Adesk::Boolean AecDrawingFrmsEntity::subWorldDraw (AcGiWorldDraw *mode)
{
return worldDraw2d(mode);
}
#endif
Adesk::Boolean AecDrawingFrmsEntity::worldDraw2d(AcGiWorldDraw *mode)
{
int nBk = mode->subEntityTraits().color();
mode->subEntityTraits().setColor(1);
for (int i = 0;i < m_arDrawFrames.length();i++)
{
mode->geometry().polyline(5,m_arDrawFrames.at(i).ptGe);
}
mode->subEntityTraits().setColor(nBk);
AcGiDrawable* pAble = NULL;
AcDbEntity* pEnt = NULL;
for (int k = 0;k < m_arEntPtrs.length();k++)
{
pEnt = (AcDbEntity*)m_arEntPtrs.at(k);
pAble = pEnt->drawable();
if (pAble != NULL)
mode->geometry().draw(pAble);
}
return Adesk::kTrue;
}
AecOutDrawingJig::AecOutDrawingJig(void)
{
m_pDrawingFrms = new AecDrawingFrmsEntity;
m_bIsShowEntPtrs = false;
m_bExtValid = false;
m_bHasRoadLine = true;
m_ptGe.set(0,0,0);
}
AecOutDrawingJig::~AecOutDrawingJig(void)
{
DELETE_PTR(m_pDrawingFrms);
CUIntArray* pGroups = NULL;
for (int i = 0;i < m_arIndexsGrpPtrs.GetSize();i++)
{
pGroups = (CUIntArray*)m_arIndexsGrpPtrs.GetAt(i);
DELETE_PTR(pGroups);
}
m_arIndexsGrpPtrs.RemoveAll();
}
void AecOutDrawingJig::SetDrawingEnts(const AcDbVoidPtrArray& arEntPtrs,const AcGeVector3d& vtDir,bool bIsShowEntPtrs,bool bLastIsRoadLine)
{
m_arEntPtrs.append(arEntPtrs);
m_vtDir = vtDir;
m_vtDir.normalize();
m_bIsShowEntPtrs = bIsShowEntPtrs;
if (bIsShowEntPtrs)
{
m_pDrawingFrms->SetDrawingEnts(arEntPtrs);
}
m_bHasRoadLine = bLastIsRoadLine;
}
void AecOutDrawingJig::SetDrawingExt(const AcDbExtents& extUCS,const AcGeVector3d& vtDir,bool bIsShowEntPtrs)
{
m_vtDir = vtDir;
m_vtDir.normalize();
m_bIsShowEntPtrs = bIsShowEntPtrs;
m_bExtValid = true;
m_extAll = extUCS;
}
void AecOutDrawingJig::SetDrawingFrme(AcDbObjectId idRec,double dScale)
{
m_idRec = idRec;
m_dScale = dScale;
}
extern AcGePoint3d MidPoint(const AcGePoint3d& pt1,const AcGePoint3d& pt2);
bool GetInsideDrawSize(AcDbObjectId idRec,AcGePoint2d& ptSize)
{
AcDbBlockReference ref;
ref.setBlockTableRecord(idRec);
ref.setScaleFactors(AcGeScale3d(1,1,1));
AcDbExtents ext1;
ref.getGeomExtents(ext1);
AcDbVoidPtrArray arEntPtrs;
ref.explode(arEntPtrs);
AcGePoint3d ptCen = MidPoint(ext1.minPoint(),ext1.maxPoint());
ptCen.z = 0.0;
AcDbXline xLn1,xLn2;
xLn1.setBasePoint(ptCen);
xLn1.setUnitDir(AcGeVector3d::kXAxis);
xLn2.setBasePoint(ptCen);
xLn2.setUnitDir(AcGeVector3d::kYAxis);
AcGePoint3d pt;
AcGePoint3dArray arPts1,arPts2;
AcDbEntity* pEnt = NULL;
double dX1 = 99999.0,dX2 = 99999.0;
double dY1 = 99999.0,dY2 = 99999.0;
for (int i = 0;i < arEntPtrs.length();i++)
{
pEnt = (AcDbEntity*)arEntPtrs.at(i);
arPts1.removeAll();
pEnt->intersectWith(&xLn1,AcDb::kOnBothOperands,arPts1);
for (int j = 0;j < arPts1.length();j++)
{
pt = arPts1.at(j);
if (pt.x - ptCen.x > 1.e-10)
{
dX2 = __min(dX2,pt.x - ptCen.x);//取最小
}
else
{
dX1 = __min(dX1,ptCen.x - pt.x);//取最小
}
}
arPts2.removeAll();
pEnt->intersectWith(&xLn2,AcDb::kOnBothOperands,arPts2);
for (int j = 0;j < arPts2.length();j++)
{
pt = arPts2.at(j);
if (pt.y - ptCen.y > 1.e-10)
{
dY2 = __min(dY2,pt.y - ptCen.y);//取最小
}
else
{
dY1 = __min(dY1,ptCen.y - pt.y);//取最小
}
}
DELETE_PTR(pEnt);
}
//排序,取得距离 ptCen 最近的点
if (dX1 < 9999.0 && dX2 < 9999.0 && dY1 < 9999.0 && dY2 < 9999.0)
{
ptSize.set( dX1 + dX2 ,dY1 + dY2);
return true;
}
return false;
}
bool GetInsideDrawSize(AcDbObjectId idRec,AcGePoint2d& ptSize,AcGePoint3d& ptLB)
{
AcDbBlockReference ref;
ref.setBlockTableRecord(idRec);
ref.setScaleFactors(AcGeScale3d(1,1,1));
AcDbExtents ext1;
ref.getGeomExtents(ext1);
AcDbVoidPtrArray arEntPtrs;
ref.explode(arEntPtrs);
AcGePoint3d ptCen = MidPoint(ext1.minPoint(),ext1.maxPoint());
ptCen.z = 0.0;
AcDbXline xLn1,xLn2;
xLn1.setBasePoint(ptCen);
xLn1.setUnitDir(AcGeVector3d::kXAxis);
xLn2.setBasePoint(ptCen);
xLn2.setUnitDir(AcGeVector3d::kYAxis);
AcGePoint3d pt;
AcGePoint3dArray arPts1,arPts2;
AcDbEntity* pEnt = NULL;
double dX1 = 99999.0,dX2 = 99999.0;
double dY1 = 99999.0,dY2 = 99999.0;
ptLB.set(-dX1,-dY1,0.0);
for (int i = 0;i < arEntPtrs.length();i++)
{
pEnt = (AcDbEntity*)arEntPtrs.at(i);
arPts1.removeAll();
pEnt->intersectWith(&xLn1,AcDb::kOnBothOperands,arPts1);
for (int j = 0;j < arPts1.length();j++)
{
pt = arPts1.at(j);
if (pt.x - ptCen.x > 1.e-10)
{
dX2 = __min(dX2,pt.x - ptCen.x);//取最小
}
else
{
dX1 = __min(dX1,ptCen.x - pt.x);//取最小
}
}
arPts2.removeAll();
pEnt->intersectWith(&xLn2,AcDb::kOnBothOperands,arPts2);
for (int j = 0;j < arPts2.length();j++)
{
pt = arPts2.at(j);
if (pt.y - ptCen.y > 1.e-10)
{
dY2 = __min(dY2,pt.y - ptCen.y);//取最小
}
else
{
dY1 = __min(dY1,ptCen.y - pt.y);//取最小
}
}
DELETE_PTR(pEnt);
}
//排序,取得距离 ptCen 最近的点
if (dX1 < 9999.0 && dX2 < 9999.0 && dY1 < 9999.0 && dY2 < 9999.0)
{
ptSize.set( dX1 + dX2 ,dY1 + dY2);
ptLB.set(ptCen.x - dX1,ptCen.y - dY1,0.0);
return true;
}
return false;
}
bool PickBoundary(const AcDbVoidPtrArray& arEntPtrs,const AcGePoint3d& ptHit,AcGePoint2d& ptSize,AcGePoint3d& ptLB)
{
AcDbXline xLn1,xLn2;
xLn1.setBasePoint(ptHit);
xLn1.setUnitDir(AcGeVector3d::kXAxis);
xLn2.setBasePoint(ptHit);
xLn2.setUnitDir(AcGeVector3d::kYAxis);
AcGePoint3d pt;
AcGePoint3dArray arPts1,arPts2;
AcDbEntity* pEnt = NULL;
double dX1 = 99999.0,dX2 = 99999.0;
double dY1 = 99999.0,dY2 = 99999.0;
ptLB.set(-dX1,-dY1,0.0);
for (int i = 0;i < arEntPtrs.length();i++)
{
pEnt = (AcDbEntity*)arEntPtrs.at(i);
arPts1.removeAll();
pEnt->intersectWith(&xLn1,AcDb::kOnBothOperands,arPts1);
for (int j = 0;j < arPts1.length();j++)
{
pt = arPts1.at(j);
if (pt.x - ptHit.x > 1.e-10)
{
dX2 = __min(dX2,pt.x - ptHit.x);//取最小
}
else
{
dX1 = __min(dX1,ptHit.x - pt.x);//取最小
}
}
arPts2.removeAll();
pEnt->intersectWith(&xLn2,AcDb::kOnBothOperands,arPts2);
for (int j = 0;j < arPts2.length();j++)
{
pt = arPts2.at(j);
if (pt.y - ptHit.y > 1.e-10)
{
dY2 = __min(dY2,pt.y - ptHit.y);//取最小
}
else
{
dY1 = __min(dY1,ptHit.y - pt.y);//取最小
}
}
DELETE_PTR(pEnt);
}
//排序,取得距离 ptCen 最近的点
if (dX1 < 9999.0 && dX2 < 9999.0 && dY1 < 9999.0 && dY2 < 9999.0)
{
ptSize.set( dX1 + dX2 ,dY1 + dY2);
ptLB.set(ptHit.x - dX1,ptHit.y - dY1,0.0);
return true;
}
return false;
}
bool GetInsideDrawSize(AcDbBlockReference& ref,AcGePoint2d& ptSize,AcGePoint3d& ptLB)
{
AcDbExtents ext1;
ref.getGeomExtents(ext1);
AcDbVoidPtrArray arEntPtrs;
ref.explode(arEntPtrs);
AcGePoint3d ptCen = MidPoint(ext1.minPoint(),ext1.maxPoint());
ptCen.z = 0.0;
return PickBoundary(arEntPtrs,ptCen,ptSize,ptLB);
}
bool PolylineIntersectWithLine(AcDbEntity* pEnt,AcDbLine* pLine,AcGePoint3dArray& arPts)
{
AcGePoint3dArray arPts2;
AcDbPolyline* pPl = AcDbPolyline::cast(pEnt);
if (pPl != NULL)
{
AcDbVoidPtrArray arCurPtrs;
pPl->explode(arCurPtrs);
AcDbEntity* pEnt2 = NULL;
for (int i = 0;i < arCurPtrs.length();i++)
{
pEnt2 = (AcDbEntity*)arCurPtrs.at(i);
pEnt2->intersectWith(pLine,AcDb::kOnBothOperands,AcGePlane::kXYPlane,arPts2);
DELETE_PTR(pEnt2);
}
AcGePoint3d ptOn;
for (int i = 0;i < arPts2.length();i++)
{
ptOn = arPts2.at(i);
pPl->getClosestPointTo(arPts2.at(i),ptOn);
arPts.append(ptOn);
}
}
AcDbLine* pLn = AcDbLine::cast(pEnt);
if (pLn != NULL)
{
pLn->intersectWith(pLine,AcDb::kOnBothOperands,AcGePlane::kXYPlane,arPts2);
AcGePoint3d ptOn;
for (int i = 0;i < arPts2.length();i++)
{
ptOn = arPts2.at(i);
pLn->getClosestPointTo(arPts2.at(i),ptOn);
arPts.append(ptOn);
}
}
return arPts.length() > 0 ? true : false;
}
bool IsExtInFrame(AcDbExtents& ext,DrawFrame& frm)
{
//判断范围有交集
AcDbLine ln(ext.minPoint(),ext.maxPoint());
AcGePoint3dArray arPts;
for (int i = 0;i < 4;i++)
{
AcDbLine ln2(frm.ptGe[i],frm.ptGe[i+1]);
ln.intersectWith(&ln2,AcDb::kOnBothOperands,arPts);
if (arPts.length() > 0)
{
return true;
}
}
return false;
}
void AecOutDrawingJig::AddElevationPoint(AecDbObjXDataMap* pxData,AcDbCurve* pCurve,const AcGePoint3dArray& arPts,CMapWordToPtr& mapPos2PtPtr)
{
if (pxData == NULL)
return;
//排序,保留最左边UCS X 最小的标高点对象 3个,每个位置一个0,1,2 //路,顶,底
AecDbObjXDataMap xData;
int nPos = 0;
double dStaEl = 0.0,dElOnPt = 0.0;
pxData->GetAt(_T("StaEl"),dStaEl);//起点标高
pxData->GetAt(_T("ElPos"),nPos);//起点标高
//开头
AcGePoint3d ptSta,ptGe1,ptGe2;
pCurve->getStartPoint(ptSta);
ads_point pt0;
acdbWcs2Ucs(asDblArray(ptSta),pt0,false);
AcGePoint3dArray arPts2;
if (arPts.isEmpty())
arPts2.append(ptSta);
if (!arPts.isEmpty())
arPts2.append(arPts);
AcDbPoint* pPt = NULL;
BOOL bSuccess = FALSE;
ads_point ptucs,pt2;
for(int i = 0;i < arPts2.length();i++)
{
ptGe1 = arPts2.at(i);
acdbWcs2Ucs(asDblArray(ptGe1),ptucs,false);
dElOnPt = (ptucs[Y] - pt0[Y] ) + dStaEl;//UCS下 Y之差+起点标高
if (mapPos2PtPtr.Lookup(nPos,(void*&)pPt))
{
ptGe2 = pPt->position();
acdbWcs2Ucs(asDblArray(ptGe2),pt2,false);
if (pt2[X] - ptucs[X] < 1.e-3)//ptucs 大
{
//忽略
}
else //ptucs x 小 (左 ), 用ptucs
{
AecDbObjXDataMap xData2;
xData2.Read(pPt,_T("StaEl"));
//使用当前点
xData2.SetAt(_T("StaEl"),dElOnPt);
pPt->setPosition(ptGe1);//
xData2.Write(pPt,_T("StaEl"));
}
}
else //没有,添加
{
pPt = new AcDbPoint;
pPt->setPosition(arPts2.at(i));
pPt->setNormal(AcGeVector3d::kZAxis);
xData.SetAt(_T("StaEl"),dElOnPt);
xData.SetAt(_T("ElPos"),nPos);
bSuccess = xData.Write(pPt,_T("StaEl"));
mapPos2PtPtr.SetAt(nPos,pPt);//位置-Pt
}
}
}
void AecOutDrawingJig::SplitEntitiesOnDrawframe()
{
KTTempTol tol(1.e-2);
float* pvertx = NULL;
float* pverty = NULL;
pvertx = new float[5];
pverty = new float[5];
Acad::ErrorStatus es = Acad::eOk;
AcArray<int> arIdxGrouped;
AcGePoint3d ptSta;
AcGeVector3d vtLB2Cen;
//分割图形实体
AcDbEntity* pEnt = NULL;
AcDbCurve* pCurve = NULL;
for (int k = 0;k < m_pDrawingFrms->m_arDrawFrames.length();k++)
{
DrawFrame& frm = m_pDrawingFrms->m_arDrawFrames.at(k);
for (int n = 0;n < 5;n++)
{
pvertx[n] = (float)frm.ptGe[n].x;
pverty[n] = (float)frm.ptGe[n].y;
}
vtLB2Cen = MidPoint(frm.ptGe[2],frm.ptGe[1]) - MidPoint(frm.ptGe[0],frm.ptGe[3]);
vtLB2Cen.normalize();
AcDbLine ln[4];
for (int n = 0;n < 4;n++)
{
ln[n].setStartPoint(frm.ptGe[n]);
ln[n].setEndPoint(frm.ptGe[n+1]);
ln[n].setNormal(AcGeVector3d::kZAxis);
//测试
//AcDbLine* pLine = (AcDbLine*)ln[n].clone();
//pLine->setColorIndex(1);
//AddToModelSpace(pLine,NULL,true);
}
//分割实体
AcDbVoidPtrArray arOtherPtrs;
CMapWordToPtr mapPos2PtPtr;
for (int i = 0;i < m_arEntPtrs.length();i++)
{
pEnt = (AcDbEntity*)m_arEntPtrs.at(i);
pCurve = AcDbCurve::cast(pEnt);
if (pCurve != NULL)
{
for (int m = 0;m < 4;m++)
{
AcDbPolyline* pPl = AcDbPolyline::cast(pCurve);
if (pPl != NULL)
{
pPl->setElevation(0.0);
pPl->setNormal(AcGeVector3d::kZAxis);
}
AcGePoint3dArray arPts;//1个点
//if (Acad::eOk == ( es = ln[m].intersectWith(pEnt,AcDb::kOnBothOperands,AcGePlane::kXYPlane,arPts) ) )
if ( PolylineIntersectWithLine(pEnt,&ln[m],arPts) )
{
AcDbVoidPtrArray arCurPtrs;
pCurve->getSplitCurves(arPts,arCurPtrs);
if (arCurPtrs.length() > 0)
{
//复制写扩展数据了
AecDbObjXDataMap xDataT;
AcDbCurve* pCurveGet = NULL;
if ( xDataT.Read(pCurve,_T("StaEl")) )//起点标高
{
pCurve->getStartPoint(ptSta);
ads_point pt0;
acdbWcs2Ucs(asDblArray(ptSta),pt0,false);
double dStaEl = 0.0,dElOnPt = 0.0;
xDataT.GetAt(_T("StaEl"),dStaEl);//起点标高
double dW = 0.0;
AcDbPolyline* pPlCurve = AcDbPolyline::cast(pCurve);
ads_point ptucs;
for (int nn = 0;nn < arCurPtrs.length();nn++)
{
pCurveGet = (AcDbCurve*)arCurPtrs.at(nn);
pCurveGet->getStartPoint(ptSta);
AcDbLine* pLn = AcDbLine::cast(pCurveGet);
if (pLn != NULL)
{
AcGePoint3d ptLn[2];
ptLn[0] = pLn->startPoint();
ptLn[1] = pLn->endPoint();
AcDbPolyline* pPlGet = new AcDbPolyline;
if (pPlGet != NULL && pPlCurve != NULL)
{
pPlCurve->getConstantWidth(dW);
pPlGet->setConstantWidth(dW);
pPlGet->addVertexAt(0,ptLn[0].convert2d(AcGePlane::kXYPlane));
pPlGet->addVertexAt(1,ptLn[1].convert2d(AcGePlane::kXYPlane));
DELETE_PTR(pCurveGet);
pCurveGet = pPlGet;
arCurPtrs.setAt(nn,pCurveGet);
}
}
if ( pCurveGet->isClosed() )
{
int mmm = 0;
}
acdbWcs2Ucs(asDblArray(ptSta),ptucs,false);
dElOnPt = (ptucs[Y] - pt0[Y] ) + dStaEl;//UCS下 Y之差+起点标高
AecDbObjXDataMap xData2;
xData2.Read(pCurve,_T("StaEl"));
xData2.SetAt(_T("StaEl"),dElOnPt);
xData2.Write(pCurveGet,_T("StaEl"));
}
}
pCurveGet = (AcDbCurve*)arCurPtrs.first();
m_arEntPtrs.setAt(i,pCurveGet);
arCurPtrs.removeFirst();
if (arCurPtrs.length() > 0)
{
//如果含有道路中心线,说明是纵断出图
if (m_bHasRoadLine)
{
AecDbObjXDataMap xData;
if ( xData.Read(pCurve,_T("StaEl")) )//起点标高
{
AddElevationPoint(&xData,pCurve,arPts,mapPos2PtPtr);
}
}
arOtherPtrs.append(arCurPtrs);
}
DELETE_PTR(pEnt);//原删除
}
else
{
acutPrintf(_T("\ngetSplitCurves error!"));
}
break;
}
else //不相交
{
//如果含有道路中心线,说明是纵断出图
if (m_bHasRoadLine)
{
AecDbObjXDataMap xData;
if ( xData.Read(pCurve,_T("StaEl")) )//起点标高
{
pCurve->getStartPoint(ptSta);
ptSta += vtLB2Cen * 0.5;//前进一点
//不相交,且开始端点在图框内
if (KTCADUtilityEx::IsPointInPoly(5,pvertx,pverty,(float)ptSta.x,(float)ptSta.y) > 0)
{
AddElevationPoint(&xData,pCurve,arPts,mapPos2PtPtr);
}
}
}
}
}
}
}
WORD nPos = -1;
AcDbPoint* pPtr = NULL;
for (POSITION ps = mapPos2PtPtr.GetStartPosition();ps != NULL;)
{
mapPos2PtPtr.GetNextAssoc(ps,nPos,(void*&)pPtr);
if(pPtr != NULL) arOtherPtrs.append(pPtr);
}
if (arOtherPtrs.length() > 0)
{
m_arEntPtrs.append(arOtherPtrs);
}
//按图框分组
CUIntArray* pGroups = new CUIntArray;
AcGePoint3d ptCen,ptTemp;
for (int i = 0;i < m_arEntPtrs.length();i++)
{
pEnt = (AcDbEntity*)m_arEntPtrs.at(i);
AcDbExtents ext;
pEnt->getGeomExtents(ext);
ptCen = MidPoint(ext.minPoint(),ext.maxPoint());
ptCen += vtLB2Cen * 0.5;//前进一点
if (KTCADUtilityEx::IsPointInPoly(5,pvertx,pverty,(float)ptCen.x,(float)ptCen.y) > 0)
{
if (arIdxGrouped.find(i) == -1)
{
pGroups->Add(i);
arIdxGrouped.append(i);
}
}
//测试
//AcDbEntity* pClone = (AcDbEntity*)pEnt->clone();
//pClone->setColorIndex(3);
//AddToModelSpace(pClone,NULL,true);
}
if (pGroups->GetSize() > 0)
{
m_arIndexsGrpPtrs.Add(pGroups);
}
else
{
DELETE_PTR(pGroups);
}
}
}
BOOL AecOutDrawingJig::GetDrawingEnts(AcDbVoidPtrArray& arEntPtrs,CPtrArray& arIndexGrpPtrs)
{
if (!m_arEntPtrs.isEmpty())
arEntPtrs.append(m_arEntPtrs);
if (!m_arIndexsGrpPtrs.IsEmpty())
arIndexGrpPtrs.Append(m_arIndexsGrpPtrs);
return arIndexGrpPtrs.GetSize() > 0 ? TRUE : FALSE;
}
BOOL AecOutDrawingJig::GetFrmeAtGroups( AcArray<DrawFrame>& arFrames)
{
if (m_pDrawingFrms != NULL)
{
m_pDrawingFrms->GetDrawFrames(arFrames);
}
return arFrames.length() > 0 ? TRUE : FALSE;
}
void AecOutDrawingJig::GetEntsUCSExt(AcDbExtents& extAll)
{
ads_point pt;
AcGePoint3d ptGe;
AcDbEntity* pEnt = NULL;
if (m_bHasRoadLine)
{
pEnt = (AcDbEntity*)m_arEntPtrs.last();
AcDbLine* pLn = AcDbLine::cast(pEnt);
if (pLn != NULL)
{
ptGe = pLn->startPoint();
acdbWcs2Ucs(asDblArray(ptGe),pt,false);
extAll.addPoint(asPnt3d(pt));
ptGe = pLn->endPoint();
acdbWcs2Ucs(asDblArray(ptGe),pt,false);
extAll.addPoint(asPnt3d(pt));
}
if (pEnt != NULL)
DELETE_PTR(pEnt);
m_arEntPtrs.removeLast();
return;
}
for (int i = 0;i < m_arEntPtrs.length() ;i++)
{
pEnt = (AcDbEntity*)m_arEntPtrs.at(i);
AcDbLine* pLn = AcDbLine::cast(pEnt);
if (pLn != NULL)
{
ptGe = pLn->startPoint();
acdbWcs2Ucs(asDblArray(ptGe),pt,false);
extAll.addPoint(asPnt3d(pt));
ptGe = pLn->endPoint();
acdbWcs2Ucs(asDblArray(ptGe),pt,false);
extAll.addPoint(asPnt3d(pt));
}
AcDbPolyline* pPl = AcDbPolyline::cast(pEnt);
if (pPl != NULL)
{
for (int j = 0;j < pPl->numVerts();j++)
{
pPl->getPointAt(j,ptGe);
acdbWcs2Ucs(asDblArray(ptGe),pt,false);
extAll.addPoint(asPnt3d(pt));
}
}
}
}
BOOL AecOutDrawingJig::DoIt(bool bDrag)
{
AcDbExtents extAll1,extEnt;
AcDbExtents ext,extAll;
if (!m_bExtValid)//非总图出图
{
GetEntsUCSExt(extAll);
}
else
{
//总图出图,外部传入 ext m_vtDir
extAll = m_extAll;
}
//分割为多个框,也可由外面传入图幅尺寸
//如果获取内框线范围???,+字求交法
AcGePoint2d ptSize;
if ( !GetInsideDrawSize(m_idRec,ptSize) )
{
acutPrintf(_T("\n计算图幅绘图尺寸出错!请检查图框正确!"));
return FALSE;
}
//通过UCS EXT 计算
double dXE = extAll.maxPoint().x - extAll.minPoint().x;
int nCount = (int)( dXE / ( ptSize.x * m_dScale) + 1.0);//总共这么多图框
if (nCount == 0) nCount = 1; //图框比例太大
//涉及到用户坐标系
AcGePoint3d ptGe[5],ptGeFr,ptGeTo;
AcGePoint3d ptGeFr1 = extAll.minPoint();
AcGePoint3d ptGeTo1 = extAll.maxPoint();
AcGeVector3d vtDirY = m_vtDir;
if (m_bExtValid)
{
AcGePoint3d ptGeTo11 = ptGeTo1;
ptGeTo11.x = __min(ptGeFr1.x,ptGeTo1.x);
AcGePoint3d ptGeFrY = MidPoint(ptGeFr1,ptGeTo11);
acdbUcs2Wcs(asDblArray(ptGeFrY),asDblArray(ptGeFr),false);
vtDirY = m_vtDir;
vtDirY.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
vtDirY.normalize();
ptGeFr -= ptSize.y * m_dScale * 0.5 * vtDirY;
}
else
{
ptGeFr = ptGeFr1;
ptGeTo = ptGeTo1;
ptGeTo.x = __min(ptGeFr.x,ptGeTo.x);
ptGeFr = MidPoint(ptGeFr,ptGeTo);
//UCS 纵断等
vtDirY = AcGeVector3d::kYAxis;
m_vtDir = AcGeVector3d::kXAxis;
//图框内上下居中显示. WriteToDwgFile函数又做了居中调整
//故此处修改 0.5 系数 显示和出图效果不一致,出图始终居中!!!
ptGeFr -= ptSize.y * m_dScale * 0.5 * vtDirY;
}
AcDbLine lnLeft,lnRight;
for (int i = 0;i < nCount;i++)
{
ptGe[0] = ptGeFr;
ptGe[1] = ptGe[0] + m_vtDir * ptSize.x * m_dScale;
ptGe[2] = ptGe[1] + vtDirY * ptSize.y * m_dScale;
ptGe[3] = ptGe[0] + vtDirY * ptSize.y * m_dScale;
ptGe[4] = ptGe[0];
if (i == 0)
{
lnLeft.setStartPoint(ptGe[0]);
lnLeft.setEndPoint(ptGe[3]);
}
if (i == nCount - 1)
{
lnRight.setStartPoint(ptGe[1]);
lnRight.setEndPoint(ptGe[2]);
}
//纵断出图在 UCS 下, 需要转成wcs
if (!m_bExtValid)
{
ads_point pt;
for (int j = 0;j < 5;j++)
{
acdbUcs2Wcs(asDblArray(ptGe[j]),pt,false);
ptGe[j] = asPnt3d(pt);
}
}
m_pDrawingFrms->AppendDrawFrame(ptGe,5);
ptGeFr += m_vtDir * ptSize.x * m_dScale;
}
AcEdJig::DragStatus eStat = AcEdJig::kNormal;
setDispPrompt(_T("\n请按任意键出图或拾取点出图:"));
if (bDrag)
eStat = drag();
if (eStat == AcEdJig::kNormal ||
eStat == AcEdJig::kNull)
{
SplitEntitiesOnDrawframe();
return TRUE;
}
return FALSE;
}
AcEdJig::DragStatus AecOutDrawingJig::sampler()
{
setUserInputControls( ( UserInputControls)
( AcEdJig::kAccept3dCoordinates |
AcEdJig::kNullResponseAccepted ) );
AcEdJig::DragStatus eStat;
if (m_bIsShowEntPtrs)
{
//double dDist = 0.0;
//eStat = acquireDist(dDist);
AcGePoint3d ptGe;
eStat = acquirePoint(ptGe);
if (eStat == AcEdJig::kNormal)
{
if ( ptGe.isEqualTo(m_ptGe))
{
//鼠标原地不动
return AcEdJig::kNoChange;
}
m_ptGe = ptGe;
}
}
else
{
AcGePoint3d ptGe;
eStat = acquirePoint(ptGe);
if (eStat == AcEdJig::kNormal)
{
if ( ptGe.isEqualTo(m_ptGe))
{
//鼠标原地不动
return AcEdJig::kNoChange;
}
m_ptGe = ptGe;
}
}
return eStat;
}
AcDbEntity* AecOutDrawingJig::entity() const
{
return m_pDrawingFrms;
}
Adesk::Boolean AecOutDrawingJig::update()
{
return Adesk::kTrue;
}