OpenCASCADE DataExchange DWG

OpenCASCADE DataExchange DWG

[email protected]

Abstract. DWG is a file format created in the 70’s for the emerging CAD applications. Currently it is the native file format of AutoCAD, a proprietary CAD program developed by Autodesk. Libredwg is a free C library to read and write DWG files. This program is part of GNU project, released under the aegis of GNU. The paper focus on the usage of Libredwg, and use the Libredwg to read a DWG file and output the entities of the DWG to Tcl script for OpenCASCADE Draw Test Harness visualization.

Key Words. OpenCASCADE, DWG, Libredwg, DataExchange, Windows

1. Introduction

DWG是CAD软件AutoCAD及基于AutoCAD的软件保存设计数据所用的一种专有文件格式,始于1970年代的一套Interact CAD软件。之后Autodesk公司于1982年取得版权开始使用这种文件格式。Autodesk公司拥有、开发并且更新DWG文件格式,通常每隔几年DWG就会随着在AutoCAD中添加新的特性而对DWG格式进行更新。

DWG格式及它的ASCII格式变体DXF格式,已经成为CAD制图数据交换中的事实文件标准,据估计全世界有超过十亿个DWG文件。有几家公司正在对DWG文件格式进行逆向工程以试图为其它的设计软件提供读写DWG文件的能力。Autodesk公司也提供了一套需要授权的DWG读写技术开发包“RealDWG”。

新版的AutoCAD可以打开旧版的DWG文件,AutoCAD2007可以打开2.0版本的DWG文件并且可以保存为R14版本。另外Autodesk公司提供一个免费的DWG查看工个“DWG TrueView”用于查看所有版本的DWG文件。另外Autodesk公司是vendor lock-in策略的强力支持者,尽力保护DWG文件格式并且禁止开发支持DWG格式的开放源代码库。

2006年11月12日,Autodesk公司对Open Design Alliance-一款支持DWG格式的自由库OpenDWG提出了诉讼。

ASCII格式的DXF文件的文档Autodesk提供了,但是二进制的DWG格式并没有提供相关文档,由上可见对DWG文件的读写处理是非常困难的。本文主要介绍如何使用Libredwg库来对读取DWG中的几何数据,并将几何数据生成为可以在OpenCASCADE中显示的Tcl脚本,以验证读取数据的正确性。

2.Modify Libredwg for Visual Studio

Libredwg是一个Free的读写DWG文件的C库,这个程序是GNU项目的一部分,授权方式是GNU GPL3。

Libredwg是Libdwg的一个分支,其目的是创建OpenDWG库的一个替代库。也是高优先级的Free软件项目:

http://www.fsf.org/campaigns/priority-projects/priority-projects/highpriorityprojects#ReplaceOpenDWG ,更多信息可访问http://www.gnu.org/software/libredwg 。

从网上下载的Libredwg源程序是在Linux下编译的,并没有配置在Windows下编译方法。为了使用Libredwg可以在Windows上的Visual Studio中编译通过,对Libredwg做了一些修改,最终编译成功。在Visual Studio 2008上成功编译的工程可以文后的链接中下载。

下面给出使用Libredwg读取DWG文件中直线、圆及文字的例子程序:

/*
 * load_dwg.c: load a DWG, get lines, text and circles
 * written by Felipe Castro
 * modified by Felipe Corrêa da Silva Sances
 * modified by Thien-Thi Nguyen
 */

#include <dwg.h>
#include "suffix.c"

void add_line(double x1, double y1, double x2, double y2)
{
  // Make something with that
}

void add_circle(double x, double y, double R)
{
  // Make something with that
}

void add_text(double x, double y, char *txt)
{
  // Make something with that
}

