diff --git a/src/connectors/connectoritem.cpp b/src/connectors/connectoritem.cpp index 7494ebb5a..aff72a1c4 100644 --- a/src/connectors/connectoritem.cpp +++ b/src/connectors/connectoritem.cpp @@ -523,13 +523,17 @@ void ConnectorItem::restoreColor(QList & visited) QList connectorItems; connectorItems.append(this); - collectEqualPotential(connectorItems, true, getSkipFlags()); + collectEqualPotential(connectorItems, true, getSkipFlags(), false); visited.append(connectorItems); - QSet attachedTo; + + QSet attachedTo; foreach (ConnectorItem * connectorItem, connectorItems) { if (connectorItem->isEverVisible()) { if (connectorItem->attachedToItemType() != ModelPart::Wire) { - attachedTo.insert(connectorItem->attachedTo()->layerKinChief()); + //For PCB pad stacks: Only add one connector to the attachedTo list (top or bottom copper) + if(!attachedTo.contains(connectorItem->getCrossLayerConnectorItem())) { + attachedTo.insert(connectorItem); + } } } } @@ -554,7 +558,24 @@ void ConnectorItem::restoreColor(QList & visited) } } } - + if (this->attachedToViewID() == 3) { + DebugDialog::debug(QString("FAI restore color PCB equalPotential: %1 attachedTo: %2") + .arg(connectorItems.count()) + .arg(attachedTo.count()) + ); + for(ConnectorItem * c : connectorItems) + DebugDialog::debug(QString("equalPotential conn, title: %1 %2 %3") + .arg(c->attachedToTitle()) + .arg(c->attachedTo()->label()) + .arg(c->attachedTo()->viewLayerID()) + ); + for(ConnectorItem * c : attachedTo) + DebugDialog::debug(QString("attachedTo conn, title: %1 %2 %3") + .arg(c->attachedToTitle()) + .arg(c->attachedTo()->label()) + .arg(c->attachedTo()->viewLayerID()) + ); + } /* DebugDialog::debug(QString("restore color dobus:%1 bccount:%2 docross:%3 cid:'%4' '%5' id:%6 '%7' vid:%8 vlid:%9 %10") @@ -1315,7 +1336,7 @@ bool ConnectorItem::isConnectedToPart() { * @param[in] skipFlags filter for the types of wires that are not to be included */ void ConnectorItem::collectEqualPotential(QList &connectorItems, - bool crossLayers, ViewGeometry::WireFlags skipFlags) + bool crossLayers, ViewGeometry::WireFlags skipFlags, bool followBuses) { // take a local (temporary working) copy of the supplied list, and wipe the original QList tempItems = connectorItems; @@ -1365,7 +1386,7 @@ void ConnectorItem::collectEqualPotential(QList &connectorItems // When the kept connector item is part of a bus, include all of the other // connectors on the bus in the list being processed Bus *bus = connectorItem->bus(); - if (bus) { + if (bus && (followBuses||fromWire)) { QList busConnectedItems; connectorItem->attachedTo()->busConnectorItems(bus, connectorItem, busConnectedItems); #ifndef QT_NO_DEBUG diff --git a/src/connectors/connectoritem.h b/src/connectors/connectoritem.h index 04faad5b3..4b5fdef27 100644 --- a/src/connectors/connectoritem.h +++ b/src/connectors/connectoritem.h @@ -235,7 +235,7 @@ class ConnectorItem : public NonConnectorItem, public CursorKeyListener static void collectPart(ConnectorItem * connectorItem, QList & partsConnectors, ViewLayer::ViewLayerPlacement); public: - static void collectEqualPotential(QList & connectorItems, bool crossLayers, ViewGeometry::WireFlags skipFlags); + static void collectEqualPotential(QList & connectorItems, bool crossLayers, ViewGeometry::WireFlags skipFlags, bool followBuses = true); static void collectParts(QList & connectorItems, QList & partsConnectors, bool includeSymbols, ViewLayer::ViewLayerPlacement); static void clearEqualPotentialDisplay(); static bool isGrounded(ConnectorItem * c1, ConnectorItem * c2); diff --git a/src/items/wire.cpp b/src/items/wire.cpp index c7906e876..4a51ea956 100644 --- a/src/items/wire.cpp +++ b/src/items/wire.cpp @@ -600,22 +600,31 @@ void Wire::mouseMoveEventAux(QPointF eventPos, Qt::KeyboardModifiers modifiers) } setConnector1Rect(); - - QSet allTo; - allTo.insert(whichConnectorItem); + QList allToList; foreach (ConnectorItem * toConnectorItem, whichConnectorItem->connectedToItems()) { Wire * chainedWire = qobject_cast(toConnectorItem->attachedTo()); if (chainedWire == NULL) continue; - allTo.insert(toConnectorItem); - foreach (ConnectorItem * subTo, toConnectorItem->connectedToItems()) { - allTo.insert(subTo); + if(!allToList.contains(toConnectorItem)) { + allToList.append(toConnectorItem); } } - allTo.remove(whichConnectorItem); - // TODO: this could all be determined once at mouse press time + for (int i = 0; i < allToList.size(); i++) { + ConnectorItem * conItem = allToList.at(i); + foreach(ConnectorItem * toConnectorItem, conItem->connectedToItems()) { + Wire * chainedWire = qobject_cast(toConnectorItem->attachedTo()); + if (chainedWire == NULL) continue; + + if(!allToList.contains(toConnectorItem)) { + allToList.append(toConnectorItem); + } + } + } + QSet allTo(allToList.begin(), allToList.end()); + + // TODO: this could all be determined once at mouse press time if (allTo.count() == 0) { // dragging one end of the wire @@ -684,9 +693,12 @@ void Wire::mouseMoveEventAux(QPointF eventPos, Qt::KeyboardModifiers modifiers) } else { // dragging a bendpoint + DebugDialog::debug("dragging a bendpoint"); + DebugDialog::debug(QString("CON0 %1 CON1 %2").arg(this->connector0()->connectedToItems().count()).arg(this->connector0()->connectedToItems().count())); foreach (ConnectorItem * toConnectorItem, allTo) { Wire * chained = qobject_cast(toConnectorItem->attachedTo()); if (chained) { + DebugDialog::debug("dragging a bendpoint123"); chained->simpleConnectedMoved(whichConnectorItem, toConnectorItem); } }