#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; iGetAt(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 §ionRecord, 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; }