admin 发表于 2024-5-4 18:40:13

获取任意路径Dwg文件内所有块在控件中显示并能选择插入当前模型空间

主对话框CPP内代码:

#include "StdAfx.h"
#include "resource.h"
#include "BlockDialog.h"
#include "..\..\Common\我的类\file.h"
#include "..\..\Common\Document\DwgDatabaseUtil.h"
#include <dbents.h>
#include <dbmain.h>
#include "..\..\Chapter11\PreviewControl\GsPreviewCtrl.h"
#include "GsPreviewCtrl.h"
#include <gepnt3d.h>
#include <geassign.h>


CString filepatha;
CString filepath;
void CBlockDialog::OnButton1()
{

m采用combo1.ResetContent();
m采用combo2.ResetContent();
m采用combo3.ResetContent();
m采用list.ResetContent();
vector<CString> filename;
Cfile::getFiles(filepath,filename);
int i;
for (i=0;i<filename.size()-2;i++)
{
m采用combo1.AddString(filename);
}
if (m采用combo1.GetCount()>0)
{
m采用combo1.SetCurSel(0);

filepatha=filepath.Left(filepath.GetLength()-1);
CString ca;
m采用combo1.GetWindowText(ca);
CString filepathaa=filepatha+ca;
vector<CString> filenamea;
Cfile::getFiles(filepathaa,filenamea);

for (i=0;i<filenamea.size()-2;i++)
{
m采用combo2.AddString(filenamea);
}
if (m采用combo2.GetCount()>0)
{
m采用combo2.SetCurSel(0);

CString filepathb=filepathaa.Left(filepathaa.GetLength()-1);
m采用combo2.GetWindowText(ca);
CString filepathbb=filepathb+ca;
vector<CString> filenameb;
Cfile::getFiles(filepathbb,filenameb);

for (i=0;i<filenameb.size()-2;i++)
{
m采用combo3.AddString(filenameb);
}
if (m采用combo3.GetCount()>0)
{
m采用combo3.SetCurSel(0);
CString filepathc=filepathbb.Left(filepathbb.GetLength()-1);
m采用combo3.GetWindowText(ca);
CString filepathcc=filepathc+ca;
AcDbDatabase *pDb=new AcDbDatabase(false);
pDb->readDwgFile(filepathcc,采用SH采用DENYWR);
AcDbObjectIdArray allEntIds = CDwgDatabaseUtil::GetAllEntityIds(NULL,pDb);
for (i=0;i<allEntIds.length();i++)
{
AcDbEntity *pEnt=NULL;
if (acdbOpenObject(pEnt,allEntIds,AcDb::kForRead)==Acad::eOk)
{
if (pEnt->isKindOf(AcDbBlockReference::desc()))
{
AcDbBlockReference *pBlkRef=NULL;
pBlkRef=AcDbBlockReference::cast(pEnt);
pEnt->close();
AcDbObjectId blkDefId=pBlkRef->blockTableRecord();
pBlkRef->close();
AcDbBlockTableRecord *pBlkDef=NULL;
char *blkDefName;
if (acdbOpenObject(pBlkDef,blkDefId,AcDb::kForRead)==Acad::eOk)
{
pBlkDef->getName(blkDefName);
m采用list.AddString(blkDefName);
pBlkDef->close();
}
}
}
}
pDb->closeInput();
delete pDb;

}
}
}
filepath=filepath.Left(filepath.GetLength()-2);
}






