Пример #1
0
static gboolean
_adg_get_info(AdgADim *adim, CpmlVector vector[],
              CpmlPair *center, gdouble *distance)
{
    AdgDim *dim;
    AdgADimPrivate *data;
    AdgPoint *ref1_point, *ref2_point, *pos_point;
    const CpmlPair *ref1, *ref2, *pos;
    const CpmlPair *org1, *org2;
    gdouble factor;

    dim = (AdgDim *) adim;
    data = adim->data;
    ref1_point = adg_dim_get_ref1(dim);
    ref2_point = adg_dim_get_ref2(dim);
    pos_point  = adg_dim_get_pos(dim);

    /* Check if the needed points are all properly defined */
    if (! adg_point_update(ref1_point) ||
        ! adg_point_update(ref2_point) ||
        ! adg_point_update(pos_point)  ||
        ! adg_point_update(data->org1) ||
        ! adg_point_update(data->org2))
    {
        return FALSE;
    }

    ref1 = (CpmlPair *) ref1_point;
    ref2 = (CpmlPair *) ref2_point;
    pos  = (CpmlPair *) pos_point;
    org1 = (CpmlPair *) data->org1;
    org2 = (CpmlPair *) data->org2;

    /* Check if the given points have valid coordinates */
    if (cpml_pair_equal(ref1, org1)) {
        g_warning(_("%s: ref1 and org1 cannot be coincidents (%lf, %lf)"),
                  G_STRLOC, ref1->x, ref1->y);
        return FALSE;
    }

    if (cpml_pair_equal(ref2, org2)) {
        g_warning(_("%s: ref2 and org2 cannot be coincidents (%lf, %lf)"),
                  G_STRLOC, ref2->x, ref2->y);
        return FALSE;
    }

    vector[0].x = ref1->x - org1->x;
    vector[0].y = ref1->y - org1->y;
    vector[2].x = ref2->x - org2->x;
    vector[2].y = ref2->y - org2->y;

    factor = vector[0].x * vector[2].y - vector[0].y * vector[2].x;
    if (factor == 0) {
        /* Parallel lines: hang with an error message */
        g_warning(_("%s: trying to set an angular dimension on parallel lines"),
                  G_STRLOC);
        return FALSE;
    }

    factor = ((ref1->y - ref2->y) * vector[2].x -
              (ref1->x - ref2->x) * vector[2].y) / factor;

    center->x = ref1->x + vector[0].x * factor;
    center->y = ref1->y + vector[0].y * factor;
    *distance = cpml_pair_distance(center, pos);
    data->angle1 = cpml_vector_angle(&vector[0]);
    data->angle2 = cpml_vector_angle(&vector[2]);
    while (data->angle2 < data->angle1)
        data->angle2 += G_PI * 2;

    cpml_vector_from_angle(&vector[1], (data->angle1 + data->angle2) / 2);

    return TRUE;
}
Пример #2
0
static void
_adg_property_pos(void)
{
    AdgDim *dim;
    AdgModel *model;
    AdgPoint *origin, *explicit_point, *model_point;
    AdgPoint *pos;

    dim = ADG_DIM(adg_rdim_new());
    model = ADG_MODEL(adg_path_new());
    origin = adg_point_new();
    explicit_point = adg_point_new();
    model_point = adg_point_new();

    adg_point_set_pair_explicit(origin, 0, 0);
    adg_point_set_pair_explicit(explicit_point, 123, 321);
    adg_model_set_named_pair(model, "named-pair", (CpmlPair *) explicit_point);
    adg_point_set_pair_from_model(model_point, model, "named-pair");

    /* Ensure ADG does not consider an explicit point equals to
     * a point bound to a named pair with the same coordinates */
    g_assert_false(adg_point_equal(explicit_point, model_point));

    pos = adg_dim_get_pos(dim);
    g_assert_null(pos);

    /* Using the public APIs */
    adg_dim_set_pos_explicit(dim, 0, 0);
    pos = adg_dim_get_pos(dim);
    g_assert_true(adg_point_equal(pos, origin));

    adg_dim_set_pos(dim, NULL);
    pos = adg_dim_get_pos(dim);
    g_assert_null(pos);

    adg_dim_set_pos(dim, explicit_point);
    pos = adg_dim_get_pos(dim);
    g_assert_true(adg_point_equal(pos, explicit_point));

    adg_dim_set_pos_from_model(dim, model, "dummy");
    pos = adg_dim_get_pos(dim);
    g_assert_nonnull(pos);

    adg_dim_set_pos_from_model(dim, model, "named-pair");
    pos = adg_dim_get_pos(dim);
    g_assert_true(adg_point_equal(pos, model_point));

    /* Using GObject property methods */
    g_object_set(dim, "pos", origin, NULL);
    g_object_get(dim, "pos", &pos, NULL);
    g_assert_true(adg_point_equal(pos, origin));
    adg_point_destroy(pos);

    g_object_set(dim, "pos", NULL, NULL);
    g_object_get(dim, "pos", &pos, NULL);
    g_assert_null(pos);

    g_object_set(dim, "pos", explicit_point, NULL);
    g_object_get(dim, "pos", &pos, NULL);
    g_assert_true(adg_point_equal(pos, explicit_point));
    adg_point_destroy(pos);

    adg_dim_set_pos_from_model(dim, model, "dummy");
    g_object_get(dim, "pos", &pos, NULL);
    g_assert_nonnull(pos);
    adg_point_destroy(pos);

    g_object_set(dim, "pos", model_point, NULL);
    g_object_get(dim, "pos", &pos, NULL);
    g_assert_true(adg_point_equal(pos, model_point));
    adg_point_destroy(pos);

    adg_point_destroy(origin);
    adg_point_destroy(explicit_point);
    adg_point_destroy(model_point);
    adg_entity_destroy(ADG_ENTITY(dim));
    g_object_unref(model);
}