#include "StdAfx.h" #include "AecDbSymbSection.h" #include "AecDbText.h" #include "PushProperty.h" #include "dbgrip.h" #include "DimOptionData.h" AcDbObjectId InitTextStyle(TTextStyle ts, AcDbDatabase *pDb); const static Adesk::UInt8 g_nVersion; ACRX_DXF_DEFINE_MEMBERS(AecXDbSymbSection, AecXDbSymbWithText, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 1, AEC_POQIE, "AEC_POQIE|缺乏上华解释器, 请下载上华软件|网址: www.shanghuasoft.com"); const Adesk::UInt8 AecXDbSymbSection::g_nVersion = 2; double AecXDbSymbSection::g_nLineWidth = 0.5; double AecXDbSymbSection::g_nSegLength = 10.0; AecXDbSymbSection::AecXDbSymbSection() { m_nTextHeight = 5.0; m_nViewDir = 0.0; m_bViewLine = TRUE; // add by lgy 20120319,剖面图号文字 m_sDrawingIndex = _T(""); m_dIndexHeight = 3.5; m_nFlag = 0; m_dText2BaseRatio = -1000; // 默认-1000时说明受天正选项距基线系数控制 m_nViewDir2 = 0; } AecXDbSymbSection::~AecXDbSymbSection() { } BOOL AecXDbSymbSection::IsValid() const { //BOOL bRet = AecXDbSymbWithText::IsValid(); //if (!bRet) // return bRet; BOOL bRet = (m_poly.Length() > 1 && !m_poly.IsClosed()); return bRet; } //Acad::ErrorStatus //AecXDbSymbSection::subGetClassID(CLSID* pClsid) const //{ // *pClsid = CLSID_ComSymbSection; // return Acad::eOk; //} // 提供对格式刷的支持 void AecXDbSymbSection::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag) { AssertWriteEnabled(); AecXDbSymbWithText::CopyPropertiesFrom(pSrcEntity, gMatchFlag); AecXDbSymbSection *pSrc = AecXDbSymbSection::cast(pSrcEntity); if (pSrc) { m_bViewLine = pSrc->m_bViewLine; } } Acad::ErrorStatus AecXDbSymbSection::dwgInFields(AcDbDwgFiler* filer) { AssertWriteEnabled(); Acad::ErrorStatus es = AecXDbSymbWithText::dwgInFields(filer); if (es != Acad::eOk) return es; Adesk::Int8 version; filer->readItem(&version); if (version > g_nVersion) return Acad::eMakeMeProxy; filer->readItem(&m_bViewLine); filer->readItem(&m_nViewDir); Adesk::UInt8 nVertNum; filer->readItem(&nVertNum); m_poly.Reset(); for (Adesk::UInt8 i = 0; i < nVertNum; i++) { ADSGePoint3d pnt; filer->readItem(&(AcGePoint2d &)pnt); m_poly.AppendNode(pnt); } GlobalFunc::ReadString(filer, m_sText); // sg modify 120426,根据9.0需求,将文字夹点转换为ECS坐标 //filer->readItem(&(AcGePoint2d &)m_ptText1); //filer->readItem(&(AcGePoint2d &)m_ptText2); ADSGePoint3d ptText1, ptText2; filer->readItem(&(AcGePoint2d &)ptText1); filer->readItem(&(AcGePoint2d &)ptText2); // add by lgy 20120319,9.0为剖面图号添加一些新的属性 if (version > 1) // 9.0版本 { m_ptText1 = ptText1; m_ptText2 = ptText2; GlobalFunc::ReadString(filer, m_sDrawingIndex); filer->readItem(&(AcGePoint2d &)m_ptSIndex); filer->readItem(&(AcGePoint2d &)m_ptEIndex); filer->readItem(&m_dIndexHeight); filer->readItem(&m_nFlag); filer->readItem(&m_idIndexStyle); filer->readItem(&m_dText2BaseRatio); filer->readItem(&m_nViewDir2); } else // 9.0以前版本 { m_nFlag = 0; m_dIndexHeight = 3.5; m_sDrawingIndex = _T(""); m_idIndexStyle = InitTextStyle(TS_INDEXSCALE, database()); m_dText2BaseRatio = -1000; m_nViewDir2 = m_nViewDir; SetTextLocation(0, ptText1); // 将起点、终点处的文字位置点转换为ECS坐标 SetTextLocation(1, ptText2); } return filer->filerStatus(); } Acad::ErrorStatus AecXDbSymbSection::dwgOutFields(AcDbDwgFiler* filer) const { assertReadEnabled(); VERIFY(AecXDbSymbWithText::dwgOutFields(filer) == Acad::eOk); // modify by lgy 20120319,9.0中新添加些属性 // filer->writeItem(g_nVersion); filer->writeItem(g_nVersion); filer->writeItem(m_bViewLine); filer->writeItem(m_nViewDir); Adesk::UInt8 vexLen = m_poly.Length(); filer->writeItem(vexLen); for (Adesk::UInt8 i = 0; i < vexLen; i++) { filer->writeItem((const AcGePoint2d &)m_poly[i]); } filer->writeItem((const TCHAR *)m_sText); // sg modify 120426,根据9.0需求,将文字夹点转换为ECS坐标 //filer->writeItem((const AcGePoint2d &)m_ptText1); //filer->writeItem((const AcGePoint2d &)m_ptText2); // add by lgy 20120319,9.0为剖面符号添加了新的属性 //if (g_nSaveTArchVer > 8) // 9.0版本 //{ filer->writeItem((const AcGePoint2d &)m_ptText1); filer->writeItem((const AcGePoint2d &)m_ptText2); filer->writeItem((const TCHAR *)m_sDrawingIndex); filer->writeItem((const AcGePoint2d &)m_ptSIndex); filer->writeItem((const AcGePoint2d &)m_ptEIndex); filer->writeItem(m_dIndexHeight); filer->writeItem(m_nFlag); filer->writeItem(m_idIndexStyle); filer->writeItem(m_dText2BaseRatio); filer->writeItem(m_nViewDir2); //} //else // 9.0以前版本 //{ // ADSGePoint3d pt = GetTextLocation(0); // filer->writeItem((const AcGePoint2d &)pt); // pt = GetTextLocation(1); // filer->writeItem((const AcGePoint2d &)pt); //} return filer->filerStatus(); } Acad::ErrorStatus AecXDbSymbSection::dxfInFields(AcDbDxfFiler* filer) { return AecXDbSymbWithText::dxfInFields(filer); } Acad::ErrorStatus AecXDbSymbSection::dxfOutFields(AcDbDxfFiler* filer) const { return AecXDbSymbWithText::dxfOutFields(filer); } Acad::ErrorStatus AecXDbSymbSection::Draw2d(AcGiDraw &dc) const { assertReadEnabled(); if (!IsValid()) // 判断是否符合绘制条件 { return Acad::eInvalidInput; } if (Has2DBuffer() && !dc.IsDragging()) { dc.SetColor(colorIndex()); dc.SetLayer(layerId()); BaseEx::_Draw2DBuffers(dc, true); return Acad::eOk; } if (!m_bInJig) int a = 0; double tempLineWidth = g_nLineWidth * GetPScale(); // sg modify 110408,剖线方向、位置长度,都改成支持在高级选项中进行设置 // double tempSegLen = g_nSegLength*GetPScale(); double tempSegLen = g_DimOption::instance().g_dSectionSegLocLength * GetPScale(), tempSegDirLen = g_DimOption::instance().g_dSectionSegDirLength * GetPScale(); int vexNum = m_poly.Length(); for (int i = 0; i < vexNum; i++) { ADSGePoint3d ptVert = m_poly[i]; ADSGePoint3d ptPrev, ptNext; BOOL bPrev = FALSE, bNext = FALSE; if (i == 0 && m_bViewLine) { // sg modify 110408,剖线方向、位置长度,都改成支持在高级选项中进行设置 // ads_polar(ptVert, m_nViewDir, 0.6*tempSegLen, ptPrev); ads_polar(ptVert, m_nViewDir, tempSegDirLen, ptPrev); bPrev = TRUE; } else if (i > 0) { double nSegLen = min(tempSegLen, ptVert.Distance2d(m_poly[i - 1]) / 2); ads_polar(ptVert, ads_angle(ptVert, m_poly[i - 1]), nSegLen, ptPrev); bPrev = TRUE; } if (i == vexNum - 1 && m_bViewLine) { // sg modify 110408,剖线方向、位置长度,都改成支持在高级选项中进行设置 // ads_polar(ptVert, m_nViewDir, 0.6*tempSegLen, ptNext); // sg modify 120524,终点处有可能使用另外一个剖视方向 // ads_polar(ptVert, m_nViewDir, tempSegDirLen, ptNext); ads_polar(ptVert, GetEndViewLineDir(), tempSegDirLen, ptNext); bNext = TRUE; } else if (i < vexNum - 1) { double nSegLen = min(tempSegLen, ptVert.Distance2d(m_poly[i + 1]) / 2); ads_polar(ptVert, ads_angle(ptVert, m_poly[i + 1]), nSegLen, ptNext); bNext = TRUE; } AcDbPolyline pline; pline.setPropertiesFrom(this); int nVert = 0; if (bPrev) { pline.addVertexAt(nVert, ptPrev); nVert++; } pline.addVertexAt(nVert, ptVert); nVert++; if (bNext) { pline.addVertexAt(nVert, ptNext); nVert++; } pline.setConstantWidth(tempLineWidth); //dc.Polyline(pline); DrawPline(dc, pline); } if (!!m_sText || g_Option::instance().g_bExplodeSubText) { AecXDbText text; text.setPropertiesFrom(this); text.SetPScale(GetPScale()); // text.SetRotation(m_nTextRotation); text.SetAlignment(AcGiDraw::kMiddleCenter); text.SetStyleId(m_idTextStyle); //if (dc.IsExportTch4()) // sg modify 090608 //{ // // sg add 120313,分解出来的文字的图层和颜色要随“高级选项”中的设置来处理 // // if (!!m_idTextLayer) // if (g_nSymbTextT3Layer == 1 && !!m_idTextLayer) // text.setLayer(m_idTextLayer); // 文字层 // else // text.setColorIndex(m_colorText); // 文字和标注放在同一层,文字的颜色为白色 //} //else text.setColorIndex(m_colorText); // sg add 090608,将文字和标注放在同一层,文字的颜色为白色 PushProperty vProp(&text, dc); text.SetHeight(m_nTextHeight); text.SetText(m_sText); // modify by lgy 20120322,9.0中各个文字位置点保存的是ecs坐标,故需要转换成为wcs // text.SetLocation(m_ptText1); ADSGePoint3d pt = GetTextLocation(0); text.SetLocation(pt); //if (dc.IsFullExplode()) // text.ExplodeOrDraw2d(dc); //else // dc.DrawEntity(text); DrawBaseEx(dc, text); // modify by lgy 20120322,9.0中各个文字位置点保存的是ecs坐标,故需要转换成为wcs // text.SetLocation(m_ptText2); pt = GetTextLocation(1);//获得剖切编号末端位置点 text.SetLocation(pt); //if (dc.IsFullExplode()) // text.ExplodeOrDraw2d(dc); //else // dc.DrawEntity(text); DrawBaseEx(dc, text); } // add by lgy 20120319,9.0中有添加了剖面图号文字 if ((GetIsHasIndexS() || GetIsHasIndexE()) && (!!m_sDrawingIndex || g_Option::instance().g_bExplodeSubText)) { AecXDbText text; text.setPropertiesFrom(this); text.SetPScale(GetPScale()); text.SetStyleId(m_idIndexStyle); //if (dc.IsExportTch4()) //{ // if (g_nSymbTextT3Layer == 1 && !!m_idTextLayer) // text.setLayer(m_idTextLayer); // 为文字设置图层 // else // text.setColorIndex(m_colorText); // 为文字设置颜色 //} //else text.setColorIndex(m_colorText); PushProperty vProp(&text, dc); text.SetHeight(m_dIndexHeight); // 为文字设置高度 text.SetText(m_sDrawingIndex); if (GetIsHasIndexS()) // 图号始端有文字 { double dRotation = GetIndexTextRotation(0); text.SetRotation(dRotation); AcGiDraw::TextAlignment nAlign = GetIndexTextAlignment(0); text.SetAlignment(nAlign); ADSGePoint3d pt = GetIndexLocation(0); text.SetLocation(pt); //if (dc.IsFullExplode()) // text.ExplodeOrDraw2d(dc); //else // dc.DrawEntity(text); DrawBaseEx(dc, text); } if (GetIsHasIndexE()) // 图号末端有文字 { double dRotation = GetIndexTextRotation(1); text.SetRotation(dRotation); AcGiDraw::TextAlignment nAlign = GetIndexTextAlignment(1); text.SetAlignment(nAlign); ADSGePoint3d pt = GetIndexLocation(1); text.SetLocation(pt); //if (dc.IsFullExplode()) // text.ExplodeOrDraw2d(dc); //else // dc.DrawEntity(text); DrawBaseEx(dc, text); } } return Acad::eOk; } SubText* AecXDbSymbSection::HitTestText(ADSGePoint3d pt)const { //SubText *pSub = TDbEntity::HitTestText(pt); //if (pSub != NULL) // pSub->SetIndex(0); //return pSub; return AecXDbSymbWithText::HitTestText(pt); } void AecXDbSymbSection::SetSubText(long i, CString sText) { AssertWriteEnabled(); // m_sText = sText; if (i == 0 || i == 1) { m_sText = sText; } else // 2或者3 { m_sDrawingIndex = sText; } } // sg add 110301,支持统一标高 bool AecXDbSymbSection::UnifyElevation(double dElevation) { AssertWriteEnabled(); m_poly.SetElevation(dElevation); m_ptText1.z = dElevation; m_ptText2.z = dElevation; m_ptSIndex.z = dElevation; m_ptEIndex.z = dElevation; return true; } void AecXDbSymbSection::getGripPoints(AcGePoint3dArray &gripPoints) const { assertReadEnabled(); // modify by lgy 20120322,9.0中文字位置点保存为ecs坐标 // gripPoints.append(m_ptText1); //0 // gripPoints.append(m_ptText2); //1 ADSGePoint3d ptTemp = GetTextLocation(0); gripPoints.append(ptTemp); ptTemp = GetTextLocation(1); gripPoints.append(ptTemp); int nEdgeNum = m_poly.TotalSegments(); gripPoints.append(*m_poly.Head()); //2 gripPoints.append(*m_poly.Tail()); //3 // add by lgy 20120321,为剖切符号添加剖面图号夹点 if (GetIsHasIndexS()) { ptTemp = GetIndexLocation(0); gripPoints.append(ptTemp); //4 } if (GetIsHasIndexE()) { ptTemp = GetIndexLocation(1); gripPoints.append(ptTemp); //5 } for (int i = 0; i < nEdgeNum; i++) { GeCurveSegment seg; m_poly.Nth(i, seg); ADSGePoint3d ptMid = seg.MidPoint(); gripPoints.append(ptMid); } } Acad::ErrorStatus AecXDbSymbSection::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapMasks, AcDbIntArray& geomIds) const { getGripPoints(gripPoints); return Acad::eOk; } namespace { double PixelToWcs(int nPixel) { ads_point ptScreenSize; double nViewSize; struct resbuf rb1, rb2; acedGetVar(_T("ScreenSize"), &rb1); acedGetVar(_T("ViewSize"), &rb2); nViewSize = rb2.resval.rreal; ads_point_set(rb1.resval.rpoint, ptScreenSize); if (ptScreenSize[1] < 1.0e-6 || nViewSize < 1.0e-6) return 0.0; double hight = (nViewSize / ptScreenSize[Y]) * nPixel; return hight; } bool Grip_WorldDrawfunc(AcDbGripData *pThis, AcGiWorldDraw *pWd, const AcDbObjectId &entId, AcDbGripOperations::DrawType type, AcGePoint3d *cursor, double dGripSize) { AcGiFillType eOldFill = pWd->subEntityTraits().fillType(); int nOldColor = pWd->subEntityTraits().color(); AecXDbSymbSection::GripData* pGrip = (AecXDbSymbSection::GripData*)pThis->appData(); AcGePoint3d ptGe[5], ptBox[5]; AcGePoint3d ptGrip = pThis->gripPoint(); double dOne = PixelToWcs(1); ptGe[0] = ptGrip; ptGe[0].x -= 4 * dOne; ptGe[1] = ptGrip; ptGe[1].x += 4 * dOne; ptBox[0] = ptGe[0]; ptBox[0].y -= 4 * dOne; ptBox[1] = ptGe[0]; ptBox[1].y += 4 * dOne; ptBox[2] = ptGe[1]; ptBox[2].y += 4 * dOne; ptBox[3] = ptGe[1]; ptBox[3].y -= 4 * dOne; pWd->subEntityTraits().setFillType(kAcGiFillAlways); pWd->geometry().polygon(4, ptBox); pWd->subEntityTraits().setFillType(eOldFill); if (pGrip->m_bDrawFrame) { AcGePoint3d arFrame1[] = {pGrip->m_pt0, pGrip->m_pt1, pGrip->m_pt2, pGrip->m_pt3,}; pWd->subEntityTraits().setColor(9); pWd->geometry().polyline(4, arFrame1); pWd->subEntityTraits().setColor(nOldColor); } return true; } } bool AecXDbSymbSection::hasLastPoint() const { assertReadEnabled(); int v; return GetSpecialtyData()->HasKey(_T("_SECTION_LAST_POINT_"), v) == FALSE ? false : true; } void AecXDbSymbSection::setLastPoint(const AcGePoint3d &pt) { AssertWriteEnabled(); GetSpecialtyData(AcDb::kForWrite)->SetAt(_T("_SECTION_LAST_POINT_"), pt); } AcGePoint3d AecXDbSymbSection::getLastPoint() const { assertReadEnabled(); AcGePoint3d pt(AcGePoint3d::kOrigin); GetSpecialtyData()->GetAt(_T("_SECTION_LAST_POINT_"), pt); return pt; } Acad::ErrorStatus AecXDbSymbSection::subGetGripPoints(AcDbGripDataPtrArray &grips , const double curViewUnitSize , const int gripSize , const AcGeVector3d &curViewDir , const int bitflags) const { AcGePoint3dArray gripPoints; getGripPoints(gripPoints); if (gripPoints.length() < 3) return Acad::eBufferTooSmall; m_GripDatas.clear(); // 先把 grippoints 里的点都绘制出来 for (int i(0); i < gripPoints.length(); ++i) { GripData gpd; gpd.m_idx = i; AcDbGripData *pGripData = new AcDbGripData; pGripData->setGripPoint(gripPoints.at(i)); pGripData->setWorldDraw(Grip_WorldDrawfunc); m_GripDatas.push_back(gpd); void *p = &*m_GripDatas.rbegin(); pGripData->setAppData(p); grips.append(pGripData); } if (!hasLastPoint()) return Acad::eOk; AcGePoint3d ptLast = getLastPoint(); int nEdges = m_poly.TotalSegments(); AcGeVector3d vt1((gripPoints[0] - gripPoints[2]).normalize()) , vt2((gripPoints[1] - gripPoints[3]).normalize()); // 同向且平行 if (vt1.isCodirectionalTo(vt2) && vt1.isParallelTo(vt2)) { AcGeRay3d ray1(gripPoints[2], vt1); AcGeRay3d ray2(gripPoints[3], vt2); AcGePoint3d pt1 = ray1.closestPointTo(ptLast); AcGePoint3d pt2 = ray2.closestPointTo(ptLast); GripData &lastGrip = *m_GripDatas.rbegin(); // 最后的夹点 lastGrip.m_bDrawFrame = true; lastGrip.m_pt0 = gripPoints[2]; lastGrip.m_pt1 = pt1; lastGrip.m_pt2 = pt2; lastGrip.m_pt3 = gripPoints[3]; } return Acad::eOk; } Acad::ErrorStatus AecXDbSymbSection::subMoveGripPointsAt(const AcDbVoidPtrArray &appData , const AcGeVector3d &offset , const int bitflags) { AssertWriteEnabled(); AcDbIntArray indices; if (!appData.isEmpty()) { GripData *pAppData = (GripData *)appData.first(); indices.append(pAppData->m_idx); return subMoveGripPointsAt(indices, offset); } else { return Acad::eOk; } return Acad::eOk; } Acad::ErrorStatus AecXDbSymbSection::subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& vtOffset) { using namespace GlobalFunc; AssertWriteEnabled(); if (!IsValid()) // 判断是否符合绘制条件 { return Acad::eOk; } ADSGePoint3d offset(vtOffset[0], vtOffset[1]); // modify by lgy 20120322, 9.0文字位置点为相对于线的ECS坐标系下的点, // 故不需要再判断移动的点是不是在默认位置 // ADSGePoint3d ptDef1=GetDefaultTextLocation(0); // ADSGePoint3d ptDef2=GetDefaultTextLocation(1); // BOOL bAtDefault1=(m_ptText1.Distance2d(ptDef1)= 0 && nPrev < nTotalEdge) // 更新起点 { m_poly.Nth(nPrev, prevSeg); prevSeg.SetLineFlag(LS_INFINITE); ADSGePoint3d ptInt[2]; int nIntNum = prevSeg.Intersection(ln, ptInt[0], ptInt[1]); if (nIntNum == 1) ptStart = ptInt[0]; else if (nIntNum == 2) { ptStart = GeLine(ptInt[0], ptInt[1]).NearPoint(ln.StartPoint()); } else bUpdateIt = FALSE; } else { Vector3D vtView(cos(m_nViewDir), sin(m_nViewDir)); double nDot = (offset & vtView); vtView *= nDot; ptStart = *m_poly[nEdgeIndex] + vtView; if (!bMT1) { // delete by lgy 20120322,移动夹点时需要将移动的夹点从ecs坐标系转换成为wcs坐标系 // m_ptText1 +=vtView; bMT1 = TRUE; offsetSViewLine = ADSGePoint3d(vtView.x, vtView.y, vtView.z); } } // 更新下一点 if (nNext >= 0 && nNext < nTotalEdge) { m_poly.Nth(nNext, nextSeg); nextSeg.SetLineFlag(LS_INFINITE); ADSGePoint3d ptInt[2]; int nIntNum = nextSeg.Intersection(ln, ptInt[0], ptInt[1]); if (nIntNum == 1) ptEnd = ptInt[0]; else if (nIntNum == 2) { ptEnd = GeLine(ptInt[0], ptInt[1]).NearPoint(ln.EndPoint()); } else bUpdateIt = FALSE; } else { // Vector3D vtView(cos(m_nViewDir), sin(m_nViewDir)); Vector3D vtView(cos(GetEndViewLineDir()), sin(GetEndViewLineDir())); double nDot = (offset & vtView); vtView *= nDot; ptEnd = *m_poly[nEdgeIndex + 1] + vtView; if (!bMT2) { // delete by lgy 20120322,移动夹点时需要将移动的夹点从ecs坐标系转换成为wcs坐标系 // m_ptText1 +=vtView; bMT2 = TRUE; offsetEViewLine = ADSGePoint3d(vtView.x, vtView.y, vtView.z); } } if (bUpdateIt) { *m_poly[nEdgeIndex] = ptStart; if (nNext >= 0 && nNext < m_poly.Length()) { *m_poly[nNext] = ptEnd; } } } } // modify by lgy 20120322,9.0文字位置点全部保存为ECS坐标系下的点 // if(bAtDefault1 && !bMoveText1) // m_ptText1=GetDefaultTextLocation(0); // if(bAtDefault2 && !bMoveText2) // m_ptText2=GetDefaultTextLocation(1); //if (bMoveText1) //{ // GeCurveSegment segFirst; // m_poly.Nth(0, segFirst); // ADSGePoint3d ptView; // ads_polar(segFirst.StartPoint(), m_nViewDir, 100.0, ptView); // if(segFirst.OnWhichSide(ptView)!=segFirst.OnWhichSide(m_ptText1)) // { // m_nViewDir=GlobalFunc::AngleRangeTo2PI(m_nViewDir+PI); // m_ptText2=GetDefaultTextLocation(1); // } //} //else if (bMoveText2) //{ // GeCurveSegment segLast; // m_poly.Nth(m_poly.TotalSegments()-1, segLast); // ADSGePoint3d ptView; // ads_polar(segLast.EndPoint(), m_nViewDir, 100.0, ptView); // if(segLast.OnWhichSide(ptView)!=segLast.OnWhichSide(m_ptText2)) // { // m_nViewDir=GlobalFunc::AngleRangeTo2PI(m_nViewDir+PI); // } //} return Acad::eOk; } Acad::ErrorStatus AecXDbSymbSection::subGetStretchPoints(AcGePoint3dArray& stretchPoints) const { assertReadEnabled(); AcDbIntArray osnapModes; AcDbIntArray geomIds; return subGetGripPoints(stretchPoints, osnapModes, geomIds); } Acad::ErrorStatus AecXDbSymbSection::subMoveStretchPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { AssertWriteEnabled(); DualPtrList lstIndices; for (long i = 0; i < indices.length(); i++) lstIndices.FindOrAddTail(indices[i]); int nAllLength = m_poly.TotalSegments() + 4, nFirstSeg = 4, nLastSeg = 4 + m_poly.TotalSegments() - 1; if (GetIsHasIndexS()) { nAllLength++; nFirstSeg++; nLastSeg++; } if (GetIsHasIndexE()) { nAllLength++; nFirstSeg++; nLastSeg++; } bool bHasSPt(false), bHasEPt(false), bAllSel(false), bHasStartText(false), bHasEndText(false); AcDbIntArray indices2; if (lstIndices.Find(2) > -1) { indices2.append(2); bHasSPt = true; } if (lstIndices.Find(3) > -1) { indices2.append(3); bHasEPt = true; } if (lstIndices.Find(nFirstSeg) > -1) { indices2.append(nFirstSeg); bHasStartText = bHasSPt; bHasSPt = true; } if (lstIndices.Find(nLastSeg) > -1) { if (nFirstSeg != nLastSeg) indices2.append(nLastSeg); bHasEndText = bHasEPt; bHasEPt = true; } int nSel = lstIndices.GetLength(); bAllSel = nAllLength == nSel; for (i = 0; i < nSel; i++) { int nIndex = lstIndices[i]; if (bHasSPt && (nIndex == 2 || nIndex == nFirstSeg || (GetIsHasIndexS() && nIndex == 4))) continue; if (bHasEPt && (nIndex == 3 || nIndex == nLastSeg || (GetIsHasIndexS() && GetIsHasIndexE() && nIndex == 5) || (!GetIsHasIndexS() && GetIsHasIndexE() && nIndex == 4))) continue; if (bAllSel && (nIndex == 0 || nIndex == 1)) continue; if (bHasStartText && nIndex == 0) continue; if (bHasEndText && nIndex == 1) continue; indices2.append(nIndex); } return subMoveGripPointsAt(indices2, offset); } Acad::ErrorStatus AecXDbSymbSection::subTransformBy(const AcGeMatrix3d& xform) { AssertWriteEnabled(); AecXDbSymbWithText::subTransformBy(xform); ads_matrix mat; memcpy(mat, &xform, sizeof(AcGeMatrix3d)); int i(0), len = m_poly.Length(); for (i = 0; i < len; i++) { m_poly[i]->TransformBy(mat); } ADSGePoint3d ptTemp1, ptTemp2; ads_polar(ptTemp1, m_nViewDir, 1000.0, ptTemp2); ptTemp1.TransformBy(mat); ptTemp2.TransformBy(mat); m_nViewDir = ads_angle(ptTemp1, ptTemp2); // modify by lgy 20120322,9.0中新添加图号文字,并且各位置点保存为ecs坐标 // m_ptText1.TransformBy(mat); // m_ptText2.TransformBy(mat); if (GetNonPerpendicularitySection()) // 不平行,可能有2个剖视方向 { ADSGePoint3d ptTemp3, ptTemp4; ads_polar(ptTemp3, m_nViewDir2, 1000.0, ptTemp4); ptTemp3.TransformBy(mat); ptTemp4.TransformBy(mat); m_nViewDir2 = ads_angle(ptTemp3, ptTemp4); } return Acad::eOk; } int AecXDbSymbSection::ConvertText(TConvertTextPtr ptr, void *pData) { AssertWriteEnabled(); TCString sText; int nRet = ptr(m_sText, sText, pData); if (nRet == RTNORM) { m_sText = sText; } int nRet1 = ptr(m_sDrawingIndex, sText, pData); if (nRet1 == RTNORM) { m_sDrawingIndex = sText; } else if (nRet1 == RTERROR) nRet = nRet1; return nRet; } // sg add 090626,解决需求平台问题1416,支持查找替换操作 BOOL AecXDbSymbSection::GetText(Adesk::UInt32 cookies, AecXDbText &text) const { // modify by lgy 20120322,9.0添加图号文字,要支持查找替换操作 //if (cookies != 0) // return FALSE; //text.setPropertiesFrom(this); //text.SetAlignment(AcGiDraw::kMiddleCenter); //text.SetStyleId(m_idTextStyle); //text.SetHeight(m_nTextHeight); //text.SetText(m_sText); //text.SetLocation(m_ptText1); if (((GetIsHasIndexS() || GetIsHasIndexE()) && (cookies > 1)) || (cookies > 0)) { return FALSE; } text.setPropertiesFrom(this); text.SetAlignment(AcGiDraw::kMiddleCenter); if (cookies == 0) // 剖切编号 { text.SetStyleId(m_idTextStyle); text.SetHeight(m_nTextHeight); ADSGePoint3d ptText = GetTextLocation(0); text.SetLocation(ptText); text.SetText(m_sText); } else // 剖切图号 { text.SetStyleId(m_idIndexStyle); text.SetHeight(m_dIndexHeight); if (GetIsHasIndexS()) // 图号始端有文字 { text.SetRotation(GetIndexTextRotation(0)); text.SetAlignment(GetIndexTextAlignment(0)); ADSGePoint3d pt = GetIndexLocation(0); text.SetLocation(pt); } else if (GetIsHasIndexE()) // 图号末端有文字 { text.SetRotation(GetIndexTextRotation(1)); text.SetAlignment(GetIndexTextAlignment(1)); ADSGePoint3d pt = GetIndexLocation(1); text.SetLocation(pt); } text.SetText(m_sDrawingIndex); } return TRUE; } TextPosition AecXDbSymbSection::FindSubText(const TCHAR *sSubText, TextPosition &posStart, TextRange *pRange) const { assertReadEnabled(); TextPosition pos; if (!sSubText || !sSubText[0]) return pos; TextPosition posNext = posStart; while (1) { AecXDbText text; text.SetPScale(GetPScale()); if (!GetText(posNext.m_nCookies, text)) break; TextPosition posFind = text.FindSubText(sSubText, posNext, pRange); if (!posFind) { posNext.m_nCookies++; posNext.m_nTextPos = 0; } else { posStart = posNext; if (!posStart) { posStart.m_nCookies++; posStart.m_nTextPos = 0; } posFind.m_nCookies = posNext.m_nCookies; pos = posFind; break; } } return pos; } TextPosition AecXDbSymbSection::ReplaceSubText(const TextPosition &posRep, const TCHAR *sRepText, TextRange *pRange) { AssertWriteEnabled(); AecXDbText text; text.SetPScale(GetPScale()); TextPosition posNext; if (!sRepText || !GetText(posRep.m_nCookies, text)) return posNext; posNext = text.ReplaceSubText(posRep, sRepText, pRange); // modify by lgy 20120419,9.0为增加剖面图号,故需要支持查找替换 // SetText(text.GetText()); if (posRep.m_nCookies == 0) { SetText(text.GetText()); } else if (posRep.m_nCookies == 1) { SetDrawingIndex(text.GetText()); } if (!posNext) { posNext.m_nCookies = posRep.m_nCookies + 1; posNext.m_nTextPos = 0; } return posNext; } void AecXDbSymbSection::GetTips(PtrList &lstInfo) const { lstInfo.Append(new ObjInfoUnit(_T("对象类型"), _T("剖切符号"))); lstInfo.Append(new ObjInfoUnit(_T("剖切号"), m_sText)); if (!!m_sDrawingIndex) lstInfo.Append(new ObjInfoUnit(_T("剖面图号"), m_sDrawingIndex)); lstInfo.Append(new ObjInfoUnit(_T("字高"), TCString(_T("%.1fP"), (double)m_nTextHeight))); //lstInfo.Append(new ObjInfoUnit(_T("线宽"), TCString(_T("%.1f"), (double)m_rLineWidth))); return; } Acad::ErrorStatus AecXDbSymbSection::GetGripText(int idx, CString &cs) const { int vexLen; vexLen = m_poly.Length(); if (idx <= 1) // 0\1 { cs = _T("移动文字和改变方向"); } else if (idx == 4) { if (GetIsHasIndexS() || GetIsHasIndexE()) { cs = _T("移动文字"); } else { cs = _T("改变剖切位置"); } } else if (idx == 5) { if (GetIsHasIndexS() || GetIsHasIndexE()) { cs = _T("移动文字"); } else { cs = _T("改变剖切位置"); } } else { cs = _T("改变剖切位置"); } return Acad::eOk; } /////////////////////////////////////////////////////////// // Properties ADSGePoint3d AecXDbSymbSection::GetDefaultTextLocation(int nPos) const { double nGap = m_nTextHeight * GetPScale() / 2.0, nGap1 = g_DimOption::instance().g_dSectionSegDirLength * GetPScale(); if (!m_bViewLine) nGap1 = 0.0; ADSGePoint3d ptRet; //ads_polar(nPos==0? *m_poly.Head():*m_poly.Tail(), m_nViewDir, nGap1+nGap*2, ptRet); if (nPos == 0) { ads_polar(*m_poly.Head(), m_nViewDir, nGap1 + nGap * 2, ptRet); } else { ads_polar(*m_poly.Tail(), GetEndViewLineDir(), nGap1 + nGap * 2, ptRet); } return ptRet; } ADSGePoint3d AecXDbSymbSection::GetTextLocation(int nPos, BOOL bEcsPoint) const { //return (nPos==0? m_ptText1 : m_ptText2); ADSGePoint3d pt = (nPos == 0) ? m_ptText1 : m_ptText2; // ECS点 if (!bEcsPoint) // WCS点 { pt = GetWcsTextPt(nPos); } return pt; } void AecXDbSymbSection::GetPoly2D(GePoly2D &poly) const { poly = m_poly; } double AecXDbSymbSection::GetViewDirection() const { return m_nViewDir; } const TCHAR * AecXDbSymbSection::GetText() const { return (const TCHAR *)m_sText; } BOOL AecXDbSymbSection::HasViewLine() const { return (m_bViewLine != 0); } void AecXDbSymbSection::SetTextLocation(int nPos, ADSGePoint3d pt) { AssertWriteEnabled(); // modify by lgy 20120319,修改该部分是为了满足9.0中求的剖面图号位置点 // if(nPos==0) //m_ptText1=pt; // else //m_ptText2=pt; AcGePoint2d ptOrigin = GetEcsOriginPt(nPos); // 获得ECS原点 AcGeVector2d xAxis, yAxis; GetEcsAxisVector(xAxis, yAxis, nPos); // 获得ECS坐标轴方向 AcGeMatrix2d mat2d; mat2d = mat2d.alignCoordSys(ptOrigin, xAxis, yAxis, AcGePoint2d(0, 0), AcGeVector2d(1, 0), AcGeVector2d(0, 1)); AcGePoint2d ptResult(pt.x, pt.y); ptResult.transformBy(mat2d); //WCS2ECS if (nPos == 0) // 剖切编号始端位置点 { m_ptText1.x = ptResult.x / GetPScale(); m_ptText1.y = ptResult.y / GetPScale(); // 用图纸比例保存 } else if (nPos == 1) // 剖切编号末端位置点 { m_ptText2.x = ptResult.x / GetPScale(); m_ptText2.y = ptResult.y / GetPScale(); // 用图纸比例保存 } } void AecXDbSymbSection::SetPoly2D(const GePoly2D &poly) { AssertWriteEnabled(); m_poly = poly; } void AecXDbSymbSection::SetText(const TCHAR * pStr) { AssertWriteEnabled(); m_sText = pStr; } void AecXDbSymbSection::SetViewDirection(double vec) { AssertWriteEnabled(); m_nViewDir = vec; } void AecXDbSymbSection::SetViewLine(BOOL bTrue) { AssertWriteEnabled(); m_bViewLine = bTrue; } AcGePoint2d AecXDbSymbSection::GetEcsOriginPt(int nPos) const //获取ECS原点,文字位置参考点 { ADSGePoint3d ptOrigin; if (nPos == 0) // 剖切编号文字始端位置点 { ptOrigin = GetDefaultTextLocation(0); } else if (nPos == 1) // 剖切编号文字末端位置点 { ptOrigin = GetDefaultTextLocation(1); } else if (nPos == 2) // 剖切图号文字始端位置点 { ptOrigin = GetDefaultIndexLocation(0); } else if (nPos == 3) // 剖切图号文字末端位置点 { ptOrigin = GetDefaultIndexLocation(1); } return ptOrigin.AsAcGePoint2d(); } void AecXDbSymbSection::GetEcsAxisVector(AcGeVector2d &xAxis, AcGeVector2d &yAxis, int nPos) const { if (m_poly.TotalSegments() < 1) { return; } switch (nPos) { case 0: xAxis = m_poly[0] - m_poly[1]; break; case 1: xAxis = m_poly[m_poly.Length() - 2] - m_poly[m_poly.Length() - 1]; break; case 2: if (GetDimDirection() == 1) // 沿剖视方向 xAxis = AcGeVector2d(cos(m_nViewDir), sin(m_nViewDir)); else xAxis = m_poly[0] - m_poly[1]; break; case 3: if (GetDimDirection() == 1) // 沿剖视方向 xAxis = AcGeVector2d(cos(GetEndViewLineDir()), sin(GetEndViewLineDir())); else xAxis = m_poly[m_poly.Length() - 2] - m_poly[m_poly.Length() - 1]; yAxis = xAxis.perpVector(); break; } yAxis = xAxis.perpVector(); xAxis.normalize(); yAxis.normalize(); } //将文字位置由ECS转换为WCS ADSGePoint3d AecXDbSymbSection::GetWcsTextPt(int nPos) const { AcGePoint2d ptOrigin = GetEcsOriginPt(nPos); // 获得ECS原点 AcGePoint2d ptResult; if (nPos == 0) // 剖切编号文字始端位置 { ptResult.x = m_ptText1.x * GetPScale(); ptResult.y = m_ptText1.y * GetPScale(); } else if (nPos == 1) // 剖切编号文字末端位置 { ptResult.x = m_ptText2.x * GetPScale(); ptResult.y = m_ptText2.y * GetPScale(); } else if (nPos == 2) // 剖切图号文字始端位置 { ptResult.x = m_ptSIndex.x * GetPScale(); ptResult.y = m_ptSIndex.y * GetPScale(); } else if (nPos == 3) // 剖切图号文字末端位置 { ptResult.x = m_ptEIndex.x * GetPScale(); ptResult.y = m_ptEIndex.y * GetPScale(); } AcGeVector2d xAxis, yAxis; GetEcsAxisVector(xAxis, yAxis, nPos); // 获得ECS坐标轴方向 AcGeMatrix2d mat2d; mat2d = mat2d.alignCoordSys(AcGePoint2d(0, 0), AcGeVector2d(1, 0), AcGeVector2d(0, 1), ptOrigin, xAxis, yAxis); // 构造转换矩阵 ptResult.transformBy(mat2d); // ECS2WCS return ADSGePoint3d(ptResult.x, ptResult.y); } TCString AecXDbSymbSection::GetDrawingIndex() const // 剖面图号的文字内容 { return m_sDrawingIndex; } void AecXDbSymbSection::SetDrawingIndex(CString strDrawingIndex) { AssertWriteEnabled(); m_sDrawingIndex = strDrawingIndex; } AcDbObjectId AecXDbSymbSection::GetIndexStyleId() const { return m_idIndexStyle; } void AecXDbSymbSection::SetIndexStyleId(AcDbObjectId id) { AssertWriteEnabled(); m_idIndexStyle = id; } double AecXDbSymbSection::GetIndexHeight() const // 文字字高 { return m_dIndexHeight; } void AecXDbSymbSection::SetIndexHeight(double dHeight) // 设置剖面图号文字字高 { AssertWriteEnabled(); m_dIndexHeight = dHeight; } ADSGePoint3d AecXDbSymbSection::GetDefaultIndexLocation(int nPos) const { ADSGePoint3d ptView, ptRet; double dDistance(0.0), dDrawAngle(0.0), dText2BaseRatio = GetText2BaseRatios() * m_dIndexHeight * GetPScale(); if (GetDimDirection() == 1) // 沿剖视方向 { if (m_bViewLine) // 剖面剖切 { dDistance = g_DimOption::instance().g_dSectionSegDirLength * GetPScale(); if (nPos == 0) // 始端剖切图号位置点 { ads_polar(m_poly[0], m_nViewDir, g_DimOption::instance().g_dSectionSegDirLength * GetPScale(), ptView); dDrawAngle = ads_angle(m_poly[1], m_poly[0]); ads_polar(ptView, dDrawAngle, dText2BaseRatio, ptRet); } else // 终点剖切图号位置点 { ads_polar(*m_poly.Tail(), GetEndViewLineDir(), g_DimOption::instance().g_dSectionSegDirLength * GetPScale(), ptView); dDrawAngle = ads_angle(m_poly[m_poly.Length() - 2], m_poly[m_poly.Length() - 1]); ads_polar(ptView, dDrawAngle, dText2BaseRatio, ptRet); } } else // 断面剖切 { if (nPos == 0) // 始端剖切图号位置点 { ads_polar(m_poly[0], m_nViewDir, -dText2BaseRatio, ptRet); } else // 终点剖切图号位置点 { ads_polar(*m_poly.Tail(), m_nViewDir, -dText2BaseRatio, ptRet); } } } else // 沿剖切方向 { dDistance = g_DimOption::instance().g_dSectionSegLocLength * GetPScale(); if (nPos == 0) // 始端端剖切图号位置点 { double dSegLen = min(dDistance, m_poly[0].Distance2d(m_poly[1]) / 2); dDrawAngle = ads_angle(m_poly[0], m_poly[1]); ads_polar(m_poly[0], dDrawAngle, dSegLen, ptView); ads_polar(ptView, m_nViewDir, -dText2BaseRatio, ptRet); } else // 终点剖切图号位置点 { int nLength = m_poly.Length(); double dSegLen = min(dDistance, m_poly[nLength - 2].Distance2d(m_poly[nLength - 1]) / 2); dDrawAngle = ads_angle(m_poly[nLength - 2], m_poly[nLength - 1]); ads_polar(m_poly[nLength - 1], dDrawAngle, -dSegLen, ptView); ads_polar(ptView, GetEndViewLineDir(), -dText2BaseRatio, ptRet); } } return ptRet; } // 获得图号标注方向,0为剖切方向,1为剖视方向 int AecXDbSymbSection::GetDimDirection() const { int nDir = 0; // 默认是剖切方向 if (m_nFlag & SYMB_SECTION_DIM_DIR) { nDir = 0; } else { nDir = 1; // 剖视方向 } return nDir; } //设置图号标注方向, 0为剖切方向,1为剖视方向 void AecXDbSymbSection::SetDimDirection(int nDir) { AssertWriteEnabled(); if (nDir == 0) //剖切方向 { m_nFlag |= SYMB_SECTION_DIM_DIR; } else if (nDir == 1) //剖视方向 { m_nFlag &= ~SYMB_SECTION_DIM_DIR; } } //始端是否有文字 BOOL AecXDbSymbSection::GetIsHasIndexS() const { BOOL bHas = (m_nFlag & SYMB_SECTION_START_INDEX); return bHas; } // 设置始端是否有文字 void AecXDbSymbSection::SetIsHasIndexS(BOOL bHas) { AssertWriteEnabled(); if (bHas) { m_nFlag |= SYMB_SECTION_START_INDEX; } else { m_nFlag &= ~SYMB_SECTION_START_INDEX; } } // 终端是否有文字 BOOL AecXDbSymbSection::GetIsHasIndexE() const { BOOL bHas = (m_nFlag & SYMB_SECTION_END_INDEX); return bHas; } // 设置终端是否有文字 void AecXDbSymbSection::SetIsHasIndexE(BOOL bHas) { AssertWriteEnabled(); if (bHas) { m_nFlag |= SYMB_SECTION_END_INDEX; } else { m_nFlag &= ~SYMB_SECTION_END_INDEX; } } // 返回图号文字距基线系数 double AecXDbSymbSection::GetText2BaseRatios() const { double dText2BaseRatio = m_dText2BaseRatio; if (fabs(m_dText2BaseRatio + 1000) < 1.0E-2) { dText2BaseRatio = GlobalFunc::DocGetText2BaseRatio(); } return dText2BaseRatio; } // 设置图号文字距基线系数 void AecXDbSymbSection::SetText2BaseRatios(double dText2BaseRatio) { AssertWriteEnabled(); m_dText2BaseRatio = dText2BaseRatio; } ADSGePoint3d AecXDbSymbSection::GetIndexLocation(int nPos, BOOL bEcsPoint) const { ADSGePoint3d pt = (nPos == 0) ? m_ptSIndex : m_ptEIndex; // ECS点 if (!bEcsPoint) // WCS点 { pt = GetWcsTextPt(nPos + 2); } return pt; } void AecXDbSymbSection::SetIndexLocation(int nPos, ADSGePoint3d pt) { AssertWriteEnabled(); AcGePoint2d ptOrigin = GetEcsOriginPt(nPos + 2); // 获得ECS原点 AcGeVector2d xAxis, yAxis; GetEcsAxisVector(xAxis, yAxis, nPos + 2); // 获得ECS坐标轴方向 AcGeMatrix2d mat2d; mat2d = mat2d.alignCoordSys(ptOrigin, xAxis, yAxis, AcGePoint2d(0, 0), AcGeVector2d(1, 0), AcGeVector2d(0, 1)); AcGePoint2d ptResult(pt.x, pt.y); ptResult.transformBy(mat2d); // WCS2ECS if (nPos == 0) // 剖切图号始端位置点 { m_ptSIndex.x = ptResult.x / GetPScale(); m_ptSIndex.y = ptResult.y / GetPScale(); // 用图纸比例保存 } else if (nPos == 1) // 剖切图号末端位置点 { m_ptEIndex.x = ptResult.x / GetPScale(); m_ptEIndex.y = ptResult.y / GetPScale(); // 用图纸比例保存 } } // 是否为非正交(非垂直)的剖切符号 BOOL AecXDbSymbSection::GetNonPerpendicularitySection() const { assertReadEnabled(); BOOL bNoPerpendicularity = ((m_nFlag & SYMB_SECTION_VIEW_DIR2) != 0); return bNoPerpendicularity; } void AecXDbSymbSection::SetNonPerpendicularitySection(BOOL bYes) { AssertWriteEnabled(); if (bYes) { m_nFlag |= SYMB_SECTION_VIEW_DIR2; } else { m_nFlag &= ~SYMB_SECTION_VIEW_DIR2; } } double AecXDbSymbSection::GetViewDirection2() const { return m_nViewDir2; } void AecXDbSymbSection::SetViewDirection2(double vec) { AssertWriteEnabled(); m_nViewDir2 = vec; } double AecXDbSymbSection::GetEndViewLineDir() const { if (GetNonPerpendicularitySection()) // 不平行 return m_nViewDir2; return m_nViewDir; } AcGiDraw::TextAlignment AecXDbSymbSection::GetIndexTextAlignment(int nPos) const { double dTextRotation = GetIndexTextRotation(nPos); // 获得文字标注方向 double dLineDir(0), // 线的方向 dViewDir(0), dTempAngle1(0), dTempAngle2(0); AcGiDraw::TextAlignment nAlign; if (nPos == 0) // 起点 { dLineDir = Wcs2Layout(ads_angle(m_poly[0], m_poly[1])); dViewDir = Wcs2Layout(m_nViewDir); dTempAngle1 = GlobalFunc::AngleRangeTo2PI(dViewDir + PI); dTempAngle2 = GlobalFunc::AngleRangeTo2PI(dLineDir + PI / 2); if (GetDimDirection() == 1) // 剖视方向 { if (m_bViewLine) // 剖面剖切 { if (IsExactSameDrt(dTextRotation, dTempAngle1, g_DimOption::instance()._angSnap)) { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kTopLeft; else nAlign = AcGiDraw::kBottomLeft; } else { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kBottomRight; else nAlign = AcGiDraw::kTopRight; } } else // 断面剖切 { if (IsExactSameDrt(dTextRotation, dTempAngle1, g_DimOption::instance()._angSnap)) { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kBottomLeft; else nAlign = AcGiDraw::kTopLeft; } else { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kTopRight; else nAlign = AcGiDraw::kBottomRight; } } } else // 剖切方向 { if (IsExactSameDrt(dTextRotation, dLineDir, g_DimOption::instance()._angSnap)) { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kTopRight; else nAlign = AcGiDraw::kBottomRight; } else { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kBottomLeft; else nAlign = AcGiDraw::kTopLeft; } } } else // 终点 { dLineDir = Wcs2Layout(ads_angle(m_poly[m_poly.Length() - 2], m_poly[m_poly.Length() - 1])); dViewDir = Wcs2Layout(GetEndViewLineDir()); dTempAngle1 = GlobalFunc::AngleRangeTo2PI(dViewDir + PI); dTempAngle2 = GlobalFunc::AngleRangeTo2PI(dLineDir + PI / 2); if (GetDimDirection() == 1) // 剖视方向 { if (m_bViewLine) // 剖面剖切 { if (IsExactSameDrt(dTextRotation, dTempAngle1, g_DimOption::instance()._angSnap)) { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kBottomLeft; else nAlign = AcGiDraw::kTopLeft; } else { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kTopRight; else nAlign = AcGiDraw::kBottomRight; } } else // 断面剖切 { if (IsExactSameDrt(dTextRotation, dTempAngle1, g_DimOption::instance()._angSnap)) { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kTopLeft; else nAlign = AcGiDraw::kBottomLeft; } else { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kBottomRight; else nAlign = AcGiDraw::kTopRight; } } } else // 剖切方向 { if (IsExactSameDrt(dTextRotation, dLineDir, g_DimOption::instance()._angSnap)) { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kTopLeft; else nAlign = AcGiDraw::kBottomLeft; } else { if (fabs(dTempAngle2 - dViewDir) < 1.0E-5) nAlign = AcGiDraw::kBottomRight; else nAlign = AcGiDraw::kTopRight; } } } return nAlign; } double AecXDbSymbSection::GetIndexTextRotation(int nPos) const { double dTextRotation(0.0); if (nPos == 0) // 起点 { dTextRotation = ads_angle(m_poly[0], m_poly[1]); if (GetDimDirection() == 1) // 剖视方向 dTextRotation = m_nViewDir; } else // 终点 { dTextRotation = ads_angle(m_poly[m_poly.Length() - 2], m_poly[m_poly.Length() - 1]); if (GetDimDirection() == 1) // 剖视方向 dTextRotation = GetEndViewLineDir(); } dTextRotation = GlobalFunc::ChangeAngleTo1_4(Wcs2Layout(dTextRotation)); return dTextRotation; }