/*****************************************************************************/ /* list.cpp - List selected entities */ /* */ /* Copyright (C) 2011 Rallaz, rallazz@gmail.com */ /* */ /* This library is free software, licensed under the terms of the GNU */ /* General Public License as published by the Free Software Foundation, */ /* either version 2 of the License, or (at your option) any later version. */ /* You should have received a copy of the GNU General Public License */ /* along with this program. If not, see . */ /*****************************************************************************/ #include #include #include #include #include "list.h" QString LC_List::name() const { return (tr("List entities")); } PluginCapabilities LC_List::getCapabilities() const { PluginCapabilities pluginCapabilities; pluginCapabilities.menuEntryPoints << PluginMenuLocation("plugins_menu", tr("List entities")); return pluginCapabilities; } void LC_List::execComm(Document_Interface *doc, [[maybe_unused]] QWidget *parent, [[maybe_unused]] QString cmd) { d = doc; QList obj; bool yes = doc->getSelect(&obj); if (!yes || obj.isEmpty()) return; QString text; for (int i = 0; i < obj.size(); ++i) { text.append( QString("%1 %2: ").arg(tr("n")).arg(i+1)); text.append( getStrData(obj.at(i))); text.append( "\n"); } lc_Listdlg dlg(parent); dlg.setText(text); dlg.exec(); while (!obj.isEmpty()) delete obj.takeFirst(); } QString LC_List::getStrData(Plug_Entity *ent) { if( NULL == ent) return QString("%1\n").arg(tr("Empty Entity")); QHash data; QString strData(""), strEntity("%1\n"), strCommon(" %1: %2\n"), strSpecific(" %1: %2\n"), strSpecificXY( QString(" %1: %2=%3 %4=%5\n").arg("%1",tr("X"),"%2",tr("Y"),"%3")); double numA {0.0}; double numB {0.0}; double numC {0.0}; QPointF ptA, ptB, ptC; int intA {0}; int intB {0}; //common entity data ent->getData(&data); strData = strCommon.arg(tr("Layer")).arg(data.value(DPI::LAYER).toString()); int col = data.value(DPI::COLOR).toInt(); strData.append( strCommon.arg(tr("Color")).arg( ent->intColor2str(col) )); strData.append( strCommon.arg(tr("Line type")).arg(data.value(DPI::LTYPE).toString())); strData.append( strCommon.arg(tr("Line thickness")).arg(data.value(DPI::LWIDTH).toString())); strData.append( strCommon.arg(tr("ID")).arg(data.value(DPI::EID).toLongLong())); //specific entity data int et = data.value(DPI::ETYPE).toInt(); switch (et) { case DPI::POINT: strData.prepend( strEntity.arg(tr("POINT"))); strData.append( strSpecificXY.arg(tr("in point")). arg(d->realToStr(data.value(DPI::STARTX).toDouble())). arg(d->realToStr(data.value(DPI::STARTY).toDouble()))); break; case DPI::LINE: strData.prepend( strEntity.arg(tr("LINE"))); ptA.setX( data.value(DPI::STARTX).toDouble()); ptA.setY( data.value(DPI::STARTY).toDouble()); ptB.setX( data.value(DPI::ENDX).toDouble()); ptB.setY( data.value(DPI::ENDY).toDouble()); strData.append( strSpecificXY.arg(tr("from point")). arg(d->realToStr(ptA.x())). arg(d->realToStr(ptA.y()))); strData.append( strSpecificXY.arg(tr("to point")). arg(d->realToStr(ptB.x())). arg(d->realToStr(ptB.y()))); ptC = ptB - ptA; numA = sqrt( (ptC.x()*ptC.x())+ (ptC.y()*ptC.y())); strData.append( strSpecific.arg(tr("length")).arg( d->realToStr(numA))); numB = asin(ptC.y() / numA); numC = numB*180/M_PI; if (ptC.x() < 0) numC = 180 - numC; if (numC < 0) numC = 360 + numC; strData.append( strSpecific.arg(tr("Angle in XY plane")).arg(d->realToStr(numC))); strData.append( strSpecificXY.arg(tr("Inc.")). arg(d->realToStr(ptC.x())). arg(d->realToStr(ptC.y()))); break; case DPI::ARC: strData.prepend( strEntity.arg(tr("ARC"))); strData.append( strSpecificXY.arg(tr("center point")). arg(d->realToStr(data.value(DPI::STARTX).toDouble())). arg(d->realToStr(data.value(DPI::STARTY).toDouble()))); numA = data.value(DPI::RADIUS).toDouble(); numB = data.value(DPI::STARTANGLE).toDouble(); numC = data.value(DPI::ENDANGLE).toDouble(); strData.append( strSpecific.arg(tr("radius")).arg(d->realToStr(numA))); strData.append( strSpecific.arg(tr("initial angle")).arg(d->realToStr(numB*180/M_PI))); strData.append( strSpecific.arg(tr("final angle")).arg(d->realToStr(numC*180/M_PI))); if( numB > numC) { numB -= 2.0 * M_PI; } strData.append( strSpecific.arg(tr("length")).arg( d->realToStr((numC-numB)*numA))); break; case DPI::CIRCLE: strData.prepend( strEntity.arg(tr("CIRCLE"))); strData.append( strSpecificXY.arg(tr("center point")). arg(d->realToStr(data.value(DPI::STARTX).toDouble())). arg(d->realToStr(data.value(DPI::STARTY).toDouble()))); numA = data.value(DPI::RADIUS).toDouble(); strData.append( strSpecific.arg(tr("radius")).arg(d->realToStr(numA))); strData.append( strSpecific.arg(tr("circumference")).arg(d->realToStr(numA*2*M_PI))); strData.append( strSpecific.arg(tr("area")).arg(d->realToStr(numA*numA*M_PI))); break; case DPI::ELLIPSE://toy aqui strData.prepend( strEntity.arg(tr("ELLIPSE"))); strData.append( strSpecificXY.arg(tr("center point")). arg(d->realToStr(data.value(DPI::STARTX).toDouble())). arg(d->realToStr(data.value(DPI::STARTY).toDouble()))); strData.append( strSpecificXY.arg(tr("major axis")). arg(d->realToStr(data.value(DPI::ENDX).toDouble())). arg(d->realToStr(data.value(DPI::ENDY).toDouble()))); /* strData.append( QString(tr(" minor axis: X=%1 Y=%2\n")).arg( data.value(DPI::ENDX).toDouble()).arg( data.value(DPI::ENDY).toDouble() ) ); strData.append( QString(tr(" start point: X=%1 Y=%2\n")).arg( data.value(DPI::ENDX).toDouble()).arg( data.value(DPI::ENDY).toDouble() ) ); strData.append( QString(tr(" end point: X=%1 Y=%2\n")).arg( data.value(DPI::ENDX).toDouble()).arg( data.value(DPI::ENDY).toDouble() ) ); strData.append( QString(tr(" initial angle: %1\n")).arg(numB*180/M_PI) ); strData.append( QString(tr(" final angle: %1\n")).arg(numC*180/M_PI) ); strData.append( QString(tr(" radius ratio: %1\n")).arg(numC*180/M_PI) );*/ break; case DPI::CONSTRUCTIONLINE: strData.prepend( strEntity.arg(tr("CONSTRUCTIONLINE"))); break; case DPI::OVERLAYBOX: strData.prepend( strEntity.arg(tr("OVERLAYBOX"))); break; case DPI::SOLID: strData.prepend( strEntity.arg(tr("SOLID"))); break; //container entities case DPI::MTEXT: strData.prepend( strEntity.arg(tr("MTEXT"))); break; case DPI::TEXT: strData.prepend( strEntity.arg(tr("TEXT"))); strData.append( strSpecificXY.arg(tr("in point")). arg(d->realToStr(data.value(DPI::STARTX).toDouble())). arg(d->realToStr(data.value(DPI::STARTY).toDouble()))); strData.append( strSpecific.arg(tr("TEXTCONTENT")).arg(data.value(DPI::TEXTCONTENT).toString())); break; case DPI::INSERT: strData.prepend( strEntity.arg(tr("INSERT"))); ptA.setX( data.value(DPI::STARTX).toDouble()); ptA.setY( data.value(DPI::STARTY).toDouble()); strData.append( strSpecific.arg( tr("Name")). arg( data.value(DPI::BLKNAME).toString())); strData.append( strSpecificXY.arg( tr("Insertion point")). arg(d->realToStr( ptA.x())). arg(d->realToStr( ptA.y()))); strData.append( strSpecificXY.arg( tr("Scale")). arg( d->realToStr( data.value(DPI::XSCALE).toDouble())). arg( d->realToStr( data.value(DPI::YSCALE).toDouble()))); strData.append( strSpecific.arg( tr("Rotation")). arg( QString("%1°"). arg( d->realToStr( data.value(DPI::STARTANGLE).toDouble() * 180 / M_PI)))); intA = data.value(DPI::COLCOUNT).toInt(); intB = data.value(DPI::ROWCOUNT).toInt(); if( 1 < intA || 1 < intB) { strData.append( strSpecific.arg( tr("Columns/Rows")). arg( QString( "%1 / %2"). arg( intA). arg( intB))); strData.append( strSpecific.arg( tr("Column/Row Spacing")). arg( QString("%1 / %2"). arg( d->realToStr( data.value(DPI::COLSPACE).toDouble())). arg( d->realToStr( data.value(DPI::ROWSPACE).toDouble())))); } break; case DPI::POLYLINE: { strData.prepend( strEntity.arg(tr("POLYLINE"))); strData.append( strSpecific.arg(tr("Closed")). arg( (0 == data.value(DPI::CLOSEPOLY).toInt()) ? tr("No") : tr("Yes"))); strData.append( strSpecific.arg(tr("Vertices")).arg("")); QList vl; ent->getPolylineData(&vl); int iVertices = vl.size(); for (int i = 0; i < iVertices; ++i) { strData.append( strSpecificXY.arg(tr("in point")). arg(d->realToStr(vl.at(i).point.x())). arg(d->realToStr(vl.at(i).point.y()))); if ( 0 != vl.at(i).bulge) { strData.append( strSpecific.arg(tr("radius")).arg( d->realToStr(polylineRadius(vl.at(i), vl.at((i+1) % iVertices))))); } } break; } case DPI::IMAGE: strData.prepend( strEntity.arg(tr("IMAGE"))); break; case DPI::SPLINE: strData.prepend( strEntity.arg(tr("SPLINE"))); break; case DPI::SPLINEPOINTS: strData.prepend( strEntity.arg(tr("SPLINEPOINTS"))); break; case DPI::HATCH: strData.prepend( strEntity.arg(tr("HATCH"))); break; case DPI::DIMLEADER: strData.prepend( strEntity.arg(tr("DIMLEADER"))); break; case DPI::DIMALIGNED: strData.prepend( strEntity.arg(tr("DIMALIGNED"))); break; case DPI::DIMLINEAR: strData.prepend( strEntity.arg(tr("DIMLINEAR"))); break; case DPI::DIMRADIAL: strData.prepend( strEntity.arg(tr("DIMRADIAL"))); break; case DPI::DIMDIAMETRIC: strData.prepend( strEntity.arg(tr("DIMDIAMETRIC"))); break; case DPI::DIMANGULAR: strData.prepend( strEntity.arg(tr("DIMANGULAR"))); break; default: strData.prepend( strEntity.arg(tr("UNKNOWN"))); break; } return strData; } double LC_List::polylineRadius( const Plug_VertexData& ptA, const Plug_VertexData& ptB) { double dChord = sqrt( pow(ptA.point.x() - ptB.point.x(), 2) + pow(ptA.point.y() - ptB.point.y(), 2)); return fabs( 0.5 * dChord / sin( 2.0 * atan(ptA.bulge))); } /*****************************/ lc_Listdlg::lc_Listdlg(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("List entities")); // QTextEdit *edit= new QTextEdit(this); edit.setReadOnly (true); edit.setAcceptRichText ( false ); QDialogButtonBox* bb = new QDialogButtonBox( QDialogButtonBox::Close, Qt::Horizontal, this ); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(&edit); mainLayout->addWidget(bb); this->setLayout(mainLayout); this->resize ( 450, 350 ); connect(bb, SIGNAL(rejected()), this, SLOT(accept())); } void lc_Listdlg::setText(QString text) { edit.setText(text); } lc_Listdlg::~lc_Listdlg() { }