void CBlockDialog::OnSelchangeCombo1()
{
m采用combo2.ResetContent();
CString ca;
m采用combo1.GetLBText(m采用combo1.GetCurSel(),ca);
CString filepa=filepatha+ca;
vector<CString>filename;
Cfile::getFiles(filepa,filename);
int i;
for (i=0;i<filename.size()-2;i++)
{
m采用combo2.AddString(filename);
}
if (m采用combo2.GetCount()>0)
{
m采用combo2.SetCurSel(0);

m采用combo3.ResetContent();
m采用combo2.GetWindowText(ca);
filepa=filepa.Left(filepa.GetLength()-1);
filepa+=ca;
vector<CString>filenamea;
Cfile::getFiles(filepa,filenamea);

for (i=0;i<filenamea.size()-2;i++)
{
m采用combo3.AddString(filenamea);
}
if (m采用combo3.GetCount()>0)
{
m采用combo3.SetCurSel(0);

m采用list.ResetContent();
m采用combo3.GetWindowText(ca);
filepa=filepa.Left(filepa.GetLength()-1);
filepa+=ca;
AcDbDatabase *pDb=new AcDbDatabase(false);
pDb->readDwgFile(filepa,采用SH采用DENYWR);
AcDbObjectIdArray allEntIds = CDwgDatabaseUtil::GetAllEntityIds(NULL,pDb);
for (int i=0;i<allEntIds.length();i++)
{
AcDbEntity *pEnt=NULL;
if (acdbOpenObject(pEnt,allEntIds,AcDb::kForRead)==Acad::eOk)
{
if (pEnt->isKindOf(AcDbBlockReference::desc()))
{
AcDbBlockReference *pBlkRef=NULL;
pBlkRef=AcDbBlockReference::cast(pEnt);
pEnt->close();
AcDbObjectId blkDefId=pBlkRef->blockTableRecord();
pBlkRef->close();
AcDbBlockTableRecord *pBlkDef=NULL;
char *blkDefName;
if (acdbOpenObject(pBlkDef,blkDefId,AcDb::kForRead)==Acad::eOk)
{
pBlkDef->getName(blkDefName);
m采用list.AddString(blkDefName);
pBlkDef->close();
}
}
}
}
delete pDb;
filepa="";

}

}

}

void CBlockDialog::OnSelchangeCombo2()
{
m采用combo3.ResetContent();
CString ca;
CString cb;
m采用combo2.GetLBText(m采用combo2.GetCurSel(),ca);
m采用combo1.GetWindowText(cb);
CString filepa=filepatha+cb;
filepa+="\\";
filepa=filepa+ca;
vector<CString>filename;
Cfile::getFiles(filepa,filename);

for (int i=0;i<filename.size()-2;i++)
{
m采用combo3.AddString(filename);
}
if (m采用combo3.GetCount()>0)
{
m采用combo3.SetCurSel(0);

m采用list.ResetContent();
m采用combo3.GetWindowText(ca);
filepa=filepa.Left(filepa.GetLength()-1);
filepa+=ca;

AcDbDatabase *pDb=new AcDbDatabase();
pDb->readDwgFile(filepa,采用SH采用DENYWR);
AcDbObjectIdArray allEntIds = CDwgDatabaseUtil::GetAllEntityIds(NULL,pDb);
for (i=0;i<allEntIds.length();i++)
{
AcDbEntity *pEnt=NULL;
if (acdbOpenObject(pEnt,allEntIds,AcDb::kForRead)==Acad::eOk)
{
if (pEnt->isKindOf(AcDbBlockReference::desc()))
{
AcDbBlockReference *pBlkRef=NULL;
pBlkRef=AcDbBlockReference::cast(pEnt);
pEnt->close();
AcDbObjectId blkDefId=pBlkRef->blockTableRecord();
pBlkRef->close();
AcDbBlockTableRecord *pBlkDef=NULL;
char *blkDefName;
if (acdbOpenObject(pBlkDef,blkDefId,AcDb::kForRead)==Acad::eOk)
{
pBlkDef->getName(blkDefName);
m采用list.AddString(blkDefName);
pBlkDef->close();
}
}
}
}
delete pDb;
filepa="";
}

}

