693 lines
26 KiB
C++
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();
|
|
} |