void frgExtractTopologicalEntsFromLinesAlgm::_extract_vertices_from_lines(std::vector<Vertex2dsOnSegment2d> &seg_pnts_pairs, const AcDbObjectIdArray &ids) { AcDbEntity *entity = NULL; acedSetStatusBarProgressMeter(_T("正在提取每根线段上的节点..."), 0, ids.length()); for (int i = 0; i < ids.length(); i++) { acdbOpenAcDbEntity(entity, ids[i], AcDb::kForRead); if (entity == NULL) continue; if (entity->isA() != AcDbLine::desc()) { entity->close(); continue; } AcDbLine *line = (AcDbLine *)entity; Vertex2dsOnSegment2d stru; stru.seg.set(AcGePoint2d(line->startPoint().x, line->startPoint().y), AcGePoint2d(line->endPoint().x, line->endPoint().y)); entity->close(); _extract_from_seg(stru); seg_pnts_pairs.push_back(stru); acedSetStatusBarProgressMeterPos(i); } acedRestoreStatusBar(); }
void frgExtractTopologicalEntsFromLinesAlgm::_add_connections(const std::vector<Vertex2dsOnSegment2d> &seg_pnts_pairs) { acedSetStatusBarProgressMeter(_T("正在梳理点、线的拓扑关系..."), 0, (int)seg_pnts_pairs.size()); for (int i = 0; i < seg_pnts_pairs.size(); i++) { const Vertex2dsOnSegment2d &value = seg_pnts_pairs[i]; if (value.vertex2ds.size() < 2) continue; std::map<double, rlVertex2d *, rl_double_sort1>::const_iterator it = value.vertex2ds.begin(), pos = it; pos++; for (; pos != value.vertex2ds.end(); ++pos, ++it) { rlVertex2d *v1 = it->second; rlVertex2d *v2 = pos->second; if (v1 == NULL || v2 == NULL) { assert(false); continue; } if (v1->has_coedge(v2)) continue; rlEdge2d *_seg = _topologies->_new<rlEdge2d>(); _seg->set_v1(v1->id()); _seg->set_v2(v2->id()); v1->insert(_seg->id()); v2->insert(_seg->id()); } acedSetStatusBarProgressMeterPos(i); } acedRestoreStatusBar(); }
////////////////////////////////////////////////////////////// // // Standard C Test function // ////////////////////////////////////////////////////////////// void Test() { acutPrintf( "Running Progress Meter...\n" ); acedSetStatusBarProgressMeter("Test Progress Bar", 0, 100); for(int i =0; i <= 100; i++) { Sleep(100); acedSetStatusBarProgressMeterPos(i); } acedRestoreStatusBar(); }
void frgExtractTopologicalEntsFromLinesAlgm::_addto_rtree(std::vector<Vertex2dsOnSegment2d> &seg_pnts_pairs) { acedSetStatusBarProgressMeter(_T("正在增加每个节点到Rtree树中..."), 0, (int)seg_pnts_pairs.size()); for (int i = 0; i < seg_pnts_pairs.size(); i++) { Vertex2dsOnSegment2d &value = seg_pnts_pairs[i]; _addto_rtree(value); acedSetStatusBarProgressMeterPos(i); } acedRestoreStatusBar(); }
void progress3 (int percent_completed) { acedSetStatusBarProgressMeterPos (200 + percent_completed) ; }
void frgExtractTopologicalEntsFromLinesAlgm::_clear_inner_vertices_on_lines() { // - 查找符合条件的点 std::set<rlVertex2d *> filtered_vertices; const std::map<rlId, rlVertex2d*> &ptrs = _topologies->vertices(); acedSetStatusBarProgressMeter(_T("正在查找待合并的节点..."), 0, (int)ptrs.size()); std::map<rlId, rlVertex2d*>::const_iterator it = ptrs.begin(); for (int i=0; it != ptrs.end(); ++it, i++) { rlVertex2d *v = it->second; if (_is_colinear_vertex(v) == false) continue; filtered_vertices.insert(v); acedSetStatusBarProgressMeterPos(i); } acedRestoreStatusBar(); // - 处理每一个节点 acedSetStatusBarProgressMeter(_T("正在合并每一个查找出来的节点..."), 0, (int)filtered_vertices.size()); std::set<rlVertex2d *>::const_iterator pos = filtered_vertices.begin(); for (int i = 0; pos != filtered_vertices.end(); ++pos, i++) { rlVertex2d *v = *pos; // -- 获取该节点相邻的节点 const std::set<rlId> &edges = v->edges(); rlId eId1 = *edges.begin(); rlId eId2 = *edges.rbegin(); rlEdge2d *e1 = _topologies->get<rlEdge2d *>(eId1); rlEdge2d *e2 = _topologies->get<rlEdge2d *>(eId2); if (e1 == NULL || e2 == NULL) { assert(false); continue; } rlId vId1 = 0, vId2 = 0; if (v->has_another_end(vId1, e1) == false || v->has_another_end(vId2, e2) == false) continue; rlVertex2d *v1 = _topologies->get<rlVertex2d *>(vId1); rlVertex2d *v2 = _topologies->get<rlVertex2d *>(vId2); if (v1 == NULL || v2 == NULL) { assert(false); continue; } // -- 删除旧有的关系,新增新关系 // --- 删除相邻点关联的线段id v1->erase(eId1); v2->erase(eId2); // --- 删除节点 _remove_from_rtee(Point_2d(v->x(), v->y())); _topologies->_delete(v); // --- 删除两个线段 _topologies->_delete(e1); _topologies->_delete(e2); // --- 新增线段 rlEdge2d *e = _topologies->_new<rlEdge2d>(); e->set_v1(vId1); e->set_v2(vId2); v1->insert(e->id()); v2->insert(e->id()); acedSetStatusBarProgressMeterPos(i); } acedRestoreStatusBar(); }