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

576 lines
12 KiB
C++

//-----------------------------------------------------------------------------+
// Copyright (C), 1998-2007, SH Software Co. Ltd.
// = FileName : XExplodeDraw 类
// = Version : ver2.0
// = Author : zjq
// = CreateDate : 2002-09-09
// = Description: XExplodeDraw 定义
// = Maintainers:
//
//-----------------------------------------------------------------------------+
#include "StdAfx.h"
#include "XExplodeStreamBase.h"
#include "acgiutil.h"
#include "XGlobalFunc.h"
#include "XGlobalCurveFunc.h"
XExplodeDraw::XExplodeDraw()
: m_vtNormal(0,0,1), m_align(kBottomLeft), m_nHeight(0.0), m_nRotation(0.0), m_nWidthFactor(1.0) , m_bInitStyle(FALSE)
{
m_nControlFlag = 0;
m_align = kMiddleCenter;
}
XExplodeDraw::~XExplodeDraw()
{
}
void XExplodeDraw::SetPropertiesFrom(const AcDbEntity *pEnt)
{
}
BOOL XExplodeDraw::IsFullExplode() const
{
return FALSE;
}
BOOL XExplodeDraw::IsExportTch4() const
{
return FALSE;
}
void XExplodeDraw::SetLocation(const XPoint &ptLoc)
{
m_ptLocation = ptLoc;
}
void XExplodeDraw::SetRotation(double nRot)
{
m_nRotation = nRot;
}
//设置图层和颜色(取图层)
void XExplodeDraw::SetColorLayer(Adesk::UInt16 iObjColor, const AcDbObjectId &id)
{
if (id.isValid())
{
SetLayer(id);
SetColor(iObjColor);
}
}
void XExplodeDraw::BackUpProperties(XMasterProperties &prop)
{
prop.m_nColor = GetColor();
prop.m_idLayer = GetLayerId();
prop.m_idLineType = GetLineTypeId();
prop.m_idMaterial = GetMaterialId();
}
void XExplodeDraw::RestoreProperties(XMasterProperties prop)
{
SetLayer(prop.m_idLayer);
SetLineType(prop.m_idLineType);
SetColor(prop.m_nColor);
SetMaterial(prop.m_idMaterial);
}
XExplodeDraw::TextAlignment
XExplodeDraw::GetTextAlignment(AcDb::TextHorzMode nHMode, AcDb::TextVertMode nVMode)
{
XExplodeDraw::TextAlignment nAlign;
// 上
if (nHMode == AcDb::kTextLeft && nVMode == AcDb::kTextTop)
{
nAlign = XExplodeDraw::kTopLeft;
}
else if (nHMode == AcDb::kTextCenter && nVMode == AcDb::kTextTop)
{
nAlign = XExplodeDraw::kTopCenter;
}
else if (nHMode == AcDb::kTextRight && nVMode == AcDb::kTextTop)
{
nAlign = XExplodeDraw::kTopRight;
}
// 中
else if (nHMode == AcDb::kTextLeft && nVMode == AcDb::kTextVertMid)
{
nAlign = XExplodeDraw::kMiddleLeft;
}
else if (nHMode == AcDb::kTextCenter && nVMode == AcDb::kTextVertMid)
{
nAlign = XExplodeDraw::kMiddleCenter;
}
else if (nHMode == AcDb::kTextRight && nVMode == AcDb::kTextVertMid)
{
nAlign = XExplodeDraw::kMiddleRight;
}
// 下
else if (nHMode == AcDb::kTextLeft && nVMode == AcDb::kTextBottom)
{
nAlign = XExplodeDraw::kBottomLeft;
}
else if (nHMode == AcDb::kTextCenter && nVMode == AcDb::kTextBottom)
{
nAlign = XExplodeDraw::kBottomCenter;
}
else if (nHMode == AcDb::kTextRight && nVMode == AcDb::kTextBottom)
{
nAlign = XExplodeDraw::kBottomRight;
}
// 基线
else if (nHMode == AcDb::kTextLeft && nVMode == AcDb::kTextBase)
{
nAlign = XExplodeDraw::kLeft;
}
else if (nHMode == AcDb::kTextCenter && nVMode == AcDb::kTextBase)
{
nAlign = XExplodeDraw::kCenter;
}
else if (nHMode == AcDb::kTextRight && nVMode == AcDb::kTextBase)
{
nAlign = XExplodeDraw::kRight;
}
else if (nHMode == AcDb::kTextMid)
{
nAlign = XExplodeDraw::kMiddle;
}
else //kTextAlign, kTextFit
{
nAlign = XExplodeDraw::kUnknown;
}
return nAlign;
}
Adesk::UInt16
XExplodeDraw::GetTextAlignment(XExplodeDraw::TextAlignment align)
{
// 对齐方式需要进行换算
AcDb::TextHorzMode nHMode;
AcDb::TextVertMode nVMode;
switch(align)
{
case kTopLeft:
nHMode = AcDb::kTextLeft;
nVMode = AcDb::kTextTop;
break;
case kTopCenter:
nHMode = AcDb::kTextCenter;
nVMode = AcDb::kTextTop;
break;
case kTopRight:
nHMode = AcDb::kTextRight;
nVMode = AcDb::kTextTop;
break;
case kMiddleLeft:
nHMode = AcDb::kTextLeft;
nVMode = AcDb::kTextVertMid;
break;
case kMiddleCenter:
nHMode = AcDb::kTextCenter;
nVMode = AcDb::kTextVertMid;
break;
case kMiddleRight:
nHMode = AcDb::kTextRight;
nVMode = AcDb::kTextVertMid;
break;
case kBottomLeft:
nHMode = AcDb::kTextLeft;
nVMode = AcDb::kTextBottom;
break;
case kBottomCenter:
nHMode = AcDb::kTextCenter;
nVMode = AcDb::kTextBottom;
break;
case kBottomRight:
nHMode = AcDb::kTextRight;
nVMode = AcDb::kTextBottom;
break;
case kLeft:
nHMode = AcDb::kTextLeft;
nVMode = AcDb::kTextBase;
break;
case kCenter:
nHMode = AcDb::kTextCenter;
nVMode = AcDb::kTextBase;
break;
case kRight:
nHMode = AcDb::kTextRight;
nVMode = AcDb::kTextBase;
case kMiddle:
nHMode = AcDb::kTextMid;
nVMode = (AcDb::TextVertMode)0;
break;
default:
nHMode = (AcDb::TextHorzMode)0;
nVMode = (AcDb::TextVertMode)0;
break;
}
Adesk::UInt16 nRet = nVMode;
nRet = (nRet << 8);
nRet += nHMode;
return nRet;
}
XPoint
XExplodeDraw::Align2Base(XExplodeDraw::TextAlignment nAlign,
XPoint ptAlign, XPoint ext)
{
XPoint ptBase = ptAlign;
// 换算基点
switch(nAlign)
{
case XExplodeDraw::kTopLeft:
ptBase.y -= ext.y;
break;
case XExplodeDraw::kTopCenter:
ptBase.y -= ext.y;
ptBase.x -= ext.x / 2.0;
break;
case XExplodeDraw::kTopRight:
ptBase.y -= ext.y;
ptBase.x -= ext.x;
break;
case XExplodeDraw::kMiddleLeft:
ptBase.y -= ext.y / 2.0;
break;
case XExplodeDraw::kMiddleCenter:
ptBase.y -= ext.y / 2.0;
ptBase.x -= ext.x / 2.0;
break;
case XExplodeDraw::kMiddleRight:
ptBase.y -= ext.y / 2.0;
ptBase.x -= ext.x;
break;
case XExplodeDraw::kBottomLeft:
ptBase.y += (ext.z - ext.y);
break;
case XExplodeDraw::kBottomCenter:
ptBase.y += (ext.z - ext.y);
ptBase.x -= ext.x / 2.0;
break;
case XExplodeDraw::kBottomRight:
ptBase.y += (ext.z - ext.y);
ptBase.x -= ext.x;
break;
case XExplodeDraw::kLeft:
break;
case XExplodeDraw::kCenter:
ptBase.x -= ext.x / 2.0;
break;
case XExplodeDraw::kRight:
ptBase.x -= ext.x;
break;
case XExplodeDraw::kMiddle:
ptBase.x -= ext.x / 2;
ptBase.y -= ext.z / 2.0;
ptBase.y += (ext.z - ext.y);
break;
default:
ASSERT(0);
}
return ptBase;
}
XPoint XExplodeDraw::Base2Align(XExplodeDraw::TextAlignment nAlign,
XPoint ptBase, XPoint ext)
{
XPoint ptAlign = ptBase;
// 换算基点
switch(nAlign)
{
case XExplodeDraw::kTopLeft:
ptAlign.y += ext.y;
break;
case XExplodeDraw::kTopCenter:
ptAlign.y += ext.y;
ptAlign.x += ext.x / 2.0;
break;
case XExplodeDraw::kTopRight:
ptAlign.y += ext.y;
ptAlign.x += ext.x;
break;
case XExplodeDraw::kMiddleLeft:
ptAlign.y += ext.y / 2.0;
break;
case XExplodeDraw::kMiddleCenter:
ptAlign.y += ext.y / 2.0;
ptAlign.x += ext.x / 2.0;
break;
case XExplodeDraw::kMiddleRight:
ptAlign.y += ext.y / 2.0;
ptAlign.x += ext.x;
break;
case XExplodeDraw::kBottomLeft:
ptAlign.y -= (ext.z - ext.y);
break;
case XExplodeDraw::kBottomCenter:
ptAlign.y -= (ext.z - ext.y);
ptAlign.x += ext.x / 2.0;
break;
case XExplodeDraw::kBottomRight:
ptAlign.y -= (ext.z - ext.y);
ptAlign.x += ext.x;
break;
case XExplodeDraw::kLeft:
break;
case XExplodeDraw::kCenter:
ptAlign.x += ext.x / 2.0;
break;
case XExplodeDraw::kRight:
ptAlign.x += ext.x;
break;
case XExplodeDraw::kMiddle:
ptAlign.x += ext.x / 2;
ptAlign.y -= (ext.z - ext.y);
ptAlign.y += ext.z / 2.0;
break;
default:
ASSERT(0);
break;
}
return ptAlign;
}
void XExplodeDraw::LoadAcGiStyle()
{
Acad::ErrorStatus es = fromAcDbTextStyle(m_textStyle, m_idTextStyle);
if (es != Acad::eOk)
{
m_bInitStyle = FALSE;
return;
}
else
{
m_bInitStyle = TRUE;
}
int nRetFlag = m_textStyle.loadStyleRec();
}
void XExplodeDraw::SetStyle(const TCHAR * szStyle)
{
m_idTextStyle = GetTextStyleId(szStyle);
LoadAcGiStyle();
}
void XExplodeDraw::SetStyle(AcDbObjectId id)
{
m_idTextStyle = id;
LoadAcGiStyle();
}
void XExplodeDraw::Polyline(AcDbPolyline &pline)
{
XPoly2D poly;
PolyConvert(pline, poly);
*this<<poly;
}
void XExplodeDraw::DrawCurve(const XCurveSegment &cv, double nThickness)
{
if (cv.Is(CURVE_LINE))
{
DrawLine(cv.GetLine(), nThickness);
}
else if (cv.Is(CURVE_ARC))
{
DrawArc(cv.GetArc(), nThickness);
}
else if (cv.Is(CURVE_CIRCLE))
{
XCircle cir = cv.GetCircle();
DrawCircle(cir, nThickness);
}
}
void XExplodeDraw::DrawCurveList(const DList<XCurveSegment> &lstCurves, double nThickness)
{
for (int i = 0; i < lstCurves.Length(); i++)
{
DrawCurve(lstCurves[i], nThickness);
}
}
void XExplodeDraw::DrawShell(const XPoly2D &polyRegion)
{
DrawShell(polyRegion, DList<XPoly2D>());
}
void XExplodeDraw::DrawColumn(const XPoly2D &polyRegion1, const XPoly2D &polyRegion2)
{
DrawMesh(polyRegion1, polyRegion2);
DrawShell(polyRegion1);
DrawShell(polyRegion2);
}
void XExplodeDraw::SetAlignment(TextAlignment align)
{
m_align = align;
}
void XExplodeDraw::SetHeight(double nHeight)
{
m_nHeight = nHeight;
}
void XExplodeDraw::SetWidthFactor(double nWidthFactor)
{
m_nControlFlag |= EDF_XSCALE;
m_nWidthFactor = nWidthFactor;
}
// 仅炸开使用
void XExplodeDraw::SetAutoProp(BOOL bTrue)
{
if (bTrue)
{
m_nControlFlag &= ~EDF_NO_AUTOPROP;
}
else
{
m_nControlFlag |= EDF_NO_AUTOPROP;
}
}
BOOL XExplodeDraw::IsAutoProp() const
{
BOOL bTrue = TRUE;
if (m_nControlFlag & EDF_NO_AUTOPROP)
{
bTrue = FALSE;
}
return bTrue;
}
void XExplodeDraw::SetSelectionMarker(int nMark)
{
}
BOOL XExplodeDraw::IsPlotGeneration() const
{
return FALSE;
}
void XExplodeDraw::DrawEntity(const AcDbEntity &ent)
{
}
void XExplodeDraw::DrawBody(const XPoly2D &polyOut, const DList<XPoly2D> &lstHoles,const XVector3D &vtOffset)
{
}
Adesk::UInt16 XExplodeDraw::GetColor() const
{
return 0;
}
void XExplodeDraw::SetColor(Adesk::UInt16 nColor)
{
}
//add by zjq on 100629 TArch8.5
//COLORREF XExplodeDraw::GetTrueColor() const
AcCmColor XExplodeDraw::GetTrueColor() const
{
AcCmColor cmColor;
return cmColor;
}
//void XExplodeDraw::SetTrueColor(COLORREF crRef)
void XExplodeDraw::SetTrueColor(AcCmColor crRef)
{
}
//显示类起作用,分解类不起作用
void XExplodeDraw::SetColor1(Adesk::UInt16 nColor)
{
}
AcDbObjectId XExplodeDraw::GetLayerId() const
{
return AcDbObjectId::kNull;
}
AcDbObjectId XExplodeDraw::GetLineTypeId() const
{
return AcDbObjectId::kNull;
}
AcDbObjectId XExplodeDraw::GetMaterialId() const
{
return AcDbObjectId::kNull;
}
Acad::ErrorStatus XExplodeDraw::SetLayer(const AcDbObjectId &id)
{
return Acad::eOk;
}
Acad::ErrorStatus XExplodeDraw::SetLayer(const TCHAR *pszLay)
{
return Acad::eOk;
}
Acad::ErrorStatus XExplodeDraw::SetLineType(const TCHAR *pltype)
{
return Acad::eOk;
}
Acad::ErrorStatus XExplodeDraw::SetLineType(AcDbObjectId idLinetype)
{
return Acad::eOk;
}
Acad::ErrorStatus XExplodeDraw::SetMaterial(AcDbObjectId idMaterial)
{
return Acad::eOk;
}
void XExplodeDraw::DrawXCurve(const XCurveSegment&curve,double nThick)
{
DrawCurve(curve,nThick);
}
void XExplodeDraw::DrawX3DFace(const X3DFace&face)
{
DrawFace(face);
}
void XExplodeDraw::DrawTextFit(const TCHAR *pszText, XPoint pt1, XPoint pt2, double nTextHeight)
{
}
void XExplodeDraw::DrawAtomicEntSet(const AcDbVoidPtrArray &entSet, const AcGeMatrix3d &matTrans)
{
}
Adesk::Boolean XExplodeDraw::IsDragging() const
{
return Adesk::kFalse;
}