Files
envi-code/SourceCode/Code2026/tg_shs/shs_pipebase/TEImpBracket.cpp
T
2026-09-28 15:28:50 +08:00

1612 lines
46 KiB
C++

#include "stdafx.h"
#include "TEImpBracket.h"
TEImpBracket::TEImpBracket()
{
}
TEImpBracket::~TEImpBracket()
{
}
Acad::ErrorStatus TEImpBracket::getClassID(CLSID* pClsid) const
{
// #if (ADS < 16)
// CLSID CLSID_BracketEntity = {0x4A8F86A3, 0xCAB9, 0x4342, { 0xB6, 0x53, 0x90, 0x00, 0xB0, 0xA6, 0x52, 0xD7 }};
// #endif
//
// #if (ADS == 16)
// CLSID CLSID_BracketEntity = {0x4A8F86A3, 0xCAB9, 0x4342, { 0xB6, 0x53, 0x90, 0x00, 0xB0, 0xA6, 0x52, 0xD8 }};
// #endif
//
// #if (ADS == 17)
// CLSID CLSID_BracketEntity = {0x4A8F86A3, 0xCAB9, 0x4342, { 0xB6, 0x53, 0x90, 0x00, 0xB0, 0xA6, 0x52, 0xD9 }};
// #endif
//
// #if (ADS == 18)
// CLSID CLSID_BracketEntity = {0x4A8F86A3, 0xCAB9, 0x4342, { 0xB6, 0x53, 0x90, 0x00, 0xB0, 0xA6, 0x52, 0xDA }};
// #endif
//
// #if (ADS == 19)
// CLSID CLSID_BracketEntity = {0x4A8F86A3, 0xCAB9, 0x4342, { 0xB6, 0x53, 0x90, 0x00, 0xB0, 0xA6, 0x52, 0xDA }};
// #endif
return Acad::eOk;
}
void TEImpBracket::GetKindName(CString& sName)
{
sName = _T("TCH_BRACKET");
}
// 夹点提示
Acad::ErrorStatus TEImpBracket::GetGripText(int i, CString &cs) const
{
switch(i)
{
case 0:
{
cs = _T("移动");
break;
}
default:
break;
}
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::getOsnapPoints(AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const
{
if (m_pXDataMap != NULL)
{
switch(osnapMode)
{
case AcDb::kOsModeNear:
{
AcGePoint3d ptNear;
if (GetNearestPoint(pickPoint, ptNear))
{
snapPoints.append(ptNear);
}
}
break;
case AcDb::kOsModeNode:
break;
}
}
return Acad::eOk;
}
// 获取最近点
BOOL TEImpBracket::GetNearestPoint(const AcGePoint3d& pickPoint,AcGePoint3d& ptNear) const
{
BOOL bIsFind = FALSE;
TComplexCurve cplCurve;
if (GetCurves(cplCurve))
{
TSupportFunc spFun;
bIsFind = spFun.GetNearestPoint(cplCurve, pickPoint, ptNear);
}
return bIsFind;
}
BOOL TEImpBracket::GetCurves(TComplexCurve& cplCurve) const
{
AcDbObjectId BlockId;
AcGePoint3d ptInsert;
AcGePoint3d ptS,ptE;
m_pXDataMap->GetAt(KEY_BLOCK_2D,BlockId);
m_pXDataMap->GetAt(KEY_START,ptS);
m_pXDataMap->GetAt(KEY_END,ptE);
TDb::TCurveElement el;
memset(&el,0,sizeof(TDb::TCurveElement));
el.ptGe[0] = ptS;
el.ptGe[1] = ptE;
el.ptGe[2] = ptE;
cplCurve.append(el);
AcDbVoidPtrArray arPtrs,arPtrsSub;
explode(arPtrs);
AcDbEntity* pEnt = NULL;
AcDbBlockReference* pRef = NULL;
AcDbLine* pLine = NULL;
for (int i = 0;i < arPtrs.length();i++)
{
pEnt = (AcDbEntity*)arPtrs[i];
if (pEnt->isKindOf(AcDbBlockReference::desc()))
{
pRef = AcDbBlockReference::cast(pEnt);
pRef->explode(arPtrsSub);
for (int k = 0;k < arPtrsSub.length();k++)
{
pEnt = (AcDbEntity*)arPtrsSub[k];
if (pEnt)
{
if (pEnt->isKindOf(AcDbLine::desc()))
{
pLine = AcDbLine::cast(pEnt);
el.ptGe[0] = pLine->startPoint();
el.ptGe[1] = pLine->endPoint();
el.ptGe[2] = pLine->endPoint();
cplCurve.append(el);
}
}
}
}
}
return TRUE;
}
Acad::ErrorStatus TEImpBracket::explode(AcDbVoidPtrArray& entitySet) const
{
if (m_pOwnerEnt)
{
m_pOwnerEnt->explode(entitySet);
}
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::ExplodeOrDraw2d(XExplodeDraw &mode) const
{
if (m_pXDataMap == NULL)
{
return Acad::eNotImplementedYet;
}
//#define KEY_ROATEANGLE _T("Roateangle") // 图块旋转角度
AcGePoint3d ptS,ptE;
AcDbObjectId idBlk2d1,idBlk2d2;
double dAngle1 = 0.0,dAngle2 = 0.0;
AcGeVector3d vtNormal,vtDir;
int nStyle = 0,nType = 0;
BOOL bDrawPedestal(TRUE);
m_pXDataMap->GetAt(KEY_START,ptS);
m_pXDataMap->GetAt(KEY_END,ptE);
m_pXDataMap->GetAt(KEY_NORMAL,vtNormal);
m_pXDataMap->GetAt(KEY_STYLE,nStyle); //立柱样式
m_pXDataMap->GetAt(KEY_BLOCK_2D,idBlk2d1);
m_pXDataMap->GetAt(KEY_ROATEANGLE,dAngle1);
m_pXDataMap->GetAt(KEY_TYPE,nType);
m_pXDataMap->GetAt(KEY_ISDRAWPEDESTAL, bDrawPedestal);
if (nType == TDb::eDRowSingleBracket)
{
return ExplodeOrDrawDRowBracket2d(mode);
}
vtDir = ptE - ptS;
vtDir.normalize();
// 托臂 changed below by mcl 2011.3.1 支持不绘制底座
ExplodeOrDraw2dSupport(mode,ptS,ptE,vtNormal);
if (bDrawPedestal)
{
ExplodeOrDraw2dPedestal(mode,ptS,idBlk2d1,dAngle1); //底座1
if (nType == TDb::eDoubleBracket)
{
m_pXDataMap->GetAt(KEY_ROATEANGLE2,dAngle2);
ExplodeOrDraw2dPedestal(mode,ptE,idBlk2d1,dAngle2); //底座2
}
}
//立柱2
//ExplodeOrDraw2dPillar(mode,ptPillarS2,vtDir,nStyle);
// //底座1
// ExplodeOrDraw2dPedestal(mode,ptS,idBlk2d1,dAngle1);
//
// //立柱1
// //m_pXDataMap->GetAt(KEY_PILLAR_START,ptPillarS1);
// //ExplodeOrDraw2dPillar(mode,ptPillarS1,vtDir,nStyle);
// //托臂
// ExplodeOrDraw2dSupport(mode,ptS,ptE,vtNormal);
// if (nType == TDb::eDoubleBracket)
// {
// m_pXDataMap->GetAt(KEY_ROATEANGLE2,dAngle2);
// //底座2
// ExplodeOrDraw2dPedestal(mode,ptE,idBlk2d1,dAngle2);
// //立柱2
// //ExplodeOrDraw2dPillar(mode,ptPillarS2,vtDir,nStyle);
// }
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::ExplodeOrDrawDRowBracket2d(XExplodeDraw &mode) const
{
AcGePoint3d ptS,ptE;
AcDbObjectId idBlk2d1,idBlk2d2;
double dAngle1 = 0.0,dAngle2 = 0.0;
AcGeVector3d vtNormal,vtDir;
int nStyle = 0,nType = 0;
BOOL bDrawPedestal(TRUE);
m_pXDataMap->GetAt(KEY_START,ptS);
m_pXDataMap->GetAt(KEY_END,ptE);
m_pXDataMap->GetAt(KEY_NORMAL,vtNormal);
m_pXDataMap->GetAt(KEY_STYLE,nStyle); //立柱样式
m_pXDataMap->GetAt(KEY_BLOCK_2D,idBlk2d1);
m_pXDataMap->GetAt(KEY_ROATEANGLE,dAngle1);
m_pXDataMap->GetAt(KEY_TYPE,nType);
m_pXDataMap->GetAt(KEY_ISDRAWPEDESTAL, bDrawPedestal);
ExplodeOrDraw2dPedestal(mode,ptS,idBlk2d1,dAngle1); //底座1
AcGePoint3d ptS1,ptS2,ptE1,ptE2;
double dLen = 0.0;
m_pXDataMap->GetAt(KEY_DROW_START1,ptS1);
m_pXDataMap->GetAt(KEY_DROW_START2,ptS2);
m_pXDataMap->GetAt(KEY_DROW_LENGTH,dLen);
ptS1.z = ptS.z;
ptS2.z = ptS.z;
vtDir = ptS1 - ptS;
vtDir.normalize();
ptE1 = ptS1 + vtDir * dLen;
vtDir = ptS2 - ptS;
vtDir.normalize();
ptE2 = ptS2 + vtDir * dLen;
//双排托臂
ExplodeOrDraw2dSupport(mode,ptS1,ptE1,vtNormal);
ExplodeOrDraw2dSupport(mode,ptS2,ptE2,vtNormal);
return Acad::eOk;
}
//绘制2维底座 指定插入点 旋转角度 图块id
Acad::ErrorStatus TEImpBracket::ExplodeOrDraw2dPedestal(XExplodeDraw &mode,AcGePoint3d ptIns,AcDbObjectId BlockId,double dAngle) const
{
AcGeScale3d scale(1.0, 1.0, 1.0);
AcDbBlockTableRecord* pBlock = NULL;
if (acdbOpenObject(pBlock, BlockId, AcDb::kForRead) == Acad::eOk)
{
mode.DrawBlock(*pBlock, ptIns, scale, dAngle, TRUE);
pBlock->close();
}
return Acad::eOk;
}
//绘制2维立柱 指定类型
Acad::ErrorStatus TEImpBracket::ExplodeOrDraw2dPillar(XExplodeDraw &mode,AcGePoint3d ptS,AcGeVector3d vtDir,int nStyle) const
{
switch(nStyle)
{
case eSquareSteel:
{
double dW = 0.0,dL = 0.0;
m_pXDataMap->GetAt(KEY_B2,dW);
m_pXDataMap->GetAt(KEY_L2,dL);
AcGePoint3d pt1,pt2,pt3,pt4;
AcGeVector3d vtTemp = vtDir;
vtTemp.rotateBy(PI/2,TSysCoordinateTool::GetCurrentViewWCSKZAxis());
vtDir.normalize();
vtTemp.normalize();
pt1 = ptS + vtDir*dL/2 + vtTemp*dW/2;
pt2 = pt1 - vtDir*dL;
pt3 = pt2 - vtTemp*dW;
pt4 = pt3 + vtDir*dL;
XLine l1,l2,l3,l4;
l1.SetPoints(pt2,pt1);
l2.SetPoints(pt2,pt3);
l3.SetPoints(pt4,pt1);
l4.SetPoints(pt4,pt3);
mode.DrawLine(l1);
mode.DrawLine(l2);
mode.DrawLine(l3);
mode.DrawLine(l4);
break;
}
default:
break;
}
return Acad::eOk;
}
//绘制2维托臂 指定起点,法向量,方向向量,长度
Acad::ErrorStatus TEImpBracket::ExplodeOrDraw2dSupport(XExplodeDraw &mode,AcGePoint3d ptS,AcGePoint3d ptE,AcGeVector3d vtNormal) const
{
AcDbPolyline* pLine = new AcDbPolyline;
if(pLine)
{
double dLineWidth = 0.0;
m_pXDataMap->GetAt(KEY_EDAGEWIDTH,dLineWidth);
AcGePlane plane(ptS,vtNormal);
AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plane);
plane.set(ptOrth,vtNormal);
double dEl = ptOrth.asVector().length();
if (!ptOrth.asVector().isCodirectionalTo(vtNormal))
{
dEl *= -1.0;
}
BracketArmType eType = TDb::eLineShape;
m_pXDataMap->GetAt(KEY_BRACKETARMTYPE, (int&)eType);
if (TDb::eLineShape == eType)
{
pLine->addVertexAt(0,ptS.convert2d(plane));
pLine->addVertexAt(1,ptE.convert2d(plane));
}
else if (TDb::eRectShape == eType) // mcl add 2011.3.1 增加矩形画法
{
double dWidth(0.0);
m_pXDataMap->GetAt(KEY_RECTARMWIDTH, dWidth);
if (dWidth < 1)
dWidth = 50.0;
AcGePoint3d ptUpLeft, ptUpRight, ptDwLeft, ptDwRight;
AcGeVector3d vtPerl = (ptE - ptS).normalize();
vtPerl.rotateBy(PI*0.5, vtNormal);
ptUpLeft = ptS - vtPerl * dWidth*0.5;
ptUpRight = ptUpLeft + vtPerl * dWidth;
ptDwLeft = ptE - vtPerl * dWidth*0.5;
ptDwRight = ptDwLeft + vtPerl * dWidth;
pLine->addVertexAt(0, ptUpLeft.convert2d(plane));
pLine->addVertexAt(1, ptUpRight.convert2d(plane));
pLine->addVertexAt(2, ptDwRight.convert2d(plane));
pLine->addVertexAt(3, ptDwLeft.convert2d(plane));
pLine->setClosed(Adesk::kTrue);
}
pLine->setNormal(vtNormal);
pLine->setConstantWidth(dLineWidth);
pLine->setElevation(dEl);
mode.Polyline(*pLine);
delete pLine;
}
else
return Acad::eOutOfMemory;
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::ExplodeOrDraw3d(XExplodeDraw &mode) const
{
Acad::ErrorStatus es = Acad::eInvalidInput;
if (m_pXDataMap != NULL)
{
int nType = -1;
int nBracketType = 0;
m_pXDataMap->GetAt(KEY_RUNTIME,nType);
switch (nType)
{
case TDb::eBracket:
{
m_pXDataMap->GetAt(KEY_TYPE,nBracketType);
if (nBracketType == TDb::eDRowSingleBracket)
{
//双排单臂吊架
es = ExplodeOrDrawDRowBracket3d(mode);
}
else
es = ExplodeOrDrawBracket3d(mode);
break;
}
case TDb::eSupport:
{
es = ExplodeOrDrawSupport3d(mode);
break;
}
default:
break;
}
}
return es;
}
Acad::ErrorStatus TEImpBracket::ExplodeOrDrawBracket3d(XExplodeDraw &mode) const
{
if (m_pXDataMap != NULL)
{
AcGePoint3d ptS,ptE,ptPillarS1,ptPillarE1,ptPillarS2,ptPillarE2;
AcDbObjectId idBlk2d1,idBlk2d2;
double dAngle1 = 0.0,dAngle2 = 0.0,dLen = 0.0;
AcGeVector3d vtNormal,vtDir;
int nStyle = 0,nType = 0;
m_pXDataMap->GetAt(KEY_START,ptS);
m_pXDataMap->GetAt(KEY_END,ptE);
m_pXDataMap->GetAt(KEY_NORMAL,vtNormal);
m_pXDataMap->GetAt(KEY_STYLE,nStyle); //立柱样式
m_pXDataMap->GetAt(KEY_TYPE,nType);
m_pXDataMap->GetAt(KEY_BLOCK_2D,idBlk2d1);
m_pXDataMap->GetAt(KEY_ROATEANGLE,dAngle1);
m_pXDataMap->GetAt(KEY_PILLAR_START,ptPillarS1);
m_pXDataMap->GetAt(KEY_PILLAR_END,ptPillarE1);
vtDir = ptE - ptS;
vtDir.normalize();
dLen = ptS.distanceTo(ptE);
// 绘制底座(四方体)
ExplodeOrDraw3dPedestal(mode,ptPillarS1,vtNormal);
// 绘制立柱
ExplodeOrDraw3dPillar(mode,ptPillarS1,ptPillarE1,vtNormal,nStyle);
// 绘制托臂
AcGePoint3dArray arPt;
m_pXDataMap->GetAt(KEY_SUPPORT_PTLST,arPt);
for (int i = 0;i < arPt.length();i++)
{
ptS = arPt[i];
ExplodeOrDraw3dSupport(mode,ptS,vtNormal,vtDir,dLen);
}
if (nType == TDb::eDoubleBracket)
{
m_pXDataMap->GetAt(KEY_PILLAR_START2,ptPillarS2);
m_pXDataMap->GetAt(KEY_PILLAR_END2,ptPillarE2);
//底座2
ExplodeOrDraw3dPedestal(mode,ptPillarS2,vtNormal);
//立柱2
ExplodeOrDraw3dPillar(mode,ptPillarS2,ptPillarE2,vtNormal,nStyle);
}
}
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::ExplodeOrDrawSupport3d(XExplodeDraw &mode) const
{
if (m_pXDataMap != NULL)
{
AcGePoint3d ptS,ptE,ptPillarS1,ptPillarE1,ptPillarS2,ptPillarE2;
AcDbObjectId idBlk2d1,idBlk2d2;
double dAngle1 = 0.0,dAngle2 = 0.0,dLen = 0.0;
AcGeVector3d vtNormal,vtDir;
int nStyle;
m_pXDataMap->GetAt(KEY_START,ptS);
m_pXDataMap->GetAt(KEY_END,ptE);
m_pXDataMap->GetAt(KEY_NORMAL,vtNormal);
m_pXDataMap->GetAt(KEY_STYLE,nStyle); //立柱样式
m_pXDataMap->GetAt(KEY_BLOCK_2D,idBlk2d1);
m_pXDataMap->GetAt(KEY_ROATEANGLE,dAngle1);
m_pXDataMap->GetAt(KEY_PILLAR_START,ptPillarS1);
m_pXDataMap->GetAt(KEY_PILLAR_END,ptPillarE1);
vtDir = ptE - ptS;
vtDir.normalize();
dLen = ptS.distanceTo(ptE);
// 绘制底座(四方体)
//ExplodeOrDraw3dPedestal(mode,ptS,vtNormal);
// 绘制立柱
ExplodeOrDraw3dPillar(mode,ptPillarS1,ptPillarE1,vtNormal,nStyle);
// 绘制托臂
AcGePoint3dArray arPt;
m_pXDataMap->GetAt(KEY_SUPPORT_PTLST,arPt);
for (int i = 0;i < arPt.length();i++)
{
ptS = arPt[i];
ExplodeOrDraw3dSupport(mode,ptS,vtNormal,vtDir,dLen);
}
}
return Acad::eOk;
}
//绘制双排吊架
Acad::ErrorStatus TEImpBracket::ExplodeOrDrawDRowBracket3d(XExplodeDraw& mode) const
{
if (m_pXDataMap != NULL)
{
AcGePoint3d ptS,ptE,ptPillarS1,ptPillarE1,ptPillarS2,ptPillarE2;
AcDbObjectId idBlk2d1,idBlk2d2;
double dAngle1 = 0.0,dAngle2 = 0.0,dLen = 0.0,dL1 = 0.0;
AcGeVector3d vtNormal,vtDir;
int nStyle = 0,nType = 0;
m_pXDataMap->GetAt(KEY_START,ptS);
m_pXDataMap->GetAt(KEY_END,ptE);
m_pXDataMap->GetAt(KEY_NORMAL,vtNormal);
m_pXDataMap->GetAt(KEY_STYLE,nStyle); //立柱样式
m_pXDataMap->GetAt(KEY_TYPE,nType);
m_pXDataMap->GetAt(KEY_BLOCK_2D,idBlk2d1);
m_pXDataMap->GetAt(KEY_ROATEANGLE,dAngle1);
m_pXDataMap->GetAt(KEY_PILLAR_START,ptPillarS1);
m_pXDataMap->GetAt(KEY_PILLAR_END,ptPillarE1);
m_pXDataMap->GetAt(KEY_L1,dL1);
m_pXDataMap->GetAt(KEY_DROW_LENGTH,dLen);
// 绘制底座(四方体)
ExplodeOrDraw3dPedestal(mode,ptS,vtNormal);
// 绘制立柱
ExplodeOrDraw3dPillar(mode,ptPillarS1,ptPillarE1,vtNormal,nStyle);
//绘制托臂
AcGeDoubleArray arHeight;
m_pXDataMap->GetAt(KEY_DROW_HEIGHT,arHeight);
//计算托臂起点,ptS为底座中心点
AcGePoint3d ptS1,ptS2;
double dW = 0.0,dL = 0.0,dB2;
m_pXDataMap->GetAt(KEY_B2,dB2); //立柱宽度
vtDir = ptE - ptS;
vtDir.normalize();
ptS1 = ptS + vtDir * dB2 * 0.5;
ptS2 = ptS - vtDir * dB2 * 0.5;
//lsd del 2013-7-26 不按两边对称画
// for (int i = 0;i < arHeight.length();i++)
// {
// //计算托臂起点
// ptS1.z = arHeight[i];
// ptS2.z = arHeight[i];
// ExplodeOrDraw3dSupport(mode,ptS1,vtNormal,vtDir,dLen);
// ExplodeOrDraw3dSupport(mode,ptS2,vtNormal,-1 * vtDir,dLen);
// }
//lsd add 2013-7-26 支持两边不对称
AcGePoint3dArray arPoints;
m_pXDataMap->GetAt(KEY_SUPPORT_PTLST,arPoints);
int dCount = arPoints.length();
if(0 == dCount)
{
for (int i = 0;i < arHeight.length();i++)
{
//计算托臂起点
ptS1.z = arHeight[i];
ptS2.z = arHeight[i];
ExplodeOrDraw3dSupport(mode,ptS1,vtNormal,vtDir,dLen);
ExplodeOrDraw3dSupport(mode,ptS2,vtNormal,-1 * vtDir,dLen);
}
}
else
{
for(int i=0; i<dCount; i++)
{
ptS1.z = arPoints[i].z;
ptS2.z = arPoints[i].z;
//判断当前托臂的方向
//if(arPoints[i].isEqualTo(ptS1))
if(arPoints[i].isEqualTo(ptS1, g_globalTol)) // modify by cq TFS8208
{
ExplodeOrDraw3dSupport(mode,ptS1,vtNormal,vtDir,dLen);
}
else
{
ExplodeOrDraw3dSupport(mode,ptS2,vtNormal,-1 * vtDir,dLen);
}
}
}
}
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::ExplodeOrDraw3dPedestal(XExplodeDraw &mode,AcGePoint3d ptIns,AcGeVector3d vtNormal) const
{
double dB = 0.0,dL = 0.0,dH = 0.0;
AcGePoint3d ptS,ptE;
m_pXDataMap->GetAt(KEY_B1,dB);
m_pXDataMap->GetAt(KEY_L1,dL);
m_pXDataMap->GetAt(KEY_H1,dH);
m_pXDataMap->GetAt(KEY_START,ptS);
m_pXDataMap->GetAt(KEY_END,ptE);
AcGeVector3d vtDir = ptE - ptS;
AcGeVector3d vtTemp = vtDir;
AcGeVector3d vtNor = vtNormal;
vtTemp.rotateBy(PI/2,vtNormal);
vtTemp.normalize();
vtDir.normalize();
vtNor.normalize();
AcGePoint3d ptLst1[5],ptLst2[5];
ptLst1[0] = ptIns - vtDir*dL/2 - vtTemp*dB/2;
ptLst1[1] = ptLst1[0] + vtDir*dL;
ptLst1[2] = ptLst1[1] - vtNor*dH;
ptLst1[3] = ptLst1[0] - vtNor*dH;
ptLst1[4] = ptLst1[0];
ptLst2[0] = ptIns - vtDir*dL/2 + vtTemp*dB/2;
ptLst2[1] = ptLst2[0] + vtDir*dL;
ptLst2[2] = ptLst2[1] - vtNor*dH;
ptLst2[3] = ptLst2[0] - vtNor*dH;
ptLst2[4] = ptLst2[0];
AcGePoint3d ptLstTemp[4];
for (int i = 0;i < 4;i++)
{
ptLstTemp[0] = ptLst1[i];
ptLstTemp[1] = ptLst2[i];
ptLstTemp[2] = ptLst1[i+1];
ptLstTemp[3] = ptLst2[i+1];
mode.DrawMesh(2,2,ptLstTemp);
}
ptLstTemp[0] = ptLst1[0];
ptLstTemp[1] = ptLst1[1];
ptLstTemp[2] = ptLst1[3];
ptLstTemp[3] = ptLst1[2];
mode.DrawMesh(2,2,ptLstTemp);
ptLstTemp[0] = ptLst2[0];
ptLstTemp[1] = ptLst2[1];
ptLstTemp[2] = ptLst2[3];
ptLstTemp[3] = ptLst2[2];
mode.DrawMesh(2,2,ptLstTemp);
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::ExplodeOrDraw3dSupport(XExplodeDraw &mode,AcGePoint3d ptS,AcGeVector3d vtNormal,AcGeVector3d vtDir,double dLen) const
{
double dW = 0.0,dL = 0.0,dH = 0.0;
m_pXDataMap->GetAt(KEY_W,dW);
m_pXDataMap->GetAt(KEY_L,dL);
m_pXDataMap->GetAt(KEY_H,dH);
if (dL < dLen)
{
dL = dLen;
}
AcGeVector3d vtTemp = vtDir;
AcGeVector3d vtNor = vtNormal;
vtTemp.rotateBy(PI/2,vtNormal);
vtTemp.normalize();
vtDir.normalize();
vtNor.normalize();
AcGePoint3d ptLst1[5],ptLst2[5];
ptLst1[0] = ptS - vtDir*(dL-dLen)/2 + vtTemp*dW/2;
ptLst1[1] = ptLst1[0] - vtTemp*dW;
ptLst1[2] = ptLst1[1] - vtNor*dH;
ptLst1[3] = ptLst1[0] - vtNor*dH;
ptLst1[4] = ptLst1[0];
ptLst2[0] = ptLst1[0] + vtDir*dL;
ptLst2[1] = ptLst1[1] + vtDir*dL;
ptLst2[2] = ptLst1[2] + vtDir*dL;
ptLst2[3] = ptLst1[3] + vtDir*dL;
ptLst2[4] = ptLst2[0];
AcGePoint3d ptLstTemp[4];
for (int i = 0;i < 4;i++)
{
ptLstTemp[0] = ptLst1[i];
ptLstTemp[1] = ptLst2[i];
ptLstTemp[2] = ptLst1[i+1];
ptLstTemp[3] = ptLst2[i+1];
mode.DrawMesh(2,2,ptLstTemp);
}
ptLstTemp[0] = ptLst1[0];
ptLstTemp[1] = ptLst1[1];
ptLstTemp[2] = ptLst1[3];
ptLstTemp[3] = ptLst1[2];
mode.DrawMesh(2,2,ptLstTemp);
ptLstTemp[0] = ptLst2[0];
ptLstTemp[1] = ptLst2[1];
ptLstTemp[2] = ptLst2[3];
ptLstTemp[3] = ptLst2[2];
mode.DrawMesh(2,2,ptLstTemp);
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::ExplodeOrDraw3dPillar(XExplodeDraw &mode,AcGePoint3d ptS,AcGePoint3d ptE,AcGeVector3d vtNormal,int nStyle) const
{
double dW = 0.0,dL = 0.0;
AcGePoint3d ptStart,ptEnd;
m_pXDataMap->GetAt(KEY_B2,dW);
m_pXDataMap->GetAt(KEY_L2,dL);
m_pXDataMap->GetAt(KEY_START,ptStart);
m_pXDataMap->GetAt(KEY_END,ptEnd);
AcGeVector3d vtDir = ptEnd - ptStart;
AcGeVector3d vtTemp = vtDir;
AcGeVector3d vtNor = vtNormal;
vtTemp.rotateBy(PI/2,vtNormal);
vtTemp.normalize();
vtDir.normalize();
vtNor.normalize();
AcGePoint3d ptLst1[5],ptLst2[5];
ptLst1[0] = ptS - vtDir*(dL)/2 + vtTemp*dW/2;
ptLst1[1] = ptLst1[0] - vtTemp*dW;
ptLst1[2] = ptLst1[1] + vtDir*dL;
ptLst1[3] = ptLst1[0] + vtDir*dL;
ptLst1[4] = ptLst1[0];
ptLst2[0] = ptE - vtDir*(dL)/2 + vtTemp*dW/2;
ptLst2[1] = ptLst2[0] - vtTemp*dW;
ptLst2[2] = ptLst2[1] + vtDir*dL;
ptLst2[3] = ptLst2[0] + vtDir*dL;
ptLst2[4] = ptLst2[0];
AcGePoint3d ptLstTemp[4];
for (int i = 0;i < 4;i++)
{
ptLstTemp[0] = ptLst1[i];
ptLstTemp[1] = ptLst2[i];
ptLstTemp[2] = ptLst1[i+1];
ptLstTemp[3] = ptLst2[i+1];
mode.DrawMesh(2,2,ptLstTemp);
}
ptLstTemp[0] = ptLst1[0];
ptLstTemp[1] = ptLst1[1];
ptLstTemp[2] = ptLst1[3];
ptLstTemp[3] = ptLst1[2];
mode.DrawMesh(2,2,ptLstTemp);
ptLstTemp[0] = ptLst2[0];
ptLstTemp[1] = ptLst2[1];
ptLstTemp[2] = ptLst2[3];
ptLstTemp[3] = ptLst2[2];
mode.DrawMesh(2,2,ptLstTemp);
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::transformBy(const AcGeMatrix3d& xform)
{
AcGePoint3d ptS,ptE,ptPillarS,ptPillarE,ptPillarS2,ptPillarE2;
AcGeVector3d vtNor,vtOldDir,vtNewDir;
AcGePoint3dArray arPnts;
double dAngle1 = 0.0;
int nType = 0;
m_pXDataMap->GetAt(KEY_START,ptS);
m_pXDataMap->GetAt(KEY_END,ptE);
m_pXDataMap->GetAt(KEY_PILLAR_START,ptPillarS);
m_pXDataMap->GetAt(KEY_PILLAR_END,ptPillarE);
m_pXDataMap->GetAt(KEY_SUPPORT_PTLST,arPnts);
m_pXDataMap->GetAt(KEY_NORMAL, vtNor);
m_pXDataMap->GetAt(KEY_TYPE,nType);
m_pXDataMap->GetAt(KEY_ROATEANGLE,dAngle1);
//增加图块角度处理
vtOldDir = ptE - ptS;
ptS.transformBy(xform);
ptE.transformBy(xform);
vtNewDir = ptE - ptS;
double dAngle = vtOldDir.angleTo(vtNewDir,AcGeVector3d::kZAxis);
ptPillarS.transformBy(xform);
ptPillarE.transformBy(xform);
vtNor.transformBy(xform);
for (int i = 0;i < arPnts.length();i++)
{
arPnts[i].transformBy(xform);
}
m_pXDataMap->SetAt(KEY_START,ptS);
m_pXDataMap->SetAt(KEY_END,ptE);
m_pXDataMap->SetAt(KEY_PILLAR_START,ptPillarS);
m_pXDataMap->SetAt(KEY_PILLAR_END,ptPillarE);
m_pXDataMap->SetAt(KEY_SUPPORT_PTLST,arPnts);
m_pXDataMap->SetAt(KEY_NORMAL, vtNor);
m_pXDataMap->SetAt(KEY_ROATEANGLE,dAngle1 + dAngle);
if (nType == TDb::eDoubleBracket)
{
double dAngle2 = 0.0;
AcGePoint3d ptPillarS2,ptPillarE2;
m_pXDataMap->GetAt(KEY_ROATEANGLE2,dAngle2);
m_pXDataMap->GetAt(KEY_PILLAR_START2,ptPillarS2);
m_pXDataMap->GetAt(KEY_PILLAR_END2,ptPillarE2);
ptPillarS2.transformBy(xform);
ptPillarE2.transformBy(xform);
m_pXDataMap->SetAt(KEY_PILLAR_START2,ptPillarS2);
m_pXDataMap->SetAt(KEY_PILLAR_END2,ptPillarE2);
m_pXDataMap->SetAt(KEY_ROATEANGLE2,dAngle2 + dAngle);
}
else if (nType == TDb::eDRowSingleBracket)
{
//增加双排吊架处理
AcGePoint3d ptDR1,ptDR2;
m_pXDataMap->GetAt(KEY_DROW_START1,ptDR1);
m_pXDataMap->GetAt(KEY_DROW_START2,ptDR2);
ptDR1.transformBy(xform);
ptDR2.transformBy(xform);
m_pXDataMap->SetAt(KEY_DROW_START1,ptDR1);
m_pXDataMap->SetAt(KEY_DROW_START2,ptDR2);
}
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::moveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
if (m_pXDataMap != NULL)
{
AcGePoint3d ptS,ptE,ptPillarS,ptPillarE,ptPillarS2,ptPillarE2;
AcGePoint3dArray arPnts;
int nType = 0;
m_pXDataMap->GetAt(KEY_START,ptS);
m_pXDataMap->GetAt(KEY_END,ptE);
m_pXDataMap->GetAt(KEY_PILLAR_START,ptPillarS);
m_pXDataMap->GetAt(KEY_PILLAR_END,ptPillarE);
m_pXDataMap->GetAt(KEY_SUPPORT_PTLST,arPnts);
m_pXDataMap->GetAt(KEY_TYPE,nType);
ptS += offset;
ptE += offset;
ptPillarS += offset;
ptPillarE += offset;
ptPillarS2 += offset;
ptPillarE2 += offset;
for (int i = 0;i < arPnts.length();i++)
{
arPnts[i] += offset;
}
m_pXDataMap->SetAt(KEY_START,ptS);
m_pXDataMap->SetAt(KEY_END,ptE);
m_pXDataMap->SetAt(KEY_PILLAR_START,ptPillarS);
m_pXDataMap->SetAt(KEY_PILLAR_END,ptPillarE);
m_pXDataMap->SetAt(KEY_SUPPORT_PTLST,arPnts);
if (nType == TDb::eDoubleBracket)
{
AcGePoint3d ptPillarS2,ptPillarE2;
m_pXDataMap->GetAt(KEY_PILLAR_START2,ptPillarS2);
m_pXDataMap->GetAt(KEY_PILLAR_END2,ptPillarE2);
ptPillarS2 += offset;
ptPillarE2 += offset;
m_pXDataMap->SetAt(KEY_PILLAR_START2,ptPillarS2);
m_pXDataMap->SetAt(KEY_PILLAR_END2,ptPillarE2);
}
else if (nType == TDb::eDRowSingleBracket)
{
//增加双排吊架处理
AcGePoint3d ptDR1,ptDR2;
m_pXDataMap->GetAt(KEY_DROW_START1,ptDR1);
m_pXDataMap->GetAt(KEY_DROW_START2,ptDR2);
ptDR1 += offset;
ptDR2 += offset;
m_pXDataMap->SetAt(KEY_DROW_START1,ptDR1);
m_pXDataMap->SetAt(KEY_DROW_START2,ptDR2);
}
}
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::moveStretchPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
return moveGripPointsAt(indices, offset);
}
Acad::ErrorStatus TEImpBracket::getStretchPoints(AcGePoint3dArray& stretchPoints) const
{
if (m_pXDataMap != NULL)
{
AcGePoint3d pt;
m_pXDataMap->GetAt(KEY_MID,pt);
stretchPoints.append(pt);
}
return Acad::eOk;
}
Acad::ErrorStatus TEImpBracket::getGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const
{
if (m_pXDataMap == NULL)
{
return Acad::eNotImplementedYet;
}
AcGePoint3d pt;
m_pXDataMap->GetAt(KEY_START, pt);
gripPoints.append(pt);
return Acad::eOk;
}
void TEImpBracket::list() const
{
}
// 2012/9/26 comment by wzh
// CString TEImpBracket::GetXml() const
// {
// if (m_pXDataMap == NULL || m_pOwnerEnt == NULL)
// {
// return _T("");
// }
//
// int nValue(0);
// double dValue(0.0);
// int nSizePreci(3), nPtPreci(6); // 尺寸、位置精度
//
// TXmlTree xmlTree;
// CString csText;
// AcGePoint3d pt;
// AcGePoint3dArray arPts;
// AcGeVector3d vtDir;
// CString csX, csY, csZ;
// POSITION posRoot = xmlTree.Insert(_T("ATS_EQUIPMENT"), NULL, NULL);
// {
// CString sTemp = _T("");
// m_pXDataMap->GetAt(KEY_RUNTIME,nValue);
// sTemp.Format(_T("%d"),nValue);
// xmlTree.SetAttribute(posRoot, _T("name"), sTemp);
// xmlTree.SetAttribute(posRoot, _T("comment"), _T("26:吊架 27:支架"));
// }
//
// POSITION nowPos = xmlTree.Insert(KEY_TYPE,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("吊架样式"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("0:支架 1:双臂吊架 2:单臂吊架"));
// nValue = 0;
// m_pXDataMap->GetAt(KEY_TYPE,nValue);
// csText.Format(_T("%d"),nValue);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(KEY_START,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("起点"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("起点"));
// m_pXDataMap->GetAt(KEY_START,pt);
// TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
// TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
// TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
// csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(KEY_END,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("终点"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("终点"));
// m_pXDataMap->GetAt(KEY_END,pt);
// TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
// TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
// TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
// csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(KEY_PILLAR_START,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱1起点"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱1起点"));
// m_pXDataMap->GetAt(KEY_PILLAR_START,pt);
// TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
// TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
// TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
// csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(KEY_PILLAR_END,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱1终点"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱1终点"));
// m_pXDataMap->GetAt(KEY_PILLAR_END,pt);
// TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
// TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
// TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
// csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(KEY_PILLAR_START2,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱2起点"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱2起点"));
// m_pXDataMap->GetAt(KEY_PILLAR_START2,pt);
// TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
// TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
// TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
// csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(KEY_PILLAR_END2,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱2终点"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱2终点"));
// m_pXDataMap->GetAt(KEY_PILLAR_END2,pt);
// TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
// TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
// TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
// csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(KEY_SUPPORT_PTLST,posRoot,NULL);
// {
// CString sTemp = _T("");
// xmlTree.SetAttribute(nowPos, _T("name"), _T("托臂起点"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("托臂起点集"));
// m_pXDataMap->GetAt(KEY_SUPPORT_PTLST,arPts);
// csText.Empty();
// for(int i = 0;i < arPts.length();i++)
// {
// pt = arPts[i];
// TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
// TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
// TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
// sTemp.Format(_T("%s,%s,%s"),csX,csY,csZ);
// if (!csText.IsEmpty())
// {
// csText += _T(";");
// }
// csText += sTemp;
// }
//
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(KEY_B1,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("底座截面宽度"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("底座截面宽度"));
// m_pXDataMap->GetAt(KEY_B1,dValue);
// TAuxTools::DoubleToString(dValue,nSizePreci,csText);
// xmlTree.SetItemText(nowPos,csText);
// }
// nowPos = xmlTree.Insert(KEY_H1,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("底座截面高度"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("底座截面高度"));
// m_pXDataMap->GetAt(KEY_H1,dValue);
// TAuxTools::DoubleToString(dValue,nSizePreci,csText);
// xmlTree.SetItemText(nowPos,csText);
// }
// nowPos = xmlTree.Insert(KEY_L1,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("底座截面长度"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("底座截面长度"));
// m_pXDataMap->GetAt(KEY_L1,dValue);
// TAuxTools::DoubleToString(dValue,nSizePreci,csText);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(KEY_W,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("托臂截面宽度"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("托臂截面宽度"));
// m_pXDataMap->GetAt(KEY_W,dValue);
// TAuxTools::DoubleToString(dValue,nSizePreci,csText);
// xmlTree.SetItemText(nowPos,csText);
// }
// nowPos = xmlTree.Insert(KEY_H,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("托臂截面高度"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("托臂截面高度"));
// m_pXDataMap->GetAt(KEY_H,dValue);
// TAuxTools::DoubleToString(dValue,nSizePreci,csText);
// xmlTree.SetItemText(nowPos,csText);
// }
// nowPos = xmlTree.Insert(KEY_L,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("托臂截面长度"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("托臂截面长度"));
// m_pXDataMap->GetAt(KEY_L,dValue);
// TAuxTools::DoubleToString(dValue,nSizePreci,csText);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(KEY_B2,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱截面宽度"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱截面宽度"));
// m_pXDataMap->GetAt(KEY_B2,dValue);
// TAuxTools::DoubleToString(dValue,nSizePreci,csText);
// xmlTree.SetItemText(nowPos,csText);
// }
// nowPos = xmlTree.Insert(KEY_L2,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱截面长度"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱截面长度"));
// m_pXDataMap->GetAt(KEY_L2,dValue);
// TAuxTools::DoubleToString(dValue,nSizePreci,csText);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(KEY_NORMAL,posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos, _T("name"), _T("法相量"));
// xmlTree.SetAttribute(nowPos, _T("comment"), _T("法相量"));
// m_pXDataMap->GetAt(KEY_NORMAL,vtDir);
// TAuxTools::DoubleToString(vtDir.x,nPtPreci,csX);
// TAuxTools::DoubleToString(vtDir.y,nPtPreci,csY);
// TAuxTools::DoubleToString(vtDir.z,nPtPreci,csZ);
// csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// nowPos = xmlTree.Insert(_T("Object_ID"),posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos,_T("name"),_T("ID"));
// xmlTree.SetAttribute(nowPos,_T("comment"),_T("支吊架ID"));
// LONG_PTR nid = m_pOwnerEnt->objectId().asOldId();
//
// csText.Format(_T("%ld"),nid);
// xmlTree.SetItemText(nowPos,csText);
// }
//
// // //获取颜色
// // CString strLayerName = m_pOwnerEnt->layer();
// // CString strColor = _T("");
// // int nr,ng,nb;
// // int ncolor = 0;
// // AcDbHardPointerId idlayer;
// // AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
// // AcDbLayerTable *pLayerTable =NULL;
// // pDb->getLayerTable(pLayerTable,AcDb::kForRead);
// // if (NULL!=pLayerTable)
// // {
// // pLayerTable->getAt(strLayerName,idlayer);
// // pLayerTable->close();
// // }
// // AcDbLayerTableRecord *pLayer = NULL;
// // Adesk::UInt16 nColor16;
// // acdbOpenObject(pLayer, idlayer,AcDb::kForRead);
// // if (pLayer != NULL)
// // {
// // ncolor = pLayer->color().color();
// // ncolor = pLayer->color().colorIndex();
// // nColor16 = pLayer->color().colorIndex();
// // nr = pLayer->color().red();
// // ng = pLayer->color().green();
// // nb = pLayer->color().blue();
// // pLayer->close();
// // TchExport::ColorToRGB(nColor16,&nr,&ng,&nb);
// // strColor.Format(_T("%d"), RGB(nr,ng,nb));
// // }
// // nowPos = xmlTree.Insert(_T("Ent_Color"),posRoot,NULL);
// // {
// // xmlTree.SetAttribute(nowPos,_T("name"),_T("color"));
// // xmlTree.SetAttribute(nowPos,_T("comment"),_T("实体颜色"));
// // xmlTree.SetItemText(nowPos,strColor);
// // }
//
// CString csXml = xmlTree.GetXml();
//
// return csXml;
// }
//
//
CString TEImpBracket::GetXml(const AcGeMatrix3d& mat) const
{
//
if (m_pXDataMap == NULL || m_pOwnerEnt == NULL)
{
return _T("");
}
int nValue(0);
double dValue(0.0);
int nSizePreci(3), nPtPreci(6); // 尺寸、位置精度
TXmlTree xmlTree;
CString csText;
AcGePoint3d pt;
AcGePoint3dArray arPts;
AcGeVector3d vtDir;
CString csX, csY, csZ;
POSITION posRoot = xmlTree.Insert(_T("ATS_EQUIPMENT"), NULL, NULL);
{
CString sTemp = _T("");
m_pXDataMap->GetAt(KEY_RUNTIME,nValue);
sTemp.Format(_T("%d"),nValue);
xmlTree.SetAttribute(posRoot, _T("name"), sTemp);
xmlTree.SetAttribute(posRoot, _T("comment"), _T("26:吊架 27:支架"));
}
POSITION nowPos = xmlTree.Insert(KEY_TYPE,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("吊架样式"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("0:支架 1:双臂吊架 2:单臂吊架"));
nValue = 0;
m_pXDataMap->GetAt(KEY_TYPE,nValue);
csText.Format(_T("%d"),nValue);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_START,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("起点"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("起点"));
m_pXDataMap->GetAt(KEY_START,pt);
TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_END,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("终点"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("终点"));
m_pXDataMap->GetAt(KEY_END,pt);
TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_PILLAR_START,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱1起点"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱1起点"));
m_pXDataMap->GetAt(KEY_PILLAR_START,pt);
TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_PILLAR_END,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱1终点"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱1终点"));
m_pXDataMap->GetAt(KEY_PILLAR_END,pt);
TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_PILLAR_START2,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱2起点"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱2起点"));
m_pXDataMap->GetAt(KEY_PILLAR_START2,pt);
TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_PILLAR_END2,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱2终点"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱2终点"));
m_pXDataMap->GetAt(KEY_PILLAR_END2,pt);
TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
xmlTree.SetItemText(nowPos,csText);
}
//add by axc
int nBracketType = 0;
m_pXDataMap->GetAt(KEY_TYPE,nBracketType);
if (nBracketType == TDb::eDRowSingleBracket)
{
nowPos = xmlTree.Insert(KEY_DROW_LENGTH,posRoot,NULL);
{
double dLen;
m_pXDataMap->GetAt(KEY_DROW_LENGTH,dLen);
xmlTree.SetAttribute(nowPos, _T("name"), _T("托臂长度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("托臂长度"));
TAuxTools::DoubleToString(dLen,nSizePreci,csText);
xmlTree.SetItemText(nowPos,csText);
}
}
nowPos = xmlTree.Insert(KEY_SUPPORT_PTLST,posRoot,NULL);
{
CString sTemp = _T("");
xmlTree.SetAttribute(nowPos, _T("name"), _T("托臂起点"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("托臂起点集"));
m_pXDataMap->GetAt(KEY_SUPPORT_PTLST,arPts);
csText.Empty();
for(int i = 0;i < arPts.length();i++)
{
pt = arPts[i];
TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
sTemp.Format(_T("%s,%s,%s"),csX,csY,csZ);
if (!csText.IsEmpty())
{
csText += _T(";");
}
csText += sTemp;
}
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_DROWSUPPORT_H,posRoot,NULL);
{
int nBracketType = 0;
m_pXDataMap->GetAt(KEY_TYPE,nBracketType);
if (nBracketType == TDb::eDRowSingleBracket)
{
AcGeDoubleArray arHeight;
m_pXDataMap->GetAt(KEY_DROW_HEIGHT,arHeight);
xmlTree.SetAttribute(nowPos, _T("name"), _T("托臂高度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("托臂高度"));
if (arHeight.length() > 0)
{
csText.Format(_T("%f"), arHeight[0]);
}
xmlTree.SetItemText(nowPos,csText);
}
}
nowPos = xmlTree.Insert(KEY_DROW_START1,posRoot,NULL);
{
AcGePoint3d pt;
xmlTree.SetAttribute(nowPos, _T("name"), _T("双排吊架托臂2d起点1"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("双排吊架托臂2d起点1"));
m_pXDataMap->GetAt(KEY_DROW_START1,pt);
TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_DROW_START2,posRoot,NULL);
{
AcGePoint3d pt;
xmlTree.SetAttribute(nowPos, _T("name"), _T("双排吊架托臂2d起点2"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("双排吊架托臂2d起点2"));
m_pXDataMap->GetAt(KEY_DROW_START2,pt);
TAuxTools::DoubleToString(pt.x,nPtPreci,csX);
TAuxTools::DoubleToString(pt.y,nPtPreci,csY);
TAuxTools::DoubleToString(pt.z,nPtPreci,csZ);
csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_B1,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("底座截面宽度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("底座截面宽度"));
m_pXDataMap->GetAt(KEY_B1,dValue);
TAuxTools::DoubleToString(dValue,nSizePreci,csText);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_H1,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("底座截面高度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("底座截面高度"));
m_pXDataMap->GetAt(KEY_H1,dValue);
TAuxTools::DoubleToString(dValue,nSizePreci,csText);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_L1,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("底座截面长度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("底座截面长度"));
m_pXDataMap->GetAt(KEY_L1,dValue);
TAuxTools::DoubleToString(dValue,nSizePreci,csText);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_W,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("托臂截面宽度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("托臂截面宽度"));
m_pXDataMap->GetAt(KEY_W,dValue);
TAuxTools::DoubleToString(dValue,nSizePreci,csText);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_H,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("托臂截面高度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("托臂截面高度"));
m_pXDataMap->GetAt(KEY_H,dValue);
TAuxTools::DoubleToString(dValue,nSizePreci,csText);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_L,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("托臂截面长度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("托臂截面长度"));
m_pXDataMap->GetAt(KEY_L,dValue);
TAuxTools::DoubleToString(dValue,nSizePreci,csText);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_B2,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱截面宽度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱截面宽度"));
m_pXDataMap->GetAt(KEY_B2,dValue);
TAuxTools::DoubleToString(dValue,nSizePreci,csText);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_L2,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("立柱截面长度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("立柱截面长度"));
m_pXDataMap->GetAt(KEY_L2,dValue);
TAuxTools::DoubleToString(dValue,nSizePreci,csText);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_NORMAL,posRoot,NULL);
{
xmlTree.SetAttribute(nowPos, _T("name"), _T("法相量"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("法相量"));
m_pXDataMap->GetAt(KEY_NORMAL,vtDir);
TAuxTools::DoubleToString(vtDir.x,nPtPreci,csX);
TAuxTools::DoubleToString(vtDir.y,nPtPreci,csY);
TAuxTools::DoubleToString(vtDir.z,nPtPreci,csZ);
csText.Format(_T("%s,%s,%s"),csX,csY,csZ);
xmlTree.SetItemText(nowPos,csText);
}
nowPos = xmlTree.Insert(KEY_ROATEANGLE,posRoot,NULL);
{
double dAngle = 0;
int nPreci(16);
xmlTree.SetAttribute(nowPos, _T("name"), _T("底座图块1旋转角度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("角度"));
m_pXDataMap->GetAt(KEY_ROATEANGLE,dAngle);
TAuxTools::DoubleToString(dAngle,nPreci,csText);
xmlTree.SetItemText(nowPos,csText);
}
int nType;
m_pXDataMap->GetAt(KEY_TYPE,nType);
if (nType == TDb::eDoubleBracket)
{
nowPos = xmlTree.Insert(KEY_ROATEANGLE2,posRoot,NULL);
{
double dAngle = 0;
int nPreci(16);
xmlTree.SetAttribute(nowPos, _T("name"), _T("底座图块2旋转角度"));
xmlTree.SetAttribute(nowPos, _T("comment"), _T("角度"));
m_pXDataMap->GetAt(KEY_ROATEANGLE2,dAngle);
TAuxTools::DoubleToString(dAngle,nPreci,csText);
xmlTree.SetItemText(nowPos,csText);
}
}
nowPos = xmlTree.Insert(_T("BLOCK2d"),posRoot,NULL);
{
xmlTree.SetAttribute(nowPos,_T("name"),_T("BLOCK2d"));
xmlTree.SetAttribute(nowPos,_T("comment"),_T("二维吊架图案"));
AcDbObjectId objId;
m_pXDataMap->GetAt(KEY_BLOCK_2D,objId);
AcDbBlockTableRecord *pRec = NULL;
acdbOpenObject(pRec, objId, AcDb::kForRead);
if (pRec != NULL)
{
TCHAR* pName = NULL;
pRec->getName(pName);
xmlTree.SetItemText(nowPos,pName);
pRec->close();
}
}
//end
nowPos = xmlTree.Insert(_T("Object_ID"),posRoot,NULL);
{
xmlTree.SetAttribute(nowPos,_T("name"),_T("ID"));
xmlTree.SetAttribute(nowPos,_T("comment"),_T("支吊架ID"));
LONG_PTR nid = m_pOwnerEnt->objectId().asOldId();
csText.Format(_T("%ld"),nid);
xmlTree.SetItemText(nowPos,csText);
}
// //获取颜色
// CString strLayerName = m_pOwnerEnt->layer();
// CString strColor = _T("");
// int nr,ng,nb;
// int ncolor = 0;
// AcDbHardPointerId idlayer;
// AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
// AcDbLayerTable *pLayerTable =NULL;
// pDb->getLayerTable(pLayerTable,AcDb::kForRead);
// if (NULL!=pLayerTable)
// {
// pLayerTable->getAt(strLayerName,idlayer);
// pLayerTable->close();
// }
// AcDbLayerTableRecord *pLayer = NULL;
// Adesk::UInt16 nColor16;
// acdbOpenObject(pLayer, idlayer,AcDb::kForRead);
// if (pLayer != NULL)
// {
// ncolor = pLayer->color().color();
// ncolor = pLayer->color().colorIndex();
// nColor16 = pLayer->color().colorIndex();
// nr = pLayer->color().red();
// ng = pLayer->color().green();
// nb = pLayer->color().blue();
// pLayer->close();
// TchExport::ColorToRGB(nColor16,&nr,&ng,&nb);
// strColor.Format(_T("%d"), RGB(nr,ng,nb));
// }
// nowPos = xmlTree.Insert(_T("Ent_Color"),posRoot,NULL);
// {
// xmlTree.SetAttribute(nowPos,_T("name"),_T("color"));
// xmlTree.SetAttribute(nowPos,_T("comment"),_T("实体颜色"));
// xmlTree.SetItemText(nowPos,strColor);
// }
CString csXml = xmlTree.GetXml();
return csXml;
}
bool TEImpBracket::GetSection(const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir,
std::vector<TObjSectionRecord> &sectionRecord, AcDbVoidPtrArray& arFillPtrs) const
{
if (NULL == m_pOwnerEnt || NULL == m_pXDataMap)
return false;
// 基本参数
AcDbObjectId idObj = m_pOwnerEnt->objectId();
AcDbObjectId idLayer = m_pOwnerEnt->layerId();
TGGeSectionPlane section_pln(face, vtPlaneSecDir); // 构造一个辅助剖面
AcDbVoidPtrArray arFaces;
XExplodeStream dc(arFaces);
ExplodeOrDraw3d(dc);
double dElevation = 0;
AcDbEntity* pEnt = NULL;
AcDbFace* pFace = NULL;
int i = 0;
for(i = 0; i < arFaces.length(); ++i)
{
pEnt = (AcDbEntity*)arFaces[i];
if (NULL == pEnt)
continue;
pFace = AcDbFace::cast(pEnt);
if (pFace)
{
TGGeSectionPlane pln(*pFace, vtPlaneSecDir);
TGGePoly2D poly;
dElevation = SectionUtility::Projection_plane2plane(section_pln, pln, poly);
if (poly.Length())
sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_EEQUIPMENT, dElevation, poly));
}
delete pEnt;
}
return true;
}
// 剖切用,返回Z坐标最高、最低点
Acad::ErrorStatus TEImpBracket::GetExtents(TADSGePoint3d &ptLow, TADSGePoint3d &ptUp) const
{
AcGePoint3d ptS,ptE;
double dHight = 0.0,dL = 0.0;
AcGeVector3d vtNor,vtMin;
m_pXDataMap->GetAt(KEY_START,ptS);
m_pXDataMap->GetAt(KEY_PILLAR_END,ptE);
ptLow = ptE;
ptUp = ptS;
return Acad::eOk;
}