📄 rs_entitycontainer.cpp
字号:
double minDist = RS_MAXDOUBLE; // minimum measured distance double curDist; // currently measured distance RS_Vector closestPoint; // closest found endpoint RS_Vector point; // endpoint found for (RS_Entity* en = firstEntity(); en != NULL; en = nextEntity()) { if (en->isVisible()) { point = en->getNearestMiddle(coord, &curDist); if (curDist<minDist) { closestPoint = point; minDist = curDist; if (dist!=NULL) { *dist = curDist; } } } } return closestPoint; */}RS_Vector RS_EntityContainer::getNearestDist(double distance, const RS_Vector& coord, double* dist) { RS_Vector point(false); RS_Entity* closestEntity; closestEntity = getNearestEntity(coord, NULL, RS2::ResolveNone); if (closestEntity!=NULL) { point = closestEntity->getNearestDist(distance, coord, dist); } return point;}/** * @return The intersection which is closest to 'coord' */RS_Vector RS_EntityContainer::getNearestIntersection(const RS_Vector& coord, double* dist) { double minDist = RS_MAXDOUBLE; // minimum measured distance double curDist; // currently measured distance RS_Vector closestPoint(false); // closest found endpoint RS_Vector point; // endpoint found RS_VectorSolutions sol; RS_Entity* closestEntity; closestEntity = getNearestEntity(coord, NULL, RS2::ResolveAll); if (closestEntity!=NULL) { for (RS_Entity* en = firstEntity(RS2::ResolveAll); en != NULL; en = nextEntity(RS2::ResolveAll)) { if (en->isVisible() && en!=closestEntity) { sol = RS_Information::getIntersection(closestEntity, en, true); for (int i=0; i<4; i++) { point = sol.get(i); if (point.valid) { curDist = coord.distanceTo(point); if (curDist<minDist) { closestPoint = point; minDist = curDist; if (dist!=NULL) { *dist = curDist; } } } } } } //} } return closestPoint;}RS_Vector RS_EntityContainer::getNearestRef(const RS_Vector& coord, double* dist) { double minDist = RS_MAXDOUBLE; // minimum measured distance double curDist; // currently measured distance RS_Vector closestPoint(false); // closest found endpoint RS_Vector point; // endpoint found for (RS_Entity* en = firstEntity(); en != NULL; en = nextEntity()) { if (en->isVisible()) { point = en->getNearestRef(coord, &curDist); if (point.valid && curDist<minDist) { closestPoint = point; minDist = curDist; if (dist!=NULL) { *dist = curDist; } } } } return closestPoint;}RS_Vector RS_EntityContainer::getNearestSelectedRef(const RS_Vector& coord, double* dist) { double minDist = RS_MAXDOUBLE; // minimum measured distance double curDist; // currently measured distance RS_Vector closestPoint(false); // closest found endpoint RS_Vector point; // endpoint found for (RS_Entity* en = firstEntity(); en != NULL; en = nextEntity()) { if (en->isVisible() && en->isSelected() && !en->isParentSelected()) { point = en->getNearestSelectedRef(coord, &curDist); if (point.valid && curDist<minDist) { closestPoint = point; minDist = curDist; if (dist!=NULL) { *dist = curDist; } } } } return closestPoint;}double RS_EntityContainer::getDistanceToPoint(const RS_Vector& coord, RS_Entity** entity, RS2::ResolveLevel level, double solidDist) { RS_DEBUG->print("RS_EntityContainer::getDistanceToPoint"); double minDist = RS_MAXDOUBLE; // minimum measured distance double curDist; // currently measured distance RS_Entity* closestEntity = NULL; // closest entity found RS_Entity* subEntity = NULL; //int k=0; for (RS_Entity* e = firstEntity(level); e != NULL; e = nextEntity(level)) { if (e->isVisible()) { RS_DEBUG->print("entity: getDistanceToPoint"); RS_DEBUG->print("entity: %d", e->rtti()); curDist = e->getDistanceToPoint(coord, &subEntity, level, solidDist); RS_DEBUG->print("entity: getDistanceToPoint: OK"); if (curDist<minDist) { if (level!=RS2::ResolveAll) { closestEntity = e; } else { closestEntity = subEntity; } minDist = curDist; } } } if (entity!=NULL) { *entity = closestEntity; } RS_DEBUG->print("RS_EntityContainer::getDistanceToPoint: OK"); return minDist;}RS_Entity* RS_EntityContainer::getNearestEntity(const RS_Vector& coord, double* dist, RS2::ResolveLevel level) { RS_DEBUG->print("RS_EntityContainer::getNearestEntity"); RS_Entity* e = NULL; // distance for points inside solids: double solidDist = RS_MAXDOUBLE; if (dist!=NULL) { solidDist = *dist; } double d = getDistanceToPoint(coord, &e, level, solidDist); if (e!=NULL && e->isVisible()==false) { e = NULL; } // if d is negative, use the default distance (used for points inside solids) if (dist!=NULL) { *dist = d; } RS_DEBUG->print("RS_EntityContainer::getNearestEntity: OK"); return e;}/** * Rearranges the atomic entities in this container in a way that connected * entities are stored in the right order and direction. * Non-recoursive. Only affects atomic entities in this container. * * @retval true all contours were closed * @retval false at least one contour is not closed */bool RS_EntityContainer::optimizeContours() { RS_DEBUG->print("RS_EntityContainer::optimizeContours"); RS_Vector current(false); RS_Vector start(false); RS_EntityContainer tmp; bool changed = false; bool closed = true; for (uint ci=0; ci<count(); ++ci) { RS_Entity* e1=entityAt(ci); if (e1!=NULL && e1->isEdge() && !e1->isContainer() && !e1->isProcessed()) { RS_AtomicEntity* ce = (RS_AtomicEntity*)e1; // next contour start: ce->setProcessed(true); tmp.addEntity(ce->clone()); current = ce->getEndpoint(); start = ce->getStartpoint(); // find all connected entities: bool done; do { done = true; for (uint ei=0; ei<count(); ++ei) { RS_Entity* e2=entityAt(ei); if (e2!=NULL && e2->isEdge() && !e2->isContainer() && !e2->isProcessed()) { RS_AtomicEntity* e = (RS_AtomicEntity*)e2; if (e->getStartpoint().distanceTo(current) < 1.0e-4) { e->setProcessed(true); tmp.addEntity(e->clone()); current = e->getEndpoint(); done=false; } else if (e->getEndpoint().distanceTo(current) < 1.0e-4) { e->setProcessed(true); RS_AtomicEntity* cl = (RS_AtomicEntity*)e->clone(); cl->reverse(); tmp.addEntity(cl); current = cl->getEndpoint(); changed = true; done=false; } } } if (!done) { changed = true; } } while (!done); if (current.distanceTo(start)>1.0e-4) { closed = false; } } } // remove all atomic entities: bool done; do { done = true; for (RS_Entity* en=firstEntity(); en!=NULL; en=nextEntity()) { if (!en->isContainer()) { removeEntity(en); done = false; break; } } } while (!done); // add new sorted entities: for (RS_Entity* en=tmp.firstEntity(); en!=NULL; en=tmp.nextEntity()) { en->setProcessed(false); addEntity(en->clone()); } RS_DEBUG->print("RS_EntityContainer::optimizeContours: OK"); return closed;}bool RS_EntityContainer::hasEndpointsWithinWindow(RS_Vector v1, RS_Vector v2) { for (RS_Entity* e=firstEntity(RS2::ResolveNone); e!=NULL; e=nextEntity(RS2::ResolveNone)) { if (e->hasEndpointsWithinWindow(v1, v2)) { return true; } } return false;}void RS_EntityContainer::move(RS_Vector offset) { for (RS_Entity* e=firstEntity(RS2::ResolveNone); e!=NULL; e=nextEntity(RS2::ResolveNone)) { e->move(offset); } if (autoUpdateBorders) { calculateBorders(); }}void RS_EntityContainer::rotate(RS_Vector center, double angle) { for (RS_Entity* e=firstEntity(RS2::ResolveNone); e!=NULL; e=nextEntity(RS2::ResolveNone)) { e->rotate(center, angle); } if (autoUpdateBorders) { calculateBorders(); }}void RS_EntityContainer::scale(RS_Vector center, RS_Vector factor) { if (fabs(factor.x)>RS_TOLERANCE && fabs(factor.y)>RS_TOLERANCE) { for (RS_Entity* e=firstEntity(RS2::ResolveNone); e!=NULL; e=nextEntity(RS2::ResolveNone)) { e->scale(center, factor); } } if (autoUpdateBorders) { calculateBorders(); }}void RS_EntityContainer::mirror(RS_Vector axisPoint1, RS_Vector axisPoint2) { if (axisPoint1.distanceTo(axisPoint2)>1.0e-6) { for (RS_Entity* e=firstEntity(RS2::ResolveNone); e!=NULL; e=nextEntity(RS2::ResolveNone)) { e->mirror(axisPoint1, axisPoint2); } }}void RS_EntityContainer::stretch(RS_Vector firstCorner, RS_Vector secondCorner, RS_Vector offset) { if (getMin().isInWindow(firstCorner, secondCorner) && getMax().isInWindow(firstCorner, secondCorner)) { move(offset); } else { for (RS_Entity* e=firstEntity(RS2::ResolveNone); e!=NULL; e=nextEntity(RS2::ResolveNone)) { e->stretch(firstCorner, secondCorner, offset); } } // some entitiycontainers might need an update (e.g. RS_Leader): update();}void RS_EntityContainer::moveRef(const RS_Vector& ref, const RS_Vector& offset) { for (RS_Entity* e=firstEntity(RS2::ResolveNone); e!=NULL; e=nextEntity(RS2::ResolveNone)) { e->moveRef(ref, offset); } if (autoUpdateBorders) { calculateBorders(); }}void RS_EntityContainer::moveSelectedRef(const RS_Vector& ref, const RS_Vector& offset) { for (RS_Entity* e=firstEntity(RS2::ResolveNone); e!=NULL; e=nextEntity(RS2::ResolveNone)) { e->moveSelectedRef(ref, offset); } if (autoUpdateBorders) { calculateBorders(); }}void RS_EntityContainer::draw(RS_Painter* painter, RS_GraphicView* view, double /*patternOffset*/) { if (painter==NULL || view==NULL) { return; } for (RS_Entity* e=firstEntity(RS2::ResolveNone); e!=NULL; e = nextEntity(RS2::ResolveNone)) { view->drawEntity(e); }}/** * Dumps the entities to stdout. */std::ostream& operator << (std::ostream& os, RS_EntityContainer& ec) { static int indent = 0; char* tab = new char[indent*2+1]; for(int i=0; i<indent*2; ++i) { tab[i] = ' '; } tab[indent*2] = '\0'; ++indent; unsigned long int id = ec.getId(); os << tab << "EntityContainer[" << id << "]: \n"; os << tab << "Borders[" << id << "]: " << ec.minV << " - " << ec.maxV << "\n"; //os << tab << "Unit[" << id << "]: " //<< RS_Units::unit2string (ec.unit) << "\n"; if (ec.getLayer()!=NULL) { os << tab << "Layer[" << id << "]: " << ec.getLayer()->getName().latin1() << "\n"; } else { os << tab << "Layer[" << id << "]: <NULL>\n"; } //os << ec.layerList << "\n"; os << tab << " Flags[" << id << "]: " << (ec.getFlag(RS2::FlagVisible) ? "RS2::FlagVisible" : ""); os << (ec.getFlag(RS2::FlagUndone) ? " RS2::FlagUndone" : ""); os << (ec.getFlag(RS2::FlagSelected) ? " RS2::FlagSelected" : ""); os << "\n"; os << tab << "Entities[" << id << "]: \n"; for (RS_Entity* t=ec.firstEntity(); t!=NULL; t=ec.nextEntity()) { switch (t->rtti()) { case RS2::EntityInsert: os << tab << *((RS_Insert*)t); os << tab << *((RS_Entity*)t); os << tab << *((RS_EntityContainer*)t); break; default: if (t->isContainer()) { os << tab << *((RS_EntityContainer*)t); } else { os << tab << *t; } break; } } os << tab << "\n\n"; --indent; delete[] tab; return os;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -