⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs_entitycontainer.cpp

📁 qcad2.05可用于windows和linux的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
       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 + -