int load_dwg(char *filename)
{
  unsigned int i;
  int success;
  Dwg_Data dwg;

  dwg.num_objects = 0;
  success = dwg_read_file(filename, &dwg);
  for (i = 0; i < dwg.num_objects; i++)
    {
      Dwg_Entity_LINE *line;
      Dwg_Entity_CIRCLE *circle;
      Dwg_Entity_TEXT *text;

      switch (dwg.object[i].type)
        {
      case DWG_TYPE_LINE:
        line = dwg.object[i].tio.entity->tio.LINE;
        add_line(line->start.x, line->end.x, line->start.y, line->end.y);
        break;
      case DWG_TYPE_CIRCLE:
        circle = dwg.object[i].tio.entity->tio.CIRCLE;
        add_circle(circle->center.x, circle->center.y, circle->radius);
        break;
      case DWG_TYPE_TEXT:
        text = dwg.object[i].tio.entity->tio.TEXT;
        add_text(text->insertion_pt.x, text->insertion_pt.y, text->text_value);
        break;
        }
    }
  dwg_free(&dwg);
  return success;
}

int main (int argc, char *argv[])
{
  REQUIRE_INPUT_FILE_ARG (argc);
  load_dwg (argv[1]);
  return 0;
}

因为Libredwg用的C编程风格,没有定义导出定义宏,所以决定将Libredwg编译成静态库libredwg.lib,然后使用其头文件及这个静态库的方式来在程序中使用Libredwg库。

经过测试,若DWG中只有简单的线和圆等简单实体,Libredwg还是可以正确读取出。但是若用rewrite的例子来测试写DWG的功能,简单的实例如一个圆的数据都会写出到DWG失败,看样子写的功能还没有完全实现好。

3.DWG to OCC

基于上面的例子程序,结合Libredwg的读取功能,将DWG中的几何数据导出成Tcl脚本,这样就可以方便在OpenCASCADE的Draw Test Harness中来测试结果了。下面给出具体的程序实例及如何在Draw Test Harness中来使用生成的Tcl脚本。

/*
*    Copyright (c) 2014 eryar All Rights Reserved.
*
*        File    : Main.cpp
*        Author  : [email protected]
*        Date    : 2014-10-15 20:46
*        Version : 1.0v
*
*    Description : Use libredwg to read data from DWG and
*                  output them to Tcl script for Draw.
*
*      Key words : OpenCASCADE, libredwg, Draw Test Harness
*/

#include "dwg.h"

#include <fstream>
#include <iostream>

#pragma comment(lib, "../Debug/libredwg.lib")

// Output the entities to Tcl for OpenCASCADE Draw.
static std::ofstream theTclExporter("d:/dwg2occ.tcl");

void OutputLine(int id, const Dwg_Entity_LINE* theLine)
{
    // Draw Tcl command: vline name xa ya za xb yb zb
    theTclExporter << "vline line" << id << " "
        << theLine->start.x << " " << theLine->start.y << " " << theLine->start.z << " "
        << theLine->end.x << " " << theLine->end.y << " " << theLine->end.z << std::endl;
}

void OutputCircle(int id, const Dwg_Entity_CIRCLE* theCircle)
{
    // Draw Tcl command: circle name x y [z [dx dy dz]] [ux uy [uz]] radius
    // 1. make a curve
    theTclExporter << "circle circle" << id << " "
        << theCircle->center.x << " " << theCircle->center.y << " " << theCircle->center.z << " "
        << "0 0 1 " << theCircle->radius << std::endl;

    // 2. make edge from the circle
    theTclExporter << "mkedge e" << id << " "
        << "circle" << id << std::endl;

    // 3. display the circle edge
    theTclExporter << "vdisplay e" << id << std::endl;
}

void OutputText(int id, const Dwg_Entity_TEXT* theText)
{
    // vdrawtext : vdrawtext  : vdrawtext name X Y Z R G B hor_align ver_align angle zoomable height Aspect [Font [isMultiByte]]
    theTclExporter << "vdrawtext " << theText->text_value << " "
        << theText->insertion_pt.x << " " << theText->insertion_pt.y << " 0"
        << " 255 255 000 "
        << theText->horiz_alignment << " " << theText->vert_alignment << " "
        << theText->height << " 1 Times-Roman"<< std::endl;
}

