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

693 lines
26 KiB
C++

// ConvertTchDlg.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "ConvertTchDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CConvertTchDlg dialog
CConvertTchDlg::CConvertTchDlg(CWnd* pParent /*=NULL*/)
: GlwCAcUiDialog(CConvertTchDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CConvertTchDlg)
m_csDoorHeight = _T("2100");
m_csMaxWallWidth = _T("500");
m_csWallHeight = _T("");
m_csWinHeight = _T("1500");
m_csWinSill = _T("800");
m_bPartConvert=FALSE;
//}}AFX_DATA_INIT
m_csWallHeight.Format(_T("%d"), AS_INT(DocGetLHeight()));
}
void CConvertTchDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CConvertTchDlg)
DDX_Text(pDX, IDC_DOOR_HEIGHT, m_csDoorHeight);
if (_tstof(m_csDoorHeight)<_DIST_SNAP)
pDX->Fail();
DDX_Text(pDX, IDC_MAX_WALL_WIDTH, m_csMaxWallWidth);
if (_tstof(m_csMaxWallWidth)<_DIST_SNAP)
pDX->Fail();
DDX_Text(pDX, IDC_WALL_HEIGHT, m_csWallHeight);
if (_tstof(m_csWallHeight)<_DIST_SNAP)
pDX->Fail();
DDX_Text(pDX, IDC_WIN_HEIGHT, m_csWinHeight);
if (_tstof(m_csWinHeight)<_DIST_SNAP)
pDX->Fail();
DDX_Text(pDX, IDC_WIN_SILL, m_csWinSill);
if (_tstof(m_csWinSill)<_DIST_SNAP)
pDX->Fail();
DDX_Check(pDX,IDC_PART,m_bPartConvert);
//}}AFX_DATA_MAP
//modified by whl on 060524
//if (_tstof(m_csWallHeight)<_DIST_SNAP+max(_tstof(m_csDoorHeight), _tstof(m_csWinHeight)+_tstof(m_csWinSill)))
if (pDX->m_bSaveAndValidate&&_tstof(m_csWallHeight)<_DIST_SNAP+max(_tstof(m_csDoorHeight), _tstof(m_csWinHeight)+_tstof(m_csWinSill)))
pDX->Fail();
}
BEGIN_MESSAGE_MAP(CConvertTchDlg, GlwCAcUiDialog)
//{{AFX_MSG_MAP(CConvertTchDlg)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CConvertTchDlg message handlers
// Command: 转换旧图
void ConvertTch()
{
if (g_nArchType==4) {//学习版
adsout << _T("\n学习版不支持,欢迎购买正式版!");
return;
}
extern void tch0(double nVal);
CConvertTchDlg dlg(acedGetAcadFrame());
{
CAcModuleResourceOverride vTemp;
if (dlg.DoModal()!=IDOK)
return;
}
AsureWCS();
GEOAPI void MakeVisible(PickSet &ss, bool bTrue);
//add by whl
PickSet ssSub(SS_FREE);
if (dlg.m_bPartConvert)
{
PickSet ssPart;
if (SelectEntities(_T("\n选择需要转化的图元<退出>"),ssPart,RBList())!=RTNORM)
return;
ssSub.Get(_T("X"));
ssSub-=ssPart;
//ssSub.Delete();
MakeVisible(ssSub,false);
}
double nSill=_tstof(dlg.m_csWinSill);
double nWinHeight=_tstof(dlg.m_csWinHeight);
double nDoorHeight=_tstof(dlg.m_csDoorHeight);
DocSetLHeight(_tstof(dlg.m_csWallHeight));
adsout << _T("\n第一阶段的处理...");
//modified by whl on 060323
//ads_command(RTSTR, _T("-LAYER"), RTSTR, _T("F"), RTSTR, _T("*"),
// RTSTR, _T("T"), RTSTR, _T("WALL*,DOTE,WINDOW"), RTSTR, _T(""), NULL);
XString sLayer;
sLayer<<_T("WALL*,DOTE,WINDOW,")<<LAY_WALL<<_T(",")<<LAY_AXIS<<_T(",")<<LAY_WIN;
ads_command(RTSTR, _T("-LAYER"), RTSTR, _T("F"), RTSTR, _T("*"),
RTSTR, _T("T"), RTSTR,(const TCHAR*)sLayer, RTSTR, _T(""), RTNONE);
tch0(_tstof(dlg.m_csMaxWallWidth));
ads_command(RTSTR, _T("-LAYER"), RTSTR, _T("T"), RTSTR, _T("*"), RTSTR, _T(""), RTNONE);
adsout << _T("\n第二阶段的处理...");
BOOL bOldVar=g_bDwgBegin;
DocSetIsDwgBegin(FALSE); //加速
PickSet ssColu(SS_FREE), ssColuNew(SS_FREE);
ssColuNew.IncludeBegin();
DList<XPoly2D> lstColuBound;
XString sLayerColu;
sLayerColu<<_T("COLUMN,")<<LAY_COLU;
if (ssColu.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("INSERT"), 2, _T("_FZH,_YZH,_FZHK,_YZHK"),
8, (const TCHAR*)sLayerColu, NULL))==RTNORM) {
//add by whl on 060324
if (dlg.m_bPartConvert)
ssColu-=ssSub;
long lCount=ssColu.Length();
for(long i=0L; i<lCount; i++) {
Entity ent=ssColu[i];
double nRot=0.0;
double sx=1.0, sy=1.0;
XPoint ptInsert;
TCHAR szBlkName[256]=_T("");
VERIFY(ent.GetData(41, &sx)==RTNORM &&
ent.GetData(42, &sy)==RTNORM &&
ent.GetData(50, &nRot)==RTNORM &&
ent.GetData(10, &ptInsert)==RTNORM &&
ent.GetData(2, szBlkName)==RTNORM);
XVector3D vtColu(0,0,1);
if (ent.GetData(210, &vtColu)==RTNORM) {
ptInsert=Ecs2Wcs(ptInsert, vtColu);
}
ptInsert.z=0;
BOOL bCreateColu=TRUE;
for(int n=0; n<lstColuBound.Length(); n++) {
XPoly2D &polyBound=*lstColuBound[n];
if ((ptInsert&polyBound)!=PR_OUTSIDE) {
bCreateColu=FALSE;
break;
}
}
if (bCreateColu) {
TDbColumn *pColu=new TDbColumn;
XRectAngle box(ptInsert, sx, sy);
XPoly2D poly2d;
if (_tcsicmp(szBlkName, _T("_YZH"))==0 && fabs(sx-sy)<_DIST_SNAP) {
XCircle cir(ptInsert, sx/2);
XCurveSegment segTemp;
segTemp=cir;
segTemp.AsPoly2D(poly2d);
} else
box.AsPoly2D(poly2d);
ads_matrix mat;
ptInsert.GetRotationMatrix(nRot, mat);
poly2d.TransUCS(mat);
pColu->SetLocation(ptInsert);
pColu->SetOutlinePoly(poly2d);
pColu->SetSectionShape(_tcsicmp(szBlkName, _T("_FZH"))==0?
TColumnData::kRect : TColumnData::kCircle);
pColu->SetLayerHatch2d(InitLayer(LAY_HATCH, FALSE));
pColu->AddToMSpace(Adesk::kTrue);
lstColuBound.Append(new XPoly2D(poly2d));
}
}
}
ssColuNew.IncludeEnd();
PickSet ssWall(SS_FREE), ssWallNew(SS_FREE);
ssWallNew.IncludeBegin();
if (ssWall.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("LINE,ARC"), 8, _T("TDOTE"), NULL))==RTNORM) {
long lCount=ssWall.Length();
for(long i=0L; i<lCount; i++) {
Entity ent=ssWall[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt) {
resbuf *rbXData=pEnt->xData(_T("TDOTE"));
if (rbXData) {
resbuf *pNext=rbXData->rbnext;
if (pNext && pNext->restype==1040 && pNext->rbnext &&
pNext->rbnext->restype==1040) {
double nLeftWidth=pNext->resval.rreal;
double nRightWidth=pNext->rbnext->resval.rreal;
XCurveSegment segCurve(ent);
BOOL bCreateWall=TRUE;
if (nLeftWidth+nRightWidth<_DIST_SNAP)
bCreateWall=FALSE;
if (bCreateWall) for(int n=0; n<lstColuBound.Length(); n++) {
XPoly2D &polyBound=*lstColuBound[n];
if ((segCurve.StartPoint()&polyBound)!=PR_OUTSIDE &&
(segCurve.EndPoint()&polyBound)!=PR_OUTSIDE) {
bCreateWall=FALSE;
break;
}
}
if (bCreateWall) {
TDbWall *pWall=new TDbWall;
pWall->SetLayerHatch2d(InitLayer(LAY_HATCH, FALSE));
(XCurveSegment &)*pWall=segCurve;
pWall->SetWidth(0, nLeftWidth);
pWall->SetWidth(1, nRightWidth);
pWall->AddToMSpace(Adesk::kTrue);
}
}
ads_relrb(rbXData);
}
}
OPENOBJ_END();
}
}
ssWallNew.IncludeEnd();
PickSet ssWin(SS_FREE), ssWinNew(SS_FREE);
ssWinNew.IncludeBegin();
XString sLayerWin;
sLayerWin<<_T("WINDOW,")<<LAY_WIN;
if (ssWin.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("INSERT"), 8, (const TCHAR*)sLayerWin, NULL))==RTNORM) {
//add by whl on 060324
if (dlg.m_bPartConvert)
ssWin-=ssSub;
long lCount=ssWin.Length();
for(long i=0L; i<lCount; i++) {
Entity ent=ssWin[i];
TCHAR szBlkName[256]=_T("");
VERIFY(ent.GetData(2, szBlkName)==RTNORM);
XVector3D vtWin(0,0,1);
BOOL bNormal=(ent.GetData(210, &vtWin)==RTNORM);
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbBlockReference, pInsert);
if (pInsert) {
resbuf *rbXData=pInsert->xData(_T("WTHICK"));
if (rbXData) {
resbuf *rbNext=rbXData->rbnext;
if (rbNext && rbNext->restype==1040) {
TDbOpening *pWin=new TDbOpening;
pWin->InitHardPointerId();
double nThick=fabs(rbNext->resval.rreal);
AcGeScale3d scales=pInsert->scaleFactors();
BOOL bDoor=(fabs(nThick-fabs(scales[1]))>_DIST_SNAP);
BOOL bLift=(_tcsicmp(szBlkName, _T("_LIFTD"))==0);
pWin->SetKind(bDoor? TOpeningData::OP_DOOR : TOpeningData::OP_WINDOW);
if (bLift)
pWin->m_nOpStyle |= OPS_LIFTDOOR;
pWin->SetHeight(bDoor? nDoorHeight : nWinHeight);
pWin->SetWidth(fabs(scales[0]));
pWin->SetThickness(nThick);
pWin->m_ptLocation=pInsert->position();
if (bNormal)
pWin->m_ptLocation = Ecs2Wcs(pWin->m_ptLocation, vtWin);
pWin->SetSill((bDoor || bLift)? 0.0 : nSill);
pWin->m_nRotation = pInsert->rotation();
pWin->m_nIdStyle2d = pInsert->blockTableRecord();
pWin->m_ptLabel=pWin->GetDefaultLabPos();
TCHAR szBlock[256]=_T("");
const TCHAR *pszBlock3d=NULL;
if (bLift) pszBlock3d=SYS_LDOOR3D;
else if (bDoor)
pszBlock3d=SYS_DOOR3D;
else pszBlock3d= SYS_WIN3D;
if (LoadDwbBlock(XString(_T("%s%s"), (const TCHAR *)g_sDwbPath, pszBlock3d),
szBlock)==RTNORM) {
pWin->m_nIdStyle3d = InitBlock(szBlock);
}
Entity entAttr;
if (entAttr.GetNext(ent)==RTNORM && entAttr.Is(_T("ATTRIB"))) {
TCHAR szLabel[256]=_T("");
if (entAttr.GetData(1, szLabel)==RTNORM) {
pWin->SetLabel(szLabel);
}
XPoint ptPos;
if (entAttr.GetData(10, &ptPos)==RTNORM) {
XVector3D vtNormal(0,0,1);
if (entAttr.GetData(210, &vtNormal)==RTNORM) {
ptPos=Ecs2Wcs(ptPos, vtNormal);
}
double nRot=0.0;
double nHeight=3.0;
VERIFY(entAttr.GetData(40, &nHeight)==RTNORM);
VERIFY(entAttr.GetData(50, &nRot)==RTNORM);
AcDbObjectId idStyle;
OPENOBJ_BEGIN(entAttr, AcDb::kForRead, AcDbAttribute, pAttr);
ASSERT(pAttr);
idStyle=pAttr->textStyle();
OPENOBJ_END();
TDbText text;
text.SetAlignment(XExplodeDraw::kMiddleCenter);
text.SetHeight(nHeight, FALSE);
text.SetRotation(nRot);
text.SetText(szLabel);
text.SetStyleId(idStyle);
XPoint ptMidCen=text.Base2Align(ptPos, text.GetExtents());
// 开启方向
pWin->m_ptLabel = ptMidCen;
}
}
pWin->AddToMSpace(Adesk::kFalse);
resbuf *xdata=ads_buildlist(1001, _T("TDOTE"), 1010, &XPoint(scales[0], scales[1], pInsert->rotation()),NULL);
if (!XSymbolTable(_T("APPID"), _T("TDOTE")))
ads_regapp(_T("TDOTE"));
pWin->setXData(xdata);
ads_relrb(xdata);
pWin->close();
}
ads_relrb(rbXData);
}
}
OPENOBJ_END();
}
}
ssWinNew.IncludeEnd();
// 文字
RBList maskText(RTDXF0, _T("TEXT"), NULL);
PickSet ssText(SS_FREE);
if (ssText.Get(_T("X"), NULL, NULL, maskText)==RTNORM) {
//add by whl on 060324
if (dlg.m_bPartConvert)
ssText-=ssSub;
long lCount=ssText.Length();
for(long i=0; i<lCount; i++) {
Entity ent=ssText[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbText, pText);
if (pText) {
TDbText *pNewText = new TDbText;
if (pNewText->ConvertFrom(pText)) {
AddToCurrentSpace(pNewText, Adesk::kTrue);
pText->erase();
} else {
delete pNewText;
}
}
OPENOBJ_END();
}
}
// 尺寸
RBList maskDim(RTDXF0, _T("DIMENSION"), NULL);
PickSet ssDim(SS_FREE);
if (ssDim.Get(_T("X"), NULL, NULL, maskDim)==RTNORM) {
//add by whl on 060324
if (dlg.m_bPartConvert)
ssDim-=ssSub;
long lCount=ssDim.Length();
for(long i=0; i<lCount; i++) {
Entity ent=ssDim[i];
ConvertDim(ent, Entity());
}
}
// 图块
ssColu.Erase();
ssWall.Erase();
ssWin.Erase();
PickSet ssDWall(SS_FREE);
if (ssDWall.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("LINE,ARC,CIRCLE"), 8, _T("TDWALL"), NULL))==RTNORM)
ssDWall.Erase();
adsout << _T("\n第三阶段的处理...");
// 建立门窗和墙体之间的关系
DList<AcDbObjectId> lstAllWall;
long nWallNum=ssWallNew.Length();
for(long k=0L; k<nWallNum; k++) {
AcDbObjectId id;
Entity entWall=ssWallNew[k];
VERIFY(acdbGetObjectId(id, entWall.name)==Acad::eOk);
lstAllWall.Append(new AcDbObjectId(id));
}
long nWinNum=ssWinNew.Length();
for(long i=0L; i<nWinNum; i++) {
Entity entWin=ssWinNew[i];
OPENOBJ_BEGIN(entWin, AcDb::kForWrite, TDbOpening, pOpening);
pOpening->ValidateContainership(lstAllWall); //验证和墙的配属关系
OPENOBJ_END();
}
// 建立柱子和墙体之间的关系
XSearchSpaceFromWall aSearch;
DList<AcDbObjectId> lstColu;
long nColuNum=ssColuNew.Length();
for(k=0L; k<nColuNum; k++) {
AcDbObjectId id;
Entity entColu=ssColuNew[k];
VERIFY(acdbGetObjectId(id, entColu.name)==Acad::eOk);
lstColu.Append(new AcDbObjectId(id));
}
try {
aSearch.InitStart(ssWallNew, lstColu); //实际并不搜索房间,仅建立排序表
for(i=0L; i<nWallNum; i++) {
Entity ent=ssWallNew[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbWall, pWall);
if (pWall) {
pWall->assertWriteEnabled();
pWall->CalSideParameters(ent,
GetAllSortWalls());
}
OPENOBJ_END();
}
for(i=0L; i<nWallNum; i++) {
Entity ent=ssWallNew[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbWall, pWall);
if (pWall) {
pWall->assertWriteEnabled();
pWall->CalSideParameters1();
}
OPENOBJ_END();
}
aSearch.UpdateColuLinkage();
} catch(...) {
adsout << /*UMSG*/ _T("\n出现了例外情况!");
}
//TArchCmdReactor::ResetAll();
DocSetIsDwgBegin(bOldVar);
//add by whl
if (dlg.m_bPartConvert)
MakeVisible(ssSub,true);
//ssSub.Delete();
}
void TestConv()
{
CConvertTchDlg dlg(acedGetAcadFrame());
{
CAcModuleResourceOverride vTemp;
if (dlg.DoModal()!=IDOK)
return;
}
double nSill=_tstof(dlg.m_csWinSill);
double nWinHeight=_tstof(dlg.m_csWinHeight);
double nDoorHeight=_tstof(dlg.m_csDoorHeight);
DocSetLHeight(_tstof(dlg.m_csWallHeight));
PickSet ssColu(SS_FREE);
DList<XPoly2D> lstColuBound;
if (ssColu.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("INSERT"), 2, _T("_FZH,_YZH"),
8, LAY_COLU, NULL))==RTNORM) {
long lCount=ssColu.Length();
for(long i=0L; i<lCount; i++) {
Entity ent=ssColu[i];
double nRot=0.0;
double sx=1.0, sy=1.0;
XPoint ptInsert;
TCHAR szBlkName[256]=_T("");
VERIFY(ent.GetData(41, &sx)==RTNORM &&
ent.GetData(42, &sy)==RTNORM &&
ent.GetData(50, &nRot)==RTNORM &&
ent.GetData(10, &ptInsert)==RTNORM &&
ent.GetData(2, szBlkName)==RTNORM);
BOOL bCreateColu=TRUE;
for(int n=0; n<lstColuBound.Length(); n++) {
XPoly2D &polyBound=*lstColuBound[n];
if ((ptInsert&polyBound)!=PR_OUTSIDE) {
bCreateColu=FALSE;
break;
}
}
if (bCreateColu) {
TDbColumn *pColu=new TDbColumn;
XRectAngle box(ptInsert, sx, sy);
XPoly2D poly2d;
if (_tcsicmp(szBlkName, _T("_YZH"))==0 && fabs(sx-sy)<_DIST_SNAP) {
XCircle cir(ptInsert, sx/2);
XCurveSegment segTemp;
segTemp=cir;
segTemp.AsPoly2D(poly2d);
} else
box.AsPoly2D(poly2d);
ads_matrix mat;
ptInsert.GetRotationMatrix(nRot, mat);
poly2d.TransUCS(mat);
pColu->SetLocation(ptInsert);
pColu->SetOutlinePoly(poly2d);
pColu->SetSectionShape(_tcsicmp(szBlkName, _T("_FZH"))==0?
TColumnData::kRect : TColumnData::kCircle);
pColu->AddToMSpace(Adesk::kTrue);
lstColuBound.Append(new XPoly2D(poly2d));
}
}
}
PickSet ss(SS_FREE), ssWall(SS_FREE);
//if (SelectEntities(_T("\n选择待转化的图形对象: "), ss, RBList())!=RTNORM)
// return;
if (ssWall.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("LINE,ARC"), 8, _T("TDOTE"), NULL))==RTNORM) {
long lCount=ssWall.Length();
for(long i=0L; i<lCount; i++) {
Entity ent=ssWall[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt) {
resbuf *rbXData=pEnt->xData(_T("TDOTE"));
if (rbXData) {
resbuf *pNext=rbXData->rbnext;
if (pNext && pNext->restype==1040 && pNext->rbnext &&
pNext->rbnext->restype==1040) {
double nRightWidth=pNext->resval.rreal;
double nLeftWidth=pNext->rbnext->resval.rreal;
XCurveSegment segCurve(ent);
BOOL bCreateWall=TRUE;
for(int n=0; n<lstColuBound.Length(); n++) {
XPoly2D &polyBound=*lstColuBound[n];
if ((segCurve.StartPoint()&polyBound)!=PR_OUTSIDE &&
(segCurve.EndPoint()&polyBound)!=PR_OUTSIDE) {
bCreateWall=FALSE;
break;
}
}
if (bCreateWall) {
TDbWall *pWall=new TDbWall;
(XCurveSegment &)*pWall=segCurve;
pWall->SetWidth(0, nLeftWidth);
pWall->SetWidth(1, nRightWidth);
pWall->AddToMSpace(Adesk::kTrue);
}
}
ads_relrb(rbXData);
}
}
OPENOBJ_END();
}
}
PickSet ssWin(SS_FREE);
if (ssWin.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("INSERT"), 8, LAY_WIN, NULL))==RTNORM) {
long lCount=ssWin.Length();
for(long i=0L; i<lCount; i++) {
Entity ent=ssWin[i];
TCHAR szBlkName[256]=_T("");
VERIFY(ent.GetData(2, szBlkName)==RTNORM);
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbBlockReference, pInsert);
if (pInsert) {
resbuf *rbXData=pInsert->xData(_T("WTHICK"));
if (rbXData) {
resbuf *rbNext=rbXData->rbnext;
if (rbNext && rbNext->restype==1040) {
TDbOpening *pWin=new TDbOpening;
pWin->InitHardPointerId();
double nThick=fabs(rbNext->resval.rreal);
AcGeScale3d scales=pInsert->scaleFactors();
BOOL bDoor=(fabs(nThick-fabs(scales[1]))>_DIST_SNAP);
BOOL bLift=(_tcsicmp(szBlkName, _T("_LIFTD"))==0);
pWin->SetKind(bDoor? TOpeningData::OP_DOOR : TOpeningData::OP_WINDOW);
if (bLift)
pWin->m_nOpStyle |= OPS_LIFTDOOR;
pWin->SetHeight(bDoor? nDoorHeight : nWinHeight);
pWin->SetWidth(fabs(scales[0]));
pWin->SetThickness(nThick);
pWin->m_ptLocation=pInsert->position();
pWin->SetSill((bDoor || bLift)? 0.0 : nSill);
pWin->m_nRotation = pInsert->rotation();
pWin->m_nIdStyle2d = pInsert->blockTableRecord();
pWin->m_ptLabel=pWin->GetDefaultLabPos();
TCHAR szBlock[256]=_T("");
const TCHAR *pszBlock3d=NULL;
if (bLift) pszBlock3d=SYS_LDOOR3D;
else if (bDoor)
pszBlock3d=SYS_DOOR3D;
else pszBlock3d= SYS_WIN3D;
if (LoadDwbBlock(XString(_T("%s%s"), (const TCHAR *)g_sDwbPath, pszBlock3d),
szBlock)==RTNORM) {
pWin->m_nIdStyle3d = InitBlock(szBlock);
}
Entity entAttr;
if (entAttr.GetNext(ent)==RTNORM && entAttr.Is(_T("ATTRIB"))) {
TCHAR szLabel[256]=_T("");
if (entAttr.GetData(1, szLabel)==RTNORM) {
pWin->SetLabel(szLabel);
}
XPoint ptPos;
if (entAttr.GetData(10, &ptPos)==RTNORM) {
double nRot=0.0;
double nHeight=3.0;
VERIFY(entAttr.GetData(40, &nHeight)==RTNORM);
VERIFY(entAttr.GetData(50, &nRot)==RTNORM);
AcDbObjectId idStyle;
OPENOBJ_BEGIN(entAttr, AcDb::kForRead, AcDbAttribute, pAttr);
ASSERT(pAttr);
idStyle=pAttr->textStyle();
OPENOBJ_END();
TDbText text;
text.SetAlignment(XExplodeDraw::kMiddleCenter);
text.SetHeight(nHeight, FALSE);
text.SetRotation(nRot);
text.SetText(szLabel);
text.SetStyleId(idStyle);
XPoint ptMidCen=text.Base2Align(ptPos, text.GetExtents());
// 开启方向
pWin->m_ptLabel = ptMidCen;
}
}
pWin->AddToMSpace(Adesk::kFalse);
resbuf *xdata=ads_buildlist(1001, _T("TDOTE"), 1010, &XPoint(scales[0], scales[1], pInsert->rotation()),NULL);
if (!XSymbolTable(_T("APPID"), _T("TDOTE")))
ads_regapp(_T("TDOTE"));
pWin->setXData(xdata);
ads_relrb(xdata);
pWin->close();
}
ads_relrb(rbXData);
}
}
OPENOBJ_END();
}
}
// 文字
RBList maskText(RTDXF0, _T("TEXT"), NULL);
PickSet ssText(SS_FREE);
if (ssText.Get(_T("X"), NULL, NULL, maskText)==RTNORM) {
long lCount=ssText.Length();
for(long i=0; i<lCount; i++) {
Entity ent=ssText[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbText, pText);
if (pText) {
TDbText *pNewText = new TDbText;
if (pNewText->ConvertFrom(pText)) {
AddToCurrentSpace(pNewText, Adesk::kTrue);
pText->erase();
} else {
delete pNewText;
}
}
OPENOBJ_END();
}
}
// 尺寸
RBList maskDim(RTDXF0, _T("DIMENSION"), NULL);
PickSet ssDim(SS_FREE);
if (ssDim.Get(_T("X"), NULL, NULL, maskDim)==RTNORM) {
long lCount=ssDim.Length();
for(long i=0; i<lCount; i++) {
Entity ent=ssDim[i];
ConvertDim(ent, Entity());
}
}
// 图块
ssColu.Erase();
ssWall.Erase();
ssWin.Erase();
PickSet ssDWall(SS_FREE);
if (ssDWall.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("LINE,ARC,CIRCLE"), 8, _T("TDWALL"), NULL))==RTNORM)
ssDWall.Erase();
}