⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filescan.c

📁 就是将BMP文件转换为DXF格式的文件
💻 C
📖 第 1 页 / 共 3 页
字号:
    {
        p_img_line = get_raw_img_line(p_scd->p_raw_ptr, p_scd->img_line_size, 1);
        tx_bits_mem(p_scd->p_nnext_line, p_scd->x_size, p_img_line, p_scd->back_ground);
    }
    p_scd->current_line = 0;
    if ((p_scd->p_polylines_list = ll_create_list()) == NULL)
    {
        free(p_scd->v_open);
        free(p_scd->p_lines);
        free_image(&p_scd->imgd);
        free(p_scd);
        return (NULL);
    }
    if ((p_scd->pp_gating_polylines = (link_list_hdr **) malloc((p_scd->x_size + 2) *
                            sizeof(link_list_hdr *))) == NULL)
    {
        ll_purge_list(p_scd->p_polylines_list);
        free(p_scd->v_open);
        free(p_scd->p_lines);
        free_image(&p_scd->imgd);
        free(p_scd);
        return (NULL);
    }
    for (ii = 0; ii < (p_scd->x_size + 2); ii++)
        p_scd->pp_gating_polylines[ii] = ll_create_list();
    if ((p_scd->fp_poly = fopen(poly_file_name, "wt")) == NULL)
    {
        for (ii = 0; ii < (p_scd->x_size + 2); ii++)
            if (p_scd->pp_gating_polylines[ii] != NULL)
                ll_purge_list(p_scd->pp_gating_polylines[ii]);
        free(p_scd->pp_gating_polylines);
        ll_purge_list(p_scd->p_polylines_list);
        free(p_scd->v_open);
        free(p_scd->p_lines);
        free_image(&p_scd->imgd);
        free(p_scd);
        return (NULL);
    }
    p_scd->number_of_polylines = 0;
    return (p_scd);

}

/* OK */
static int      free_scan_data(scan_data * p_scd)
{

    if (p_scd->p_polylines_list != NULL)
        flush_all_polylines(p_scd);
    if (p_scd->fp_poly != NULL)
        fclose(p_scd->fp_poly), p_scd->fp_poly = NULL;
    if (p_scd->v_open != NULL)
        free(p_scd->v_open), p_scd->v_open = NULL;
    if (p_scd->p_lines != NULL)
        free(p_scd->p_lines), p_scd->p_lines = NULL;
    if (p_scd->pp_gating_polylines != NULL)
    {
        int             ii;

        for (ii = 0; ii < (p_scd->x_size + 2); ii++)
            if (p_scd->pp_gating_polylines[ii] != NULL)
                ll_empty_free_list(p_scd->pp_gating_polylines[ii]),
                        p_scd->pp_gating_polylines[ii] = NULL;
        free(p_scd->pp_gating_polylines), p_scd->pp_gating_polylines = NULL;
    }
    free_image(&p_scd->imgd);
    free(p_scd);
    return (TRUE);

}

/* OK */
static int      add_poly_gate(scan_data * p_scd, int gate, polyline * p_polyline)
{

    link_list_hdr  *p_gating_poly_list;

    if ((gate < 0) || (gate >= (p_scd->x_size + 2)))
        return (FALSE);
    p_gating_poly_list = p_scd->pp_gating_polylines[gate];
    ll_set_list_currpntr(p_gating_poly_list, TG_HEAD);
    do
    {
        polyline       *p_curr_polyline;

        if ((p_curr_polyline = (polyline *) ll_get_list_data(p_gating_poly_list)) == NULL)
            break;
        if (p_curr_polyline == p_polyline)
            return (TRUE);
        if (p_curr_polyline == DELETED_POLYLINE)
        {
            ll_set_list_data(p_gating_poly_list, p_polyline);
            return (TRUE);
        }
    } while (ll_set_list_currpntr(p_gating_poly_list, TG_AFTER) == TG_AFTER);
    return (ll_add_list_item(p_gating_poly_list, TG_HEAD, p_polyline, 0));

}

/* OK */
static int      remove_poly_gate(scan_data * p_scd, int gate, polyline * p_polyline)
{

    link_list_hdr  *p_gating_poly_list;

    if ((gate < 0) || (gate >= (p_scd->x_size + 2)))
        return (FALSE);
    p_gating_poly_list = p_scd->pp_gating_polylines[gate];
    ll_set_list_currpntr(p_gating_poly_list, TG_HEAD);
    do
    {
        polyline       *p_curr_polyline;

        if ((p_curr_polyline = (polyline *) ll_get_list_data(p_gating_poly_list)) == NULL)
            break;
        if (p_curr_polyline == p_polyline)
            ll_set_list_data(p_gating_poly_list, DELETED_POLYLINE);
    } while (ll_set_list_currpntr(p_gating_poly_list, TG_AFTER) == TG_AFTER);
    return (TRUE);

}

/* OK */
static int      try_to_join_polylines(scan_data * p_scd, polyline * p_owner_polyline,
                        img_point * p_join_pnt, int pnt_location)
{

    link_list_hdr  *p_gating_poly_list = p_scd->pp_gating_polylines[p_join_pnt->x];

    ll_set_list_currpntr(p_gating_poly_list, TG_HEAD);
    do
    {
        polyline       *p_polyline;

        if ((p_polyline = (polyline *) ll_get_list_data(p_gating_poly_list)) == NULL)
            break;
        if ((p_polyline == p_owner_polyline) || (p_polyline == DELETED_POLYLINE))
            continue;
        if ((pnt_location == TG_HEAD) && same_point(&p_polyline->pnt1, p_join_pnt))
        {
            remove_poly_gate(p_scd, p_owner_polyline->pnt0.x, p_owner_polyline);
            if (!transfer_polyline_points(p_owner_polyline, p_polyline, TG_HEAD, -1))
                return (FALSE);
            add_poly_gate(p_scd, p_owner_polyline->pnt0.x, p_owner_polyline);
            remove_poly_gate(p_scd, p_polyline->pnt0.x, p_polyline);
            remove_poly_gate(p_scd, p_polyline->pnt1.x, p_polyline);
            remove_polyline(p_scd, p_polyline);
            return (TRUE);
        }
        if ((pnt_location == TG_TAIL) && same_point(&p_polyline->pnt0, p_join_pnt))
        {
            remove_poly_gate(p_scd, p_owner_polyline->pnt1.x, p_owner_polyline);
            if (!transfer_polyline_points(p_owner_polyline, p_polyline, TG_TAIL, +1))
                return (FALSE);
            add_poly_gate(p_scd, p_owner_polyline->pnt1.x, p_owner_polyline);
            remove_poly_gate(p_scd, p_polyline->pnt0.x, p_polyline);
            remove_poly_gate(p_scd, p_polyline->pnt1.x, p_polyline);
            remove_polyline(p_scd, p_polyline);
            return (TRUE);
        }
    } while (ll_set_list_currpntr(p_gating_poly_list, TG_AFTER) == TG_AFTER);
    return (FALSE);

}

/* OK */
static int      add_line(scan_data * p_scd, img_point * p_img_pnt0,
                        img_point * p_img_pnt1)
{

    ins_polyline    iply;

    if (get_insert_info(p_scd, p_img_pnt0, p_img_pnt1, &iply))
    {
        if (!add_point_in_poly(iply.p_polyline, &iply.pnt, iply.insert_location))
            return (FALSE);
        switch (line_type(p_img_pnt0, p_img_pnt1))
        {
            case (HORIZONTAL_LINE):
                remove_poly_gate(p_scd, iply.link_pnt.x, iply.p_polyline);
                add_poly_gate(p_scd, iply.pnt.x, iply.p_polyline);
                break;

            case (VERTICAL_LINE):
                break;
        }
        try_to_join_polylines(p_scd, iply.p_polyline, &iply.pnt, iply.insert_location);
        return (TRUE);
    }
    return (create_new_polyline(p_scd, p_img_pnt0, p_img_pnt1));

}

