/** * Returns the prev entity or container or \p NULL if the last entity * returned by \p prev() was the first entity in the container. */ RS_Entity* RS_EntityContainer::prevEntity(RS2::ResolveLevel level) { switch (level) { case RS2::ResolveNone: return entities.prev(); break; case RS2::ResolveAllButInserts: { RS_Entity* e=NULL; if (subContainer!=NULL) { e = subContainer->prevEntity(level); if (e!=NULL) { return e; } else { e = entities.prev(); } } else { e = entities.prev(); } if (e!=NULL && e->isContainer() && e->rtti()!=RS2::EntityInsert) { subContainer = (RS_EntityContainer*)e; e = ((RS_EntityContainer*)e)->lastEntity(level); // emtpy container: if (e==NULL) { subContainer = NULL; e = prevEntity(level); } } return e; } case RS2::ResolveAll: { RS_Entity* e=NULL; if (subContainer!=NULL) { e = subContainer->prevEntity(level); if (e!=NULL) { return e; } else { e = entities.prev(); } } else { e = entities.prev(); } if (e!=NULL && e->isContainer()) { subContainer = (RS_EntityContainer*)e; e = ((RS_EntityContainer*)e)->lastEntity(level); // emtpy container: if (e==NULL) { subContainer = NULL; e = prevEntity(level); } } return e; } } return NULL; }
/** * Sets the polylines start and endpoint to match the first and last vertex. */ void RS_Polyline::updateEndpoints() { RS_Entity* e1 = firstEntity(); if (e1!=NULL && e1->isAtomic()) { RS_Vector v = ((RS_AtomicEntity*)e1)->getStartpoint(); setStartpoint(v); } RS_Entity* e2 = lastEntity(); if (isClosed()) { e2 = prevEntity(); } if (e2!=NULL && e2->isAtomic()) { RS_Vector v = ((RS_AtomicEntity*)e2)->getEndpoint(); setEndpoint(v); } }
/** * Sets the polylines start and endpoint to match the first and last vertex. */ void RS_Polyline::updateEndpoints() { RS_Entity* e1 = firstEntity(); if (e1 && e1->isAtomic()) { RS_Vector const& v = e1->getStartpoint(); setStartpoint(v); } RS_Entity const* e2 = last(); if (isClosed()) { e2 = prevEntity(); } if (e2 && e2->isAtomic()) { RS_Vector const& v = e2->getEndpoint(); setEndpoint(v); } }
/** * Returns the prev entity or container or \p nullptr if the last entity * returned by \p prev() was the first entity in the container. */ RS_Entity* RS_EntityContainer::prevEntity(RS2::ResolveLevel level) { //set entIdx pointing in prev entity and check if is out of range --entIdx; switch (level) { case RS2::ResolveNone: if (entIdx >= 0) return entities.at(entIdx); break; case RS2::ResolveAllButInserts: { RS_Entity* e=nullptr; if (subContainer) { e = subContainer->prevEntity(level); if (e) { return e; } else { if (entIdx >= 0) e = entities.at(entIdx); } } else { if (entIdx >= 0) e = entities.at(entIdx); } if (e && e->isContainer() && e->rtti()!=RS2::EntityInsert) { subContainer = (RS_EntityContainer*)e; e = ((RS_EntityContainer*)e)->lastEntity(level); // emtpy container: if (!e) { subContainer = nullptr; e = prevEntity(level); } } return e; } case RS2::ResolveAllButTextImage: case RS2::ResolveAllButTexts: { RS_Entity* e=nullptr; if (subContainer) { e = subContainer->prevEntity(level); if (e) { return e; } else { if (entIdx >= 0) e = entities.at(entIdx); } } else { if (entIdx >= 0) e = entities.at(entIdx); } if (e && e->isContainer() && e->rtti()!=RS2::EntityText && e->rtti()!=RS2::EntityMText) { subContainer = (RS_EntityContainer*)e; e = ((RS_EntityContainer*)e)->lastEntity(level); // emtpy container: if (!e) { subContainer = nullptr; e = prevEntity(level); } } return e; } case RS2::ResolveAll: { RS_Entity* e=nullptr; if (subContainer) { e = subContainer->prevEntity(level); if (e) { ++entIdx; //return a sub-entity, index not advanced return e; } else { if (entIdx >= 0) e = entities.at(entIdx); } } else { if (entIdx >= 0) e = entities.at(entIdx); } if (e && e->isContainer()) { subContainer = (RS_EntityContainer*)e; e = ((RS_EntityContainer*)e)->lastEntity(level); // emtpy container: if (!e) { subContainer = nullptr; e = prevEntity(level); } } return e; } } return nullptr; }