peng_code 2019-07-08 14:10 采纳率: 0%
浏览 869
已结题

dxf如何画出只有轮廓的图形(包括多边形)

本人现在正在做着gerber文件转dxf文件,虽然最后很艰辛地将之转换了过来,但是上司要求将dxf中所画的图形轮廓化(意思是本来通过dxflib转化出来的图形都是实心的,后来自己又重新将实心自己写代码重绘,将实心图形都变换成了边框.)但是要求是将任意一个实体转化为边框,其中就包括多边形,本人思考了大半个月,尝试了数种方法都解决不了(举个例子:我想过两个方法:1. 每画一个图形都去判断数组上是否存在该点是已经被使用了,这样可以分析去重叠区域,进而得知多边形的折点,但这样做的话会有个很大的弊端就是需要将所有的图形化成一个个的点,用点再去一次次判断,因为比如说两个长方形部分重叠,重叠一部分的话通过四个顶点的范围判断是不准确的,所以要换成一个个点去判断,这样会导致运行量巨大,并不现实.
2.就是先将gerber化成图片(bmp\jpg),再通过opencv的canny轮廓算法去找出每个实体的轮廓并画出来,再通过图片转成dxf,但由于这样转回来的dxf的图形会出现很尴尬的问题:canny检测的图形再画的,但导致图形轮廓不规则(换句话就是说会出现锯齿\凹凸等情况,同时坐标的大小耶发生了变化.)我曾使用各种滤波耶无法解决这个问题.)因此,想请教一下:希望有此经验或者能有解决方向的大师指点一下方向或解决方法.

  • 写回答

2条回答

  • dabocaiqq 2019-07-08 15:29
    关注

    这个涉及到dxf的格式,简单说下:
    ☆标题段(HEADER)标题段记录AutoCAD系统的所有标题变量的当前值或当前状态。标题变量记录了AutoCAD系统的当前工作环境,如SNAP捕捉当前状态、栅格间距式样、当前图层层名及线型、颜色等。

    ☆表段(TABLES)表段共包含4个表,每个表又包含可变数目的表项。这些表在文件中出现的顺序是线型表(LTYPE)、图层表(LAYER)、字样表(STYLE)、视图表(VIEW)。

    ☆块段(BLOCK)块段记录了所用块的块名,当前图层层名、块的种类、块的插入基点及组成该块的所有成员。块的种类分为图形块、带有属性的块和无名块三种。无名块包括用HATCH命令生成的剖面线和用DIM命令所完成的尺寸标准。

    ☆实体段(ENTITIES)实体段记录了每个实体的名称、所在图层及其名字、线型、颜色等。

    ☆文件结束段(EOF OF FILE)DXF文件的结束标志。

    一个DXF文件由若干个组构成,每个组占两行,第一行为组的代码,第二行为组值。组代码相当于数据类型的代码,它由CAD图形系统所规定,而组值为具体的数值,二者结合起来表示一个数据的含义和值。例如,代码10代表一个点的X坐标,占一行,而其第二行4.5425则是点X坐标的具体数值,二者结合表示一点,其X坐标值为4.5425。

    (1)组代码和组值的类型组代码为一个非负的不超过三位的整数,而组值由组代码的类型决定。例如:

    代码0~9组值类型为字符型。
    代码10~59组值类型为实型。
    代码60~79组值类型为整型。
    代码999表示解释行。

    (2)组代码的含义每个组代码均有规定的含义,有些代码含义是固定的,而有些组代码则因应用场合不同而有多个含义,应具体分析。另外,一些代码是备用的,目前版本尚未用到,现将他们的含义举例介绍如下。

    0:表示一个事物的开始,如一个块、表、图层、实体等。
    1:字符型数据的值,如TEXT的字符串、文件名、属性值等。
    2:一个事物的名字,如段、表、块、线型、视图等的名字。
    3~5:字符型数据的值,如文件名、线型说明等。
    6:线型名(固定类型)。
    8:图层名(固定类型)。

    关于实体的坐标与相应的组代码10~18、20~28、30~38的用法应根据实体所用到点的数量,按组代码个位的0、1、2、……的顺序使用。例如LINE的起点组代码为10、20、30,而11、21、31为其终点。其他类似。

    DXF文件的结构相当复杂,完整读取DXF文件也是一项异常繁琐的工程。在实际应用中,为了提取图形的实体信息,可以省略DXF文件中的许多项,只要获取其中的层表、块段和实体段,就可以完成相应几何图形的描述。在层表中说明每一层的颜色、线型,在块段中说明块所在的层、属性及其在图形中的位置,在实体段中说明直线的起点、终点及圆的圆心、半径等几何信息和各实体所在的层。根据实体所在的层,在层表中搜索每一层的颜色、线型并将其添加到实体对象中。在利用CAD进行绘图时,需将变量参数DIMASO设为ON,以保证块段中定义的尺寸块为一个整体,并可被正确无误地获取。根据尺寸类型名、尺寸定义的起点、终点坐标与实体类型名、实体空间坐标是否匹配,对实体对象进行尺寸附加。在绘图时,如对自定义的粗糙度、形位公差等块不进行"EXPLODE"炸开操作,也可通过增加相应读取函数提取其属性。

    下面举例说明实体段在DXF文件中的格式。

    圆弧(ARC)

    0(开始)ARC(圆弧)
    8(层的组码)
    W1(层名为"W1")
    10(圆弧圆心的X坐标组码)
    7.0(圆弧圆心的X坐标组值)
    20(圆弧圆心的Y坐标组码)
    9.0(圆弧圆心的Y坐标组值)
    30(圆弧圆心的Z坐标组码)
    0.0(圆弧圆心的Z坐标组值)
    40(圆弧的半径组码)
    25.0(圆弧的半径值)
    50(圆弧的起始角度组码)
    90.0(圆弧的起始角度值)
    51(圆弧的终止角度组码)
    180.0(圆弧的终止角度组值)

    若实体的线型用BYLAYER,颜色为256(即BYLAYER),基面高度和厚度为零,其格式可简化。

    用C语言可以定一个结构体,然后读取解析,具体的代码你要采纳了可以帮你写。正好以前写过呢。

    评论

报告相同问题?

悬赏问题

  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?