#include "stdafx.h" #include "DbPipeValve.h" #include "DbPipe.h" #include "DbDoubleLinePipe.h" extern void Matrix3D2String( const AcGeMatrix3d &mat, CString &str ); ACRX_DXF_DEFINE_MEMBERS(ATSPipeValve, ATSPipeAttachment, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,1, ATS_PIPEVALVE, "ATS_PIPEVALVE图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); IMPLEMENT_TENTBASE(TDbPipeValve); const Adesk::UInt8 TDbPipeValve::g_nVersion = 2; TDbPipeValve::TDbPipeValve() : m_dWidth(0.0),m_dScale(1.0),m_dYScale(1.0),m_dFlangeDn(0),m_dFlangeWidth(0),m_nQuadrant(0),m_bHorizontal(FALSE),m_bFlange(FALSE),m_dSpare(0) { } void TDbPipeValve::CopyPropertiesFrom(AcDbEntity *pSrc,unsigned gMatchFlag) { assertWriteEnabled(); TDbPipeAttachment::CopyPropertiesFrom(pSrc, gMatchFlag); TDbPipeValve *pValve = TDbPipeValve::cast(pSrc); if(pValve) { //m_idBlock2d = pValve->m_idBlock2d; //m_idBlock3d = pValve->m_idBlock3d; //m_sSysBlock = pValve->m_sSysBlock; m_bHorizontal = pValve->m_bHorizontal; m_bFlange = pValve->m_bFlange; m_dFlangeDn = pValve->m_dFlangeDn; m_dFlangeWidth = pValve->m_dFlangeWidth; //m_dWidth = pValve->m_dWidth; //m_dScale = pValve->m_dScale; } } Acad::ErrorStatus TDbPipeValve::subGetClassID(CLSID* pClsid) const { return Acad::eOk; } // 从DWG读入数据: Acad::ErrorStatus TDbPipeValve::dwgInFields(AcDbDwgFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbPipeAttachment::dwgInFields(pFiler); if(es != Acad::eOk) return es; Adesk::UInt8 nVer; pFiler->readItem(&nVer); if(nVer>g_nVersion) {// Version is too new return Acad::eMakeMeProxy; } pFiler->readItem(&m_idBlock2d); pFiler->readItem(&m_idBlock3d); ReadString(pFiler, m_sSysBlock); pFiler->readItem(&m_dScale); pFiler->readItem(&m_dWidth); //pFiler->readItem(&m_bHorizontal); FilerRead(pFiler, m_bHorizontal); pFiler->readItem(&m_nQuadrant); if(nVer > 1){ pFiler->readItem(&m_dYScale); pFiler->readItem(&m_dZScale); pFiler->readItem(&m_dFlangeWidth); pFiler->readItem(&m_dFlangeDn); //pFiler->readItem(&m_bFlange); FilerRead(pFiler, m_bFlange); // pFiler->readItem(&m_dFlangeWidth); } else{ BOOL IsDoublePipeValve = FALSE; if(m_dYScale == 1 && m_dZScale == 0){ m_dYScale = m_dScale; m_dZScale = m_dScale; } OPENOBJ_BEGIN(m_idPipe, AcDb::kForRead, TDbDoubleLinePipe, pPipe); if(pPipe){ if(m_dScale > 10 && m_dYScale < 2){ m_dYScale = m_dScale; m_dZScale = m_dScale; } } OPENOBJ_END(); } return pFiler->filerStatus(); } Acad::ErrorStatus TDbPipeValve::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es = TDbPipeAttachment::dwgOutFields(pFiler); if(es != Acad::eOk) return es; if(g_nSaveTArchVer==6) pFiler->writeItem((Adesk::UInt8)1); else pFiler->writeItem(g_nVersion); pFiler->writeItem(m_idBlock2d); pFiler->writeItem(m_idBlock3d); pFiler->writeItem((const TCHAR *)m_sSysBlock); pFiler->writeItem(m_dScale); pFiler->writeItem(m_dWidth); //pFiler->writeItem(m_bHorizontal); FilerWrite(pFiler, m_bHorizontal); pFiler->writeItem(m_nQuadrant); if(g_nSaveTArchVer>6){ pFiler->writeItem(m_dYScale); pFiler->writeItem(m_dZScale); pFiler->writeItem(m_dFlangeWidth); pFiler->writeItem(m_dFlangeDn); //pFiler->writeItem(m_bFlange); FilerWrite(pFiler, m_bFlange); // pFiler->writeItem(m_dFlangeWidth); } return pFiler->filerStatus(); } Acad::ErrorStatus TDbPipeValve::dxfInFields(AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::dxfInFields(pFiler); if(es!=Acad::eOk) return es; if (!pFiler->atSubclassData(_T("TDbPipeValve"))) { return Acad::eBadDxfSequence; } resbuf rb; while((es==Acad::eOk) && ((es=pFiler->readResBuf(&rb))==Acad::eOk)) { switch (rb.restype) { case AcDb::kDxfXReal: m_dWidth=rb.resval.rreal; break; case AcDb::kDxfXReal+1: m_dScale=rb.resval.rreal; break; case AcDb::kDxfBlockName: break; default: pFiler->pushBackItem(); es = Acad::eEndOfFile; break; } } if(es!=Acad::eEndOfFile) return Acad::eInvalidResBuf; return pFiler->filerStatus(); } Acad::ErrorStatus TDbPipeValve::dxfOutFields(AcDbDxfFiler* pFiler) const { Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::dxfOutFields(pFiler); assert(es == Acad::eOk); es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbPipeValve")); assert(es == Acad::eOk); pFiler->writeDouble(AcDb::kDxfXReal,m_dWidth); pFiler->writeDouble(AcDb::kDxfXReal+1,m_dScale); CString sBlkName,sDesName; GetBlkNameById(m_idBlock2d,sBlkName,sDesName); pFiler->writeString(AcDb::kDxfBlockName,(const TCHAR*)sBlkName); return es; } Acad::ErrorStatus TDbPipeValve::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const { assertReadEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::subGetStretchPoints(stretchPoints); if(es!=Acad::eOk) return es; return Acad::eOk; } // 取得所有的夹点 Acad::ErrorStatus TDbPipeValve::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { assertReadEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::subGetGripPoints(gripPoints,osnapModes,geomIds); if(es!=Acad::eOk) return es; XPoint ptQuadrant = GetQuadrantGrip(); gripPoints.append((AcGePoint3d)ptQuadrant); return Acad::eOk; } extern BOOL Is2DView(); Acad::ErrorStatus TDbPipeValve::subTransformBy(const AcGeMatrix3d& xform) { assertWriteEnabled(); // 移动、赋值、黏贴时阀门所在管线进行了特殊处理,故阀门作相应调整处理 cet 2012.11.12 modify // TDbPipeAttachment::subTransformBy(xform); XString &sCmd=GetCurDocData()->m_sCurCommand; if((_tcsicmp(sCmd,_T("MOVE"))==0 || _tcsicmp(sCmd,_T("copy"))==0 || _tcsicmp(sCmd,_T("pasteclip"))==0) && (Is2DView())) { AcGeVector3d vtNoneZ = xform.translation(); AcGeMatrix3d mat(xform); if(fabs(vtNoneZ.x) > 0.0001 || fabs(vtNoneZ.y) > 0.0001)//2012-9-2 SR 修正:z轴位移除外 { vtNoneZ.x = 0.0; vtNoneZ.y = 0.0; vtNoneZ.z *= -1; AcGeMatrix3d mat1; mat1.setToTranslation(vtNoneZ); mat *= mat1; } TDbPipeAttachment::subTransformBy(mat); } else { TDbPipeAttachment::subTransformBy(xform); } ScaleTransform(xform,m_dScale); ScaleTransform(xform,m_dYScale); ScaleTransform(xform,m_dZScale); if(IsMirrorMatrix(xform)) { //阀门镜像 sr add 2005/6/7 int q = GetQuadrant(); if(q == 0) q = 3; else if(q == 1) q = 2; else if(q == 2) q = 1; else if(q == 3) q = 0; //q = (q + 2) % 4; SetQuadrant(q); return Acad::eOk; } return Acad::eOk; } // 取得夹点说明 Acad::ErrorStatus TDbPipeValve::GetGripText(int idx, CString &cs) const { Acad::ErrorStatus es = Acad::eOk; es = TDbPipeAttachment::GetGripText(idx,cs); if(es!=Acad::eOk) return es; switch(idx) { case 1: cs=_T("改变开启方向"); break; default: /*es=Acad::eInvalidInput*/; } return es; } Acad::ErrorStatus TDbPipeValve::MoveGSPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { XPoint vtOffset=*(XPoint *)&offset; for (int i = 0; i < indices.length(); i++) { int idx = indices[i]; switch(idx) { case 1:{//quadrant point vtOffset.z=0; XPoint ptQuadrant(GetQuadrantGrip()); ptQuadrant += vtOffset; double dAngle = 0; if(!IsHorizontal()) dAngle = ads_angle(XPoint(),m_vtLocation); dAngle = CT_std_angle(ads_angle(m_ptLocation, ptQuadrant)-dAngle); if(dAngle>=0.0 && dAngle=PI/2.0 && dAngle=PI && dAngle<1.5*PI) m_nQuadrant=2; else m_nQuadrant=3; } break; default: break; } } return Acad::eOk; } Acad::ErrorStatus TDbPipeValve::subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::subMoveGripPointsAt(indices,offset); if(es!=Acad::eOk) return es; es = MoveGSPointsAt(indices,offset); return es; } Acad::ErrorStatus TDbPipeValve::subMoveStretchPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbPipeAttachment::subMoveStretchPointsAt(indices,offset); //if(es!=Acad::eOk) return es; //es = MoveGSPointsAt(indices,offset); return es; } // 象限点 XPoint TDbPipeValve::GetQuadrantGrip() const { XPoint ptQuadrant; double dGripDist = 1; double dAngle = 0; if(!IsHorizontal()) dAngle = ads_angle(XPoint(),m_vtLocation); dAngle += m_nQuadrant*PI/2+PI/4; double dWidth=GetWidth()>1.0E-3 ? GetWidth()/2 : 100; // if(GetScale() > 50) // dGripDist = dWidth; // else dGripDist = dWidth*GetScale(); ads_polar(m_ptLocation,dAngle,dGripDist,ptQuadrant); return ptQuadrant; } double TDbPipeValve::GetWidth() const { BOOL IsDoublePipeValve = FALSE; OPENOBJ_BEGIN(m_idPipe, AcDb::kForRead, TDbDoubleLinePipe, pPipe); if(pPipe){ IsDoublePipeValve = TRUE; } OPENOBJ_END(); if(!IsDoublePipeValve) return m_dWidth*GetPScale()/100; else { // cet 2018.6.22 add 支持米单位 if (DocGetCurMeterUnitDraw()) { return m_dWidth * 0.001; } return m_dWidth; } } // 图块插入比例 AcGeScale3d TDbPipeValve::GetInsertScale() const { assertReadEnabled(); BOOL IsDoublePipeValve = FALSE; OPENOBJ_BEGIN(m_idPipe, AcDb::kForRead, TDbDoubleLinePipe, pPipe); if(pPipe){ IsDoublePipeValve = TRUE; } OPENOBJ_END(); double dScale(1), dScaleY(1); if(!IsDoublePipeValve) dScale=GetScale()*GetPScale()/100; else { dScale = m_dScale; // cet 2018.6.22 add 支持米单位 if (DocGetCurMeterUnitDraw()) { dScale *= 0.001; } } if(!IsDoublePipeValve) dScaleY=m_dYScale*GetPScale()/100; else { dScaleY = m_dYScale; // cet 2018.6.22 add 支持米单位 if (DocGetCurMeterUnitDraw()) { dScaleY *= 0.001; } } if(fabs(dScaleY) < 0.001) dScaleY = dScale; AcGeScale3d scale(dScale,dScaleY,fabs(dScale)); if(m_nQuadrant==1){ scale.sx *= -1; } else if(m_nQuadrant==2) { scale.sx *= -1; scale.sy *= -1; } else if(m_nQuadrant==3) { scale.sy *= -1; } return scale; } Acad::ErrorStatus TDbPipeValve::ExplodeOrDraw2d(XExplodeDraw &dc) const { // cet 2016.10.17 add 图层关闭时,实体不显示,不进行绘制(打印时,也不会绘制) AcDbLayerTableRecordPointer player(this->layerId(), AcDb::kForRead); if (player.openStatus() == Acad::eOk && player->isOff()) { return Acad::eOk; } return _ExplodeOrDraw2d(dc); } extern BOOL IsSystemValve(AcDbObjectId id); Acad::ErrorStatus TDbPipeValve:: _ExplodeOrDraw2d(XExplodeDraw &dc,BOOL bZEqual0) const { if(!m_idBlock2d.isValid()) return Acad::eInvalidInput; if(fabs(m_vtLocation.x)<1.0E-6 && fabs(m_vtLocation.y)<1.0E-6) return Acad::eOk; //垂直阀件 OPENOBJ_BEGIN(m_idBlock2d, AcDb::kForRead, AcDbBlockTableRecord, pBlock); if(pBlock) { XPoint ptInsert=m_ptLocation; if(bZEqual0) ptInsert.z=0; double dAngle=0; if(!m_bHorizontal) dAngle=ads_angle(XPoint(),m_vtLocation); //delete by dyw 2014-5-8 在端点处的阀门水平放置时与管线平行 /************************************************************************* else // cet 2011.11.10 add 水平放置时角度 { dAngle = Ucs2Wcs(0.0); } *************************************************************************/ //delete end //add by dyw 2014-5-9 如果在水管的端点进行水平放置的时候 则阀门的方向跟水管的方向一致 //============================================================================================ else { //获取关联水管的起始和终止点 XPoint ptSPipe, ptEPipe; OPENOBJ_BEGIN(m_idPipe, AcDb::kForRead, TDbPipe, pPipe); if(NULL != pPipe) { ptSPipe = pPipe->StartPoint(); ptEPipe = pPipe->EndPoint(); //拾取水管端点时,计算水管的方向 if(acutDistance(m_ptLocation, ptSPipe) <= 1e-5 || acutDistance(m_ptLocation, ptEPipe) <= 1e-5) { AcGeVector3d vecTemp(m_vtLocation); vecTemp.rotateBy(PI / 2, AcGeVector3d::kZAxis); dAngle = ads_angle(XPoint(), XPoint(vecTemp.x, vecTemp.y, vecTemp.z)); //水管方向与X轴夹角大于九十度的时候 根据拾取点的位置(以Y轴为基准),若点在上方则反向绘制阀门 if(dAngle > PI / 2) { dAngle = (((m_ptLocation == ptSPipe) && (m_ptLocation.y > ptEPipe.y))|| ((m_ptLocation == ptEPipe) && (m_ptLocation.y > ptSPipe.y))) ? dAngle - PI : dAngle; } //水管方向与X轴平行的时候 根据拾取点的位置(以X轴为基准),若点在右方则反向绘制阀门 else if((dAngle - PI / 2) <= 1e-5) { dAngle = (((m_ptLocation == ptSPipe) && (m_ptLocation.x > ptEPipe.x))|| ((m_ptLocation == ptEPipe) && (m_ptLocation.x > ptSPipe.x))) ? dAngle - PI : dAngle; } //水管方向与X轴夹角小于九十度的时候 根据拾取点的位置(以Y轴为基准),若点在上方则反向绘制阀门 else { dAngle = (((m_ptLocation == ptSPipe) && (m_ptLocation.y > ptEPipe.y))|| ((m_ptLocation == ptEPipe) && (m_ptLocation.y > ptSPipe.y))) ? dAngle - PI : dAngle; } } //拾取水管上的点时 else dAngle = Ucs2Wcs(0.0); } else dAngle = Ucs2Wcs(0.0); OPENOBJ_END(); } //============================================================================================ //add end double dScaleX=1,dScaleY=1; // BOOL bNewMethod=(g_nAcadVer>15.0001 && g_bMakeBlock); // sg add 091105,强制打印时,不使用新方法 // if (_tcscmp(dc.Desc(), XAcGiViewDraw::Descriptor())==0 && dc.IsPlotGeneration()) // bNewMethod = FALSE; //2011-9-30 沈睿dc.DrawBlock(*pBlock,ptInsert,GetInsertScale(),dAngle,TRUE); 采用旧方法,从8.0版本开始,TRUE参数对于打印不起作用。关闭图层,仍然打印 //dc.DrawBlock(*pBlock,ptInsert,GetInsertScale(),dAngle,bNewMethod); dc.DrawBlock(*pBlock,ptInsert,GetInsertScale(),dAngle,TRUE); } OPENOBJ_END(); BOOL bIsDouble = FALSE; BOOL bIsSys = IsSystemValve(m_idBlock2d); OPENOBJ_BEGIN(m_idPipe, AcDb::kForRead, TDbDoubleLinePipe, pPipe); if(pPipe){ bIsDouble = TRUE; if(bIsSys) bIsSys = FALSE; } OPENOBJ_END(); if(m_bFlange){ double nWidth = GetWidth()*m_dScale+m_dFlangeWidth*m_dScale*GetPScale()/100; double dFlangeDn=m_dFlangeDn*GetPScale()/100; if(bIsDouble) dFlangeDn = m_dFlangeDn; //如果是双线水管的阀门,按真实尺寸,不按比例 2008-11-3 double dAng = ads_angle(XPoint(),m_vtLocation); if(bIsSys){ if(m_nQuadrant == 0 || m_nQuadrant == 2) dAng = dAng - PI/4; else dAng = dAng + PI/4; } XPoint pt1, pt2, pt3, pt4; // cet 2011.11.10 modify // ads_polar(m_ptLocation, ads_angle(XPoint(),m_vtLocation), nWidth/2, pt1); // ads_polar(m_ptLocation, ads_angle(XPoint(),m_vtLocation), -nWidth/2, pt2); if (m_bHorizontal) { dAng = Ucs2Wcs(0.0); ads_polar(m_ptLocation, dAng, nWidth/2, pt1); ads_polar(m_ptLocation, dAng, -nWidth/2, pt2); } else { ads_polar(m_ptLocation, ads_angle(XPoint(),m_vtLocation), nWidth/2, pt1); ads_polar(m_ptLocation, ads_angle(XPoint(),m_vtLocation), -nWidth/2, pt2); } ads_polar(pt1, dAng+PI/2, dFlangeDn/2, pt3); ads_polar(pt1, dAng-PI/2, dFlangeDn/2, pt4); dc << XLine(pt3, pt4); ads_polar(pt2, dAng+PI/2, dFlangeDn/2, pt3); ads_polar(pt2, dAng-PI/2, dFlangeDn/2, pt4); dc << XLine(pt3, pt4); nWidth = GetWidth()*m_dScale; // cet 2011.11.10 modify // ads_polar(m_ptLocation, ads_angle(XPoint(),m_vtLocation), nWidth/2, pt1); // ads_polar(m_ptLocation, ads_angle(XPoint(),m_vtLocation), -nWidth/2, pt2); if (m_bHorizontal) { ads_polar(m_ptLocation, dAng, nWidth/2, pt1); ads_polar(m_ptLocation, dAng, -nWidth/2, pt2); } else { ads_polar(m_ptLocation, ads_angle(XPoint(),m_vtLocation), nWidth/2, pt1); ads_polar(m_ptLocation, ads_angle(XPoint(),m_vtLocation), -nWidth/2, pt2); } ads_polar(pt1, dAng+PI/2, dFlangeDn/2, pt3); ads_polar(pt1, dAng-PI/2, dFlangeDn/2, pt4); dc << XLine(pt3, pt4); ads_polar(pt2, dAng+PI/2, dFlangeDn/2, pt3); ads_polar(pt2, dAng-PI/2, dFlangeDn/2, pt4); dc << XLine(pt3, pt4); } return Acad::eOk; } Acad::ErrorStatus TDbPipeValve::ExplodeOrDraw3d(XExplodeDraw &dc) const { if(!m_idBlock3d.isValid()) return _ExplodeOrDraw2d(dc,FALSE); OPENOBJ_BEGIN(m_idBlock3d, AcDb::kForRead, AcDbBlockTableRecord, pBlock); if(pBlock) { XVector3D vtNormal(0,0,1); if(fabs(m_vtLocation.z)>1.0E-6) { //非水平面,计算法向 vtNormal = XVector3D(1,0,0)*m_vtLocation; vtNormal.Normalize(); } XPoint ptLoc=Wcs2Ecs(m_ptLocation, vtNormal); double nRotEcs = ads_angle(XPoint(),m_vtLocation); //计算ECS下的转角 if(fabs(m_vtLocation.z)>1.0E-6) { //非水平面,计算插入角度,ads_angle只能计算平面角度 AcGeVector3d v1 = m_vtLocation.AsAcGeVector3d(); AcGeVector3d v2 = AcGeVector3d::kXAxis; nRotEcs = v2.angleTo(v1); } AcDbBlockReference insert(ptLoc, m_idBlock3d); insert.setRotation(nRotEcs); insert.setNormal(vtNormal); // sr modify 2005-6-14 阀门的比例随管径走,不管平面中的插入比例 OPENOBJ_BEGIN(m_idPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ double dn = pPipe->GetDnDiameter()*0.5; // cet 2017.3.3 add 支持米单位 if (DocGetCurMeterUnitDraw()) { dn *= 0.001; } if(pPipe->GetModelType() == TPipeSys::kSystem)//系统图不画3d return _ExplodeOrDraw2d(dc,FALSE); insert.setScaleFactors(dn); } OPENOBJ_END(); if(_tcscmp(dc.Desc(), XAcGiViewDraw::Descriptor())==0) { AcGeMatrix3d mat=insert.blockTransform(); AcGiGeometry *geom=((XAcGiViewDraw &)dc).GetCommonDraw()->rawGeometry(); geom->pushModelTransform(mat); //if(geom != NULL) // geom->draw(&insert); geom->draw(pBlock); geom->popModelTransform(); //insert.worldDraw(viewDraw.m_pWd); } else if(_tcscmp(dc.Desc(), XExplodeStream::Descriptor())==0) { ((XExplodeStream &)dc).Append((AcDbEntity *)insert.clone()); } } else { return Acad::eInvalidInput; } OPENOBJ_END(); return Acad::eOk; } void TDbPipeValve::GetTips(DList &info) const { TDbPipeAttachment::GetTips(info); info.Append(new TObjInfoUnit(_T("对象类型"), _T("管道附件"))); CString sBlkName,sDesName; if(GetBlkNameById(m_idBlock2d,sBlkName,sDesName) && !sDesName.IsEmpty()) { info.Append(new TObjInfoUnit(_T("对象名称"), (const TCHAR*)sDesName)); } } void InitDbPipeValve(BOOL bTrue) { if(bTrue) { TDbPipeValve::rxInit(); TDbPipeValve::InitMatchProtocol(TRUE); } else { TDbPipeValve::InitMatchProtocol(FALSE); deleteAcRxClass(TDbPipeValve::desc()); } } bool TDbPipeValve::GetSection(const AcDbFace &face, const AcGeVector3d& vtPlaneSecDir, std::vector §ionRecords, AcDbVoidPtrArray& arFillPtrs) const { AcDbObjectId idPipe = GetPipeId(); // 所在管线 if (!idPipe.isValid()) { return false; } AcGePoint3d ptS, ptE; BOOL bVertical = FALSE; TDbPipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForRead); if (pPipe != NULL) { ptS = pPipe->StartPoint(); ptE = pPipe->EndPoint(); bVertical = pPipe->IsVertical(); pPipe->close(); } TGGeSectionPlane section_pln(face, vtPlaneSecDir); AcGeLineSeg3d line(ptS, ptE); AcGeLineSeg3d seg; AcGePoint3d pt; short iRet = SectionUtility::Projection_line2plane(section_pln, line, seg, pt); if (iRet == 0) // 不垂直 { AcGePlane plane = section_pln.AsAcGePlane(); pt = m_ptLocation.AsAcGePoint3d(); AcGePoint3d ptTemp = pt.orthoProject(plane); if (section_pln.IsOn(ptTemp,true)) { // 距投影面的距离 double dDist = ptTemp.distanceTo(pt); // 图块外包框 AcGePoint3d ptMin, ptMax; XPoint pt1, pt2; GetExtents(pt1, pt2); ptMin = pt1; ptMax = pt2; ptMax = ptMax.orthoProject(plane); ptMin = ptMin.orthoProject(plane); if (bVertical) // 附件在立管上 { CString strBlockName, strDesName; GetBlkNameById(m_idBlock2d, strBlockName, strDesName); int nIndex = -1; nIndex = strBlockName.Find(_T("$"), 1); if (nIndex != -1) { strBlockName = strBlockName.Right(strBlockName.GetLength() - nIndex - 1); } strBlockName += _T("-1"); AcDbBlockTable *pBlkTbl = NULL; acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite); if (pBlkTbl != NULL) { AcDbObjectId idBlock; if (pBlkTbl->has(strBlockName)) // 块存在 { pBlkTbl->getAt(strBlockName, idBlock); } else { AcDbBlockTableRecord *pNewRec = new AcDbBlockTableRecord; pNewRec->setName(strBlockName); pBlkTbl->add(idBlock, pNewRec); AcDbBlockReference *pRef = new AcDbBlockReference(AcGePoint3d::kOrigin, m_idBlock2d); AcGeMatrix3d mat; mat.setToRotation(PI * 0.5, AcGeVector3d::kZAxis, AcGePoint3d::kOrigin); pRef->transformBy(mat); AcDbVoidPtrArray ptrArr; pRef->explode(ptrArr); for (int i = 0; i < ptrArr.length(); i++) { AcDbEntity *pEnt = (AcDbEntity*)ptrArr[i]; AcDbEntity *pNewEnt = (AcDbEntity*)pEnt->clone(); if(pNewEnt != NULL) { pNewRec->appendAcDbEntity(pNewEnt); pNewEnt->close(); } } delete pRef; pNewRec->close(); } pBlkTbl->close(); if (idBlock.isValid()) { BlockRefInfo info(idBlock, AcGeScale3d(m_dScale), ptTemp, dDist * (-1), ptMax, ptMin); TSectionFill *pFill = new TSectionFill(info, layerId()); arFillPtrs.append(pFill); } } } else { BlockRefInfo info(m_idBlock2d, AcGeScale3d(m_dScale), ptTemp, dDist * (-1), ptMax, ptMin); TSectionFill *pFill = new TSectionFill(info, layerId()); arFillPtrs.append(pFill); } } } return true; } CString TDbPipeValve::GetXml(const AcGeMatrix3d& mat) const { // cet 2013.5.14 add 三维图块id不存在时,不进行导出 if (!m_idBlock3d.isValid() && !m_idBlock2d.isValid()) { return CString(); } AcDbObjectId idBlock3d = m_idBlock3d; if (!m_idBlock3d.isValid()) { idBlock3d = m_idBlock2d; } TPipeSys::ModelType modelType = TPipeSys::kModel; AcDbObjectId idPipe = GetPipeId(); // 所在管线 TDbPipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForRead); if (pPipe != NULL) { modelType = pPipe->GetModelType(); pPipe->close(); } if (modelType == TPipeSys::kSystem) // 系统图 { return CString(); } TXmlTree xmlTree; CString csText; AcGePoint3d pt; CString csX, csY, csZ; int nPreci = 3; // 精度 POSITION posRoot = xmlTree.Insert(_T("ATS_PIPEVALVE"), NULL, NULL); { xmlTree.SetAttribute(posRoot, _T("name"), _T("水管阀门")); xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称")); } POSITION posItemName = xmlTree.Insert(_T("Equip_name"),posRoot, NULL); { xmlTree.SetAttribute(posItemName, _T("name"), _T("设备名称")); xmlTree.SetAttribute(posItemName, _T("comment"), _T("对应图库中的阀门名称")); CString csBlkName, csDesName; GetBlkNameById(m_idBlock2d,csBlkName,csDesName); xmlTree.SetItemText(posItemName, csDesName); } POSITION posItemCenterPt = xmlTree.Insert(_T("Center_point"), posRoot, posItemName); { xmlTree.SetAttribute(posItemCenterPt, _T("name"), _T("中心点")); xmlTree.SetAttribute(posItemCenterPt, _T("comment"), _T("插入点位置")); XPoint ptLoc = m_ptLocation; ptLoc.TransformBy(mat); csX = DoubleToString(ptLoc.x, nPreci); csY = DoubleToString(ptLoc.y, nPreci); csZ = DoubleToString(ptLoc.z, nPreci); csText.Format(_T("%s,%s,%s"), csX, csY, csZ); xmlTree.SetItemText(posItemCenterPt, csText); } POSITION posItemBlk = xmlTree.Insert(_T("Block"), posRoot, posItemCenterPt); { xmlTree.SetAttribute(posItemBlk, _T("name"), _T("对应图块")); } POSITION posItemBlk2d = xmlTree.Insert(_T("Block_2D"), posItemBlk, NULL); { xmlTree.SetAttribute(posItemBlk2d, _T("name"), _T("2D块图块名")); xmlTree.SetAttribute(posItemBlk2d, _T("comment"), _T("平面图块")); CString csBlkName, csDesName; GetBlkNameById(m_idBlock2d, csBlkName, csDesName); xmlTree.SetItemText(posItemBlk2d, csBlkName); } POSITION posItemBlk3d = xmlTree.Insert(_T("Block_3D"), posItemBlk, posItemBlk2d); { xmlTree.SetAttribute(posItemBlk3d, _T("name"), _T("3D块图块名")); xmlTree.SetAttribute(posItemBlk3d, _T("comment"), _T("三维图块")); CString csBlkName, csDesName; GetBlkNameById(idBlock3d, csBlkName, csDesName); xmlTree.SetItemText(posItemBlk3d, csBlkName); } POSITION posItemScale = xmlTree.Insert(_T("Ratio"), posRoot, posItemBlk3d); { xmlTree.SetAttribute(posItemScale, _T("name"), _T("图块比例")); xmlTree.SetAttribute(posItemScale, _T("comment"), _T("图块x,y,z方向比例")); AcGeScale3d scale = GetInsertScale(); csX = DoubleToString(scale[X], nPreci); csY = DoubleToString(scale[Y], nPreci); csZ = DoubleToString(scale[Z], nPreci); csText.Format(_T("%s,%s,%s"), csX, csY, csZ); xmlTree.SetItemText(posItemScale, csText); } POSITION posItemVector = xmlTree.Insert(_T("Vector"), posRoot, posItemCenterPt); { xmlTree.SetAttribute(posItemVector, _T("name"), _T("向量")); xmlTree.SetAttribute(posItemVector, _T("comment"), _T("向量")); XVector3D vector3d = GetDirection(); csX = DoubleToString(vector3d.x, nPreci); csY = DoubleToString(vector3d.y, nPreci); csZ = DoubleToString(vector3d.z, nPreci); csText.Format(_T("%s,%s,%s"), csX, csY, csZ); xmlTree.SetItemText(posItemVector, csText); } POSITION posItemId = xmlTree.Insert(_T("Object_ID"), posRoot, posItemBlk); { xmlTree.SetAttribute(posItemId, _T("name"), _T("ID")); xmlTree.SetAttribute(posItemId, _T("comment"), _T("阀门ID")); csText.Format(_T("%ld"), objectId().asOldId()); xmlTree.SetItemText(posItemId, csText); } // 三维图块转换矩阵 XVector3D vtNormal(0,0,1); if(fabs(m_vtLocation.z)>1.0E-6) //非水平面,计算法向 { vtNormal = XVector3D(1,0,0)*m_vtLocation; vtNormal.Normalize(); } XPoint ptLoc=Wcs2Ecs(m_ptLocation, vtNormal); double nRotEcs = ads_angle(XPoint(),m_vtLocation); //计算ECS下的转角 if(fabs(m_vtLocation.z)>1.0E-6) //非水平面,计算插入角度,ads_angle只能计算平面角度 { AcGeVector3d v1 = m_vtLocation.AsAcGeVector3d(); AcGeVector3d v2 = AcGeVector3d::kXAxis; nRotEcs = v2.angleTo(v1); } AcDbBlockReference insert(ptLoc, idBlock3d); insert.setRotation(nRotEcs); insert.setNormal(vtNormal); if (idBlock3d != m_idBlock2d) { // sr modify 2005-6-14 阀门的比例随管径走,不管平面中的插入比例 OPENOBJ_BEGIN(m_idPipe, AcDb::kForRead, TDbPipe, pPipe); if(pPipe) { double dn = pPipe->GetDnDiameter()*0.5; // 将阀门阀件放大一些,以便包裹住管道,增强显示效果 insert.setScaleFactors(dn * 1.4); } OPENOBJ_END(); } else { insert.setScaleFactors(GetInsertScale()); } AcGeMatrix3d mat1 = insert.blockTransform(); mat1 = mat * mat1; CString sMat; Matrix3D2String(mat1, sMat); POSITION posItemMat= xmlTree.Insert(_T("Matrix3d"), posRoot, posItemId); { xmlTree.SetAttribute(posItemMat, _T("name"), _T("矩阵")); xmlTree.SetAttribute(posItemMat, _T("comment"), _T("图块转换矩阵")); xmlTree.SetItemText(posItemMat, sMat); } CString csXml = xmlTree.GetXml(); int nIndex = -1; nIndex = csXml.Find(_T("")); if (nIndex != -1) { CString sTemp = TDbPipeAttachment::GetXml(mat); csXml.Insert(nIndex, sTemp); } return csXml; }