Files
envi-code/SourceCode/Code2026/tg_shs/shs_kernal/dbPromptMark.cpp
T

708 lines
18 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#include "stdafx.h"
ACRX_DXF_DEFINE_MEMBERS(ATSPromptMark, ATSEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
1, ATS_PROMPTMARK, "ATS_PROMPTMARK图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com");
IMPLEMENT_TENTBASE(TDbPromptMark);
// ver: 1-TArch5;2-TArch6;3-TArch7
const Adesk::UInt8 TDbPromptMark::g_nVersion = 3;
TDbPromptMark::TDbPromptMark(const XPoint &pt1, const XPoint &pt2, const TCHAR *pszMsg)
: m_nControlFlag(0), m_shape(kRectCrossing), m_nRotation(0.0)
{
XRectAngle rec(pt1, pt2);
m_xSize=rec.Width();
m_ySize=rec.Height();
rec.Center(m_ptLocation);
if(pszMsg) m_sPrompt=pszMsg;
}
TDbPromptMark::TDbPromptMark()
:m_nControlFlag(0), m_shape(kRectCrossing),
m_nRotation(0.0),m_xSize(0.0),m_ySize(0.0)
{
m_colorText=7;
}
TDbPromptMark::~TDbPromptMark()
{
}
Acad::ErrorStatus
TDbPromptMark::subGetClassID(CLSID* pClsid) const
{
return Acad::eOk;
//return TDbEntity::getClassID(pClsid);
}
// 提供对格式刷的支持
void TDbPromptMark::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag)
{
assertWriteEnabled();
TDbEntity::CopyPropertiesFrom(pSrcEntity, gMatchFlag);
TDbPromptMark *pSrc=TDbPromptMark::cast(pSrcEntity);
if(pSrc) {
m_nControlFlag=pSrc->m_nControlFlag;
m_shape=pSrc->m_shape;
if(database()==NULL||
pSrcEntity->database()==NULL||
database()==pSrcEntity->database())//add by whl on 060317
{
m_idTextStyle=pSrc->m_idTextStyle;
}
m_colorText=pSrc->m_colorText;
}
}
//////////////////////////////////////////////////////////////
// 从DWG读入数据:
Acad::ErrorStatus TDbPromptMark::dwgInFields (AcDbDwgFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es = TDbEntity::dwgInFields(pFiler);
if(es != Acad::eOk) return es;
Adesk::UInt8 nVer;
pFiler->readItem(&nVer);
if(nVer>g_nVersion) {// Version is too new
return Acad::eMakeMeProxy;
}
if(nVer==1) {
AcGePoint3d lowLeft, upRight;
pFiler->readItem(&(AcGePoint3d &)lowLeft);
pFiler->readItem(&(AcGePoint3d &)upRight);
ReadString(pFiler, m_sPrompt);
Midpoint(lowLeft, upRight, m_ptLocation);
m_ptLocation.z=0;
m_idTextStyle = GetTextStyleId(_T("STANDARD"), database());
m_xSize = upRight[0]-lowLeft[0];
m_ySize = upRight[1]-lowLeft[1];
m_nRotation = 0.0;
} else { // TArch6
pFiler->readItem(&m_nControlFlag);
Adesk::UInt8 tmp;
pFiler->readItem(&tmp);
m_shape = (ShapeFlag)tmp;
ReadString(pFiler, m_sPrompt);
pFiler->readItem(&m_idTextStyle);
pFiler->readItem((AcGePoint2d *)&m_ptLocation);
pFiler->readItem(&m_xSize);
pFiler->readItem(&m_ySize);
pFiler->readItem(&m_nRotation);
}
if(nVer>2)
pFiler->readItem(&m_colorText);
return pFiler->filerStatus();
}
// 写出数据到dwg:
Acad::ErrorStatus TDbPromptMark::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es = TDbEntity::dwgOutFields(pFiler);
if(es != Acad::eOk) return es;
if(g_nSaveTArchVer==5) {
pFiler->writeItem((Adesk::UInt8)1);
XRectAngle rect(m_ptLocation, m_xSize, m_ySize);
XPoint ptLow=rect.GetLowLeft();
XPoint ptUp=rect.GetUpRight();
pFiler->writeItem((AcGePoint3d &)ptLow);
pFiler->writeItem((AcGePoint3d &)ptUp);
pFiler->writeString((const TCHAR *)m_sPrompt);
} else if(g_nSaveTArchVer==6) {
pFiler->writeItem((Adesk::UInt8)2);
pFiler->writeItem(m_nControlFlag);
pFiler->writeItem((Adesk::UInt8)m_shape);
pFiler->writeString((const TCHAR *)m_sPrompt);
pFiler->writeItem(m_idTextStyle);
pFiler->writeItem((const AcGePoint2d &)m_ptLocation);
pFiler->writeItem(m_xSize);
pFiler->writeItem(m_ySize);
pFiler->writeItem(m_nRotation);
}else{
pFiler->writeItem(g_nVersion);
pFiler->writeItem(m_nControlFlag);
pFiler->writeItem((Adesk::UInt8)m_shape);
pFiler->writeString((const TCHAR *)m_sPrompt);
pFiler->writeItem(m_idTextStyle);
pFiler->writeItem((const AcGePoint2d &)m_ptLocation);
pFiler->writeItem(m_xSize);
pFiler->writeItem(m_ySize);
pFiler->writeItem(m_nRotation);
pFiler->writeItem(m_colorText);
}
return es;
}
Acad::ErrorStatus TDbPromptMark::dxfInFields (AcDbDxfFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es = TDbEntity::dxfInFields(pFiler);
if(!es)
return es;
if (!pFiler->atSubclassData(_T("TDbPromptMark"))) {
return Acad::eBadDxfSequence;
}
TDbPromptMark bakClone;
CopyObject(*this, bakClone);
int fieldsFlags=0;
resbuf rb;
while ((es == Acad::eOk)
&& ((es = pFiler->readResBuf(&rb)) == Acad::eOk)) {
switch (rb.restype) {
case 10:
m_ptLocation=rb.resval.rpoint;
fieldsFlags |= 0x01;
break;
case 1:
m_sPrompt=rb.resval.rstring;
free(rb.resval.rstring);
break;
case 7:
{
XString sName;
sName=rb.resval.rstring;
free(rb.resval.rstring);
m_idTextStyle=TchExport::GetTextStyleId(sName, database());
}
break;
case 40:
m_xSize=rb.resval.rreal;
break;
case 41:
m_ySize=rb.resval.rreal;
break;
case 50:
m_nRotation=rb.resval.rreal;
break;
case 70:
m_shape=(ShapeFlag)rb.resval.rint;
break;
case 90:
m_nControlFlag=rb.resval.rlong;
break;
default:
// An unrecognized group. Push it back so that
// the subclass can read it again.
pFiler->pushBackItem();
es = Acad::eEndOfFile;
break;
}
}
if (es != Acad::eEndOfFile) {
CopyObject(bakClone, *this);
return Acad::eInvalidResBuf;
}
if(!(fieldsFlags&0x01)) {
pFiler->setError(Acad::eMissingDxfField,_T("\nMissing DXF group code: 10"));
CopyObject(bakClone, *this);
return Acad::eMissingDxfField;
}
if(!m_idTextStyle) {
XString style;
if(database())
m_idTextStyle=database()->textstyle();
else {
xg_getvar(_T("TEXTSTYLE"), style);
m_idTextStyle = TchExport::GetTextStyleId(style, database());
}
}
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbPromptMark::dxfOutFields(AcDbDxfFiler* pFiler) const
{
Acad::ErrorStatus es;
es = TDbEntity::dxfOutFields(pFiler);
assert(es == Acad::eOk);
es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbPromptMark"));
assert(es == Acad::eOk);
pFiler->writePoint3d(10, m_ptLocation);
pFiler->writeString(1, m_sPrompt);
pFiler->writeString(7, (const TCHAR *)GetSymbolName(m_idTextStyle));
pFiler->writeDouble(40, m_xSize);
pFiler->writeDouble(41, m_ySize);
pFiler->writeDouble(50, m_nRotation);
pFiler->writeInt16(70, (Adesk::Int16)m_shape);
pFiler->writeInt32(90, (Adesk::Int32)m_nControlFlag);
return es;
}
// -----------------------------------------------------------------------
// Overriden functions for edit
// to do:
// 定义了6个夹点:
// 中心点: 用来移动
// 四个角点: 用来改尺寸
// 边点: 用来改角度
Acad::ErrorStatus TDbPromptMark::subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const
{
gripPoints.append(m_ptLocation);
return Acad::eOk;
}
Acad::ErrorStatus TDbPromptMark::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const
{
stretchPoints.append(m_ptLocation);
return Acad::eOk;
}
// 取得夹点说明
Acad::ErrorStatus TDbPromptMark::GetGripText(int i, CString &cs) const
{
Acad::ErrorStatus es=Acad::eOk;
switch(i) {
case 0:
cs=(const TCHAR *)m_sPrompt;
break;
default:
es=Acad::eInvalidInput;
}
return es;
}
// Active when being rotated, scaled, moved, etc.
Acad::ErrorStatus TDbPromptMark::subTransformBy(const AcGeMatrix3d& xform)
{
assertWriteEnabled();
TDbEntity::subTransformBy(xform);
((AcGePoint3d &)m_ptLocation).transformBy(xform);
m_ptLocation.z=0;
if(!g_bLayoutRotate) {
AcGeVector3d vt(cos(m_nRotation), sin(m_nRotation), 0.0);
vt.transformBy(xform);
m_nRotation = ads_angle(XPoint(), XPoint(vt[0], vt[1]));
m_xSize *= xform(0,0);
m_ySize *= xform(1,1);
}
return Acad::eOk;
}
// 功能: 夹点操作
// bug: 当图块含属性时,系统崩溃
Acad::ErrorStatus TDbPromptMark::subMoveGripPointsAt(
const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
assertWriteEnabled();
XPoint vtOffset=*(XPoint *)&offset;
vtOffset.z=0;
int idx=0;
for (int i = 0; i < indices.length(); i++) {
idx = indices[i];
switch(idx) {
case 0: // Move Center
m_ptLocation += vtOffset;
break; // stretch begin point
default:
break;
}
}
return Acad::eOk;
}
Acad::ErrorStatus TDbPromptMark::subMoveStretchPointsAt(
const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
assertWriteEnabled();
return subMoveGripPointsAt(indices, offset);
}
/////////////////////////////////////////
// 显示
Acad::ErrorStatus TDbPromptMark::ExplodeOrDraw2d(XExplodeDraw &dc) const
{
TPushProperty vProp(this, dc);
ads_matrix mat;
m_ptLocation.GetRotationMatrix(Layout2Wcs(m_nRotation), mat);
switch(m_shape) {
case kRectCrossing: {
//AcDbPolyline pline;
//GetPolyline(pline);
//pline.setPropertiesFrom(this);
//dc.DrawEntity(pline);
XPoly2D poly2d(1);
XRectAngle box(m_ptLocation, m_xSize, m_ySize);
box.AsPoly2D(poly2d);
poly2d.TransUCS(mat);
//PolyConvert(poly2d, pline);
XLine ln1(box.GetLowLeft(), box.GetUpRight());
XLine ln2(box.GetUpLeft(), box.GetLowRight());
ln1.TransformBy(mat);
ln2.TransformBy(mat);
dc << poly2d << ln1 << ln2;
}
break;
case kCircle: {
XCircle cir(m_ptLocation, m_xSize/2);
XCurveSegment seg;
seg = cir;
dc << seg;
}
break;
case kRect: {
XRectAngle box(m_ptLocation, m_xSize, m_ySize);
XPoly2D poly2d(1);
box.AsPoly2D(poly2d);
poly2d.TransUCS(mat);
dc << poly2d;
}
break;
case kTriangle: {
XPoint ptTop, ptLeft, ptRight;
ads_polar(m_ptLocation, PI/2, m_xSize/2, ptTop);
ads_polar(m_ptLocation, -PI/6, m_xSize/2, ptRight);
ads_polar(m_ptLocation, PI+PI/6, m_xSize/2, ptLeft);
XPoly2D poly2d(1);
poly2d.AppendNode(ptLeft); poly2d.AppendNode(ptRight); poly2d.AppendNode(ptTop);
poly2d.TransUCS(mat);
dc << poly2d;
}
break;
case kCrossing:
case kItericCrossing: {
XPoint ptLeft, ptRight, ptTop, ptBot;
double nRotInc=0.0;
if(m_shape==kItericCrossing)
nRotInc=PI/4;
ads_polar(m_ptLocation, PI+nRotInc, m_xSize/2, ptLeft);
ads_polar(m_ptLocation, 0.0+nRotInc, m_xSize/2, ptRight);
ads_polar(m_ptLocation, PI/2+nRotInc, m_xSize/2, ptTop);
ads_polar(m_ptLocation, PI*1.5+nRotInc, m_xSize/2, ptBot);
XLine ln1(ptLeft, ptRight), ln2(ptBot, ptTop);
ln1.TransformBy(mat); ln2.TransformBy(mat);
dc << ln1 << ln2;
}
break;
case kCircleCrossing:
case kCircleICrossing: {
XCircle cir(m_ptLocation, m_xSize/2);
XCurveSegment seg;
seg = cir;
dc << seg;
XPoint ptLeft, ptRight, ptTop, ptBot;
double nRotInc=0.0;
if(m_shape==kCircleICrossing)
nRotInc=PI/4;
ads_polar(m_ptLocation, PI+nRotInc, m_xSize/2, ptLeft);
ads_polar(m_ptLocation, 0.0+nRotInc, m_xSize/2, ptRight);
ads_polar(m_ptLocation, PI/2+nRotInc, m_xSize/2, ptTop);
ads_polar(m_ptLocation, PI*1.5+nRotInc, m_xSize/2, ptBot);
XLine ln1(ptLeft, ptRight), ln2(ptBot, ptTop);
ln1.TransformBy(mat); ln2.TransformBy(mat);
dc << ln1 << ln2;
}
break;
}
if(GetDrawText() && !!m_idTextStyle && (!!m_sPrompt||g_bExplodeSubText)) {
TDbPromptMark *pClone=(TDbPromptMark *)clone();
pClone->SetDrawText(FALSE);
pClone->SetRotation(0.0);
pClone->SetLayoutRotation(0.0);
XPoint ptLow, ptUp;
pClone->GetExtents2d(ptLow, ptUp);
delete pClone;
XRectAngle rec(ptLow, ptUp);
XPoint ptPos=rec.GetLowRight();
ptPos.TransformBy(mat);
TDbText text;
text.setPropertiesFrom(this);
text.SetStyleId(m_idTextStyle);
text.SetLocation(ptPos);
text.SetRotation(m_nRotation);
text.SetText(m_sPrompt);
text.SetHeight(rec.Height(), FALSE);
if(dc.IsFullExplode())
text.ExplodeOrDraw2d(dc);
else
dc.DrawEntity(text);
}
return Acad::eOk;
}
/* * * * * * * * * * 取 动 态 属 性 显 示 数 据 的 函 数 * * * * * * * * * */
void TDbPromptMark::GetTips(DList<TObjInfoUnit> &lstInfo) const
{
lstInfo.Append(new TObjInfoUnit(_T("提示标记"), m_sPrompt));
}
////////////////////////////////////////////////////////////////////////////
// Property methods
/*
void TDbPromptMark::GetPolyline(AcDbPolyline &pline) const
{
ASSERT(m_shape=kRectCrossing);
XRectAngle box(m_ptLocation, m_xSize, m_ySize);
pline.addVertexAt(0, box.GetLowLeft().AsAcGePoint2d());
pline.addVertexAt(1, box.GetLowRight().AsAcGePoint2d());
pline.addVertexAt(2, box.GetUpRight().AsAcGePoint2d());
pline.addVertexAt(3, box.GetUpLeft().AsAcGePoint2d());
pline.setClosed(Adesk::kTrue);
}
*/
const TCHAR * TDbPromptMark::GetDefaultLayer() const
{
return LAY_ERRORMSG;
}
int TDbPromptMark::ConvertText(TConvertTextPtr ptr, void *pData)
{
XString sText;
int nRet=ptr(m_sPrompt, sText, pData);
if(nRet==RTNORM) {
assertWriteEnabled();
m_sPrompt=sText;
}
return nRet;
}
void TDbPromptMark::SetPrompt(const TCHAR *pszMsg)
{
assertWriteEnabled();
if(pszMsg) {
m_sPrompt=pszMsg;
}
}
void TDbPromptMark::SetShape(TDbPromptMark::ShapeFlag sp)
{
assertWriteEnabled();
m_shape=sp;
}
void TDbPromptMark::SetTextStyle(AcDbObjectId id)
{
assertWriteEnabled();
m_idTextStyle=id;
}
void TDbPromptMark::SetLocation(XPoint pt)
{
assertWriteEnabled();
m_ptLocation = pt;
}
void TDbPromptMark::SetSizeX(double x)
{
assertWriteEnabled();
m_xSize=x;
}
void TDbPromptMark::SetSizeY(double y)
{
assertWriteEnabled();
m_ySize=y;
}
void TDbPromptMark::SetRotation(double nRot)
{
assertWriteEnabled();
m_nRotation=nRot;
}
TDbPromptMark::ShapeFlag
TDbPromptMark::GetShape() const
{
return m_shape;
}
AcDbObjectId TDbPromptMark::GetTextStyle() const
{
return m_idTextStyle;
}
BOOL TDbPromptMark::GetDrawText() const
{
return ((m_nControlFlag&PMF_DRAW_TEXT)!=0);
}
void TDbPromptMark::SetDrawText(BOOL bTrue)
{
assertWriteEnabled();
if(bTrue)
m_nControlFlag |= PMF_DRAW_TEXT;
else
m_nControlFlag &= ~PMF_DRAW_TEXT;
}
int TDbPromptMark::CompareTo(const TDbPromptMark &src) const
{
int n1=Compare(int(GetSizeX()), int(src.GetSizeX()));
if(n1) return n1;
int n2=Compare(int(GetSizeY()), int(src.GetSizeY()));
if(n2) return n2;
int n3=_tcsicmp(GetPrompt(), src.GetPrompt());
if(n3) return n3;
if(GetLocation()==src.GetLocation())
return 0;
return 1;
}
void InitDbErrorMsg(BOOL bTrue)
{
if(bTrue) {
TDbPromptMark::rxInit();
acrxBuildClassHierarchy();
TDbPromptMark::InitMatchProtocol(TRUE);
} else {
TDbPromptMark::InitMatchProtocol(FALSE);
deleteAcRxClass(TDbPromptMark::desc());
}
}
//extern BOOL g_bGenBoundaryFromCurve;
//////////////////////////////////////////////////////////////////////////////////
// 报告发生错误的地方
void ErrorPosition(const XPoint &ptLowLeft, const XPoint &ptUpRight, const TCHAR *pszMsg)
{
TDbPromptMark *pEntMsg=new TDbPromptMark(ptLowLeft, ptUpRight, pszMsg);
double nW=pEntMsg->GetSizeX(), nH=pEntMsg->GetSizeY();
{
///////////////////////////////////////////////////////
// 判断是否已经有相同的符号存在
XDbBlockTableRec objMSpace;
ASSERT(!!objMSpace);
AcDbBlockTableRecordIterator* pBlockIterator=NULL;
Acad::ErrorStatus es = objMSpace.m_pBlockTableRec->newIterator(pBlockIterator);
ASSERT(es==Acad::eOk && pBlockIterator!=NULL);
BOOL bExist=FALSE;
for (pBlockIterator->start(); !pBlockIterator->done(); pBlockIterator->step()) {
AcDbEntity *pEntity=NULL;
es = pBlockIterator->getEntity(pEntity, AcDb::kForRead);
if(es!=Acad::eOk) continue;
ASSERT(pEntity);
XDbObject vTemp(pEntity);
//不处理不可见的实体
if (pEntity->visibility() == AcDb::kInvisible) {
continue;
}
TDbPromptMark *pMsg=TDbPromptMark::cast(pEntity);
if(pMsg && pEntMsg->CompareTo(*pMsg)==0) {
bExist=TRUE;
break;
}
}
delete pBlockIterator;
if(bExist) {
delete pEntMsg;
return;
}
}
if(nW>1.0E-6 && nH>1.0E-6) {
nW *= 1.5;
nH *= 1.5;
XRectAngle rect2(pEntMsg->GetLocation(), nW, nH);
XPoint ptLow=rect2.GetLowLeft(), ptUp=rect2.GetUpRight();
pEntMsg->SetTextStyle(InitTextStyle(TS_STANDARD));
pEntMsg->AddToMSpace(Adesk::kTrue);
if(arxZoom(ptLow, ptUp)==Acad::eOk) {
XPoint ptTemp;
ads_getpoint(NULL, _T("\n按<回车键>继续: "), ptTemp);
}
} else {
delete pEntMsg;
}
}
void ErrorPosition1(const XPoint &ptLowLeft, const XPoint &ptUpRight, const TCHAR *pszMsg)
{
TDbPromptMark *pEntMsg=new TDbPromptMark(ptLowLeft, ptUpRight, pszMsg);
double nW=pEntMsg->GetSizeX(), nH=pEntMsg->GetSizeY();
{
///////////////////////////////////////////////////////
// 判断是否已经有相同的符号存在
XDbBlockTableRec objMSpace;
ASSERT(!!objMSpace);
AcDbBlockTableRecordIterator* pBlockIterator=NULL;
Acad::ErrorStatus es = objMSpace.m_pBlockTableRec->newIterator(pBlockIterator);
ASSERT(es==Acad::eOk && pBlockIterator!=NULL);
BOOL bExist=FALSE;
for (pBlockIterator->start(); !pBlockIterator->done(); pBlockIterator->step()) {
AcDbEntity *pEntity=NULL;
es = pBlockIterator->getEntity(pEntity, AcDb::kForRead);
if(es!=Acad::eOk) continue;
ASSERT(pEntity);
XDbObject vTemp(pEntity);
//不处理不可见的实体
if (pEntity->visibility() == AcDb::kInvisible) {
continue;
}
TDbPromptMark *pMsg=TDbPromptMark::cast(pEntity);
if(pMsg && pEntMsg->CompareTo(*pMsg)==0) {
bExist=TRUE;
break;
}
}
delete pBlockIterator;
if(bExist) {
delete pEntMsg;
return;
}
}
if(nW>1.0E-6 && nH>1.0E-6) {
nW *= 1.5;
nH *= 1.5;
XRectAngle rect2(pEntMsg->GetLocation(), nW, nH);
XPoint ptLow=rect2.GetLowLeft(), ptUp=rect2.GetUpRight();
pEntMsg->SetTextStyle(InitTextStyle(TS_STANDARD));
pEntMsg->AddToMSpace(Adesk::kTrue);
} else {
delete pEntMsg;
}
}