源文档链接
以下均为console application,在vs2005中编译通过!需要引用Autodesk的Object DBX 或最新的Real DWG 的SDK。
如有其他的问题,请留言!
列举dwg文件中的所有的blcok的name:
C#实现:
using System;using System.Collections;using System.Collections.Generic;using System.Text;using System.Diagnostics;using System.Reflection;using System.Runtime;using System.Windows.Forms;using System.IO;using System.ComponentModel;using System.Data;using System.Drawing;using Autodesk.AutoCAD.DatabaseServices;using System.Runtime.InteropServices;using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.Geometry;[assembly: SecuredApplication(@"license")]namespace GetFrameOfRealDwg{class MyHostApplicationServices : Autodesk.AutoCAD.DatabaseServices.HostApplicationServices{public override System.String FindFile(System.String fileName,Autodesk.AutoCAD.DatabaseServices.Database database,Autodesk.AutoCAD.DatabaseServices.FindFileHint hint){return string.Empty;}static public ArrayList GetBlockNames(Database db){ArrayList array = new ArrayList();Transaction tran = db.TransactionManager.StartTransaction();try{BlockTable bt = (BlockTable)tran.GetObject(db.BlockTableId, OpenMode.ForWrite);foreach (ObjectId recordid in bt){BlockTableRecord record = (BlockTableRecord)tran.GetObject(recordid, OpenMode.ForRead);array.Add(record.Name);}}catch{}finally{tran.Dispose();}return array;}static void Main(string[] args){MyHostApplicationServices myserver = new MyHostApplicationServices();int lcid = 0x00001033; // EnglishRuntimeSystem.Initialize(myserver, lcid);Database Db = new Database(false, true);Db.ReadDwgFile(@"filepath", FileShare.Read, false, "");ArrayList ar = GetBlockNames(Db);foreach (string str in ar){System.Console.WriteLine(str);}RuntimeSystem.Terminate();System.Console.WriteLine();}}}
注意: 只需ref :acdbmgd.dll
必须实现HostApplicationServices及她的findfile().
生成的dll必须使用绑定工具绑定.
(license是很贵的啊,可以到autodesk公司主页)
c++实现:
以下均为console application,在vs2005中编译通过!需要引用Autodesk的Object DBX 或最新的Real DWG 的SDK。如有其他的问题,请留言!列举dwg文件中的所有的blcok的name:C#实现:using System;using System.Collections;using System.Collections.Generic;using System.Text;using System.Diagnostics;using System.Reflection;using System.Runtime;using System.Windows.Forms;using System.IO;using System.ComponentModel;using System.Data;using System.Drawing;using Autodesk.AutoCAD.DatabaseServices;using System.Runtime.InteropServices;using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.Geometry;[assembly: SecuredApplication(@"license")]namespace GetFrameOfRealDwg{class MyHostApplicationServices : Autodesk.AutoCAD.DatabaseServices.HostApplicationServices{public override System.String FindFile(System.String fileName,Autodesk.AutoCAD.DatabaseServices.Database database,Autodesk.AutoCAD.DatabaseServices.FindFileHint hint){return string.Empty;}static public ArrayList GetBlockNames(Database db){ArrayList array = new ArrayList();Transaction tran = db.TransactionManager.StartTransaction();try{BlockTable bt = (BlockTable)tran.GetObject(db.BlockTableId, OpenMode.ForWrite);foreach (ObjectId recordid in bt){BlockTableRecord record = (BlockTableRecord)tran.GetObject(recordid, OpenMode.ForRead);array.Add(record.Name);}}catch{}finally{tran.Dispose();}return array;}static void Main(string[] args){MyHostApplicationServices myserver = new MyHostApplicationServices();int lcid = 0x00001033; // EnglishRuntimeSystem.Initialize(myserver, lcid);Database Db = new Database(false, true);Db.ReadDwgFile(@"filepath", FileShare.Read, false, "");ArrayList ar = GetBlockNames(Db);foreach (string str in ar){System.Console.WriteLine(str);}RuntimeSystem.Terminate();System.Console.WriteLine();}}}注意: 只需ref :acdbmgd.dll必须实现HostApplicationServices及她的findfile().生成的dll必须使用绑定工具绑定.(license是很贵的啊,可以到autodesk公司主页)c++实现:#pragma once#define _CRT_SECURE_NO_DEPRECATE#include "windows.h"#include "dbsymtb.h"#include "dbents.h"#include <stdio.h>#include <string.h>#include "tchar.h"#include <string>#include <atlconv.h>#include <iostream>#include "dbapserv.h"using namespace std;class CreatentHostApp : public AcDbHostApplicationServices{Acad::ErrorStatus findFile(TCHAR* pcFullPathOut, int nBufferLength,const TCHAR* pcFilename, AcDbDatabase* pDb = NULL,AcDbHostApplicationServices::FindFileHint = kDefault);// These two functions return the full path to the root folder where roamable/local// customizable files were installed. Note that the user may have reconfigured// the location of some the customizable files using the Options Dialog// therefore these functions should not be used to locate customizable files.// To locate customizable files either use the findFile function or the// appropriate system variable for the given file type.//Acad::ErrorStatus getRoamableRootFolder(const TCHAR*& folder);Acad::ErrorStatus getLocalRootFolder(const TCHAR*& folder);// make sure you implement getAlternateFontName. In case your findFile implementation// fails to find a font you should return a font name here that is guaranteed to exist.virtual TCHAR * getAlternateFontName() const{return _T("txt.shx"); //findFile will be called again with this name}};// Return the Install directory for customizable filesAcad::ErrorStatusCreatentHostApp::getRoamableRootFolder(const TCHAR*& folder){Acad::ErrorStatus ret = Acad::eOk;static TCHAR buf[MAX_PATH] = _T("\0"); //MDI SAFEif (buf[0]==0)if (GetModuleFileName(NULL, buf, MAX_PATH) != 0)ret = Acad::eRegistryAccessError;folder = buf;return ret;}// Return the Install directory for customizable filesAcad::ErrorStatusCreatentHostApp::getLocalRootFolder(const TCHAR*& folder){Acad::ErrorStatus ret = Acad::eOk;static TCHAR buf[MAX_PATH] = _T("\0"); //MDI SAFEif (buf[0]==0)if (GetModuleFileName(NULL, buf, MAX_PATH) != 0)ret = Acad::eRegistryAccessError;folder = buf;return ret;}Acad::ErrorStatusCreatentHostApp::findFile(TCHAR* pcFullPathOut, int nBufferLength,const TCHAR* pcFilename, AcDbDatabase* pDb,AcDbHostApplicationServices::FindFileHint hint){TCHAR pExtension[5];switch (hint){case kCompiledShapeFile:_tcscpy(pExtension, _T(".shx"));break;case kTrueTypeFontFile:_tcscpy(pExtension, _T(".ttf"));break;case kPatternFile:_tcscpy(pExtension, _T(".pat"));break;case kARXApplication:_tcscpy(pExtension, _T(".dbx"));break;case kFontMapFile:_tcscpy(pExtension, _T(".fmp"));break;case kXRefDrawing:_tcscpy(pExtension, _T(".dwg"));break;case kFontFile: // Fall through. These could havecase kEmbeddedImageFile: // various extensionsdefault:pExtension[0] = _T('\0');break;}TCHAR* filePart;DWORD result;result = SearchPath(NULL, pcFilename, pExtension, nBufferLength,pcFullPathOut, &filePart);if (result && result < (DWORD)nBufferLength)return Acad::eOk;elsereturn Acad::eFileNotFound;}void dumpBlockTable(AcDbBlockTable *pBlockTable){AcDbBlockTableIterator *pIter;AcDbBlockTableRecord *pRecord;pBlockTable->newIterator(pIter);while (!pIter->done()){if (pIter->getRecord(pRecord, AcDb::kForRead) == Acad::eOk){TCHAR *pName;if (pRecord->getName(pName) == Acad::eOk){cout<<pName<<endl;printf("%s",pName);}pRecord->close();}pIter->step();}delete pIter;}CreatentHostApp gCreatentHostApp;int _tmain(int argc, TCHAR *argv[]){acdbSetHostApplicationServices(&gCreatentHostApp);long lcid = 0x00000409; // EnglishacdbValidateSetup(lcid);// Create an AcDbDatabase and initialize its tables.AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse);if (pDb == NULL)return 0;pDb->readDwgFile(_T("C:\\Documents and Settings\\xhzhu\\Desktop\\Test Template Explorer 1.1.4.46 for XUPU\\02\\aaaaaa.dwg"));acdbHostApplicationServices()->setWorkingDatabase(pDb);// Open the block table.AcDbBlockTable* pBlockTable;if (pDb->getBlockTable(pBlockTable, AcDb::kForRead) == Acad::eOk){dumpBlockTable(pBlockTable); //get name list// Close the block table.pBlockTable->close();}delete pDb;acdbCleanUp();return 0;}注意:c++的是不需要绑定的,必须实现AcDbHostApplicationServices,也的包含头文件.
注意:c++的是不需要绑定的,必须实现AcDbHostApplicationServices,也的包含头文件.
