std::ostream& operator << (std::ostream& os, RS_UndoCycle& uc) { os << " Undo item: " << "\n"; //os << " Type: "; /*switch (i.type) { case RS2::UndoAdd: os << "RS2::UndoAdd"; break; case RS2::UndoDel: os << "RS2::UndoDel"; break; }*/ os << " Undoable ids: "; for (auto u: uc.undoables) { if (u->undoRtti()==RS2::UndoableEntity) { RS_Entity* e = (RS_Entity*)u; os << e->getId() << (u->isUndone() ? "*" : "") << " "; } else { os << "|"; } } return os; }
void RS_ActionDrawLineOrthTan::mouseMoveEvent(QMouseEvent* e) { RS_DEBUG->print("RS_ActionDrawLineOrthTan::mouseMoveEvent begin"); if( getStatus() != SetCircle ) return; RS_Vector mouse(graphicView->toGraphX(e->x()), graphicView->toGraphY(e->y())); RS_Entity* en ; en = catchEntity(e, circleList, RS2::ResolveAll); if (en!=NULL && (en->rtti()==RS2::EntityCircle || en->rtti()==RS2::EntityArc || en->rtti()==RS2::EntityEllipse)) { circle = en; RS_Creation creation(NULL, NULL); RS_Line* t = creation.createLineOrthTan(mouse, normal, circle); if (t!=NULL) { if (tangent!=NULL) { delete tangent; tangent=NULL; } tangent = (RS_Line*)t->clone(); deletePreview(); preview->addEntity(t); drawPreview(); } } RS_DEBUG->print("RS_ActionDrawLineOrthTan::mouseMoveEvent end"); }
void RS_ActionDrawLineBisector::mouseReleaseEvent(QMouseEvent* e) { if (e->button()==Qt::RightButton) { deletePreview(); init(getStatus()-1); } else { RS_Vector mouse = RS_Vector(graphicView->toGraphX(e->x()), graphicView->toGraphY(e->y())); switch (getStatus()) { case SetLine1: { coord1 = mouse; RS_Entity* en = catchEntity(e, RS2::ResolveAll); if (en!=NULL && en->rtti()==RS2::EntityLine) { line1 = (RS_Line*)en; } } setStatus(SetLine2); break; case SetLine2: coord2 = mouse; trigger(); setStatus(SetLine1); break; } } }
void RS_ActionToolRegenerateDimensions::trigger() { RS_DEBUG->print("RS_ActionToolRegenerateDimensions::trigger()"); int num = 0; for (RS_Entity* e = container->firstEntity(RS2::ResolveNone); e != NULL; e = container->nextEntity(RS2::ResolveNone)) { if (RS_Information::isDimension(e->rtti()) && e->isVisible()) { num++; if (((RS_Dimension*)e)->getLabel()==";;") { ((RS_Dimension*)e)->setLabel(""); } ((RS_Dimension*)e)->update(true); } } if (num>0) { graphicView->redraw(); RS_DIALOGFACTORY->commandMessage( tr("Regenerated %1 dimension entities").arg(num)); } else { RS_DIALOGFACTORY->commandMessage(tr("No dimension entities found")); } finish(); }
/** * Constructor. */ RS_ActionPARISDebugCreateContainer::RS_ActionPARISDebugCreateContainer( RS_EntityContainer& container, RS_GraphicView& graphicView) : RS_ActionInterface("rs_actionparischeckcont", container, graphicView) { //QMessageBox::about(NULL, "info", "check container"); RS_Document* theDoc = (RS_Document*) &container; if (theDoc->countSelected() < 2) { return; } RS_EntityContainer* con = new RS_EntityContainer(theDoc, true); RS_PtrListIterator<RS_Entity> it = theDoc->createIterator(); RS_Entity* e; while ( (e = it.current()) != 0) { ++it; if (e->isSelected()) { con->addEntity(e); e->setParent(con); } } theDoc -> addEntity(con); }
/** * Returns the last entity or \p NULL if this graphic is empty. * * @param level \li \p 0 Groups are not resolved * \li \p 1 (default) only Groups are resolved * \li \p 2 all Entity Containers are resolved */ RS_Entity* RS_EntityContainer::lastEntity(RS2::ResolveLevel level) { switch (level) { case RS2::ResolveNone: return entities.last(); break; case RS2::ResolveAllButInserts: { RS_Entity* e = entities.last(); subContainer = NULL; if (e!=NULL && e->isContainer() && e->rtti()!=RS2::EntityInsert) { subContainer = (RS_EntityContainer*)e; e = ((RS_EntityContainer*)e)->lastEntity(level); } return e; } break; case RS2::ResolveAll: { RS_Entity* e = entities.last(); subContainer = NULL; if (e!=NULL && e->isContainer()) { subContainer = (RS_EntityContainer*)e; e = ((RS_EntityContainer*)e)->lastEntity(level); } return e; } break; } return NULL; }
/** * @return The point which is closest to 'coord' * (one of the vertexes) */ RS_Vector RS_EntityContainer::getNearestEndpoint(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_PtrListIterator<RS_Entity> it = createIterator(); //RS_Entity* en; //while ( (en = it.current()) != NULL ) { // ++it; for (RS_Entity* en = firstEntity(); en != NULL; en = nextEntity()) { if (en->isVisible()) { point = en->getNearestEndpoint(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; }
/** * Renames all inserts with name 'oldName' to 'newName'. This is * called after a block was rename to update the inserts. */ void RS_EntityContainer::renameInserts(const RS_String& oldName, const RS_String& newName) { RS_DEBUG->print("RS_EntityContainer::renameInserts()"); //for (RS_Entity* e=firstEntity(RS2::ResolveNone); // e!=NULL; // e=nextEntity(RS2::ResolveNone)) { RS_PtrListIterator<RS_Entity> it = createIterator(); RS_Entity* e; while ( (e = it.current()) != NULL ) { ++it; if (e->rtti()==RS2::EntityInsert) { RS_Insert* i = ((RS_Insert*)e); if (i->getName()==oldName) { i->setName(newName); } } else if (e->isContainer()) { ((RS_EntityContainer*)e)->renameInserts(oldName, newName); } } RS_DEBUG->print("RS_EntityContainer::renameInserts() OK"); }
/** * Catches an entity which is close to the given position 'pos'. * * @param pos A graphic coordinate. * @param level The level of resolving for iterating through the entity * container * @enType, only search for a particular entity type * @return Pointer to the entity or nullptr. */ RS_Entity* RS_Snapper::catchEntity(const RS_Vector& pos, RS2::EntityType enType, RS2::ResolveLevel level) { RS_DEBUG->print("RS_Snapper::catchEntity"); // std::cout<<"RS_Snapper::catchEntity(): enType= "<<enType<<std::endl; // set default distance for points inside solids RS_EntityContainer ec(nullptr,false); //isContainer bool isContainer{false}; switch(enType){ case RS2::EntityPolyline: case RS2::EntityContainer: case RS2::EntitySpline: isContainer=true; break; default: break; } for(RS_Entity* en= container->firstEntity(level);en;en=container->nextEntity(level)){ if(en->isVisible()==false) continue; if(en->rtti() != enType && isContainer){ //whether this entity is a member of member of the type enType RS_Entity* parent(en->getParent()); bool matchFound{false}; while(parent ) { // std::cout<<"RS_Snapper::catchEntity(): parent->rtti()="<<parent->rtti()<<" enType= "<<enType<<std::endl; if(parent->rtti() == enType) { matchFound=true; ec.addEntity(en); break; } parent=parent->getParent(); } if(!matchFound) continue; } if (en->rtti() == enType){ ec.addEntity(en); } } if (ec.count() == 0 ) return nullptr; double dist(0.); RS_Entity* entity = ec.getNearestEntity(pos, &dist, RS2::ResolveNone); int idx = -1; if (entity && entity->getParent()) { idx = entity->getParent()->findEntity(entity); } if (entity && dist<=getSnapRange()) { // highlight: RS_DEBUG->print("RS_Snapper::catchEntity: found: %d", idx); return entity; } else { RS_DEBUG->print("RS_Snapper::catchEntity: not found"); return nullptr; } }
/** * Detaches shallow copies and creates deep copies of all subentities. * This is called after cloning entity containers. */ void RS_EntityContainer::detach() { QList<RS_Entity*> tmp; bool autoDel = isOwner(); RS_DEBUG->print("RS_EntityContainer::detach: autoDel: %d", (int)autoDel); setOwner(false); // make deep copies of all entities: for (RS_Entity* e=firstEntity(); e!=NULL; e=nextEntity()) { if (!e->getFlag(RS2::FlagTemp)) { tmp.append(e->clone()); } } // clear shared pointers: entities.clear(); setOwner(autoDel); // point to new deep copies: for (int i = 0; i < tmp.size(); ++i) { RS_Entity* e = tmp.at(i); entities.append(e); e->reparent(this); } }
void RS_ActionDrawLineTangent2::trigger() { RS_PreviewActionInterface::trigger(); if (tangent!=NULL) { RS_Entity* newEntity = NULL; newEntity = new RS_Line(container, tangent->getData()); if (newEntity!=NULL) { newEntity->setLayerToActive(); newEntity->setPenToActive(); container->addEntity(newEntity); // upd. undo list: if (document!=NULL) { document->startUndoCycle(); document->addUndoable(newEntity); document->endUndoCycle(); } circle1->setHighlighted(false); graphicView->redraw(RS2::RedrawDrawing); setStatus(SetCircle1); } delete tangent; tangent = NULL; } else { RS_DEBUG->print("RS_ActionDrawLineTangent2::trigger:" " Entity is NULL\n"); } }
void RS_ActionDrawLineTangent2::trigger() { RS_PreviewActionInterface::trigger(); RS_Entity* newEntity = NULL; newEntity = new RS_Line(container, *lineData); if (newEntity!=NULL) { newEntity->setLayerToActive(); newEntity->setPenToActive(); container->addEntity(newEntity); // upd. undo list: if (document!=NULL) { document->startUndoCycle(); document->addUndoable(newEntity); document->endUndoCycle(); } if(circle1!=NULL){ circle1->setHighlighted(false); graphicView->redraw(RS2::RedrawDrawing); circle1=NULL; } setStatus(SetCircle1); } tangent.reset(); }
/** * Slightly optimized drawing for polylines. */ void RS_Polyline::draw(RS_Painter* painter,RS_GraphicView* view, double /*patternOffset*/) { if (view==NULL) { return; } // draw first entity and set correct pen: RS_Entity* e = firstEntity(RS2::ResolveNone); // We get the pen from the entitycontainer and apply it to the // first line so that subsequent line are draw in the right color RS_Pen p=this->getPen(true); //prevent segfault if polyline is empty if (e != NULL) { e->setPen(p); view->drawEntity(painter, e); // draw subsequent entities with same pen: for (RS_Entity* e=nextEntity(RS2::ResolveNone); e!=NULL; e = nextEntity(RS2::ResolveNone)) { view->drawEntityPlain(painter, e); } } }
void LC_MakerCamSVG::writePolyline(RS_Polyline* polyline) { RS_DEBUG->print("RS_MakerCamSVG::writePolyline: Writing polyline ..."); std::string path = svgPathMoveTo(convertToSvg(polyline->getStartpoint())); for (RS_Entity* entity = polyline->firstEntity(RS2::ResolveNone); entity != NULL; entity = polyline->nextEntity(RS2::ResolveNone)) { if (!entity->isAtomic()) { continue; } if (entity->rtti() == RS2::EntityArc) { path += svgPathArc((RS_Arc*)entity); } else { path += svgPathLineTo(convertToSvg(entity->getEndpoint())); } } if (polyline->isClosed()) { path += svgPathClose(); } xmlWriter->addElement("path", NAMESPACE_URI_SVG); xmlWriter->addAttribute("d", path); xmlWriter->closeElement(); }
/** * Adds all entities in the given range and those which have endpoints * in the given range to the preview. */ void RS_Preview::addStretchablesFrom(RS_EntityContainer& container, const RS_Vector& v1, const RS_Vector& v2) { int c=0; for (RS_Entity* e=container.firstEntity(); e!=NULL; e=container.nextEntity()) { if (e->isVisible() && e->rtti()!=RS2::EntityHatch && ((e->isInWindow(v1, v2)) || e->hasEndpointsWithinWindow(v1, v2)) && c<maxEntities) { RS_Entity* clone = e->clone(); //clone->setSelected(false); clone->reparent(this); c+=clone->countDeep(); addEntity(clone); // clone might be NULL after this point } } }
/** * Catches an entity which is close to the given position 'pos'. * * @param pos A graphic coordinate. * @param level The level of resolving for iterating through the entity * container * @return Pointer to the entity or NULL. */ RS_Entity* RS_Snapper::catchEntity(const RS_Vector& pos, RS2::ResolveLevel level) { RS_DEBUG->print("RS_Snapper::catchEntity"); // set default distance for points inside solids double dist = graphicView->toGraphDX(snapRange)*0.9; RS_Entity* entity = container->getNearestEntity(pos, &dist, level); int idx = -1; if (entity!=NULL && entity->getParent()!=NULL) { idx = entity->getParent()->findEntity(entity); } if (entity!=NULL && dist<=graphicView->toGraphDX(snapRange)) { // highlight: RS_DEBUG->print("RS_Snapper::catchEntity: found: %d", idx); return entity; } else { RS_DEBUG->print("RS_Snapper::catchEntity: not found"); return NULL; } RS_DEBUG->print("RS_Snapper::catchEntity: OK"); }
/** * Implementation of update. Updates the arrow. */ void RS_Leader::update() { // find and delete arrow: for (RS_Entity* e=firstEntity(); e!=NULL; e=nextEntity()) { if (e->rtti()==RS2::EntitySolid) { removeEntity(e); break; } } if (isUndone()) { setVisible(false); return; } RS_Entity* fe = firstEntity(); if (fe!=NULL && fe->isAtomic()) { RS_Vector p1 = ((RS_AtomicEntity*)fe)->getStartpoint(); RS_Vector p2 = ((RS_AtomicEntity*)fe)->getEndpoint(); // first entity must be the line which gets the arrow: if (hasArrowHead()) { RS_Solid* s = new RS_Solid(this, RS_SolidData()); s->shapeArrow(p1, p2.angleTo(p1), getGraphicVariableDouble("$DIMASZ", 2.5)); s->setPen(RS_Pen(RS2::FlagInvalid)); s->setLayer(NULL); RS_EntityContainer::addEntity(s); } } }
RS_Entity* RS_ActionDrawCircleTan2_1P::catchCircle(QMouseEvent* e) { RS_Entity* ret=NULL; RS_Entity* en = catchEntity(e,enTypeList, RS2::ResolveAll); if(en == NULL) return ret; if(en->isVisible()==false) return ret; for(int i=0; i<circles.size(); ++i) { if(circles[i]) if(en->getId() == circles[i]->getId()) return ret; //do not pull in the same line again } if(en->getParent() != NULL) { if ( en->getParent()->rtti() == RS2::EntityInsert /**Insert*/ || en->getParent()->rtti() == RS2::EntitySpline || en->getParent()->rtti() == RS2::EntityMText /**< Text 15*/ || en->getParent()->rtti() == RS2::EntityText /**< Text 15*/ || en->getParent()->rtti() == RS2::EntityDimAligned /**< Aligned Dimension */ || en->getParent()->rtti() == RS2::EntityDimLinear /**< Linear Dimension */ || en->getParent()->rtti() == RS2::EntityDimRadial /**< Radial Dimension */ || en->getParent()->rtti() == RS2::EntityDimDiametric /**< Diametric Dimension */ || en->getParent()->rtti() == RS2::EntityDimAngular /**< Angular Dimension */ || en->getParent()->rtti() == RS2::EntityDimLeader /**< Leader Dimension */ ){ return ret; } } return en; }
/** * Implementation of update. Updates the arrow. */ void RS_Leader::update() { // find and delete arrow: for(auto e: entities){ if (e->rtti()==RS2::EntitySolid) { removeEntity(e); break; } } if (isUndone()) { return; } RS_Entity* fe = firstEntity(); if (fe && fe->isAtomic()) { RS_Vector p1 = ((RS_AtomicEntity*)fe)->getStartpoint(); RS_Vector p2 = ((RS_AtomicEntity*)fe)->getEndpoint(); // first entity must be the line which gets the arrow: if (hasArrowHead()) { RS_Solid* s = new RS_Solid(this, RS_SolidData()); s->shapeArrow(p1, p2.angleTo(p1), getGraphicVariableDouble("$DIMASZ", 2.5)* getGraphicVariableDouble("$DIMSCALE", 1.0)); s->setPen(RS_Pen(RS2::FlagInvalid)); s->setLayer(nullptr); RS_EntityContainer::addEntity(s); } } calculateBorders(); }
void RS_ActionModifyEntity::trigger() { if (en) { RS_Entity* clone = en->clone(); if (RS_DIALOGFACTORY->requestModifyEntityDialog(clone)) { container->addEntity(clone); graphicView->deleteEntity(en); en->setSelected(false); clone->setSelected(false); graphicView->drawEntity(clone); if (document) { document->startUndoCycle(); document->addUndoable(clone); en->setUndoState(true); document->addUndoable(en); document->endUndoCycle(); } RS_DIALOGFACTORY->updateSelectionWidget(container->countSelected(),container->totalSelectedLength()); } else { delete clone; } } else { RS_DEBUG->print("RS_ActionModifyEntity::trigger: Entity is NULL\n"); } }
/** * Catches an entity which is close to the given position 'pos'. * * @param pos A graphic coordinate. * @param level The level of resolving for iterating through the entity * container * @return Pointer to the entity or NULL. */ RS_Entity* RS_Snapper::catchEntity(const RS_Vector& pos, RS2::ResolveLevel level) { RS_DEBUG->print("RS_Snapper::catchEntity"); // set default distance for points inside solids double dist (0.); // std::cout<<"getSnapRange()="<<getSnapRange()<<"\tsnap distance = "<<dist<<std::endl; RS_Entity* entity = container->getNearestEntity(pos, &dist, level); int idx = -1; if (entity!=NULL && entity->getParent()!=NULL) { idx = entity->getParent()->findEntity(entity); } if (entity!=NULL && dist<=getSnapRange()) { // highlight: RS_DEBUG->print("RS_Snapper::catchEntity: found: %d", idx); return entity; } else { RS_DEBUG->print("RS_Snapper::catchEntity: not found"); return NULL; } RS_DEBUG->print("RS_Snapper::catchEntity: OK"); }
RS_Entity* RS_EntityContainer::getNearestEntity(const RS_Vector& coord, double* dist, RS2::ResolveLevel level) const{ RS_DEBUG->print("RS_EntityContainer::getNearestEntity"); RS_Entity* e = nullptr; // distance for points inside solids: double solidDist = RS_MAXDOUBLE; if (dist) { solidDist = *dist; } double d = getDistanceToPoint(coord, &e, level, solidDist); if (e && e->isVisible()==false) { e = nullptr; } // if d is negative, use the default distance (used for points inside solids) if (dist) { *dist = d; } RS_DEBUG->print("RS_EntityContainer::getNearestEntity: OK"); return e; }
void RS_ActionDrawEllipseInscribe::mouseMoveEvent(QMouseEvent* e) { RS_DEBUG->print("RS_ActionDrawEllipse4Line::mouseMoveEvent begin"); if(getStatus() == SetLine4) { RS_Entity* en = catchEntity(e, RS2::EntityLine, RS2::ResolveAll); if(!en) return; if(!(en->isVisible() && en->rtti()== RS2::EntityLine)) return; for(auto p: lines){ if(en == p) return; //do not pull in the same line again } if(en->getParent() && en->getParent()->ignoredOnModification()){ return; } deletePreview(); clearLines(true); lines.push_back(static_cast<RS_Line*>(en)); if(preparePreview()) { lines.back()->setHighlighted(true); graphicView->drawEntity(lines.back()); RS_Ellipse* e=new RS_Ellipse(preview.get(), *eData); preview->addEntity(e); drawPreview(); } } RS_DEBUG->print("RS_ActionDrawEllipse4Line::mouseMoveEvent end"); }
/** * Slightly optimized drawing for polylines. */ void RS_Polyline::draw(RS_Painter* painter,RS_GraphicView* view, double& /*patternOffset*/) { if (view==NULL) { return; } // draw first entity and set correct pen: RS_Entity* e = firstEntity(RS2::ResolveNone); // We get the pen from the entitycontainer and apply it to the // first line so that subsequent line are draw in the right color //prevent segfault if polyline is empty if (e != NULL) { RS_Pen p=this->getPen(true); e->setPen(p); double patternOffset=0.; view->drawEntity(painter, e, patternOffset); e = nextEntity(RS2::ResolveNone); while(e!=NULL) { view->drawEntityPlain(painter, e, patternOffset); e = nextEntity(RS2::ResolveNone); //RS_DEBUG->print("offset: %f\nlength was: %f", offset, e->getLength()); } } }
void RS_ActionDrawLineBisector::mouseReleaseEvent(QMouseEvent* e) { if (e->button()==Qt::RightButton) { deletePreview(); init(getStatus()-1); } else { RS_Vector mouse = RS_Vector(graphicView->toGraphX(e->x()), graphicView->toGraphY(e->y())); switch (getStatus()) { case SetLine1: { coord1 = mouse; RS_Entity* en = catchEntity(e, RS2::ResolveAll); if (en && en->rtti()==RS2::EntityLine) { line1 = static_cast<RS_Line*>(en); line1->setHighlighted(true); graphicView->redraw(RS2::RedrawDrawing); line2=nullptr; setStatus(SetLine2); } } break; case SetLine2: coord2 = mouse; trigger(); setStatus(SetLine1); break; } } }
/** * Loads the given pattern file into this pattern. * Entities other than lines are ignored. * * @param filename File name of the pattern file (without path and * extension or full path. */ bool RS_Pattern::loadPattern() { if (loaded) { return true; } RS_DEBUG->print("RS_Pattern::loadPattern"); QString path; // Search for the appropriate pattern if we have only the name of the pattern: if (!fileName.toLower().contains(".dxf")) { QStringList patterns = RS_SYSTEM->getPatternList(); QFileInfo file; for (QStringList::Iterator it = patterns.begin(); it!=patterns.end(); it++) { if (QFileInfo(*it).baseName().toLower()==fileName.toLower()) { path = *it; RS_DEBUG->print("Pattern found: %s", path.toLatin1().data()); break; } } } // We have the full path of the pattern: else { path = fileName; } // No pattern paths found: if (path.isEmpty()) { RS_DEBUG->print("No pattern \"%s\"available.", fileName.toLatin1().data()); return false; } RS_Graphic* gr = new RS_Graphic(); // TODO: Find out why the new dxf filter doesn't work for patterns: RS_FILEIO->fileImport(*gr, path, RS2::FormatDXF1); for (RS_Entity* e=gr->firstEntity(); e!=NULL; e=gr->nextEntity()) { if (e->rtti()==RS2::EntityLine || e->rtti()==RS2::EntityArc) { RS_Layer* l = e->getLayer(); RS_Entity* cl = e->clone(); cl->reparent(this); if (l!=NULL) { cl->setLayer(l->getName()); } addEntity(cl); } } delete gr; loaded = true; RS_DEBUG->print("RS_Pattern::loadPattern: OK"); return true; }
/** * Clones the given entity and adds the clone to the preview. */ void RS_Preview::addCloneOf(RS_Entity* entity) { if (!entity) { return; } RS_Entity* clone = entity->clone(); clone->reparent(this); addEntity(clone); }
/** * @return The bulge of the closing entity. */ double RS_Polyline::getClosingBulge() { if (isClosed()) { RS_Entity* e = lastEntity(); if (e!=NULL && e->rtti()==RS2::EntityArc) { return ((RS_Arc*)e)->getBulge(); } } return 0.0; }
/** * Loads the given pattern file into this pattern. * Entities other than lines are ignored. * * @param filename File name of the pattern file (without path and * extension or full path. */ bool RS_Pattern::loadPattern() { if (loaded) { return true; } RS_DEBUG->print("RS_Pattern::loadPattern"); QString path; // Search for the appropriate pattern if we have only the name of the pattern: if (!fileName.toLower().contains(".dxf")) { QStringList patterns = RS_SYSTEM->getPatternList(); QFileInfo file; for (QStringList::Iterator it = patterns.begin(); it!=patterns.end(); it++) { if (QFileInfo(*it).baseName().toLower()==fileName.toLower()) { path = *it; RS_DEBUG->print("Pattern found: %s", path.toLatin1().data()); break; } } } // We have the full path of the pattern: else { path = fileName; } // No pattern paths found: if (path.isEmpty()) { RS_DEBUG->print("No pattern \"%s\"available.", fileName.toLatin1().data()); return false; } RS_Graphic gr; RS_FileIO::instance()->fileImport(gr, path); for(auto e: gr){ if (e->rtti()==RS2::EntityLine || e->rtti()==RS2::EntityArc) { RS_Layer* l = e->getLayer(); RS_Entity* cl = e->clone(); cl->reparent(this); if (l) { cl->setLayer(l->getName()); } addEntity(cl); } } loaded = true; RS_DEBUG->print("RS_Pattern::loadPattern: OK"); return true; }