/******************************************************************** created: 2004/03/18 created: 18:3:2004 11:28 filename: f:\tg_dev\telecdev\twtkernal\sprinkleredit.cpp file path: f:\tg_dev\telecdev\twtkernal file base: sprinkleredit file ext: cpp author: 沈睿 purpose: 喷头编辑文件, 主要是喷头定位 *********************************************************************/ #include "stdafx.h" //#include #include #include #include #include "DbVPipeDim.h" //*************************************************************************************************** // 喷头定位 //*************************************************************************************************** XCurveSegment GetBlkPickSegment(Entity entBlk, XPoint ptPick, BOOL &bTrue); // cet 2011.9.1 add 移动立管标注 void MoveVPipeDim(const XPoint &pt, const AcGeMatrix3d &mat, double dLen) { PickSet ssDim(SS_FREE); RBList rbMaskDim(RTDXF0, _T("ATS_VPIPEDIM"), NULL); XRectAngle rect(Wcs2Ucs(pt), dLen, dLen); ssDim.Get(_T("C"), rect.GetLowLeft(), rect.GetUpRight(), rbMaskDim); for (long i = 0; i < ssDim.Length(); i++) { OPENOBJ_BEGIN(ssDim[i], AcDb::kForWrite, TDbVPipeDim , pDim); if (pDim != NULL) { pDim->subTransformBy(mat); } OPENOBJ_END(); } } void DoModifySprinklerLoc(Entity entRef, Entity entSprink, XPoint ptPick) { RBList rbMask = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); CPoint ptDwgView; int cvport=0; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); acedCoordFromWorldToPixel(cvport, ptPick, ptDwgView); CTemporaryResourceOverride vTmp; XPoint ptSprink; if(entSprink.Is(_T("ATS_EQUIPMENT"))){ OPENOBJ_BEGIN(entSprink, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ ptSprink = pEquip->GetLocation(); ptSprink.z = 0; } OPENOBJ_END(); } else if(entSprink.Is(_T("ATS_PIPE"))){ OPENOBJ_BEGIN(entSprink, AcDb::kForRead, TDbPipe, pPipe); if(!pPipe || !pPipe->IsVertical()){ AfxMessageBox(_T("不是立管!")); return; } ptSprink = pPipe->StartPoint(); ptSprink.z = 0; OPENOBJ_END(); } CString csText; XPoint ptInt; double nDist(0); if(entRef.Is(_T("LINE"))){ XLine line(entRef, 1); ptSprink.Project(&line, ptInt); ptInt.z = 0; nDist = ads_distance(ptSprink, ptInt); } else if(entRef.Is(_T("ATS_EQUIPMENT"))){ XPoint ptNewLoc; OPENOBJ_BEGIN(entRef, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ ptInt = pEquip->GetLocation(); ptInt.z = 0; } OPENOBJ_END(); nDist = ads_distance(ptSprink, ptInt); } else if(entRef.Is(_T("ATS_WALL"))){ XCurveSegment lCurve, rCurve; OPENOBJ_BEGIN(entRef, AcDb::kForRead, TDbWall, pWall); if(pWall) { XPoint ptNew1, ptNew2; pWall->GetSideCurve(lCurve, rCurve); lCurve.ProjectToMe(ptSprink, ptNew1); rCurve.ProjectToMe(ptSprink, ptNew2); ptNew1.z = 0.0; // cet 2011.9.1 add ptNew2.z = 0.0; // cet 2011.9.1 add double nDist1 = ads_distance(ptSprink, ptNew1); double nDist2 = ads_distance(ptSprink, ptNew2); if(nDist1 < nDist2){ nDist = nDist1; ptInt = ptNew1; } else{ nDist = nDist2; ptInt = ptNew2; } } OPENOBJ_END(); } else if (entRef.Is(_T("INSERT")))// cet 2011.5.24 add { XCurveSegment SelCurve; BOOL bIsLeft = TRUE; SelCurve = GetBlkPickSegment(entRef, ptPick, bIsLeft); if(!!SelCurve) { XPoint ptTmp; ptSprink.Project(&SelCurve, ptTmp); ptTmp.z = 0.0; // cet 2011.9.1 add nDist = ads_distance(ptSprink, ptTmp); ptInt = ptTmp; } else // 获取参考失败直接返回 { return; } } else if (entRef.Is(_T("ATS_COLUMN"))) // cet 2011.8.31 add 支持柱子 { XCurveSegment seg; OPENOBJ_BEGIN(entRef, AcDb::kForRead, TDbColumn, pColumn); if(pColumn != NULL) { XPoly2D poly; pColumn->GetOutline(poly); int nNum = poly.TotalSegments(); for (int i = 0; i < nNum; i++) { poly.Nth(i, seg); if (seg.GetCurveType() == CURVE_LINE) { XLine line(seg.GetStartPoint(), seg.GetEndPoint(), 1); if (IsPtOnLine(ptPick, line, 50)) { break; } } } } OPENOBJ_END(); if (!seg) // 未找到直接返回 { return; } XPoint ptTmp; ptSprink.Project(&seg, ptTmp); ptTmp.z = 0.0; nDist = ads_distance(ptSprink, ptTmp); ptInt = ptTmp; } else if (entRef.Is(_T("LWPOLYLINE")) || entRef.Is(_T("POLYLINE")))// zxl 2013.10.30 add 支持pline线 { XCurveSegment seg, seg1; XPoly2D poly(entRef); int nNum = poly.TotalSegments(); for (int i = 0; i < nNum; i++) { poly.Nth(i, seg1); if (seg1.GetCurveType() == CURVE_LINE) { XLine line(seg1.GetStartPoint(), seg1.GetEndPoint(), 0); if (IsPtOnLine(ptPick, line, 50)) { seg = seg1; break; } } } if (!seg) // 未找到直接返回 { return; } XPoint ptTmp; ptSprink.Project(&seg, ptTmp); ptTmp.z = 0.0; nDist = ads_distance(ptSprink, ptTmp); ptInt = ptTmp; } else return; csText.Format(_T("%.0f"), nDist); XPoint ptTmp; double nAng = ads_angle(ptSprink, ptInt); InitSheetHook(TRUE); CEdit *pEdit = new CEdit(); pEdit->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP |WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN, CRect(ptDwgView.x, ptDwgView.y,ptDwgView.x+100,ptDwgView.y +20), acedGetAcadDwgView(), IDC_USER_SHEET_EDIT); pEdit->SetWindowText(csText); int lenText = csText.GetLength(); pEdit->SetSel(0, lenText); pEdit->SetFocus(); int nKey, ret; ads_prompt(_T("\n请在编辑框内输入新的距离<回车键完成, ESC键退出>")); while(1){ ret = ads_getint(_T(""), &nKey); if(ret == RTNONE && g_nKey != 0) { if(g_nKey == VK_ESCAPE) break; if(g_nKey == VK_RETURN || g_nKey == VK_RBUTTON){ CString csTmp; pEdit->GetWindowText(csTmp); double nEle = _tstof(csTmp); ads_polar(ptSprink, nAng, nDist - nEle, ptTmp); break; } } else if(ret == RTCAN) break; } InitSheetHook(FALSE); if(pEdit) pEdit->DestroyWindow(); delete pEdit; if(!ptTmp) return; if(entSprink.Is(_T("ATS_PIPE"))){ AcGeMatrix3d mat; // cet 2011.9.1 add XPoint pt; // cet 2011.9.1 add 立管原来位置 double dLen = 100; // cet 2011.9.1 add 标注搜索范围 OPENOBJ_BEGIN(entSprink, AcDb::kForWrite, TDbPipe, pPipe); if(!pPipe || !pPipe->IsVertical()){ return; } // cet 2011.9.1 add 获得联动立管标注的矩阵 dLen = pPipe->GetRadius()*pPipe->GetPScale(); pt = pPipe->StartPoint(); AcGeVector3d vt = ptTmp - pt; vt.z = 0.0; mat.setToTranslation(vt); ptTmp.z = pPipe->StartPoint().z; pPipe->SetStartPoint(ptTmp); ptTmp.z = pPipe->EndPoint().z; pPipe->SetEndPoint(ptTmp); OPENOBJ_END(); MoveVPipeDim(pt, mat, dLen); // cet 2011.9.1 add 移动立管编号 return; } AcGeVector3d vectTmp(ptTmp.x - ptSprink.x, ptTmp.y - ptSprink.y, 0); AcGeVector3d vectTmp2(ptSprink.x - ptTmp.x, ptSprink.y - ptTmp.y, 0); AcGeMatrix3d mat; mat.setToTranslation(vectTmp2); XPushVar vOsMode(_T("OSMODE"), 0); PickSet ss(SS_FREE); if(SelectEntities(_T("\n请选择联动喷头及管线:<只移动本喷头>"), ss, rbMask) != RTNORM){ ss+=entSprink; OPENOBJ_BEGIN(entSprink, AcDb::kForWrite, TDbEquipment, pEquip); if(pEquip){ ptTmp.z = pEquip->GetLocation().z; pEquip->SetLocation(ptTmp); pEquip->SetInsert(ptTmp); } OPENOBJ_END(); } else{ ss+=entSprink; // zxl 2013.11.05 modify 未考虑ucs // SHads_command(RTSTR, _T("MOVE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), // RT3DPOINT, &ptSprink, RT3DPOINT, &ptTmp, RTNONE); TADSGePoint3d _pt1(Wcs2Ucs(ptSprink)), _pt2(Wcs2Ucs(ptTmp)); SHads_command(RTSTR, _T("MOVE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &_pt1, RT3DPOINT, &_pt2, RTNONE); } for(long j=0;jGetInterfaceNum(); ptNewLoc = pEquip->GetLocation(); ptOldLoc = ptNewLoc; ptOldLoc.TransformBy(mat); if(num == 1){ TPipeInterface face; pEquip->GetInterface(0, face); AcDbObjectId PipeId = face.m_idPipe; OPENOBJ_BEGIN(PipeId, AcDb::kForWrite, TDbPipe, pPipe); if(pPipe){ XPoint ptStart, ptEnd; pPipe->getStartPoint(ptStart); pPipe->getEndPoint(ptEnd); if(ptStart == ptOldLoc) pPipe->SetStartPoint(ptNewLoc); else if(ptEnd == ptOldLoc) pPipe->SetEndPoint(ptNewLoc); } OPENOBJ_END(); } } OPENOBJ_END(); } PickSet ssDim(SS_FREE); RBList rbMaskDim(RTDXF0, _T("ATS_DIMENSION2"), NULL); XRectAngle rect(ptSprink, 650, 650); ssDim.Get(_T("C"), rect.GetLowLeft(), rect.GetUpRight(), rbMaskDim); long len = ssDim.Length(); ptSprink.z = 0; for(long i=0;igetGripPoints(gripPoints,osnapModes,geomIds); int ptlen = gripPoints.length(); for (int n=0;nmoveGripPointsAt(indices, vectTmp); } } } OPENOBJ_END(); } } XCurveSegment GetBlkPickSegment(Entity entBlk, XPoint ptPick, BOOL &bTrue) { //第一步,得到块参考矩阵 AcDbBlockReference *pBlkRef = NULL; AcDbObjectId id = NULL; acdbGetObjectId(id, entBlk); acdbOpenObject(pBlkRef, id, AcDb::kForRead); if(!pBlkRef) return XCurveSegment(); AcGeMatrix3d mat = pBlkRef->blockTransform(); if(pBlkRef) pBlkRef->close(); double xscale; entBlk.GetData(41, &xscale); xscale = fabs(xscale); //第二步,得到块记录遍历器 TCHAR szBlkName[256]; entBlk.GetData(2, szBlkName); AcDbBlockTable* pBlockTable = NULL; AcDbBlockTableRecord *pRecord = NULL; acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead); if(Acad::eOk != pBlockTable->getAt(szBlkName, pRecord, AcDb::kForRead)) return XCurveSegment(); pBlockTable->close(); if(pRecord->isFromExternalReference() == true){ XPoint ptOrigin = pRecord->origin(); AcGeMatrix3d mat2; mat2.setToTranslation(AcGeVector3d(-ptOrigin[0], -ptOrigin[1], -ptOrigin[2])); mat *= mat2; } AcDbBlockTableRecordIterator *pIterator = NULL; pRecord->newIterator(pIterator); BOOL bIsWall5 = FALSE; XCurveSegment seg; if(pRecord) pRecord->close(); for(pIterator->start(); !pIterator->done(); pIterator->step()){ AcDbEntity *pEnt; pIterator->getEntity(pEnt, AcDb::kForRead); AcDbLine *pLine = NULL; TDbWall *pWall = NULL; TDbColumn *pColumn = NULL; // cet 2011.8.31 add // zxl 2013.10.30 add Entity ent; ads_name name; acdbGetAdsName(name, pEnt->id()); ent = name; if(pWall = TDbWall::cast(pEnt)){ //特别支持5。0墙体 XCurveSegment lCurve, rCurve; pWall->GetSideCurve(lCurve, rCurve); if(lCurve.Is(CURVE_LINE)){ AcGePoint3d ptStart = lCurve.GetStartPoint(); ptStart = ptStart.transformBy(mat); AcGePoint3d ptEnd = lCurve.GetEndPoint(); ptEnd = ptEnd.transformBy(mat); ptStart.z = 0.0; // cet 2011.9.1 add ptEnd.z = 0.0; // cet 2011.9.1 add XLine line(asDblArray(ptStart), asDblArray(ptEnd), 1); seg = line; if(IsPtOnLine(ptPick, line, 50)){ bTrue = TRUE; bIsWall5 = TRUE; pEnt->close(); delete pIterator; return seg; } } if(rCurve.Is(CURVE_LINE)){ AcGePoint3d ptStart = rCurve.GetStartPoint(); ptStart = ptStart.transformBy(mat); AcGePoint3d ptEnd = rCurve.GetEndPoint(); ptEnd = ptEnd.transformBy(mat); ptStart.z = 0.0; // cet 2011.9.1 add ptEnd.z = 0.0; // cet 2011.9.1 add XLine line(asDblArray(ptStart), asDblArray(ptEnd), 1); seg = line; if(IsPtOnLine(ptPick, line, 50)){ bIsWall5 = TRUE; bTrue = FALSE; pEnt->close(); delete pIterator; return seg; } } } else if (pLine = AcDbLine::cast(pEnt)) // cet 2011.5.24 add { AcGePoint3d ptStart, ptEnd; pLine->getStartPoint(ptStart); pLine->getEndPoint(ptEnd); ptStart = ptStart.transformBy(mat); ptEnd = ptEnd.transformBy(mat); ptStart.z = 0.0; // cet 2011.9.1 add ptEnd.z = 0.0; // cet 2011.9.1 add XLine line(asDblArray(ptStart), asDblArray(ptEnd), 1); seg = line; if(IsPtOnLine(ptPick, line, 50)) { bTrue = FALSE; pEnt->close(); delete pIterator; return seg; } } else if (pColumn = TDbColumn::cast(pEnt)) // cet 2011.8.31 add 支持柱子 { XPoly2D poly; pColumn->GetOutline(poly); int nNum = poly.TotalSegments(); XPoint ptS, ptE; for (int i = 0; i < nNum; i++) { poly.Nth(i, seg); if (seg.GetCurveType() == CURVE_LINE) { ptS = seg.GetStartPoint(); ptE = seg.GetEndPoint(); ptS.TransformBy(mat); ptE.TransformBy(mat); ptS.z = 0.0; ptE.z = 0.0; XLine line(ptE, ptS, 1); if (IsPtOnLine(ptPick, line, 50)) { bTrue = FALSE; pEnt->close(); delete pIterator; seg.SetStartPoint(ptS); seg.SetEndPoint(ptE); return seg; } } } } else if (ent.Is(_T("LWPOLYLINE")) || ent.Is(_T("POLYLINE"))) // zxl 2013.10.30 add 支持pline线 { XPoly2D poly(ent); int nNum = poly.TotalSegments(); XPoint ptS, ptE; XCurveSegment seg1; for (int i = 0; i < nNum; i++) { poly.Nth(i, seg1); if (seg.GetCurveType() == CURVE_LINE) { ptS = seg1.GetStartPoint(); ptE = seg1.GetEndPoint(); ptS.TransformBy(mat); ptE.TransformBy(mat); ptS.z = 0.0; ptE.z = 0.0; XLine line(ptE, ptS, 1); if (IsPtOnLine(ptPick, line, 50)) { bTrue = FALSE; pEnt->close(); delete pIterator; seg.SetStartPoint(ptS); seg.SetEndPoint(ptE); return seg; } } } } pEnt->close(); } if(pIterator) delete pIterator; return XCurveSegment(); } void SprinklerOrientation() { Entity entSel; RBList rbMaskSel = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); if(SelectEntity(_T("\n请选择需要定位的喷头或立管<退出>:"), entSel, rbMaskSel) != RTNORM) return; XPoint ptSprink; if(entSel.Is(_T("ATS_EQUIPMENT"))){ OPENOBJ_BEGIN(entSel, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ ptSprink = pEquip->GetLocation(); ptSprink.z = 0; } OPENOBJ_END(); } else if(entSel.Is(_T("ATS_PIPE"))){ OPENOBJ_BEGIN(entSel, AcDb::kForRead, TDbPipe, pPipe); if(!pPipe || !pPipe->IsVertical()){ AfxMessageBox(_T("不是立管!")); return; } ptSprink = pPipe->StartPoint(); ptSprink.z = 0; OPENOBJ_END(); } entSel.Redraw(3); RBList rbMask1(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_EQUIP_SPRINKLE, NULL); RBList rbMask2(RTDXF0, _T("LINE"), 8, _T("*"), NULL); RBList rbMask3(RTDXF0, _T("ATS_WALL"), 8, _T("*"), NULL); RBList rbMask4(RTDXF0, _T("INSERT"), 8, _T("*"), NULL); RBList rbMask5(RTDXF0, _T("ATS_COLUMN"), 8, _T("*"), NULL); // cet 2011.8.31 add RBList rbMask6(RTDXF0, _T("LWPOLYLINE"), 8, _T("*"), NULL);// zxl 2013.10.29 add RBList rbMask7(RTDXF0, _T("POLYLINE"), 8, _T("*"), NULL);// zxl 2013.10.29 add int pickbox; int type(0); XPoint pt1,pt2; Entity entTag; PickSet ssAll(SS_FREE); VERIFY(xg_getvar(_T("PICKBOX"), &pickbox)==RTNORM); CTipWnd *pTextDlg = NULL; ads_prompt(_T("\n请选择参考位置,如墙、喷头<退出>:")); for (;;) { resbuf result; type = 2; if (ads_grread(5,&type,&result) != RTNORM) break; if (type != 5 && type!=3 && type!=12 && type!=11) break; pt1[0] = result.resval.rpoint[0]; pt1[1] = result.resval.rpoint[1]; pt1[2] = 0.0; if(type==3) { PickSet s(SS_FREE); if (ads_ssget(NULL,pt1,NULL,NULL,s) == RTNORM ) { entTag = s[0L]; if(!entTag.MatchBase(rbMask1) && !entTag.MatchBase(rbMask2) && !entTag.MatchBase(rbMask3) && !entTag.MatchBase(rbMask4) && !entTag.MatchBase(rbMask5) && !entTag.MatchBase(rbMask6) && !entTag.MatchBase(rbMask7)) // cet 2011.8.31 modify 支持柱子 continue; if (pTextDlg) { pTextDlg->DestroyWindow(); delete pTextDlg; pTextDlg = NULL; } DoModifySprinklerLoc(entTag, entSel, Ucs2Wcs(pt1)); break; } continue; } else if(type == 11){ //右键进行编辑 break; } if (ads_distance(pt1,pt2) > 0.1) { if (pTextDlg) { pTextDlg->DestroyWindow(); delete pTextDlg; pTextDlg = NULL; } PickSet s(SS_FREE); if (ads_ssget(NULL,pt1,NULL,NULL,s) != RTNORM ) { continue; } Groups g1(1), g0(0); ads_trans(XPoint(pt1), (resbuf *)&g1, (resbuf *)&g0, 0, pt1); // 构造WCS到Dcs的转换矩阵 AcGeMatrix3d transWcsToDcs; XPoint xAxesWcs(1,0,0), yAxesWcs(0,1,0), zAxesWcs(0,0,1), xAxesDcs, yAxesDcs, zAxesDcs; XPoint ptOrginWcs(0,0,0), ptOrginDcs(0,0,0); Groups fromWcs(0), toDcs(2); ads_trans(ptOrginWcs, (resbuf *)&fromWcs, (resbuf *)&toDcs, 0, ptOrginDcs); ads_trans(xAxesWcs, (resbuf *)&fromWcs, (resbuf *)&toDcs, 1, xAxesDcs); ads_trans(yAxesWcs, (resbuf *)&fromWcs, (resbuf *)&toDcs, 1, yAxesDcs); ads_trans(zAxesWcs, (resbuf *)&fromWcs, (resbuf *)&toDcs, 1, zAxesDcs); transWcsToDcs.setCoordSystem(ptOrginDcs, xAxesDcs, yAxesDcs, zAxesDcs); double nMinDist=0.0; Entity entNearest; long lCount=s.Length(); for(long i=0L; igetOsnapPoints(AcDb::kOsModeNear, 0, pt1, ptTemp, transWcsToDcs, points, ar); XPoint ptNear; if(!GetNearestPoint(points, pt1, ptNear)) continue; ptNear.z=pt1.z; double nDist=ptNear.Distance(pt1); if(!entNearest || nDist0) entNearest=s[0L]; if(!entNearest) continue; } if(entNearest == entSel) continue; DList lstInfo; double nDist(0); if(entNearest.MatchBase(rbMask2)){ XLine line(entNearest, 1); XPoint ptTmp; ptSprink.Project(&line, ptTmp); ptTmp.z = 0.0; // cet 2011.9.1 add nDist = ads_distance(ptSprink, ptTmp); } else if(entNearest.MatchBase(rbMask1)){ XPoint ptNewLoc; OPENOBJ_BEGIN(entNearest, AcDb::kForRead, TDbEquipment, pEquip); if(pEquip){ ptNewLoc = pEquip->GetLocation(); ptNewLoc.z = 0; } OPENOBJ_END(); nDist = ads_distance(ptSprink, ptNewLoc); } else if(entNearest.MatchBase(rbMask3)){ XCurveSegment lCurve, rCurve; OPENOBJ_BEGIN(entNearest, AcDb::kForRead, TDbWall, pWall); if(pWall) { XPoint ptNew1, ptNew2; pWall->GetSideCurve(lCurve, rCurve); lCurve.ProjectToMe(ptSprink, ptNew1); rCurve.ProjectToMe(ptSprink, ptNew2); ptNew1.z = 0.0; // cet 2011.9.1 add ptNew2.z = 0.0; // cet 2011.9.1 add nDist = ads_distance(ptSprink, ptNew1) < ads_distance(ptSprink, ptNew2) ? ads_distance(ptSprink, ptNew1) : ads_distance(ptSprink, ptNew2); } OPENOBJ_END(); } else if(entNearest.MatchBase(rbMask4))//外部参考 2011-5-24 sr { XCurveSegment SelCurve; BOOL bIsLeft = TRUE; SelCurve = GetBlkPickSegment(entNearest, pt1, bIsLeft); if(!!SelCurve) { XPoint ptTmp; ptSprink.Project(&SelCurve, ptTmp); ptTmp.z = 0.0; // cet 2011.9.1 add nDist = ads_distance(ptSprink, ptTmp); } else // 获取参考失败直接返回 { continue; } } else if (entNearest.MatchBase(rbMask5)) // cet 2011.8.31 add 支持柱子 { XCurveSegment seg; OPENOBJ_BEGIN(entNearest, AcDb::kForRead, TDbColumn, pColumn); if(pColumn != NULL) { XPoly2D poly; pColumn->GetOutline(poly); int nNum = poly.TotalSegments(); for (int i = 0; i < nNum; i++) { poly.Nth(i, seg); if (seg.GetCurveType() == CURVE_LINE) { XLine line(seg.GetStartPoint(), seg.GetEndPoint(), 1); if (IsPtOnLine(pt1, line, 50)) { break; } } } } OPENOBJ_END(); if (!seg) // 未找到直接返回 { continue; } XPoint ptTmp; ptSprink.Project(&seg, ptTmp); ptTmp.z = 0.0; nDist = ads_distance(ptSprink, ptTmp); } else if (entNearest.MatchBase(rbMask6) || entNearest.MatchBase(rbMask7))// zxl 2013.10.30 add 支持pline线 { XCurveSegment seg, seg1; XPoly2D poly(entNearest); int nNum = poly.TotalSegments(); for (int i = 0; i < nNum; i++) { poly.Nth(i, seg1); if (seg1.GetCurveType() == CURVE_LINE) { XLine line(seg1.GetStartPoint(), seg1.GetEndPoint(), 0); if (IsPtOnLine(pt1, line, 50)) { seg = seg1; break; } } } if (!seg) // 未找到直接返回 { continue; } XPoint ptTmp; ptSprink.Project(&seg, ptTmp); ptTmp.z = 0.0; nDist = ads_distance(ptSprink, ptTmp); } else continue; if(fabs(pt1.z - pt2.z) < _distSnap && nDist > 0){ CBlockStruct *pInfo = new CBlockStruct(); pInfo->m_csRecord = _T("离喷头距离"); pInfo->m_csDesName.Format(_T("%.0f"), nDist); lstInfo.Append(pInfo); } else // cet 2011.5.24 add { continue; } if(!pTextDlg){ CPoint pt; int cvport; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); acedCoordFromWorldToPixel(cvport, pt1, pt); acedGetAcadDwgView()->ClientToScreen(&pt); acedGetAcadFrame()->ScreenToClient(&pt); pTextDlg = new CTipWnd(); pTextDlg->Create(lstInfo, pt.x+pickbox*2, pt.y+pickbox*2, acedGetAcadFrame()); acedGetAcadDwgView()->SetFocus(); } } } entSel.Redraw(4); if(pTextDlg){ pTextDlg->DestroyWindow(); delete pTextDlg; } SHads_command(RTSTR, _T(".REDRAW"), RTNONE); }