ObjectDBX技术: 脱离AutoCAD处理dwg文件(NET 实现)
2013-12-12 16:00
731 查看
以下均为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)
{
17246
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; // English
RuntimeSystem.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 files
Acad::ErrorStatus
CreatentHostApp::getRoamableRootFolder(const TCHAR*& folder)
{
Acad::ErrorStatus ret = Acad::eOk;
static TCHAR buf[MAX_PATH] = _T("\0"); //MDI SAFE
if (buf[0]==0)
if (GetModuleFileName(NULL, buf, MAX_PATH) != 0)
ret = Acad::eRegistryAccessError;
folder = buf;
return ret;
}
// Return the Install directory for customizable files
Acad::ErrorStatus
CreatentHostApp::getLocalRootFolder(const TCHAR*& folder)
{
Acad::ErrorStatus ret = Acad::eOk;
static TCHAR buf[MAX_PATH] = _T("\0"); //MDI SAFE
if (buf[0]==0)
if (GetModuleFileName(NULL, buf, MAX_PATH) != 0)
ret = Acad::eRegistryAccessError;
folder = buf;
return ret;
}
Acad::ErrorStatus
CreatentHostApp::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 have
case kEmbeddedImageFile: // various extensions
default:
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;
else
return 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; // English
acdbValidateSetup(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,也的包含头文件.
posted on 2006-06-21 17:41
梦在天涯 阅读(4852)
评论(6) 编辑 收藏
引用 所属分类:
ARX/DBX
# re: ObjectDBX技术: 脱离AutoCAD处理dwg文件(NET
我按你的方法做了,可到acdbSetHostApplicationServices(&gCreatentHostApp);就报“DBX CAS 4”的错误,如何解决?
回复 更多评论
^_^!
你用的是c++的吗,你可能是由于连接了一些多余的跟AUTOCAD平台有关的DLL。
如果你用的是c#版的,你肯能是由于没有lience或是没有绑定成功,也可能是acdbmgd.dll的版本不正确!
^_^!
最后提醒这里说的Object DBX 不是Object ARX中的自定义实体啊,是Autodesk的另一个可以脱离autocad平台处理dwg的技术,最新的版本名字是RealDWG。
希望能够帮助大家! 回复 更多评论
你可以自己到AutoDesk的网站看看有没有! 回复 更多评论
# re: ObjectDBX技术: 脱离AutoCAD处理dwg文件(NET 实现)2012-01-05
我建立了一个DBX项目,写了一个自定义实体,想以外部图纸作为模板画这个实体.
用到readDwgFile函数时总是不成功,出现DBX CAS4错误.
看到你的文章中说要实现AcDbHostApplicationServices,请问能再说的具体点吗? 回复 更多评论
如有其他的问题,请留言!
列举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)
{
17246
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; // English
RuntimeSystem.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 files
Acad::ErrorStatus
CreatentHostApp::getRoamableRootFolder(const TCHAR*& folder)
{
Acad::ErrorStatus ret = Acad::eOk;
static TCHAR buf[MAX_PATH] = _T("\0"); //MDI SAFE
if (buf[0]==0)
if (GetModuleFileName(NULL, buf, MAX_PATH) != 0)
ret = Acad::eRegistryAccessError;
folder = buf;
return ret;
}
// Return the Install directory for customizable files
Acad::ErrorStatus
CreatentHostApp::getLocalRootFolder(const TCHAR*& folder)
{
Acad::ErrorStatus ret = Acad::eOk;
static TCHAR buf[MAX_PATH] = _T("\0"); //MDI SAFE
if (buf[0]==0)
if (GetModuleFileName(NULL, buf, MAX_PATH) != 0)
ret = Acad::eRegistryAccessError;
folder = buf;
return ret;
}
Acad::ErrorStatus
CreatentHostApp::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 have
case kEmbeddedImageFile: // various extensions
default:
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;
else
return 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; // English
acdbValidateSetup(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,也的包含头文件.
posted on 2006-06-21 17:41
梦在天涯 阅读(4852)
评论(6) 编辑 收藏
引用 所属分类:
ARX/DBX
评论
# re: ObjectDBX技术: 脱离AutoCAD处理dwg文件(NET
实现)2006-10-09 21:21y
我按你的方法做了,可到acdbSetHostApplicationServices(&gCreatentHostApp);就报“DBX CAS 4”的错误,如何解决?回复 更多评论
# re: ObjectDBX技术: 脱离AutoCAD处理dwg文件(NET 实现)2006-10-10 08:57梦在天涯
这个错误经常的出现!^_^!
你用的是c++的吗,你可能是由于连接了一些多余的跟AUTOCAD平台有关的DLL。
如果你用的是c#版的,你肯能是由于没有lience或是没有绑定成功,也可能是acdbmgd.dll的版本不正确!
^_^!
最后提醒这里说的Object DBX 不是Object ARX中的自定义实体啊,是Autodesk的另一个可以脱离autocad平台处理dwg的技术,最新的版本名字是RealDWG。
希望能够帮助大家! 回复 更多评论
# re: ObjectDBX技术: 脱离AutoCAD处理dwg文件(NET 实现)2006-11-16 14:26yy
麻烦给一个RealDWG的下载地址 回复 更多评论# re: ObjectDBX技术: 脱离AutoCAD处理dwg文件(NET 实现)2006-11-17 12:32梦在天涯
RealDwg是AutoDesk的收费的,不知道有没有官方的下载连接啊,.net板的必须的有她的licence绑定以后才可以使用的啊!你可以自己到AutoDesk的网站看看有没有! 回复 更多评论
# re: ObjectDBX技术: 脱离AutoCAD处理dwg文件(NET 实现)2006-11-21 12:15cj
请教一下 如何使用ObjectDBX导入ADT相关的aec开头的DBX文件?谢谢! 回复 更多评论# re: ObjectDBX技术: 脱离AutoCAD处理dwg文件(NET 实现)2012-01-05
15:02aaa
我建立了一个DBX项目,写了一个自定义实体,想以外部图纸作为模板画这个实体.用到readDwgFile函数时总是不成功,出现DBX CAS4错误.
看到你的文章中说要实现AcDbHostApplicationServices,请问能再说的具体点吗? 回复 更多评论
相关文章推荐
- C#开发AutoCad,利用ObjectDbx技术在当前dwg文件中插入其它未打开的dwg文件中的图块
- ASP.NET实现从服务器下载文件问题处理
- 使用asp.net 实现在ie中打开autocad格式文件
- 基于ASP.net C#技术来实现,介绍如何处理Session对象变量失效的问题
- (比如C#)里面调用AutoCAD ActiveX API实现后台打印DWG文件为PDF文件
- 比如C#里面调用AutoCAD ActiveX API实现后台打印DWG文件为PDF文件
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)
- ASP.NET实现从服务器下载文件问题处理
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)
- (转)Asp.Net 用Jquery和一般处理程序实现无刷新上传大文件
- ASP.NET实现从服务器下载文件问题处理
- Asp.net MVC 利用(aspose+pdfobject.js) 实现在线预览word、excel、ppt、pdf文件
- ASP.NET实现从服务器下载文件问题处理
- C# 实现预览dwg文件完整源代码(无需autocad环境)
- Asp.net 2.0 用 FileUpload 控件实现多文件上传 用户控件(示例代码下载).NET技术
- ASP.NET实现从服务器下载文件问题处理
- Web开发中的缓存技术之三:通过ETag实现缓存处理(ASP.NET MVC版)
- Asp.net利用一般处理程序实现文件下载功能
- 怎样在asp.net中用一般处理文件ashx实现下载功能
- asp.net使用一般处理程序实现文件下载