Files
envi-code/SourceCode/Code2026/Dimension/AecDbSymbSection.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

1916 lines
47 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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)<g_Option::instance()._DIST_SNAP);
// BOOL bAtDefault2=(m_ptText2.Distance2d(ptDef2)<g_Option::instance()._DIST_SNAP);
// BOOL bMoveText1 = FALSE;
// BOOL bMoveText2 = FALSE;
BOOL bMT1 = FALSE;
BOOL bMT2 = FALSE;
ADSGePoint3d offsetSViewLine(offset),
offsetEViewLine(offset);
int nSeg = m_poly.TotalSegments();
for (int i = 0; i < indices.length(); i++)
{
int idx = indices[i];
if (idx == 0) // GetTextLocation(0)
{
//if (!bMT1)
//{
// modify by lgy 20120322,移动夹点时需要将移动的夹点从ecs坐标系转换成为wcs坐标系
// m_ptText1 +=offset;
// bMoveText1 = TRUE;
ADSGePoint3d ptTemp = GetTextLocation(0),
ptOther = GetTextLocation(1),
ptSIndex = GetIndexLocation(0),
ptEIndex = GetIndexLocation(1);
ptTemp += offsetSViewLine;
GeCurveSegment segFirst;
m_poly.Nth(0, segFirst);
GeCurveSegment segLast;
m_poly.Nth(m_poly.TotalSegments() - 1, segLast);
ADSGePoint3d ptView;
ads_polar(segFirst.StartPoint(), m_nViewDir, 100.0, ptView);
if (segFirst.OnWhichSide(ptView) != segFirst.OnWhichSide(ptTemp)) // 反向
{
m_nViewDir = GlobalFunc::AngleRangeTo2PI(m_nViewDir + PI);
if (GetNonPerpendicularitySection()) // 不平行
m_nViewDir2 = GlobalFunc::AngleRangeTo2PI(m_nViewDir2 + PI);
// 将另外的点都进行镜像操作
{
ADSGePoint3d ptMid, ptMirror;
segLast.ProjectToMe(ptOther, ptMid);
ptMid.Mirror(ptOther, ptMirror);
SetTextLocation(1, ptMirror);
segFirst.ProjectToMe(ptSIndex, ptMid);
ptMid.Mirror(ptSIndex, ptMirror);
SetIndexLocation(0, ptMirror);
segLast.ProjectToMe(ptEIndex, ptMid);
ptMid.Mirror(ptEIndex, ptMirror);
SetIndexLocation(1, ptMirror);
}
}
SetTextLocation(0, ptTemp);
//bMT1 = TRUE;
//}
}
else if (idx == 1) // GetTextLocation(1)
{
//if (!bMT2)
//{
// modify by lgy 20120322,移动夹点时需要将移动的夹点从ecs坐标系转换成为wcs坐标系
// m_ptText2 +=offset;
// bMoveText2 = TRUE;
ADSGePoint3d ptTemp = GetTextLocation(1),
ptOther = GetTextLocation(0),
ptSIndex = GetIndexLocation(0),
ptEIndex = GetIndexLocation(1);
ptTemp += offsetEViewLine;
GeCurveSegment segFirst;
m_poly.Nth(0, segFirst);
GeCurveSegment segLast;
m_poly.Nth(m_poly.TotalSegments() - 1, segLast);
ADSGePoint3d ptView;
ads_polar(segLast.EndPoint(), GetEndViewLineDir(), 100.0, ptView);
if (segLast.OnWhichSide(ptView) != segLast.OnWhichSide(ptTemp)) // 反向
{
m_nViewDir = GlobalFunc::AngleRangeTo2PI(m_nViewDir + PI);
if (GetNonPerpendicularitySection()) // 不平行
m_nViewDir2 = GlobalFunc::AngleRangeTo2PI(m_nViewDir2 + PI);
// 将另外一个点镜像
{
ADSGePoint3d ptMid, ptMirror;
segFirst.ProjectToMe(ptOther, ptMid);
ptMid.Mirror(ptOther, ptMirror);
SetTextLocation(0, ptMirror);
segFirst.ProjectToMe(ptSIndex, ptMid);
ptMid.Mirror(ptSIndex, ptMirror);
SetIndexLocation(0, ptMirror);
segLast.ProjectToMe(ptEIndex, ptMid);
ptMid.Mirror(ptEIndex, ptMirror);
SetIndexLocation(1, ptMirror);
}
}
SetTextLocation(1, ptTemp);
// bMT2 = TRUE;
//}
}
else if (idx == 2) // *m_poly.Head()
{
GeLine ln;
GeArc arc;
m_poly.Nth(0, ln, arc);
Vector3D vt = ln.StartPoint() - ln.EndPoint();
((AcGeVector3d &)vt).normalize();
double nInc = (offset & vt);
ads_polar(ADSGePoint3d(ln.StartPoint()), ln.Direction() - PI, nInc, *m_poly.Head());
vt.Scale(nInc);
if (!bMT1)
{
// delete by lgy 20120322,该点已经保存为ECS坐标,故不需要再转换偏移
// m_ptText1 += vt;
bMT1 = TRUE;
Vector3D vtViewLine = Vector3D(cos(m_nViewDir), sin(m_nViewDir));
((AcGeVector3d &)vtViewLine).normalize();
nInc = (offset & vtViewLine);
vtViewLine.Scale(nInc);
offsetSViewLine = ADSGePoint3d(vtViewLine.x, vtViewLine.y, vtViewLine.z);
}
}
else if (idx == 3) // *m_poly.Tail()
{
GeLine ln;
GeArc arc;
m_poly.Nth(nSeg - 1, ln, arc);
Vector3D vt = ln.EndPoint() - ln.StartPoint();
((AcGeVector3d &)vt).normalize();
double nInc = (offset & vt);
ads_polar(ADSGePoint3d(ln.EndPoint()), ln.Direction(), nInc, *m_poly.Tail());
vt.Scale(nInc);
if (!bMT2)
{
// delete by lgy 20120322,该点已经保存为ECS坐标,故不需要再转换偏移
// m_ptText2 += vt;
bMT2 = TRUE;
Vector3D vtViewLine = Vector3D(cos(GetEndViewLineDir()), sin(GetEndViewLineDir()));
((AcGeVector3d &)vtViewLine).normalize();
nInc = (offset & vtViewLine);
vtViewLine.Scale(nInc);
offsetEViewLine = ADSGePoint3d(vtViewLine.x, vtViewLine.y, vtViewLine.z);
}
}
else
{
// add by lgy 201203,为剖面剖切添加了两个剖面图号夹点
if (idx == 4)
{
if (GetIsHasIndexS()) // GetIndexLocation(0)
{
ADSGePoint3d pt = GetIndexLocation(0);
pt += offset;
SetIndexLocation(0, pt);
continue;
}
else if (GetIsHasIndexE()) // GetIndexLocation(1)
{
ADSGePoint3d pt = GetIndexLocation(1);
pt += offset;
SetIndexLocation(1, pt);
continue;
}
}
else if (idx == 5)
{
if (GetIsHasIndexS() && GetIsHasIndexE()) // GetIndexLocation(1)
{
ADSGePoint3d pt = GetIndexLocation(1);
pt += offset;
SetIndexLocation(1, pt);
continue;
}
}
if (GetIsHasIndexS())
{
idx--;
}
if (GetIsHasIndexE())
{
idx--;
}
// Move Edge
int nEdgeIndex = idx - 4;
int nTotalEdge = m_poly.TotalSegments();
GeLine ln;
GeArc arc;
m_poly.Nth(nEdgeIndex, ln, arc);
ln.StartPoint() += offset;
ln.EndPoint() += offset;
ln.SetLineFlag(LS_INFINITE);
GeDirectionCurve prevSeg,
nextSeg;
int nPrev = nEdgeIndex - 1,
nNext = nEdgeIndex + 1;
ADSGePoint3d ptStart,
ptEnd;
BOOL bUpdateIt = TRUE;
if (nPrev >= 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<int> 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<ObjInfoUnit> &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;
}