void RS_ActionLayersToggleLock::trigger() { RS_DEBUG->print("toggle layer"); if (graphic!=NULL) { RS_Layer* layer = graphic->getActiveLayer(); if (layer!=NULL) { graphic->toggleLayerLock(layer); // deselect entities on locked layer: if (layer->isLocked()) { for (RS_Entity* e=container->firstEntity(); e!=NULL; e=container->nextEntity()) { if (e!=NULL && e->isVisible() && e->getLayer()==layer) { if (graphicView!=NULL) { graphicView->deleteEntity(e); } e->setSelected(false); if (graphicView!=NULL) { graphicView->drawEntity(e); } } } } } } finish(); }
QVariant QG_LayerModel::data ( const QModelIndex & index, int role ) const { if (!index.isValid() || index.row() >= listLayer.size()) return QVariant(); RS_Layer* lay = listLayer.at(index.row()); if (role ==Qt::DecorationRole) { if (index.column() == VISIBLE) { if (!lay->isFrozen()) { return layerVisible; } else { return layerHidden; } } if (index.column() == LOCKED) { if (!lay->isLocked()) { return layerDefreeze; } else { return layerFreeze; } } } if (role ==Qt::DisplayRole && index.column() == NAME) { return lay->getName(); } //Other roles: return QVariant(); }
void Doc_plugin_interface::setCurrentLayerProperties(QColor c, QString w, QString t){ RS_Layer* layer = docGr->getActiveLayer(); if (layer != NULL) { RS_Pen pen(RS_Color(c), Converter.str2lw(w), Converter.str2lt(t)); layer->setPen(pen); } }
void RS_ActionLayersEdit::trigger() { RS_DEBUG->print("RS_ActionLayersEdit::trigger"); RS_Layer* layer = NULL; if (graphic!=NULL) { layer = RS_DIALOGFACTORY->requestEditLayerDialog(graphic->getLayerList()); if (layer!=NULL) { graphic->editLayer(graphic->getActiveLayer(), *layer); // update updateable entities on the layer that has changed for (RS_Entity* e=graphic->firstEntity(RS2::ResolveNone); e!=NULL; e=graphic->nextEntity(RS2::ResolveNone)) { RS_Layer* l = e->getLayer(); if (l!=NULL && l->getName()==layer->getName()) { e->update(); } } } } finish(); graphicView->redraw(); }
/** * Adds a layer to the layer list. * If there is already a layer with the same name, no layer is * added. In that case the layer passed to the methode will be deleted! * If no layer was active so far, the new layer becomes the active one. * * Listeners are notified. */ void RS_LayerList::add(RS_Layer* layer) { RS_DEBUG->print("RS_LayerList::addLayer()"); if (layer==NULL) { return; } // check if layer already exists: RS_Layer* l = find(layer->getName()); if (l==NULL) { layers.append(layer); // notify listeners for (uint i=0; i<layerListListeners.count(); ++i) { RS_LayerListListener* l = layerListListeners.at(i); l->layerAdded(layer); } setModified(true); // if there was no active layer so far, activate this one. if (activeLayer==NULL) { activate(layer); } } else { // if there was no active layer so far, activate this one. if (activeLayer==NULL) { activate(l); } l->setPen(layer->getPen()); delete layer; layer = NULL; } }
void Doc_plugin_interface::setCurrentLayerProperties(QColor c, DPI::LineWidth w, DPI::LineType t){ RS_Layer* layer = docGr->getActiveLayer(); if (layer != NULL) { RS_Pen pen(RS_Color(c), static_cast<RS2::LineWidth>(w), static_cast<RS2::LineType>(t)); layer->setPen(pen); } }
/** * 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; }
/** * 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; }
/** * Selects all entities on the given layer. */ void RS_Selection::selectLayer(RS_Entity* e) { if (e==NULL) { return; } bool select = !e->isSelected(); RS_Layer* layer = e->getLayer(true); if (layer==NULL) { return; } RS_String layerName = layer->getName(); selectLayer(layerName, select); }
/** * Shows a dialog that asks the user if the selected layer * can be removed. Doesn't remove the layer. This is up to the caller. * * @return a pointer to the layer that should be removed. */ RS_Layer* QG_DialogFactory::requestLayerRemovalDialog(RS_LayerList* layerList) { RS_Layer* layer = nullptr; if (!layerList) { RS_DEBUG->print(RS_Debug::D_WARNING, "QG_DialogFactory::requestLayerRemovalDialog(): " "layerList is nullptr"); return nullptr; } /* if (!layerList) { if (container && container->rtti()==RS2::EntityGraphic) { layerList = (RS_LayerList*)container; } else { return nullptr; } }*/ // Layer for parameter livery layer = layerList->getActive(); if (layer) { if (layer->getName()!="0") { QMessageBox msgBox( QMessageBox::Warning, QMessageBox::tr("Remove Layer"), QMessageBox::tr("Layer \"%1\" and all " "entities on it will be removed.\n" "This action can NOT be undone.") .arg(layer->getName()), QMessageBox::Ok | QMessageBox::Cancel); if (msgBox.exec()==QMessageBox::Ok) {} else { layer = nullptr; } } else { QMessageBox::information(parent, QMessageBox::tr("Remove Layer"), QMessageBox::tr("Layer \"%1\" can never " "be removed.") .arg(layer->getName()), QMessageBox::Ok); } } return layer; }
/** * @return Pointer to the layer with the given name or * \p NULL if no such layer was found. */ RS_Layer* RS_LayerList::find(const QString& name) { //RS_DEBUG->print("RS_LayerList::find begin"); RS_Layer* ret = NULL; for (int i=0; i<layers.size(); ++i) { RS_Layer* l = layers.at(i); if (l->getName()==name) { ret = l; break; } } //RS_DEBUG->print("RS_LayerList::find end"); return ret; }
/** * @return Index of the given layer in the layer list or -1 if the layer * was not found. */ int RS_LayerList::getIndex(const QString& name) { //RS_DEBUG->print("RS_LayerList::find begin"); int ret = -1; for (int i=0; i<layers.size(); i++) { RS_Layer* l = layers.at(i); if (l->getName()==name) { ret = i; break; } } //RS_DEBUG->print("RS_LayerList::find end"); return ret; }
/** * Recalculates the borders of this entity container. */ void RS_EntityContainer::calculateBorders() { RS_DEBUG->print("RS_EntityContainer::calculateBorders"); resetBorders(); for (RS_Entity* e=firstEntity(RS2::ResolveNone); e!=NULL; e=nextEntity(RS2::ResolveNone)) { RS_Layer* layer = e->getLayer(); RS_DEBUG->print("RS_EntityContainer::calculateBorders: " "isVisible: %d", (int)e->isVisible()); if (e->isVisible() && (layer==NULL || !layer->isFrozen())) { e->calculateBorders(); adjustBorders(e); } } RS_DEBUG->print("RS_EntityContainer::calculateBorders: size 1: %f,%f", getSize().x, getSize().y); // needed for correcting corrupt data (PLANS.dxf) if (minV.x>maxV.x || minV.x>RS_MAXDOUBLE || maxV.x>RS_MAXDOUBLE || minV.x<RS_MINDOUBLE || maxV.x<RS_MINDOUBLE) { minV.x = 0.0; maxV.x = 0.0; } if (minV.y>maxV.y || minV.y>RS_MAXDOUBLE || maxV.y>RS_MAXDOUBLE || minV.y<RS_MINDOUBLE || maxV.y<RS_MINDOUBLE) { minV.y = 0.0; maxV.y = 0.0; } RS_DEBUG->print("RS_EntityCotnainer::calculateBorders: size: %f,%f", getSize().x, getSize().y); //RS_DEBUG->print(" borders: %f/%f %f/%f", minV.x, minV.y, maxV.x, maxV.y); //printf("borders: %lf/%lf %lf/%lf\n", minV.x, minV.y, maxV.x, maxV.y); //RS_Entity::calculateBorders(); }
/** * Gets the pen needed to draw this entity. * The attributes can also come from the layer this entity is on * if the flags are set accordingly. * * @param resolve true: Resolve the pen to a drawable pen (e.g. the pen * from the layer or parent..) * false: Don't resolve and return a pen or ByLayer, ByBlock, ... * * @return Pen for this entity. */ RS_Pen RS_Entity::getPen(bool resolve) const { if (!resolve) { return pen; } else { RS_Pen p = pen; RS_Layer* l = getLayer(true); // use parental attributes (e.g. vertex of a polyline, block // entities when they are drawn in block documents): if (!p.isValid() || p.getColor().isByBlock()) { if (parent!=NULL) { p = parent->getPen(); } } // use layer attributes: else if (l!=NULL) { // layer is "ByBlock": /*if (layer->getName()=="ByBlock" && getBlockOrInsert()!=NULL) { p = getBlockOrInsert()->getPen(); } else {*/ // use layer's color: if (p.getColor().isByLayer()) { p.setColor(l->getPen().getColor()); } // use layer's width: if (p.getWidth()==RS2::WidthByLayer) { p.setWidth(l->getPen().getWidth()); } // use layer's linetype: if (p.getLineType()==RS2::LineByLayer) { p.setLineType(l->getPen().getLineType()); } //} } return p; } }
/** * Selects all entities on the given layer. */ void RS_Selection::selectLayer(const RS_String& layerName, bool select) { for (RS_Entity* en=container->firstEntity(); en!=NULL; en=container->nextEntity()) { if (en!=NULL && en->isVisible() && en->isSelected()!=select && (en->getLayer()==NULL || en->getLayer()->isLocked()==false)) { RS_Layer* l = en->getLayer(true); if (l!=NULL && l->getName()==layerName) { if (graphicView!=NULL) { graphicView->deleteEntity(en); } en->setSelected(select); if (graphicView!=NULL) { graphicView->drawEntity(en); } } } } }
QVariant QG_LayerModel::data ( const QModelIndex & index, int role ) const { if (!index.isValid() || index.row() >= listLayer.size()) return QVariant(); RS_Layer* lay = listLayer.at(index.row()); if (role ==Qt::DecorationRole) { switch(index.column()){ case VISIBLE: if (!lay->isFrozen()) { return layerVisible; } else { return layerHidden; } case LOCKED: if (!lay->isLocked()) { return layerDefreeze; } else { return layerFreeze; } case HelpLayer: return helpLayer.pixmap(QSize(20,20),lay->isHelpLayer() ? QIcon::Disabled: QIcon::Normal, QIcon::On); default: break; } } if (role ==Qt::DisplayRole && index.column() == NAME) { return lay->getName(); } //Other roles: return QVariant(); }
/** * Sets the layer shown in the combobox to the given layer. */ void QG_LayerBox::setLayer(RS_Layer& layer) { currentLayer = &layer; //if (layer.getName()=="ByBlock" && showByBlock) { // setCurrentItem(0); //} else { int i = findText(layer.getName()); setCurrentIndex(i); //} //if (currentItem()!=7+(int)showByBlock*2) { slotLayerChanged(currentIndex()); //} }
/** * Initialisation (called manually only once). * * @param layerList Layer list which provides the layer names that are * available. * @param showByBlock true: Show attribute ByBlock. */ void QG_LayerBox::init(RS_LayerList& layerList, bool showByBlock, bool showUnchanged) { this->showByBlock = showByBlock; this->showUnchanged = showUnchanged; this->layerList = &layerList; if (showUnchanged) { addItem(tr("- Unchanged -")); } for (unsigned i=0; i<layerList.count(); ++i) { RS_Layer* lay = layerList.at(i); if (lay!=NULL && (lay->getName()!="ByBlock" || showByBlock)) { addItem(lay->getName()); } } connect(this, SIGNAL(activated(int)), this, SLOT(slotLayerChanged(int))); setCurrentIndex(0); slotLayerChanged(currentIndex()); }
/** * Adds a layer to the layer list. * If there is already a layer with the same name, no layer is * added. In that case the layer passed to the method will be deleted! * If no layer was active so far, the new layer becomes the active one. * * Listeners are notified. */ void RS_LayerList::add(RS_Layer* layer) { RS_DEBUG->print("RS_LayerList::addLayer()"); if (layer==NULL) { return; } // check if layer already exists: RS_Layer* l = find(layer->getName()); if (l==NULL) { layers.append(layer); this->sort(); // notify listeners for (int i=0; i<layerListListeners.size(); ++i) { RS_LayerListListener* l = layerListListeners.at(i); l->layerAdded(layer); } setModified(true); // if there was no active layer so far, activate this one. if (activeLayer==NULL) { activate(layer); } } else { // if there was no active layer so far, activate this one. if (activeLayer==NULL) { activate(l); } l->freeze( layer->isFrozen()); l->lock( layer->isLocked()); l->setPrint( layer->isPrint()); l->setConverted( layer->isConverted()); l->setConstruction( layer->isConstruction()); l->visibleInLayerList( layer->isVisibleInLayerList()); l->setPen(layer->getPen()); delete layer; layer = NULL; } }
QVariant QG_LayerModel::data ( const QModelIndex & index, int role ) const { if (!index.isValid() || index.row() >= listLayer.size()) return QVariant(); RS_Layer* lay = listLayer.at(index.row()); if (role ==Qt::DecorationRole) { switch(index.column()){ case VISIBLE: if (!lay->isFrozen()) { return layerVisible; } return layerHidden; case LOCKED: if (!lay->isLocked()) { return layerDefreeze; } return layerFreeze; case PRINT: return layerPrint.pixmap(QSize(16,16), lay->isPrint() ? QIcon::Normal : QIcon::Disabled, QIcon::On); case CONSTRUCTION: return layerConstruction.pixmap(QSize(16,16), lay->isConstruction() ? QIcon::Normal : QIcon::Disabled, QIcon::On); case COLOR_SAMPLE: { return createColorSampleForLayer(lay); } default: break; } } if (role ==Qt::DisplayRole && index.column() == NAME) { return lay->getName(); } //Other roles: return QVariant(); }
/** * Gets the pen needed to draw this entity. * The attributes can also come from the layer this entity is on * if the flags are set accordingly. * * @param resolve true: Resolve the pen to a drawable pen (e.g. the pen * from the layer or parent..) * false: Don't resolve and return a pen or ByLayer, ByBlock, ... * * @return Pen for this entity. */ RS_Pen RS_Entity::getPen(bool resolve) const { if (!resolve) { return pen; } else { RS_Pen p = pen; RS_Layer* l = getLayer(true); // use parental attributes (e.g. vertex of a polyline, block // entities when they are drawn in block documents): if (parent) { //if pen is invalid gets all from parent if (!p.isValid() ) { p = parent->getPen(); } //pen is valid, verify byBlock parts RS_EntityContainer* ep = parent; //If parent is byblock check parent.parent (nested blocks) while (p.getColor().isByBlock()){ if (ep) { p.setColor(parent->getPen().getColor()); ep = ep->parent; } else break; } ep = parent; while (p.getWidth()==RS2::WidthByBlock){ if (ep) { p.setWidth(parent->getPen().getWidth()); ep = ep->parent; } else break; } ep = parent; while (p.getLineType()==RS2::LineByBlock){ if (ep) { p.setLineType(parent->getPen().getLineType()); ep = ep->parent; } else break; } } // check byLayer attributes: if (l) { // use layer's color: if (p.getColor().isByLayer()) { p.setColor(l->getPen().getColor()); } // use layer's width: if (p.getWidth()==RS2::WidthByLayer) { p.setWidth(l->getPen().getWidth()); } // use layer's linetype: if (p.getLineType()==RS2::LineByLayer) { p.setLineType(l->getPen().getLineType()); } //} } return p; } }