int LoadDwg(char* theDwgFile)
{
    int aResult = 0;

    Dwg_Data aDwgData;

    aResult = dwg_read_file(theDwgFile, &aDwgData);

    for (unsigned int i = 0; i < aDwgData.num_objects; ++i)
    {
        switch (aDwgData.object[i].type)
        {
        case DWG_TYPE_LINE:
            OutputLine(i, aDwgData.object[i].tio.entity->tio.LINE);
            break;

        case DWG_TYPE_CIRCLE:
            OutputCircle(i, aDwgData.object[i].tio.entity->tio.CIRCLE);
            break;

        case DWG_TYPE_TEXT:
            OutputText(i, aDwgData.object[i].tio.entity->tio.TEXT);
            break;
        }
    }

    return aResult;
}

int main(int argc, char* argv[])
{
    theTclExporter.flags(std::ios::fixed);

    theTclExporter << "pload ALL" << std::endl;
    theTclExporter << "vinit" << std::endl;
    theTclExporter << "vtrihedron tr" << std::endl;

    if (argc < 1)
    {
        std::cout << "please input the dwg file name!" << std::endl;
    }
    else
    {
        LoadDwg(argv[1]);
    }

    theTclExporter << "vdisplayall" << std::endl;
    theTclExporter << "vfit" << std::endl;
    theTclExporter << "vhelp" << std::endl;

    return 0;
}

将生成的dwg2occ.tcl在OpenCASCADE的Draw Test Harness中显示如下所示:

Figure 3.1 Import the Tcl script in the Draw Test Hanress of OpenCASCADE

Figure 3.2 Enitites in the DWG file

Figure 3.3 Entities in the Draw Test Harness of OpenCASCADE

通过对比发现,直线和圆已经正确读出,但是文字没有读出来。看来Libredwg的可靠性还有待提高啊。

4.Conclusion

通过使用Libredwg来读取DWG格式中几何数据,并将其转换成OpenCASCADE的Draw Test Harness中能执行的Tcl脚本,以方便测试libredwg读取数据的正确性。

通过简单测试发现,libredwg能读取直线和圆,但是文字内容没有正确读出,看来libredwg的可靠性还有待提高,但是发现这个开源库的更新很缓慢。

5. References

1. DWG Wiki: http://en.wikipedia.org/wiki/.dwg

2. Libredwg: http://www.gnu.org/software/libredwg

3. OpenCASCADE Test Harness User’s Guide 6.7.1

Libredwg for Visual Studio: OpenCASCADE DataExchange DWG

时间: 2024-10-16 14:24:12

OpenCASCADE DataExchange DWG的相关文章

CAD二次开发控件,dwg控件,网页DWG控件,手机浏览编辑DWG控件

梦想绘图插件5.2(MxDraw5.2) 是国内最强,最专业的CAD开发插件(控件),不需要AutoCAD就能独立运行. 控件使用VC 2010开发,具有30万行代码规模,最早从2007年第一个版本完成,经过多年的累积已经非常稳定可靠,功能完善.有关键的空间搜索算法,并使用汇编优化,可以处理50万级实体,图形的显示和处理效率比同类产品高出很多. 梦想绘图3d插件6.0(MxDraw6.03d),使用二维控件的显示核心,基于 OpenCASCADE 几何造型引擎, 创建锥.柱.环等基本几何体, 对

opencascade读取iges并用vtk离散的一些问题

最近抽时间在弄iges文件内容读取的工作,然后将其离散化在vtk中可以显示处理以及后续的一些工作,主要目的是识别CAD文件导出的模型,然后进行离散处理,方便后续的处理.离散工作比较简单,opencascade里面的brepmesh直接支持将topoDS_shape类型的模型按照设置的精度要求离散成三角网格.目前面临的主要问题是,用opencascade里面的igesreader函数,参照dataexchange里面的例子来读取iges文件里面的模型的时候,遇到了几个问题,第一就是参考面也识别了,

OpenCASCADE入门指南

