mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-10-02 08:24:14 +02:00
Merge pull request #1194 from ispyisail/fix/element-nonfinite-coordinates
Fix bugtracker #266: symbol with a nan coordinate breaks the editor
This commit is contained in:
@@ -529,6 +529,19 @@ int checkOneElement(const QString &path)
|
||||
return 2;
|
||||
}
|
||||
|
||||
// QET loads the element but leaves out a shape with a "nan" or "inf"
|
||||
// coordinate, on the folio and in the element editor.
|
||||
const QDomNodeList description = root.elementsByTagName("description");
|
||||
for (QDomNode n = description.isEmpty() ? QDomNode()
|
||||
: description.at(0).firstChild() ;
|
||||
!n.isNull() ; n = n.nextSibling()) {
|
||||
const QDomElement shape = n.toElement();
|
||||
if (!shape.isNull() && QET::hasNonFiniteGeometry(shape)) {
|
||||
out << "WARN " << path << " (<" << shape.tagName()
|
||||
<< "> with a non-finite coordinate is not drawn)\n";
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
// Negative dimensions are malformed but QET still loads them; surface as a
|
||||
// warning rather than a failure so this agrees with QET's own loader.
|
||||
if (w < 0 || h < 0) {
|
||||
|
||||
@@ -1272,6 +1272,14 @@ ElementContent ElementScene::loadContent(const QDomDocument &xml_document)
|
||||
CustomElementPart *cep = nullptr;
|
||||
PartDynamicTextField *pdtf = nullptr;
|
||||
|
||||
//A shape with a "nan" or "inf" coordinate is not drawn
|
||||
//on the folio either; loading it would only break the view
|
||||
if (QET::hasNonFiniteGeometry(qde)) {
|
||||
qWarning() << "Element editor: skipped a" << qde.tagName()
|
||||
<< "with a non-finite coordinate";
|
||||
continue;
|
||||
}
|
||||
|
||||
if (qde.tagName() == "line") cep = new PartLine (m_element_editor);
|
||||
else if (qde.tagName() == "rect") cep = new PartRectangle (m_element_editor);
|
||||
else if (qde.tagName() == "ellipse") cep = new PartEllipse (m_element_editor);
|
||||
|
||||
@@ -256,6 +256,34 @@ bool QET::attributeIsAReal(
|
||||
return(true);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief QET::hasNonFiniteGeometry
|
||||
@param shape a shape of an element definition (<line>, <rect>, <text>...)
|
||||
@return true if one of its coordinates or sizes is "nan" or "inf".
|
||||
The folio does not draw such a shape (see attributeIsAReal()), and the
|
||||
element editor cannot show or edit it.
|
||||
*/
|
||||
bool QET::hasNonFiniteGeometry(const QDomElement &shape)
|
||||
{
|
||||
static const QStringList geometry {
|
||||
"x", "y", "x1", "y1", "x2", "y2", "width", "height", "diameter",
|
||||
"rx", "ry", "start", "angle", "rotation", "length1", "length2"};
|
||||
static const QRegularExpression polygon_point("^[xy][0-9]+$");
|
||||
|
||||
const QDomNamedNodeMap attributes = shape.attributes();
|
||||
for (int i = 0 ; i < attributes.count() ; ++i)
|
||||
{
|
||||
const QDomAttr attribute = attributes.item(i).toAttr();
|
||||
if (!geometry.contains(attribute.name())
|
||||
&& !polygon_point.match(attribute.name()).hasMatch())
|
||||
continue;
|
||||
bool ok;
|
||||
const qreal value = attribute.value().toDouble(&ok);
|
||||
if (ok && !std::isfinite(value)) return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief QET::infoFlagIsTrue
|
||||
@see the header comment for why this exists rather than a bare
|
||||
|
||||
@@ -162,6 +162,7 @@ namespace QET {
|
||||
bool orthogonalProjection(const QPointF &, const QLineF &, QPointF * = nullptr);
|
||||
bool attributeIsAnInteger(const QDomElement &, const QString& , int * = nullptr);
|
||||
bool attributeIsAReal(const QDomElement &, const QString& , qreal * = nullptr);
|
||||
bool hasNonFiniteGeometry(const QDomElement &);
|
||||
/**
|
||||
Whether an elementInformations flag (auto_num_locked,
|
||||
potential_isolating, exclude_from_bom, ...) counts as "on".
|
||||
|
||||
Reference in New Issue
Block a user