void CBlockDialog::OnSelchangeCombo3()
{
CString ca;
CString cb;
CString cc;
m采用list.ResetContent();
m采用combo1.GetWindowText(ca);
m采用combo2.GetWindowText(cb);
m采用combo3.GetLBText(m采用combo3.GetCurSel(),cc);
CString filepa=filepatha+ca;
filepa+="\\";
filepa=filepa+cb;
filepa+="\\";
filepa=filepa+cc;

AcDbDatabase *pDb=new AcDbDatabase();
pDb->readDwgFile(filepa,采用SH采用DENYWR);
AcDbObjectIdArray allEntIds = CDwgDatabaseUtil::GetAllEntityIds(NULL,pDb);
for (int i=0;i<allEntIds.length();i++)
{
AcDbEntity *pEnt=NULL;
if (acdbOpenObject(pEnt,allEntIds,AcDb::kForRead)==Acad::eOk)
{
if (pEnt->isKindOf(AcDbBlockReference::desc()))
{
AcDbBlockReference *pBlkRef=NULL;
pBlkRef=AcDbBlockReference::cast(pEnt);
pEnt->close();
AcDbObjectId blkDefId=pBlkRef->blockTableRecord();
pBlkRef->close();
AcDbBlockTableRecord *pBlkDef=NULL;
char *blkDefName;
if (acdbOpenObject(pBlkDef,blkDefId,AcDb::kForRead)==Acad::eOk)
{
pBlkDef->getName(blkDefName);
m采用list.AddString(blkDefName);
pBlkDef->close();
}
}
}
}
delete pDb;
filepa="";

}

BOOL CBlockDialog::OnInitDialog()
{
CAcUiDialog::OnInitDialog();

m采用edit.SetWindowText("E:\\ARX\\资源");
m采用edit.GetWindowText(filepath);

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

void CBlockDialog::OnKillfocusEdit1()
{
m采用edit.Convert();
m采用edit.GetWindowText(filepath);

}

void CBlockDialog::OnSelchangeList3()
{
// TODO: Add your control notification handler code here

CString blockName;
m采用list.GetText(m采用list.GetCurSel(),blockName);
CString ca,cb,cc;
CString fileName;
m采用combo1.GetWindowText(ca);
m采用combo2.GetWindowText(cb);
m采用combo3.GetWindowText(cc);

fileName=filepatha+ca;
fileName+="\\";
fileName=fileName+cb;
fileName+="\\";
fileName=fileName+cc;
AcDbDatabase *m采用pDb=new AcDbDatabase();
m采用pDb->readDwgFile(fileName,采用SH采用DENYWR);

AcDbBlockTable *pBlkTbl=NULL;
m采用pDb->getSymbolTable(pBlkTbl,AcDb::kForRead);
AcDbObjectId blkDefId;
pBlkTbl->getAt(blockName,blkDefId);
pBlkTbl->close();
AcDbBlockReference *pBlkRef=new AcDbBlockReference(AcGePoint3d::kOrigin,blkDefId);

AcDbDatabase *pDb=new AcDbDatabase();
CDwgDatabaseUtil::PostToModelSpace(pBlkRef,pDb);

m采用gsPreviewCtrl.SubclassDlgItem(IDC采用PREVIEW,this);
m采用gsPreviewCtrl.Init(PreviewControlDLL.ModuleResourceInstance(),true);
m采用gsPreviewCtrl.SetDatabase(pDb);

}

void CBlockDialog::OnButton()
{

CString blockName;
m采用list.GetText(m采用list.GetCurSel(),blockName);
CString ca,cb,cc;
CString fileName;
m采用combo1.GetWindowText(ca);
m采用combo2.GetWindowText(cb);
m采用combo3.GetWindowText(cc);

fileName=filepatha+ca;
fileName+="\\";
fileName=fileName+cb;
fileName+="\\";
fileName=fileName+cc;
AcDbDatabase *m采用pDb=new AcDbDatabase();
m采用pDb->readDwgFile(fileName,采用SH采用DENYWR);

AcDbBlockTable *pBlkTbl=NULL;
m采用pDb->getSymbolTable(pBlkTbl,AcDb::kForRead);
AcDbObjectId blkDefId;
pBlkTbl->getAt(blockName,blkDefId);
pBlkTbl->close();

BeginEditorCommand();
ads采用point pt;
if (acedGetPoint(NULL,"\n输入一个点:",pt)!=RTNORM)
{
CompleteEditorCommand();

}
else
{
AcGePoint3d pt3d=asPnt3d(pt);
AcDbBlockReference *pBlkRef=new AcDbBlockReference(pt3d,blkDefId);
AcDbDatabase *pDb=acdbHostApplicationServices()->workingDatabase();
CDwgDatabaseUtil::PostToModelSpace(pBlkRef,pDb);
pBlkRef->close();
CompleteEditorCommand();
}
}
页: [1]
查看完整版本: 获取任意路径Dwg文件内所有块在控件中显示并能选择插入当前模型空间