// InsTextDlg.cpp : implementation file // #include "stdafx.h" #include #include #include #include #include #include #include #include #include "InsTextDlg.h" #include "tapi.h" #include "xtext.h" #include "TextHeightDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern double g_nDimHeight, g_nScaleDim ; extern CString g_csDimStyle; //************************************************************************************ // 统一字高 //************************************************************************************ void SetBlkAttrHeight(Entity entBlk, const TCHAR*szTag, double nHeight) { SetLayer0UnLocked(); AcDbBlockReference *pBlockRef = NULL;// 定义块表指针 AcDbObjectId eId; acdbGetObjectId(eId, entBlk); acdbOpenObject(pBlockRef, eId, AcDb::kForRead); if(!pBlockRef) return; AcDbObjectIterator *pIterator; pIterator = pBlockRef -> attributeIterator(); for (pIterator -> start(); !pIterator -> done(); pIterator -> step()) { //遍历块中实体 AcDbObjectId att_id; att_id = pIterator -> objectId(); AcDbEntity *pEnt; AcDbAttribute *pAtt; acdbOpenAcDbEntity(pEnt, att_id, AcDb::kForWrite); pAtt = AcDbAttribute::cast(pEnt); if(pAtt != NULL) { TCHAR *cname = pAtt->tag();//得到标记 if(_tcsicmp(cname, szTag) == 0){ pAtt->setHeight(nHeight*DocGetPScale()); } delete[] cname; } pEnt->close(); } delete pIterator; pBlockRef->close(); } void EqualTextHeight() { RBList rbMask = ads_buildlist( -4, _T(""), NULL); PickSet ss(SS_FREE); if(SelectEntities(_T("\n请选择要修改的文字(ACAD文字,上华文字,上华标注)<退出>"), ss, rbMask) != RTNORM) return; BOOL bHasAcad(FALSE), bHasTch(FALSE), bHasDim(FALSE), bHasEquip(FALSE); long len2 = ss.Length(); for(long j=0;j"), &nHeight); if(nHeight > 20){ AfxMessageBox(_T("输入字高太大了!应为实际出图字高")); return; } } else{ CAcModuleResourceOverride vTemp; CTextHeightDlg dlg; dlg.m_bAcad = bHasAcad; dlg.m_bDim = bHasDim; dlg.m_bTch = bHasTch; if(dlg.DoModal() != IDOK) return; nHeight = dlg.m_nHeight; bHasAcad = dlg.m_bAcad; bHasDim = dlg.m_bDim; bHasTch = dlg.m_bTch; if(dlg.m_bLayer){ Entity entSel; if(SelectEntity(_T("\n请选择指定图层上任意图元"), entSel, rbMask) != RTNORM) return; PickSet ssDel(SS_FREE); TCHAR szLayer[256]; TCHAR szLayer2[256]; entSel.GetData(8, szLayer); for(long j=0;jSetHeight(nHeight); } OPENOBJ_END(); } else if(ent.Is(_T("ATS_PIPETEXT")) && bHasDim){ ent.SetData(140, nHeight); ent.Modify(); } else if(ent.Is(_T("ATS_PIPEMULTDIM")) && bHasDim){ // ent.SetData(40, nHeight); // ent.Modify(); OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbPipeMultDim, pEnt); if(pEnt){ pEnt->SetTextHeight(nHeight); } OPENOBJ_END(); } else if(ent.Is(_T("ATS_PIPE")) && bHasDim){ ent.SetData(141, nHeight); ent.Modify(); } else if(ent.Is(_T("ATS_ARROW")) && bHasDim){ OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbSymbArrow, pEnt); if(pEnt){ pEnt->SetTextHeight(nHeight); } OPENOBJ_END(); } else if(ent.Is(_T("ATS_MTEXT")) && bHasTch){ OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbMText, pEnt); if(pEnt){ pEnt->SetHeight(nHeight); } OPENOBJ_END(); } else if(ent.Is(_T("TEXT")) && bHasAcad){ OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbText, pEnt); if(pEnt){ if(bHasAcad && !bHasTch && !bHasDim && nHeight > 90) pEnt->setHeight(nHeight); else pEnt->setHeight(nHeight*DocGetPScale()); } OPENOBJ_END(); } else if(ent.Is(_T("ATS_VPIPEDIM")) && bHasDim){ OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbVPipeDim, pEnt); if(pEnt){ pEnt->SetTextHeight(nHeight); } OPENOBJ_END(); } else if(ent.Is(_T("ATS_EQUIPDIM2")) && bHasDim){ OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbEquipDimNew, pEnt); if(pEnt){ pEnt->SetTextHeight(nHeight); } OPENOBJ_END(); } else if(ent.Is(_T("ATS_WIREDIM2")) && bHasDim){ OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbWireDimNew, pEnt); if(pEnt){ pEnt->SetTextHeight(nHeight); } OPENOBJ_END(); } else if(ent.Is(_T("ATS_RADIATOR")) && bHasDim){ OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbRadiator, pEnt); if(pEnt){ pEnt->SetTextHeight(nHeight); } OPENOBJ_END(); } else if(ent.Is(_T("ATS_WIREDIM")) && bHasDim){ OPENOBJ_BEGIN(ent, AcDb::kForWrite, TWireDim, pEnt); if(pEnt){ pEnt->SetTextHeight(nHeight*DocGetPScale()); } OPENOBJ_END(); } else if(ent.Is(_T("INSERT")) && bHasDim){ TCHAR szBlkName[256]; ent.GetData(2, szBlkName); CString csBlkName = szBlkName; if(csBlkName.Find(_T("$TelecSys$")) > -1) SetBlkAttrHeight(ent, _T("N"), nHeight); else SetBlkAttrHeight(ent, _T("$TEXT$"), nHeight); } // else if(ent.Is(_T("ATS_DBHEQUIPMENT")) && bHasDim){ // OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbHvacEquipment, pEnt); // if(pEnt){ // TDbXDataMap* pXMap = pEnt->GetSpecialtyData(); // if(NULL != pXMap){ // pXMap->SetAt(HDIM_DimTextHeigh, nHeight); // } // } // OPENOBJ_END(); // } } } //************************************************************************************ // 递增文字 //************************************************************************************ extern TARCH_IMPEXP BOOL g_bTextStyleEx; TTextPosition FindEntText(Entity ent, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange) { TTextPosition posFind; if(!sSubText || !sSubText[0]) return posFind; OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); if(pEnt->isKindOf(TDbEntity::desc())) { TDbEntity *pText=TDbEntity::cast(pEnt); posFind=pText->FindSubText(sSubText, posStart, pRange); } else if(pEnt->isKindOf(AcDbText::desc())) { XPushMemVar vTemp(g_bTextStyleEx, FALSE); TDbText text; AcDbText *pText=AcDbText::cast(pEnt); if(text.ConvertFrom(pText)) { posFind = text.FindSubText(sSubText, posStart, pRange); } } OPENOBJ_END(); return posFind; } void GrdrawRect(XRectAngle &rect) { ads_grdraw(rect.GetLowLeft(), rect.GetUpLeft(), 1, 0); ads_grdraw(rect.GetLowLeft(), rect.GetLowRight(), 1, 0); ads_grdraw(rect.GetUpRight(), rect.GetLowRight(), 1, 0); ads_grdraw(rect.GetUpLeft(), rect.GetUpRight(), 1, 0); } void GrdrawPoly(XPoly2D &poly) { int len = poly.Length(); for(int i=0;i"); if(SelectEntity(csPompt, entSel, ptPick, RBList(RTDXF0, _T("ATS_TEXT,TEXT"), NULL)) != RTNORM) return; XPoint ptPickWcs = Ucs2Wcs(ptPick); XText text2(entSel); csText = text2.m_csText; int len = csText.GetLength(); TTextPosition pos; for(int i=0;i ptMin.x && ptPick.y < ptMax.y && ptPick.y > ptMin.y){ csLeft = csText.Left(pos.m_nTextPos); csRight = csText.Right(len - pos.m_nTextPos); poly.TransUCS(Groups(0), Groups(1));//Groups(0) wcs, Groups(1) ucs // XRectAngle rect(ptMin, ptMax); GrdrawPoly(poly); break; } } } } } if(csLeft != _T("") || csRight != _T("")) break; } XText text(entSel); XPoint ptInsert, ptAlignmentPoint, ptOld; double nHeight = text.m_nHeight; if(entSel.Is(_T("ATS_TEXT"))) nHeight = nHeight*DocGetPScale(); else{ OPENOBJ_BEGIN(entSel, AcDb::kForRead, AcDbText, pEnt); if(pEnt){ ptInsert = pEnt->position(); ptAlignmentPoint = pEnt->alignmentPoint(); ptOld = ptAlignmentPoint; } OPENOBJ_END(); } //2007-6-1 支持用户点基点 AcGeMatrix3d matBase; XPoint ptBase; if(ads_getpoint(Wcs2Ucs(text.m_ptInsert), _T("\n请点选基点:"), ptBase) == RTNORM) { ptBase = Ucs2Wcs(ptBase); matBase.setToTranslation(AcGeVector3d(text.m_ptInsert[0] - ptBase[0], text.m_ptInsert[1] - ptBase[1], 0)); } while(1){ SHORT nStateCtrl = GetKeyState(VK_CONTROL); BOOL bCtrl = (nStateCtrl&256)!=0; if(bCtrl) csLeft = PlusString(csLeft, 1, FALSE); else csLeft = PlusString(csLeft, 1, TRUE); csText = csLeft + csRight; XPoint ptIns; xg_getvar(_T("VIEWCTR"), ptIns); ptIns = Ucs2Wcs(ptIns); TTextEdJig jig(entSel.Is(_T("ATS_TEXT")), ptInsert, text.m_nHeight, csText, text.m_idStyle, text.m_nRotate); jig.SetPrompt(_T("\n请指定文字的插入点<退出>:")); jig.m_mat = matBase; if(!ptOld) ptOld = ptInsert; if(entSel.Is(_T("ATS_TEXT"))) jig.SetAlign(text.m_Align); else{ jig.SetAlign(text.m_vertMode, text.m_horzMode); jig.SetAlignPoint(ptAlignmentPoint); } jig.m_ptRef = ptOld; jig.SetWHScale(text.m_nScale); if(jig.DoIt() != RTNORM) return; ptIns = jig.GetPickPoint(); ptIns.TransformBy(matBase); ptOld = ptIns; XText text2(csText, ptIns, nHeight, text.m_nScale, (const TCHAR*)GetSymbolName(text.m_idStyle), text.m_csLayer); text2.SetRotate(text.m_nRotate); if(entSel.Is(_T("ATS_TEXT"))) text2.TgDraw(text.m_Align); else{ AcGeVector3d vt(ptIns-ptInsert); XPoint ptAcadTextAlign = ptAlignmentPoint+vt; text2.m_ptAlign = ptAcadTextAlign; text2.Draw(text.m_vertMode, text.m_horzMode); } } } //************************************************************************************ // 修改文字 //************************************************************************************ // 返回: FALSE-空串 // numWidth: 0-无数字;1-数字宽度不固定,否则固定宽度 BOOL StringAnalysis(const TCHAR *src, XString &sPrefix, int *num, int *numWidth) { ASSERT(src && num && numWidth); int nLen = (int)_tcslen(src); if(!nLen) return FALSE; int iNumPos=nLen; for(int iPos=nLen-1; iPos>=0; iPos--) { if(!_istdigit(src[iPos])) break; else iNumPos=iPos; } if(iNumPos==nLen) { *numWidth=0; //No digit } else { if(iNumPos>0) { XString sTemp; sTemp=src; StrCpy(sTemp, src, src+iNumPos); sPrefix=sTemp; } else { sPrefix=_T(""); } if(iNumPos==nLen-1) { *numWidth=-1; } else { if(src[iNumPos]==_T('0')) { *numWidth=nLen - (int)_tcslen(sPrefix); } else { *numWidth=-1; } } *num=_ttoi(src+iNumPos); } return TRUE; } void ModifyTextCmd() { RBList rbMask = ads_buildlist( -4, _T(""), NULL); Entity entSel; while(1){ if(SelectEntity(_T("\n请选择要修改的文字图元(同时按CTRL键进行多选项编辑)<退出>"), entSel, rbMask) != RTNORM) break; SHORT nStateCtrl = GetKeyState(VK_CONTROL); BOOL bCtrl = (nStateCtrl&256)!=0; if(entSel.Is(_T("ATS_MTEXT")) || entSel.Is(_T("ATS_TEXT")) || bCtrl){ PickSet ss(SS_FREE); ss += entSel; ads_sssetfirst(ss, ss); acDocManager->sendStringToExecute(curDoc(), _T("dxbj "), true, false, false); break; } TCHAR szText[256]; CString csText; XPoint ptLow1, ptUp1, ptLow, ptUp; if(entSel.Is(_T("ATS_WIREDIM"))){ OPENOBJ_BEGIN(entSel, AcDb::kForRead, TWireDim, pEnt); if(pEnt){ csText = pEnt->GetDimContent(); pEnt->GetExtend(ptLow1, ptUp1); } OPENOBJ_END(); } else if(entSel.Is(_T("ATS_PIPE"))){ entSel.GetData(10, ptLow1); entSel.GetData(301, szText); double nDn; entSel.GetData(140, &nDn); csText.Format(_T("%s%.0f"), szText, nDn); ptUp1 = ptLow1; } else if(entSel.Is(_T("ATS_ARROW"))){ OPENOBJ_BEGIN(entSel, AcDb::kForRead, TDbSymbArrow, pEnt); if(pEnt){ csText = pEnt->GetText(); } OPENOBJ_END(); entSel.GetExtend(ptLow1, ptUp1); } else if(entSel.Is(_T("ATS_PIPETEXT"))){ entSel.GetData(301, szText); entSel.GetExtend(ptLow1, ptUp1); csText = szText; } else if(entSel.Is(_T("ATS_ELEVATION"))){ OPENOBJ_BEGIN(entSel, AcDb::kForRead, TDbSymbElevation, pEnt); if(pEnt){ csText = pEnt->GetText(); } OPENOBJ_END(); entSel.GetExtend(ptLow1, ptUp1); } else if(entSel.Is(_T("ATS_WIREDIM2"))){ OPENOBJ_BEGIN(entSel, AcDb::kForRead, TMutiWireDim, pEnt); if(pEnt){ if(pEnt->GetIsPredigest()){ csText = pEnt->GetDimContent(); pEnt->GetExtend(ptLow1, ptUp1); } else continue; } OPENOBJ_END(); } else{ entSel.GetExtend(ptLow1, ptUp1); entSel.GetData(1, szText); csText = szText; } if(!ptLow1 || !ptUp1) continue; ptLow.x = ptLow1.x; ptLow.y = ptUp1.y; ptLow.z = 0; ptUp.x = ptUp1.x; ptUp.y = ptLow1.y; ptUp.z = 0; InitSheetHook(TRUE); CPoint pt1, pt2; int cvport=0; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); acedCoordFromWorldToPixel(cvport, ptLow, pt1); acedCoordFromWorldToPixel(cvport, ptUp, pt2); CAcModuleResourceOverride vTmp; CEdit *pEdit = new CEdit(); int iMargin = 20; if(pt2.x - pt1.x < 50) iMargin = 100; pEdit->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP |WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN, CRect(pt1.x, pt1.y, pt2.x+iMargin, pt1.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); if(csText != csTmp){ if(entSel.Is(_T("ATS_WIREDIM"))){ OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TWireDim, pEnt); if(pEnt){ pEnt->SetDimContent(csTmp); } OPENOBJ_END(); } else if(entSel.Is(_T("ATS_WIREDIM2"))){ OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TMutiWireDim, pEnt); if(pEnt){ if(pEnt->GetIsPredigest()){ pEnt->SetDimContent(csTmp); } else continue; } OPENOBJ_END(); } else if(entSel.Is(_T("ATS_PIPETEXT"))){ entSel.SetData(301, csTmp); entSel.Modify(); } else if(entSel.Is(_T("ATS_PIPE"))){ XString xsText; int num, numWith; StringAnalysis((const TCHAR*)csTmp, xsText, &num, &numWith); entSel.SetData(301, (const TCHAR*)xsText); entSel.SetData(140, (double)num); entSel.Modify(); } else if(entSel.Is(_T("ATS_ARROW"))){ OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TDbSymbArrow, pEnt); if(pEnt){ pEnt->SetText((const TCHAR*)csTmp); } OPENOBJ_END(); } else if(entSel.Is(_T("ATS_ELEVATION"))){ OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TDbSymbElevation, pEnt); if(pEnt){ pEnt->SetText((const TCHAR*)csTmp); } OPENOBJ_END(); } else{ entSel.SetData(1, csTmp); entSel.Modify(); } } break; } } else if(ret == RTCAN) break; } InitSheetHook(FALSE); if(pEdit){ pEdit->DestroyWindow(); delete pEdit; } else AfxMessageBox(_T("edit err!")); } if(g_nKey != 0) AfxMessageBox(_T("Hook err!")); } //************************************************************************************ // 文字对齐 //************************************************************************************ void GetTDbSymbElevationExtent(TDbSymbElevation *pElev, XPoint &ptLow, XPoint &ptUp) { if (pElev != NULL) { std::vector data; AcDbVoidPtrArray arPtr; pElev->explode(arPtr); for (int i = 0; i < arPtr.length(); i++) { AcDbEntity *pEnt = (AcDbEntity*)(arPtr[i]); AcDbLine *pLine = AcDbLine::cast(pEnt); TDbMText *pMText = TDbMText::cast(pEnt); if (pLine != NULL) { AcDbExtents ext; pLine->getGeomExtents(ext); data.push_back(Wcs2Ucs(ext.minPoint())); data.push_back(Wcs2Ucs(ext.maxPoint())); delete pLine; } else if (pMText != NULL) { AcDbVoidPtrArray arPtr2; pMText->explode(arPtr2); for(int i = 0; i < arPtr2.length(); i++) { AcDbEntity *pEnt = (AcDbEntity*)(arPtr2[i]); AcDbText *pText = AcDbText::cast(pEnt); if (pText != NULL) { AcDbExtents extents; pText->getGeomExtents(extents); data.push_back(Wcs2Ucs(extents.minPoint())); data.push_back(Wcs2Ucs(extents.maxPoint())); } } ReleaseEntSet(arPtr2); } } double xMin, xMax, yMin, yMax; std::vector::iterator it; for (it = data.begin(); it != data.end(); it++) { if (it == data.begin()) { xMin = xMax = (*it).x; yMin = yMax = (*it).y; } else { if (xMin > (*it).x) { xMin = (*it).x; } if (xMax < (*it).x) { xMax = (*it).x; } if (yMin > (*it).y) { yMin = (*it).y; } if (yMax < (*it).y) { yMax = (*it).y; } } } ptLow.x = xMin; ptLow.y = yMin; ptUp.x = xMax; ptUp.y = yMax; ptLow = Ucs2Wcs(ptLow); ptUp = Ucs2Wcs(ptUp); } } //获得实体外包框 void GetExtent(PickSet &ss, std::map > &data) { for (long i = 0; i < ss.Length(); i++) { OPENOBJ_BEGIN(ss[i], AcDb::kForWrite, AcDbEntity, pEnt); if (pEnt != NULL) { TDbText *pTDbText = NULL; AcDbText *pText = NULL; TDbSymbElevation *pElev = NULL; TDbSymbDrawingIndex *pDraw = NULL; pTDbText = TDbText::cast(pEnt); pText = AcDbText::cast(pEnt); pElev = TDbSymbElevation::cast(pEnt); pDraw = TDbSymbDrawingIndex::cast(pEnt); XPoint ptLow, ptUp; if (pTDbText != NULL) // 上华单行文字 { double dAngle = pTDbText->GetRotation(); pTDbText->SetRotation(0.0); pTDbText->GetExtents2d(ptLow, ptUp); pTDbText->SetRotation(dAngle); } else if (pText != NULL) // cad单行文字 { double dAngle = pText->rotation(); pText->setRotation(0); AcDbExtents extents; pText->getGeomExtents(extents); ptLow = extents.minPoint(); ptUp = extents.maxPoint(); pText->setRotation(dAngle); } else if (pElev != NULL) // 标高标注 { ptLow = pElev->GetLocation(); GetTDbSymbElevationExtent(pElev, ptLow, ptUp); } else if (pDraw != NULL) { double dRadius = pDraw->GetRadius(FALSE); ptLow = pDraw->GetCenter(); AcGeVector3d vt = AcGeVector3d::kXAxis; vt.rotateBy(Ucs2Wcs(0.0), AcGeVector3d::kZAxis); vt.rotateBy(-PI * 3 / 4, AcGeVector3d::kZAxis); ptLow += vt * sqrt(2 * dRadius * dRadius); ptUp = ptLow - vt * 2 * sqrt(2 * dRadius * dRadius); } AcGeVector3d vtX = AcGeVector3d::kXAxis; AcGeVector3d vtY = AcGeVector3d::kYAxis; std::vector vec; vec.push_back(ptLow + vtY * (ptUp.y - ptLow.y)); vec.push_back(ptLow); vec.push_back(ptLow + vtX * (ptUp.x - ptLow.x)); vec.push_back(ptUp); data.insert(std::make_pair(pEnt->objectId(),vec)); } OPENOBJ_END(); } } // 获得实体集中所有实体外包框左下点距直线距离最小的实体ent // ssRes中保存实体到直线的投影与ent的投影有交集的实体 void GetNearestEnt(Entity entLine, PickSet &ss, Entity &ent, XPoint &ptRes, PickSet &ssRes) { //获得实体外包框 std::map > data; GetExtent(ss, data); // 获得距离直线最近的实体(以实体外包框左下点为准) std::map >::iterator it; double dDist = 0.0; AcDbObjectId id; for (it = data.begin(); it != data.end(); it++) { XPoint pt; XPoint pt1 = (*it).second[1]; if(entLine.Is(_T("LINE"))) { OPENOBJ_BEGIN(entLine, AcDb::kForRead, AcDbLine, pLine); if (pLine != NULL) { pLine->getClosestPointTo(pt1, pt, Adesk::kTrue); } OPENOBJ_END(); } else { OPENOBJ_BEGIN(entLine, AcDb::kForRead, AcDbPolyline, pLine); if (pLine != NULL) { pLine->getClosestPointTo(pt1, pt, Adesk::kTrue); } OPENOBJ_END(); } double dCurDist = pt.Distance2d(pt1); ads_name name; AcDbObjectId id2 = (*it).first; Acad::ErrorStatus st = acdbGetAdsName(name, (*it).first); if (it == data.begin()) { dDist = dCurDist; ent = name; id = (*it).first; ptRes = (*it).second[1]; continue; } if (dDist > dCurDist) { dDist = dCurDist; ent = name; id = (*it).first; ptRes = (*it).second[1]; } } // TDbSymbDrawingIndex 实体无需验证和其他实体的投影关系 if (ent.Is(_T("ATS_DRAWINGINDEX"))) { ssRes += ent; return; } //获得ent外包框四个点到直线的投影点中最长两点组成的直线 XPoint pt1, pt2, pt3, pt4; it = data.find(id); pt1 = (*it).second[0]; pt2 = (*it).second[1]; pt3 = (*it).second[2]; pt4 = (*it).second[3]; if(entLine.Is(_T("LINE"))) { OPENOBJ_BEGIN(entLine, AcDb::kForRead, AcDbLine, pLine); if (pLine != NULL) { pLine->getClosestPointTo(pt1, pt1, Adesk::kTrue); pLine->getClosestPointTo(pt2, pt2, Adesk::kTrue); pLine->getClosestPointTo(pt3, pt3, Adesk::kTrue); pLine->getClosestPointTo(pt4, pt4, Adesk::kTrue); } OPENOBJ_END(); } else { OPENOBJ_BEGIN(entLine, AcDb::kForRead, AcDbPolyline, pLine); if (pLine != NULL) { pLine->getClosestPointTo(pt1, pt1, Adesk::kTrue); pLine->getClosestPointTo(pt2, pt2, Adesk::kTrue); pLine->getClosestPointTo(pt3, pt3, Adesk::kTrue); pLine->getClosestPointTo(pt4, pt4, Adesk::kTrue); } OPENOBJ_END(); } std::map > ptMap; std::vector vec; vec.push_back(pt1); vec.push_back(pt2); ptMap.insert(std::make_pair(pt1.Distance2d(pt2), vec)); vec[0] = pt1; vec[1] = pt3; ptMap.insert(std::make_pair(pt1.Distance2d(pt3), vec)); vec[0] = pt1; vec[1] = pt4; ptMap.insert(std::make_pair(pt1.Distance2d(pt4), vec)); vec[0] = pt2; vec[1] = pt3; ptMap.insert(std::make_pair(pt2.Distance2d(pt3), vec)); vec[0] = pt2; vec[1] = pt4; ptMap.insert(std::make_pair(pt2.Distance2d(pt4), vec)); vec[0] = pt3; vec[1] = pt4; ptMap.insert(std::make_pair(pt3.Distance2d(pt4), vec)); std::map >::iterator it1; double dLen = -1; for (it1 = ptMap.begin(); it1 != ptMap.end(); it1++) { if (dLen < (*it1).first) { pt1 = (*it1).second[0]; pt2 = (*it1).second[1]; dLen = (*it1).first; } } AcDbLine line2(pt1, pt2); // 距离直线最近的实体外包框四个点的投影点构成的最长直线 // 获得实体到直线的投影中与ent有交集的实体存入ssRes中 // 只要实体外包框上四个点有一点的投影在ent外包框四个点投影范围内 // 就判定有交集 for (it = data.begin(); it != data.end(); it++) { if (id == (*it).first) { continue; } for (int i = 0; i < 4; i++) { XPoint pt; XPoint ptTemp = (*it).second[i]; line2.getClosestPointTo(ptTemp, pt, Adesk::kTrue); if (fabs(pt.Distance2d(pt1) + pt.Distance2d(pt2) - pt1.Distance2d(pt2)) < 1e-3) { ads_name name; acdbGetAdsName(name, (*it).first); Entity ent2(name); ssRes += ent2; break; } } } ssRes += ent; } void TextAlignment() { RBList rbMask = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); PickSet ss(SS_FREE); if (SelectEntities(_T("\n请选择要对齐的文字或者符号<退出>:"), ss, rbMask) != RTNORM) { return; } RBList rbMask2 = ads_buildlist( -4, _T(""), -4, _T(""), -4, _T("or>"), NULL); Entity entSel; bool bDrawLine = false; int nRet = 0; nRet = SelectEntity(_T("\n 请选择对齐基准线<绘制对齐基准线>:"), entSel, rbMask2); if (nRet != RTNORM) { XPushVar vOrthoMode(_T("ORTHOMODE"), 1); //f8 XPoint pt1, pt2; if (acedGetPoint(NULL, _T("\n请指定起点:"), pt1) != RTNORM) { return; } if (acedGetPoint(pt1, _T("\n请指定终点:"), pt2) != RTNORM) { return; } pt1 = Ucs2Wcs(pt1); pt2 = Ucs2Wcs(pt2); XLine l(pt1, pt2); l.Make(); entSel.GetLast(); bDrawLine = true; } while(ss.Length() != 0) { PickSet ss2(SS_FREE); XPoint ptRes; Entity ent; // 获得距离参考线最近的实体ent 以及与其到参考线投影存在交集的实体ss2 GetNearestEnt(entSel, ss, ent, ptRes, ss2); ss -= ss2; XPoint pt; if(entSel.Is(_T("LINE"))) { OPENOBJ_BEGIN(entSel, AcDb::kForRead, AcDbLine, pLine); if (pLine != NULL) { pLine->getClosestPointTo(ptRes, pt, Adesk::kTrue); } OPENOBJ_END(); } else { OPENOBJ_BEGIN(entSel, AcDb::kForRead, AcDbPolyline, pLine); if (pLine != NULL) { pLine->getClosestPointTo(ptRes, pt, Adesk::kTrue); } OPENOBJ_END(); } AcGeVector3d vt = pt - ptRes; AcGeMatrix3d mat; mat.setToTranslation(vt); for (long i = 0; i < ss2.Length(); i++) { OPENOBJ_BEGIN(ss2[i], AcDb::kForWrite, AcDbEntity, pEnt); if (pEnt != NULL) { pEnt->transformBy(mat); } OPENOBJ_END(); } } if (bDrawLine) { entSel.Erase(); } } //************************************************************************************ // 插入专业文字 //************************************************************************************ void InsertTextCmd() { CInsTextDlg dlg(acedGetAcadFrame()); { CAcModuleResourceOverride vTemp; dlg.Create(IDD_INSERT_TEXT, acedGetAcadFrame()); } dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); XPoint ptText; int nOsMode=0; xg_getvar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA; XPushVar vOsMode(_T("OSMODE"), nOsMode); XPoint ptOld; XExplodeDraw::TextAlignment AlignList[] = { XExplodeDraw::kTopLeft, XExplodeDraw::kTopCenter , XExplodeDraw::kTopRight, XExplodeDraw::kMiddleLeft , XExplodeDraw::kMiddleCenter, XExplodeDraw::kMiddleRight , XExplodeDraw::kBottomLeft, XExplodeDraw::kBottomCenter , XExplodeDraw::kBottomRight,}; while(1){ HWND hwnd = dlg.GetSafeHwnd(); if(!dlg.IsWindowVisible()) {//在替换或选取的时候关闭对话框 break; } XPoint ptIns; xg_getvar(_T("VIEWCTR"), ptIns); ptIns = Ucs2Wcs(ptIns); dlg.UpdateData(TRUE); if(dlg.m_iRunMode == 1){//替换文字 Entity entSel; int ret = SelectEntity(_T("\n请选择要替换的文字图元<文字插入>"), entSel, RBList(RTDXF0, _T("ATS_TEXT,TEXT"), NULL)); if(ret == RTCAN) break; else if(ret != RTNORM){ dlg.m_iRunMode = 0; continue; } entSel.SetData(1, dlg.m_csSel); entSel.Modify(); } else if(dlg.m_iRunMode == 2){//拾取文字 Entity entSel; if(SelectEntity(_T("\n请选择要拾取的文字图元<文字插入>"), entSel, RBList(RTDXF0, _T("ATS_TEXT,TEXT"), NULL)) != RTNORM){ dlg.m_iRunMode = 0; continue; } XText text(entSel); ptOld = text.m_ptInsert; dlg.m_csHeight.Format(_T("%.1f"), text.m_nHeight); CString csStyle = (const TCHAR*)GetSymbolName(text.m_idStyle); dlg.m_csSel = text.m_csText; dlg.m_iRunMode = 0; dlg.SetTextStyle(csStyle); continue; } else{ TTextEdJig jig(&dlg, ptIns); jig.SetKeyword(_T("`")); jig.SetPrompt(_T("\n请指定文字的插入点<退出>:")); int nKeyIdx; if(!!ptOld) jig.m_ptRef = ptOld; int ret = jig.DoIt(&nKeyIdx); if(ret == RTKWORD){ if(nKeyIdx == 0) continue; } else if(ret != RTNORM){ dlg.DestroyWindow(); return; } ptIns = jig.GetPickPoint(); ptOld = ptIns; double nTextHeight2 = _tstof(dlg.m_csHeight)*DocGetPScale(); XText text(dlg.m_csSel, ptIns, nTextHeight2, g_nScaleDim, dlg.m_csTextStyle, LAY_TEXT); text.SetRotate(Ucs2Wcs(0.0));//支持UCS text.TgDraw(AlignList[dlg.m_iAlign]); } } dlg.DestroyWindow(); return; } CString CInsTextDlg::m_csSel = _T(""); CString CInsTextDlg::m_csType = _T(""); IMPLEMENT_DYNAMIC(CInsTextDlg, CModelessDialog) CInsTextDlg::CInsTextDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(CInsTextDlg::IDD, pParent) { //{{AFX_DATA_INIT(CInsTextDlg) // m_csSel = _T(""); m_csContent = _T(""); //m_csType = _T(""); m_iAlign = 6; m_csHeight = _T(""); m_iStyle = 0; //}}AFX_DATA_INIT m_csTextStyle = g_csDimStyle; m_iRunMode = 0; } void CInsTextDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CInsTextDlg) DDX_Control(pDX, IDC_EDIT_SEL, m_edit); DDX_Control(pDX, IDC_COMBO_TEXTSTYLE, m_comboStyle); DDX_Control(pDX, IDC_COMBO_TEXTHEIGHT, m_comboHeight); DDX_Control(pDX, IDC_LIST_CONTENT, m_listContent); DDX_Control(pDX, IDC_LIST_TYPE, m_listType); DDX_Text(pDX, IDC_EDIT_SEL, m_csSel); DDX_LBString(pDX, IDC_LIST_CONTENT, m_csContent); DDX_LBString(pDX, IDC_LIST_TYPE, m_csType); DDX_CBIndex(pDX, IDC_COMBO_ALIGN, m_iAlign); DDX_CBString(pDX, IDC_COMBO_TEXTHEIGHT, m_csHeight); DDX_CBIndex(pDX, IDC_COMBO_TEXTSTYLE, m_iStyle); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CInsTextDlg, CModelessDialog) //{{AFX_MSG_MAP(CInsTextDlg) //ON_MESSAGE(WM_ACAD_KEEPFOCUS,onAcadKeepFocus) ON_LBN_SELCHANGE(IDC_LIST_TYPE, OnSelchangeListType) ON_LBN_SELCHANGE(IDC_LIST_CONTENT, OnSelchangeListContent) ON_WM_CLOSE() ON_CBN_SELCHANGE(IDC_COMBO_TEXTSTYLE, OnSelchangeComboTextstyle) ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd) ON_BN_CLICKED(IDC_BUTTON_DEL, OnButtonDel) ON_BN_CLICKED(IDC_BUTTON_REPLACE, OnButtonReplace) ON_BN_CLICKED(IDC_BUTTON_PICK, OnButtonPick) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CInsTextDlg message handlers //LONG CInsTextDlg::onAcadKeepFocus(UINT, LONG) //{ // return FALSE; void CInsTextDlg::SetTextStyle(const TCHAR* szStyle) { CString csStyle = szStyle; int len = m_comboStyle.GetCount(); for(int i=0;iMoveFirst(); while(!pTable->IsEOF()) { GET_FIELD(pTable, _T("TypeNumber"), Number); GET_FIELD(pTable, _T("TypeName"), csType); GET_FIELD(pTable, _T("TypeValue"), csValue); GET_FIELD(pTable, _T("REMARK"), csRemark); if(Number == 5){ if(m_lstType.Index(csType)<0) m_lstType.Append(tstrnew(csType)); } pTable->MoveNext(); } int iTypeIdx(0); XSymbolList lstStyle(_T("STYLE")); for (int m =0; m < lstStyle.Length(); m++) { m_comboStyle.AddString(lstStyle[m]); if(_tcsicmp(g_csDimStyle, lstStyle[m]) == 0){ m_iStyle = m; UpdateData(FALSE); } } for(int i=0;iMoveFirst(); while(!pTable->IsEOF()) { GET_FIELD(pTable, _T("TypeNumber"), Number); GET_FIELD(pTable, _T("TypeName"), csType); GET_FIELD(pTable, _T("TypeValue"), csValue); if(Number == 5 && csType==m_csType){ if(m_lstAll.Index(csValue)<0) m_lstAll.Append(tstrnew(csValue)); } pTable->MoveNext(); } for(int i=0;iSetFocus(); //屏幕菜单点取时, 命令焦点没有在图形窗口 UpdateData(FALSE); } void CInsTextDlg::PostNcDestroy() { CModelessDialog::PostNcDestroy(); } void CInsTextDlg::OnClose() { CModelessDialog::OnClose(); acedPostCommand(_T("\33\33")); } void CInsTextDlg::OnChangeEditSel() { UpdateData(TRUE); UpdateData(FALSE); } void CInsTextDlg::OnSelchangeComboTextstyle() { UpdateData(TRUE); m_comboStyle.GetLBText(m_iStyle, m_csTextStyle); } void CInsTextDlg::OnButtonReplace() { if(m_iRunMode == 2) return; m_iRunMode = 1; acedGetAcadDwgView()->SetFocus(); PostCommand(_T("` "), false); } void CInsTextDlg::OnButtonPick() { if(m_iRunMode == 1) return; m_iRunMode = 2; acedGetAcadDwgView()->SetFocus(); PostCommand(_T("` "), false); } void CInsTextDlg::OnButtonAdd() { UpdateData(TRUE); if(m_lstAll.Index(m_csSel) < 0) m_lstAll.Append(tstrnew(m_csSel)); else return; //已经存在 m_listContent.ResetContent(); for (int m =0; m < m_lstAll.Length(); m++) m_listContent.AddString(m_lstAll[m]); CodeBase db; XString fullFile; if(!FindFile(_T("DataStore.dbf"), fullFile)) { Callme(_T("对不起,没有发现DataStore.dbf文件!")); return; } XDbfTable *pTable = db.Open(fullFile); if(pTable) { pTable->AppendBegin(); SET_FIELD(pTable, _T("TypeNumber"), 5); SET_FIELD(pTable, _T("TypeName"), (const TCHAR*)m_csType); SET_FIELD(pTable, _T("TypeValue"), (const TCHAR*)m_csSel); pTable->AppendEnd(); } } void CInsTextDlg::OnButtonDel() { UpdateData(TRUE); int sel = m_listContent.GetCurSel(); if(sel < 0) return; CString csSel; m_listContent.GetText(sel, csSel); m_lstAll.Remove(sel); m_listContent.ResetContent(); for (int m =0; m < m_lstAll.Length(); m++) m_listContent.AddString(m_lstAll[m]); CodeBase db; XString fullFile; if(!FindFile(_T("DataStore.dbf"), fullFile)) { Callme(_T("对不起,没有发现DataStore.dbf文件!")); return; } XDbfTable *pTable = db.Open(fullFile); int Number; CString csType, csValue; if(pTable) { pTable->MoveFirst(); while(!pTable->IsEOF()) { GET_FIELD(pTable, _T("TypeNumber"), Number); GET_FIELD(pTable, _T("TypeName"), csType); GET_FIELD(pTable, _T("TypeValue"), csValue); if(csValue == csSel && Number == 5 && csType == m_csType){ pTable->Delete(); return; } pTable->MoveNext(); } } } //******************************************************************************* // TTextEdJig //******************************************************************************* XExplodeDraw::TextAlignment TTextEdJig::m_AlignList[] = { XExplodeDraw::kTopLeft, XExplodeDraw::kTopCenter , XExplodeDraw::kTopRight, XExplodeDraw::kMiddleLeft , XExplodeDraw::kMiddleCenter, XExplodeDraw::kMiddleRight , XExplodeDraw::kBottomLeft, XExplodeDraw::kBottomCenter , XExplodeDraw::kBottomRight,}; TTextEdJig::TTextEdJig(BOOL bIsTg, XPoint pt, double nHeight, const TCHAR*szText, AcDbObjectId idStyle, double nRotation) { m_pDlg = NULL; m_pText = NULL; m_pAcadText = NULL; m_bIsTgText = bIsTg; if(m_bIsTgText){ m_pText = new TDbText(); m_pText->SetStyleId(idStyle); m_pText->SetRotation(nRotation); m_pText->SetHeight(nHeight); m_pText->SetText(szText); m_pText->SetLocation(pt); } else{ m_pAcadText = new AcDbText(); m_pAcadText->setRotation(nRotation); m_pAcadText->setHeight(nHeight); m_pAcadText->setTextString(szText); m_pAcadText->setTextStyle(idStyle); m_pAcadText->setPosition(pt); m_pAcadText->setAlignmentPoint(pt); } } TTextEdJig::TTextEdJig(CInsTextDlg *dlg, XPoint pt) { m_pDlg = dlg; m_pAcadText = NULL; dlg->UpdateData(TRUE); AcDbObjectId idTextStyle = GetTextStyleId(dlg->m_csTextStyle); m_pText = new TDbText(); m_pText->SetStyleId(idTextStyle); m_pText->SetHeight(_tstof(dlg->m_csHeight)); m_pText->SetText(dlg->m_csSel); m_pText->SetLocation(pt); m_pText->SetAlignment(m_AlignList[dlg->m_iAlign]); } TTextEdJig::~TTextEdJig() { if(m_pText) delete m_pText; if(m_pAcadText) delete m_pAcadText; } AcEdJig::DragStatus TTextEdJig::GetPoint(XPoint &pt) { if(!m_ptRef) return acquirePoint(pt); else return acquirePoint(pt, m_ptRef); } int TTextEdJig::DoIt(int *keyIndex) { int nRet = TSymbEdJig::DoIt(keyIndex); return nRet; } // 更新实体数据 Adesk::Boolean TTextEdJig::update() { Adesk::Boolean bRet=Adesk::kTrue; XPoint ptRes = m_ptResult; ptRes.TransformBy(m_mat); if(m_pDlg){ m_pDlg->UpdateData(TRUE); AcDbObjectId idTextStyle = GetTextStyleId(m_pDlg->m_csTextStyle); m_pText->SetStyleId(idTextStyle); m_pText->SetHeight(_tstof(m_pDlg->m_csHeight)); m_pText->SetText(m_pDlg->m_csSel); m_pText->SetLocation(ptRes); m_pText->SetRotation(Ucs2Wcs(0.0));//支持UCS m_pText->SetAlignment(m_AlignList[m_pDlg->m_iAlign]); } else{ if(m_pText) m_pText->SetLocation(ptRes); if(m_pAcadText){ m_pAcadText->setPosition(ptRes); AcGeVector3d vt(m_ptResult-m_ptRef); m_ptAcadAlign+=vt; m_pAcadText->setAlignmentPoint(m_ptAcadAlign); } } return bRet; } AcDbEntity* TTextEdJig::entity() const { if(m_pDlg){ return (AcDbEntity *)m_pText; } else{ if(m_bIsTgText) return (AcDbEntity *)m_pText; else return (AcDbEntity *)m_pAcadText; } return NULL; } void TTextEdJig::SetAlign(AcDb::TextVertMode vertMode, AcDb::TextHorzMode horzMode) { if(m_pAcadText){ m_pAcadText->setVerticalMode(vertMode); m_pAcadText->setHorizontalMode(horzMode); } } void TTextEdJig::SetAlign(XExplodeDraw::TextAlignment Align) { if(m_pText) m_pText->SetAlignment(Align); } void TTextEdJig::SetAlignPoint(XPoint ptAlignPoint) { m_ptAcadAlign = ptAlignPoint; if(m_pAcadText) m_pAcadText->setAlignmentPoint(ptAlignPoint); } void TTextEdJig::SetWHScale(double nWHScale) { if(m_pAcadText) m_pAcadText->setWidthFactor(nWHScale); }