/* OK */
static int      get_insert_link(link_list_hdr * p_gating_poly_list,
                        img_point * p_img_pnt0, img_point * p_img_pnt1,
                        ins_polyline * p_iply)
{

    ll_set_list_currpntr(p_gating_poly_list, TG_HEAD);
    do
    {
        polyline       *p_polyline;

        if ((p_polyline = (polyline *) ll_get_list_data(p_gating_poly_list)) == NULL)
            break;
        if (p_polyline == DELETED_POLYLINE)
            continue;
        if (same_point(&p_polyline->pnt1, p_img_pnt0))
        {
            if (same_point(&p_polyline->pnt0, p_img_pnt1))
            {
                if ((p_img_pnt1->x > p_img_pnt0->x) || (p_img_pnt1->y > p_img_pnt0->y))
                {
                    p_iply->p_polyline = p_polyline;
                    p_iply->insert_location = TG_TAIL;
                    p_iply->link_pnt = *p_img_pnt0;
                    p_iply->pnt = *p_img_pnt1;
                }
                else
                {
                    p_iply->p_polyline = p_polyline;
                    p_iply->insert_location = TG_HEAD;
                    p_iply->link_pnt = *p_img_pnt1;
                    p_iply->pnt = *p_img_pnt0;
                }
                return (TRUE);
            }
            else
            {
                p_iply->p_polyline = p_polyline;
                p_iply->insert_location = TG_TAIL;
                p_iply->link_pnt = *p_img_pnt0;
                p_iply->pnt = *p_img_pnt1;
                return (TRUE);
            }
        }
        else
        {
            if (same_point(&p_polyline->pnt0, p_img_pnt1))
            {
                p_iply->p_polyline = p_polyline;
                p_iply->insert_location = TG_HEAD;
                p_iply->link_pnt = *p_img_pnt1;
                p_iply->pnt = *p_img_pnt0;
                return (TRUE);
            }
        }
    } while (ll_set_list_currpntr(p_gating_poly_list, TG_AFTER) == TG_AFTER);
    return (FALSE);

}

/* OK */
static int      get_insert_info(scan_data * p_scd, img_point * p_img_pnt0,
                        img_point * p_img_pnt1, ins_polyline * p_iply)
{

    link_list_hdr  *p_gating_poly_list0 = p_scd->pp_gating_polylines[p_img_pnt0->x],
                   *p_gating_poly_list1 = p_scd->pp_gating_polylines[p_img_pnt1->x];

    p_iply->p_polyline = NULL;
    if (get_insert_link(p_gating_poly_list0, p_img_pnt0, p_img_pnt1, p_iply))
        return (TRUE);
    return ((p_gating_poly_list0 != p_gating_poly_list1) ?
            get_insert_link(p_gating_poly_list1, p_img_pnt0, p_img_pnt1, p_iply) : FALSE);

}

/* OK */
static int      create_new_polyline(scan_data * p_scd, img_point * p_img_pnt0,
                        img_point * p_img_pnt1)
{

    polyline       *p_polyline;

    if ((p_polyline = (polyline *) malloc(sizeof(polyline))) == NULL)
        return (FALSE);
    if ((p_polyline->p_poly_list = ll_create_list()) == NULL)
    {
        free(p_polyline);
        return (FALSE);
    }
    p_polyline->pnt0 = p_polyline->last_pnt1 = p_polyline->prev_pnt1 = *p_img_pnt0;
    p_polyline->pnt1 = p_polyline->last_pnt0 = p_polyline->prev_pnt0 = *p_img_pnt1;
    if (!ll_add_list_data(p_polyline->p_poly_list, TG_HEAD, &p_polyline->pnt0))
    {
        ll_empty_free_list(p_polyline->p_poly_list);
        free(p_polyline);
        return (FALSE);
    }
    if (!ll_add_list_data(p_polyline->p_poly_list, TG_TAIL, &p_polyline->pnt1))
    {
        ll_empty_free_list(p_polyline->p_poly_list);
        free(p_polyline);
        return (FALSE);
    }
    if (!ll_add_list_item(p_scd->p_polylines_list, TG_HEAD, p_polyline, 1))
    {
        ll_empty_free_list(p_polyline->p_poly_list);
        free(p_polyline);
        return (FALSE);
    }
    switch (line_type(p_img_pnt0, p_img_pnt1))
    {
        case (HORIZONTAL_LINE):
            add_poly_gate(p_scd, p_img_pnt0->x, p_polyline);
            add_poly_gate(p_scd, p_img_pnt1->x, p_polyline);
            break;

        case (VERTICAL_LINE):
            add_poly_gate(p_scd, p_img_pnt0->x, p_polyline);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -