cad脱离cad读取dwg的⽅法A-TeiGhaForDrawing配置教程
简述
.dwg是Autodesk(桌⼦)的⾃⼰的格式.
.dxf是桌⼦和其他公司⽤组码形式交换的格式.
TeiGhaForDrawing (后⾯都会简称teigha) 是美国开放设计联盟ODA (Open Design Alliance)破解dwg格式的库.所以他们之前打了官司...
然后桌⼦弹出 "⾮AutodeskDWG。此DWG⽂件由⾮Autodesk开发或许可的软件应⽤程序保存。将此⽂件与AutoCAD软件⼀起使⽤可能导致稳定性问题。"这么打着打着,到了如今他们居然暧昧了起来...不强⾏弹窗了...
桌⼦会随着新发布的ACAD发布⽽更新.dwg格式(就是⼤家熟知的07版格式,10版格式等等...)以此对抗ODA,
⽽ODA就紧紧跟在后⾯并且同步更新...
所以说,现在中望和浩⾠都⽤着ODA的技术来实现dwg的读取,除⾮⼤家不想⽤dwg格式,否则他们也是⽆可奈何,
谁叫我们没有中国开放设计联盟..........<;钱?意义?>
这⾥并不提供teigha的下载链接(为了⽂章永存)...⼤家⾃⾏去对应的⽹络,QQ,等等问问其他前辈要就有了...
下⾯是配置teigha的⽅法,以及c#操作teigha的⽅法:
Teigha中DWG数据库结构
经常⽤到的有TextStyleTable、LayerTable、LinetypeTable、BlockTable及其对应的
TextStyleTableRecord、LayerTableRecord、LinetypeTableRecord、BlockTableRecord
及Entity,⼏乎和桌⼦的⼀模⼀样,不过这个玩意是没有内置的打印函数的,毕竟只是解析.dwg的内库.
新建项⽬
本此展⽰是⼀个控制台程序,当然了,你也可以去⽤winform,WPF来制作⼀个具有界⾯的cad.
在vs上⾯新建⼀个net framework吧.
版本问题
3.09.10为 x86不可. x64可⽤(亲测)
4.00.0 为x86可⽤. x64不可 (亲测)
⾮亲测指引:
使⽤前应该添加TD_Mgd_3.03_9.dll或是其他版本类库,类库分为64位与32位,32位类库在64位系统上运⾏效果可能不太好.
3.02版本及以下版本可能没有64位的类库.
⾥来的⼀张图:
都可以⽤ net 4.0 框架:
然后配置管理器,如果没有就添加x86.
选择x86添加.
注意下⾯如图设置:
x86
配置新建⾥x86,这样才会有 x86的Debug ⽂件夹,
然后将下载的 teigha 4.00.0 解压放⼊进去x86⽂件夹,
重要!! 执⾏⽂件.exe 必须在这些 dll中间....所以输出路径⼀定也是 bin\x86\Debug\ x64
然后将下载的 teigha 3.09.10解压放⼊进去x64⽂件夹,
重要!! 执⾏⽂件.exe 必须在这些 dll中间....所以输出路径⼀定也是 bin\x64\Debug\
想分离的话,我是没有办法的......
可能需要和ODA联系,然后拿到⼀版源码,然后再设置相对路径,然后再重新编译?知道的评论说⼀下....
引⽤⽂件
4.00.0添加引⽤⽂件:
….\bin\x86\Debug\TD_Mgd_4.00_10.dll
3.09.10添加引⽤⽂件:
….\bin\x86\Debug\TD_Mgd.dll
这样就完成了配置⽂件了.....
代码
这部分的代码和桌⼦的差不多.
//3.02及以下版本命名空间应将Teigha换为DWGdirect
#if Teigha302Dnow
using DWGdirect.DatabaseServices;
using DWGdirect.Geometry;
using DWGdirect.Colors;
using DWGdirect.Export_Import;
using DWGdirect.GraphicsInterface;
using DWGdirect.GraphicsSystem;
using DWGdirect.Runtime;
#else
using Teigha.DatabaseServices;
using Teigha.Geometry;
using Teigha.Colors;
using Teigha.Export_Import;
using Teigha.GraphicsInterface;
using Teigha.GraphicsSystem;
using Teigha.Runtime;
#endif
// 参考的Teigha⽂件
/
/wenku.baidu/view/1019d1850b1c59eef9c7b41f.html?tdsourcetag=s_pcqq_aiomsg&up
// 参考的错误
//jingyan.baidu/article/bea41d439008dcb4c51be60b.html
namespace JJBoxTeigha
{
public class Program
{
static void Main(string[] args)
{
//打开、新建、保存数据库
//处理数据库之前,需要启⽤Teigha的服务程序.⼀个应⽤程序加上⼀个就⾏了,否则出错
using (Services ser = new Services())
{
//打开数据库(dwg⽂件)
using (Database pDb = new Database(false, false))//不加参数会出错
{
pDb.ReadDwgFile(Application.StartupPath + "\\TABMENU.dwg", FileOpenMode.OpenForReadAndWriteNoShare, false, "");
//pDb取得了,再加⼊你想处理的代码......
}
//新建数据库
using (Database pDb = new Database())//加参数出错
{
//pDb取得了,再加⼊你想处理的代码......
// 保存数据库
// A.保存格式
// Save12为.dwg,Save13为dxf
// 默认保存为dwg,可以不⽤指定。
什么软件能打开dwg文件SaveType pSavetype = SaveType.Save12;
// B.保存版本类型
// ACAD2010为vAC24;ACAD2007为vAC21;ACAD2004为vAC18;
// 很重要,保存时要⽤,版本过⾼时低版本AutoCAD不能打开。
DwgVersion dwgver = DwgVersion.vAC18;
// C.保存语句
pDb.SaveAs(filename, dwgver);
//pDb为数据库(Database),filename为dwg⽂件名,dwgver为版本。
}
}
}
}
}
//之后就是⼀些代码段的参考了.....................
//2.3写数据
//2.3.1添加⽂本样式
ObjectId styleId = ObjectId.Null;
using (TextStyleTable pStyles = (TextStyleTable)pDb.TextStyleTableId.GetObject(OpenMode.ForWrite))
{
//⽂本样式记录
using (TextStyleTableRecord pStyle = new TextStyleTableRecord())
{
// 表对象(记录)添加到表之前必须命名
// isShapeFile flag must also be set (if true) before adding the object
// to the database.
pStyle.Name = styleName;//必须设定
pStyle.IsShapeFile = isShapeFile;//添加(记录)到数据库之前必须设定(如果为true)
// Add the object to the table.添加对象(记录)到表
styleId = pStyles.Add(pStyle);
// 设置剩下的属性。(可以添加后设置也可以添加之前设置)
pStyle.TextSize = textSize;
pStyle.XScale = xScale;
pStyle.PriorSize = priorSize;
pStyle.ObliquingAngle = obliquing;
pStyle.FileName = fileName;
if (isShapeFile)
pStyle.PriorSize = 22.45;
if (!string.IsNullOrEmpty(ttFaceName))
pStyle.Font = new FontDescriptor(ttFaceName, bold, italic, charset, pitchAndFamily);
return styleId;
}
}
// 注:pDb为Database
// 2.3.2添加线型
using (LinetypeTable pLinetypes = (LinetypeTable)pDb.LinetypeTableId.GetObject(OpenMode.ForWrite))
{
//线表记录
using (LinetypeTableRecord pLinetype = new LinetypeTableRecord())
{
pLinetype.Name = name;//必须命名
ObjectId linetypeId = pLinetypes.Add(pLinetype);//添加记录
return linetypeId;
}
}
// 注:线型要有相应的线型⽂件,且不⼀定能够加成功,线型可以在使⽤之前⼿动加在dwg模板中,从其他⽂件向dwg⽂件复制线型,可能不成功。// 2.3.3添加块
// 例:
using (BlockTable blockTable = (BlockTable)pDb.BlockTableId.GetObject(OpenMode.ForWrite))
{
ObjectId annoBlockId;
using (BlockTableRecord btr = new BlockTableRecord())
{
btr.Name = "AnnoBlock";
annoBlockId = blockTable.Add(btr);
using (Circle pCircle = new Circle())
{
pCircle.SetDatabaseDefaults(pDb);
btr.AppendEntity(pCircle);
Point3d center = new Point3d(0, 0, 0);
pCircle.Center = center;
pCircle.Radius = 0.5;
}
}
}
// 向块表中加⼊块之前,块⼀定要有名字。同时可以从其他⽂件中提取块,加⼊到⽬标数据库中
// 例:
using (Database db = new Database(false, false))
{
if (!File.Exists(Application.StartupPath + "\\BLOCKS\\" + blockname + ".dwg"))
{
MessageBox.Show("没到CASS块⽂件");
return ObjectId.Null;
}
db.ReadDwgFile(Application.StartupPath + "\\BLOCKS\\" + blockname + ".dwg", FileOpenMode.OpenForReadAndAllShare, false, "");
using (BlockTable pTable = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead))
{
using (BlockTable bt = (BlockTable)pDb.BlockTableId.Open(OpenMode.ForWrite))
{
using (BlockTableRecord btr = new BlockTableRecord())
{
foreach (ObjectId id in pTable)
{
using (BlockTableRecord pBlock = (BlockTableRecord)id.Open(OpenMode.ForRead))
{
foreach (ObjectId entid in pBlock)
{
using (Entity pEnt = (Entity)entid.Open(OpenMode.ForRead, false, true))
{
btr.AppendEntity((Entity)pEnt.Clone());
}
}
}
}
btr.Name = blockname;
ObjectId blockid = bt.Add(btr);
return blockid;
}
}
}
}
// 2.3.4向模型(model)空间画实体(线、⾯等)
// 加⼊线,例:
using (BlockTable blockTable = (BlockTable)pDb.BlockTableId.GetObject(OpenMode.ForWrite))
{
ObjectId modelSpaceID = blockTable[BlockTableRecord.ModelSpace];
using (BlockTableRecord btr = (BlockTableRecord)modelSpaceID.GetObject(OpenMode.ForWrite))
{
using (Polyline2d pline = new Polyline2d())
{
btr.AppendEntity(pline);//向块记录中添加线
Vertex2d pVertex = new Vertex2d();//顶点
Point3d pos = start;//起点
pVertex = new Vertex2d();
pline.AppendVertex(pVertex);
pos = start;//起点
pVertex.Position = pos;
pVertex.Dispose();
pVertex = new Vertex2d();
pline.AppendVertex(pVertex);
pos = end;//顶点,终点
pVertex.Position = pos;
if (linewidth >= 0.0)
{
pVertex.StartWidth = linewidth;//线宽
pVertex.EndWidth = linewidth;
}
pVertex.Dispose();
//pline.Closed = false;//此属性在画线时不加,但在成⾯时将属性变为true
if (linestyle != null)
{
pline.Linetype = linestyle;//线型
}
pline.Layer = LayerName;//图层名
}
}
}
// 加⼊⾯的操作与上⾯加⼊线类似,但最后线的Closed属性应设置成true。
// 插⼊⽂字:
using (BlockTableRecord bBTR = (BlockTableRecord)modelSpaceID.GetObject(OpenMode.ForWrite))
{
using (DBText pText = new DBText())
{
//开始时插⼊⽂字以左上点为准插⼊
using (Database pDb = bBTR.Database)
{
pText.SetDatabaseDefaults(pDb);
}
ObjectId textId = bBTR.AppendEntity(pText);
// 注释
pText.Annotative = AnnotativeStates.True;
//加⼊到特殊
if (pGroup != null)
pGroup.Append(textId);
pText.Position = position;//位置(应该是左上⽅)
pText.AlignmentPoint = alignmentPoint;//校准点什么东西
pText.Height = height;//⾼度
pText.WidthFactor = 1.0;//什么东西
pText.TextString = text;
pText.HorizontalMode = hMode;//⽂字模式
pText.VerticalMode = vMode;//垂直模式
pText.Oblique = OdaToRadian(oblique);//倾斜
pText.Rotation = OdaToRadian(rotation);//旋转
/
/⽂字样式
if (!textstyleID.IsNull)
pText.TextStyleId = textstyleID;
//层名
if (!layerId.IsNull)
pText.SetLayerId(layerId, false);
if (widthfactor != 0.0)
{
pText.WidthFactor = widthfactor;//宽度因⼦
}
}
}
//插⼊块:
using (BlockTableRecord btr = (BlockTableRecord)modelSpaceID.GetObject(OpenMode.ForWrite))
{
BlockReference pBlkRef = new BlockReference(point, btr.ObjectId);//point为插⼊的位置
pBlkRef.BlockTableRecord = BlockRefID;//块在数据库中的id
pBlkRef.ScaleFactors = new Scale3d(scale, scale, scale);//⽐例
pBlkRef.LayerId = layerID;//图层id
btr.AppendEntity(pBlkRef);//插⼊块
}
// 2.3.5图层
/
/ 加⼊图层:
using (LayerTable pLayers = (LayerTable)pDb.LayerTableId.GetObject(OpenMode.ForWrite))
{
//图层
using (LayerTableRecord pLayer = new LayerTableRecord())
{
pLayer.Name = name;//图层名必须有
pLayer.Color = Color.FromColorIndex(ColorMethod.ByAci, color);//颜⾊
//图层线型
using (LinetypeTable pLinetypes = (LinetypeTable)pDb.LinetypeTableId.GetObject(OpenMode.ForWrite)) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论