硬盘数据恢复导航
RAID数据恢复导航
 | 网站首页 | 数据恢复资料 | 数据恢复软件 | 咨询留言 | 数据恢复博客 | 数据恢复论坛 | 
数据恢复软件下载
数据恢复服务 数据恢复 数据恢复报价 数据恢复培训 数据恢复实验室 数据恢复研究成果 数据恢复服务联系方式
您现在的位置: 北亚数据恢复技术站 >> 数据恢复资料 >> 文件格式 >> 图形文件 >> 文章正文
dwg file format(AutoCAD DWG 文件格式说明)          【字体:
dwg file format(AutoCAD DWG 文件格式说明)
作者:未知    文章来源:互联网    点击数:    更新时间:2006-09-08
an attempt to specify the dwg (r12) file format using the bff grammar for
binary files.
acknowledgements
i would like to thank reini urban  for his
contributions.
definition of the elementary elements
typedef word word :=
     byte : b1, byte : b2
     return (word)f | ((word)s << 8).
typedef longword longp :=
     byte : b1, byte : b2, byte : b3, byte : b4
     return (longword)b1 | ((longword)b2 << 8)
          | ((longword)b3 << 16) | ((longword)b4 << 24).
typedef longword longword :=
     byte : b1, byte : b2, byte : b3, byte : b4
     return (longword)b1 | ((longword)b2 << 8)
          | ((longword)b3 << 16) | ((longword)b4 << 24).
definition of the whole file
root dwg_file :=
 [begin : end](
  char[12] : version,
  byte, word, word, word, byte,
  longp : p_entities,  longp : p_entend,
  longp : p_blocksec,  byte[4],  longp : p_bsend,  byte[4],
  tablepos : block_table,
  tablepos : layer_table,
  tablepos : style_table,
  tablepos : ltype_table,
  tablepos : view_table,
  header,  [cur : 0x3ef]byte*,
  tablepos : ucs_table,  [cur : 0x500]byte*,
  tablepos : vport_table,  byte[8],
  tablepos : appid_table,  byte[6],
  tablepos : dimstyle_table,  [cur : 0x69f]byte*,
  tablepos : p13_table,  bytes[38],
  [p_entities : p_entend]entities : ents,   byte[19],
  [block_table.start : ]blocks : block_table,
  [layer_table.start : ]layers : layer_table,
  [style_table.start : ]styles : style_table,
  [ltype_table.start : ]ltypes : ltype_table,
  [view_table.start : ]table : view_table,
  [ucs_table.start : ]table : ucs_table,
  [vport_table.start : vport_table.end]table : vport_table,
  [appid_table.start : ]appids : appid_table,
  [dimstyle_table.start : ]table : dimstyle_table,
  [p13_table.start : ]table : p13_table,
  [p_blocksec : p_bsend]entities : blocks,  bytes[36],
  longp = p_entities,  longp = p_entend,
  longp = blocksec,  longp = bsend,
  bytes[12],
  bytes[6],
  longp = block_table.start,   bytes[6],
  longp = layer_table.start,   bytes[6],
  longp = style_table.start,   bytes[6],
  longp = ltype_table.start,   bytes[6]
  longp = view_table.start,   bytes[6],
  longp = ucs_table.start,   bytes[6],
  longp = vport_table.start,   bytes[6],
  longp = appid_table.start,   bytes[6],
  longp = dimstyle_table.start,   bytes[6],
  longp = p13_table.start,   bytes[6],
  longp  bytes*,
 ).
a table position
tablepos :=
   word : size,
   long : nr,
   long : start,
the header
header :=
   word,
   point(true) : inbase,
   point(true) : extmin,
   point(true) : extmax,
   point(false) : limmin,
   point(false) : limmax,
   double[4],
   byte[2],
   double[2],
   byte[56],
   double[3],
   byte[18],
   double .
the block table
blocks :=
  ( [size](
      byte : flag,
      char[32] : name,
      word : used,
      byte, word, byte, word,
      check_2
    )
  )[nr] : blocks_info,
  check_32.