OpenCASCADE入门指南 [email protected] 一.概述 荀子说“君子性非异也,善假于物也”.当你会用英语,就可以与世界各国的人交流:当你会用编程语言,就可以与计算机交流:当你会用数学语言,就可以精确的描述世界.当你会用OpenCASCADE这个开发包(SDK),就可以在计算机中创造一个三维世界.大学期间,偶然在图书馆翻到一本发黄的书,讲的是用Turbo C2.0 C语言graphics.h头文件来画图的计算机图形学的书,随即对计算机图形学有了兴趣.后来一直在图书馆里面看计算

OpenCASCADE Extended Data Exchange - XDE

OpenCASCADE Extended Data Exchange - XDE [email protected] Abstract. OpenCASCADE Data Exchange allows developing OCCT-Based applications that can interact with other CAD systems by writing and reading CAD models to and from external data. The exchang

怎么移动dwg文件查看器中的图形位置

一张图纸中包括图形和文字,图形可以让读者更加容易理解,而文字则是起到了一个解释性的作用.在电脑中打开CAD图纸,需要用到dwg文件查看器,制作过CAD的朋友们都知道CAD文件的格式是dwg格式.图纸中的图形有的时候不在适合位置,就需要把他移动到一个合适的位置上,那么,如何移动呢,来看看具体的操作方法. 如果想要将CAD图形对象移动到指定位置,那么只需要使用迅捷CAD编辑器就可以对CAD图形对象进行移动操作,这是一款专业的CAD编辑软件,软件不仅可以用来浏览和查看DWG.DXF等CAD文件格式,还

DWG转换成PDF这样转,DWG转为PDF的步骤

DWG是最基础的CAD图纸文件格式,在我们编辑CAD图纸的时候,最常使用的图纸文件就是DWG文件,当我们对DWG文件编辑完成之后,大多数情况下都会选择将DWG文件转换成PDF格式,这是因为PDF文件相比于DWG文件查看更加的方便而且安全,那么我们应该怎么进行操作,才可以将DWG文件转换成PDF格式?DWG如何转换成PDF格式? 一.DWG转换成PDF格式应该使用什么软件 想要将DWG文件转换成PDF格式,那么我们可以使用DWG转PDF转换器进行转换(官方下载:http://cad.xjpdf.c

正确的打开DWG格式文件用这个办法

CAD文件如今在许多的领域当中都会使用到,DWG格式文件作为最常使用的CAD文件图纸,自然经常会被我们使用到,如果我们想要对DWG格式文件进行查看和编辑,那么我们应该怎么进行操作呢?想要打开DWG格式文件,就需要使用专业的CAD文件编辑器打开.那么打开DWG格式文件正确的方法是什么? 一.什么软件可以打开DWG格式文件 打开DWG格式文件正确的方法就是使用迅捷CAD编辑器(官网:http://cad.xjpdf.com)这款专业的CAD文件编辑软件进行打开.这款软件支持多种CAD文件格式,其中就

怎么才能DWG转PDF格式转换器

对于经常图形设计的小伙伴,DWG是最熟悉不过的一种CAD图纸格式,大多数情况下,我们在编辑完DWG图纸格式后,都会将DWG图纸转换成PDF文件,这是意外PDF文件是一种更安全,更易查看的文件格式,那么如果我们想要将DWG转PDF格式,应该怎么进行操作?DWG转PDF格式转换器如何使用? 一.使用什么软件可以将DWG转PDF格式 将DWG转换成PDF格式,那么只需要使用迅捷CAD编辑器(官网下载:http://cad.xjpdf.com)就可以完成图纸的转换.这是一款专业的CAD文件编辑软件,不仅

一款不错的DWG转PDF格式转换器

DWG是我我们最常使用的一中CAD文件格式,有时候我们在编辑完DWG之后,在一些特殊情况下我们将DWG转换成更安全.更容易查看的PDF文件格式.那么如果我们想要将DWG文件转换成PDF格式我们怎么转换?DWG转PDF格式转换器应该用哪一款? 想要将DWG转换成PDF格式,就需要使用到转换的文件转换器进行转换,在这里我推荐大家使用迅捷CAD编辑器来完成转换,这款软件不仅仅是一款专业的CAD文件编辑器,而且我们还可以利用这款软件将DWG.DXF.DWT等CAD文件转换成常用的PDF.图片等文件格式.