| | 1590 | void test_get_ents_with_default_value() |
| | 1591 | { |
| | 1592 | MBCore moab; |
| | 1593 | MBInterface &mb = moab; |
| | 1594 | MBErrorCode rval; |
| | 1595 | MBRange result; |
| | 1596 | |
| | 1597 | // create a bunch of vertices |
| | 1598 | std::vector<double> coords(90,0.0); |
| | 1599 | MBRange verts; |
| | 1600 | rval = mb.create_vertices( &coords[0], coords.size()/3, verts ); |
| | 1601 | CHECK_ERR( rval ); |
| | 1602 | CHECK_EQUAL( coords.size()/3, verts.size() ); |
| | 1603 | // create one edge, which we should never get back from |
| | 1604 | // our queries with type == MBVERTEX |
| | 1605 | MBEntityHandle edge, ends[] = { verts.front(), verts.back() }; |
| | 1606 | rval = mb.create_element( MBEDGE, ends, 2, edge ); |
| | 1607 | CHECK_ERR(rval); |
| | 1608 | |
| | 1609 | // split vertices into four groups |
| | 1610 | MBRange sets[4]; |
| | 1611 | size_t s = 0; |
| | 1612 | for (MBRange::iterator i = verts.begin(); i != verts.end(); ++i) { |
| | 1613 | sets[s].insert(*i); |
| | 1614 | s = (s+1)%4; |
| | 1615 | } |
| | 1616 | |
| | 1617 | |
| | 1618 | // create a sparse tag and set some verts to non-default value |
| | 1619 | int default_sparse = 5; |
| | 1620 | MBTag tag_sparse = test_create_tag( mb, "int", sizeof(int), MB_TAG_SPARSE, MB_TYPE_INTEGER, &default_sparse ); |
| | 1621 | std::vector<int> sparse_vals(sets[0].size(), -1); |
| | 1622 | rval = mb.tag_set_data( tag_sparse, sets[0], &sparse_vals[0] ); |
| | 1623 | CHECK_ERR(rval); |
| | 1624 | |
| | 1625 | // get all entities with default value for sparse tag |
| | 1626 | result.clear(); |
| | 1627 | const void* ptrs[] = { &default_sparse }; |
| | 1628 | rval = mb.get_entities_by_type_and_tag( 0, MBVERTEX, &tag_sparse, ptrs, 1, result ); |
| | 1629 | CHECK_ERR(rval); |
| | 1630 | CHECK_EQUAL( subtract(verts, sets[0]), result ); |
| | 1631 | |
| | 1632 | |
| | 1633 | // create a dense tag and set some verts to non-default value |
| | 1634 | double default_dense = -1.0; |
| | 1635 | MBTag tag_dense = test_create_tag( mb, "double", sizeof(double), MB_TAG_DENSE, MB_TYPE_DOUBLE, &default_dense ); |
| | 1636 | std::vector<double> dense_vals(sets[1].size(), 3.14159); |
| | 1637 | rval = mb.tag_set_data( tag_dense, sets[1], &dense_vals[0] ); |
| | 1638 | CHECK_ERR(rval); |
| | 1639 | |
| | 1640 | // get all entities with default value for dense tag |
| | 1641 | result.clear(); |
| | 1642 | ptrs[0] = &default_dense; |
| | 1643 | rval = mb.get_entities_by_type_and_tag( 0, MBVERTEX, &tag_dense, ptrs, 1, result ); |
| | 1644 | CHECK_ERR(rval); |
| | 1645 | CHECK_EQUAL( subtract(verts, sets[1]), result ); |
| | 1646 | |
| | 1647 | |
| | 1648 | // create a variable-length tag and set some verts to non-default value |
| | 1649 | // SKIP THIS: NO API FOR QUERYING ENTITIES WITH VARIABLE-LENGTH VALUE |
| | 1650 | //int default_vlen[] = { 1, 2, 3 }; |
| | 1651 | //MBTag tag_vlen = test_create_var_len_tag( mb, "vlen", MB_TAG_SPARSE, MB_TYPE_INTEGER, default_vlen, sizeof(default_vlen) ); |
| | 1652 | //int other_vlen[] = { 4, 5, 6, 7 }; |
| | 1653 | //std::vector<const void*> vlen_ptrs( sets[2].size(), other_vlen ); |
| | 1654 | //std::vector<int> vlen_sizes( sets[2].size)(), sizeof(other_vlen) ); |
| | 1655 | //rval = mb.tag_set_data( tag_vlen, sets[2], &vlen_ptrs[0], &vlen_sizes[0] ); |
| | 1656 | //CHECK_ERR(rval); |
| | 1657 | |
| | 1658 | |
| | 1659 | // check that INTERSECT option works as expected |
| | 1660 | result.clear(); |
| | 1661 | result.insert( sets[1].front() ); |
| | 1662 | ptrs[0] = &default_sparse; |
| | 1663 | rval = mb.get_entities_by_type_and_tag( 0, MBVERTEX, &tag_sparse, ptrs, 1, result, MBInterface::INTERSECT ); |
| | 1664 | CHECK_ERR(rval); |
| | 1665 | CHECK_EQUAL( (size_t)1, result.size() ); |
| | 1666 | CHECK_EQUAL( sets[1].front(), result.front() ); |
| | 1667 | |
| | 1668 | |
| | 1669 | // check that UNITE option works as expected |
| | 1670 | result.clear(); |
| | 1671 | result.insert( edge ); |
| | 1672 | ptrs[0] = &default_sparse; |
| | 1673 | rval = mb.get_entities_by_type_and_tag( 0, MBVERTEX, &tag_sparse, ptrs, 1, result, MBInterface::UNION ); |
| | 1674 | CHECK_ERR(rval); |
| | 1675 | CHECK_EQUAL( edge, result.back() ); |
| | 1676 | } |