check_2 := byte[2].
check_32 := byte[32].
the layer table
layers :=
  ( [size](
      byte : flag,
      char[32] : name,
      word : used,
      word : color,
      word : style,
      check_2
    )
  )[nr] : layer_info,
  check_32.
the style table
styles :=
  ( [size](
      byte : flag,
      char[32] : name,
      word, double[3], byte, double, char[128],
      check_2
    )
  )[nr] : style_info,
  check_32.
the line-type table
ltypes :=
  ( [size](
      byte : flag,
      char[32] : name,
      word,  char[48],  byte,
      byte,  double[13],
      check_2
    )
  )[nr] : ltype_info,
  check_32 .
the application identifier table
appids :=
  ( [size](
      byte : flag,
      char[32] : name,
      word,
      check_2
    )
  )[nr] : appid_info,
  check_32 .
the other tables
table :=
  ( [size](
      byte : flag,
      [size - 3]byte*,
      check_2
    )
  )[nr],
  check_32 .
the entities
(experimental)
entities :=
  ( byte : kind,
    byte : flag,
    word : length,
    [length - 4](
      word : layer,
      word : opts,
      if (flag & 1) then byte : color else color = 0 fi,
      if (flag & 0x40) then byte : extra else extra = 0 fi,
      if (extra & 2) then xdata fi,
      if (flag & 2) then word : type fi,
      if (flag & 4 && kind > 2 && kind != 22) then double : z fi,
      if (flag & 8) then double : th fi,
      if (flag & 0x20) then handle fi,
      if (extra & 4) then word : paper fi,
      switch (kind)
      case 1:  /* line */
        point(!(flag & 4)) : l10,
        point(!(flag & 4)) : l11,
        if (opts & 1) then point(true) : l210 fi,
        if (opts & 2) then double : l38 fi,
      case 2:  /* point */
        point(!(flag & 4)) : l10,
        if (opts & 1) then point(true) : l210 fi,
        if (opts & 2) then double : l38 fi,
      case 3:  /* circle */
        point(false) : l10,
        double : l40,
        if (opts & 1) then point(true) : l210 fi,
        if (opts & 2) then double : l38 fi,
      case 4:  /* shape */
        point(false) : l10,
        word : l2,
        if (opts & 1) then point(true) : l210 fi,
        if (opts & 2) then double : l38 fi,
      case 7: /* text */
        point(false) : l10,
        double : l40,
        string : l1,
        if (opts & 1) then double : l50 fi,
        if (opts & 2) then double : l41 fi,
        if (opts & 4) then double : l51 fi,             /*?*/
        if (opts & 8) then byte : l7 fi,
        if (opts & 0x10) then byte : l71 fi,
        if (opts & 0x20) then byte : l72 fi,
        if (opts & 0x40) then point(false) : l11 fi,
        if (opts & 0x100) then byte : l73 fi,
      case 8:  /* arc */
        point(false) : l10,
        double : l40,
        double : l50,
        double : l51,
        if (opts & 1) then point(true) : l210 fi,
        if (opts & 2) then double : l38 fi,
      case 9:   /* trace */
        point(false) : l10,
        point(false) : l11,
        point(false) : l12,
        point(false) : l13,
        if (opts & 1) then point(true) : l210 fi,
        if (opts & 2) then double : l38 fi,
      case 11:   /* solid */
        point(false) : l11,
        point(false) : l12,
        point(false) : l13,
        point(false) : l14,
        if (opts & 1) then point(true) : l210 fi,
        if (opts & 2) then double : l38 fi
      case 12:   /* block */
        point(false) : l10,                /*?*/
        string : l1,                       /* if (opts & 1) then ? */
        if (opts & 2) then string : l3 fi
      case 13:  /* endblk */
      case 14:   /* insert */
        word : l1,
        point(false) : l10,
        if (opts & 1) then double : l41 fi,
        if (opts & 2) then double : l42 fi,
        if (opts & 4) then double : l43 fi,
        if (opts & 8) then double : l50 fi,
        if (opts & 0x10) then byte : l70 fi,                /*?*/
        if (opts & 0x20) then byte : l71 fi,                /*?*/
        if (opts & 0x40) then double : l44 fi,              /*?*/
        if (opts & 0x80) then double : l45 fi              /*?*/
      case 15:    /* attdef */
        point(false) : l10,
        double : l40,
        string : l1,
        string : l3,
        string : l2,
        byte : l70,
        if (opts & 1) then byte : l73 fi,           /*?*/
        if (opts & 2) then double : l50 fi,         /*?*/
        if (opts & 4) then double : l41 fi,
        if (opts & 8) then double : l42 fi,
        if (opts & 0x10) then byte : l7 fi,
        if (opts & 0x20) then byte : l71 fi,
        if (opts & 0x40) then byte : l72 fi,
        if (opts & 0x80) then point(false) : l11 fi,   /*?*/
        if (opts & 0x100) then point(true) : l210 fi,
        if (opts & 0x200) then double : l38 fi        /*?*/
      case 16:   /* attrib */
        point(false) : l10,
        double : l40,
        string : l1,
        string : l2,
        byte : l70,
        if (opts & 1) then byte : l73 fi,           /*?*/
        if (opts & 2) then double : l50 fi,         /*?*/
        if (opts & 4) then double : l41 fi,
        if (opts & 8) then double : l42 fi,
        if (opts & 0x10) then byte : l7 fi,
        if (opts & 0x20) then byte : l71 fi,
        if (opts & 0x40) then byte : l72 fi,
        if (opts & 0x80) then point(false) : l11 fi,   /*?*/
        if (opts & 0x100) then point(true) : l210 fi,
        if (opts & 0x200) then double : l38 fi        /*?*/
      case 17:   /* s/bend */
        long
      case 19:   /* pline */
        if (opts & 1) then byte : l70 fi,
        if (opts & 2) then double : l40 fi,                   /*?*/
        if (opts & 4) then byte : l71 fi,         /*?*/
        if (opts & 8) then byte : l72 fi,         /*?*/
        if (opts & 0x10) then byte : l73 fi,         /*?*/
        if (opts & 0x20) then byte : l74 fi,         /*?*/
        if (opts & 0x40) then byte : l75 fi         /*?*/
      case 20:   /* vertex */
        point(false) : l10,
        if (opts & 1) then double : l40 fi,           /*?*/
        if (opts & 2) then double : l41 fi,           /*?*/
        if (opts & 4) then byte : l70 fi,             /*?*/
        if (opts & 8) then double : l50 fi           /*?*/
      case 22:   /* 3dface */
        point(!(flag & 4)) : l10,
        point(!(flag & 4)) : l11,
        point(!(flag & 4)) : l12,
        point(!(flag & 4)) : l13
      case 23:   /* dim */
        word : l1,
        point(true) : l10,
        point(false) : l11,   /*?*/
        if (opts & 2) then byte : l70 fi,
        if (opts & 1) then point(true) : l12 fi,    /*?*/
        if (opts & 4) then string : l1 fi,
        if (opts & 8) then point(true) : l13 fi,
        if (opts & 0x10) then point(true) : l14 fi,
        if (opts & 0x20) then point(true) : l15 fi,
        if (opts & 0x40) then point(true) : l16 fi,
        if (opts & 0x80) then double : l40 fi,
        if (opts & 0x100) then double : l50 fi,
        if (opts & 0x200) then double : l51 fi,
        if (opts & 0x400) then double : l52 fi,
        if (opts & 0x800) then double : l53 fi
      case 24:   /* vport */
        point(true) : l10,
        double : l40,
        double : l41,
        word : l68
      endswitch
      check_2
    )
  )* : entities.
文章录入:菜刀    责任编辑:菜刀 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    关于我们 | RAID数据恢复 | 友情链接 | RSS生成 | XML生成 | 文章HTML地图 | 下载HTML地图

    全国统一客服电话:4006-505-808
    总部电话:010-82488636 邮箱:ycf@frombyte.com
    公司地址:北京市海淀区永丰基地丰慧中路7号新材料创业大厦B座205室
    京ICP备05011939
    25