diff --git a/qad_blockview/blockitem.h b/qad_blockview/blockitem.h index 07a0853..e0b297a 100644 --- a/qad_blockview/blockitem.h +++ b/qad_blockview/blockitem.h @@ -153,6 +153,8 @@ public: QColor color() const {return col;} void setColor(QColor c) {col = c; _resize(size());} QSizeF size() const {return g_main.rect().size();} + qreal width() const {return size().width();} + qreal height() const {return size().height();} void setSize(QSizeF s) {_resize(s);} void setSize(qreal w, qreal h) {setSize(QSizeF(w, h));} void setWidth(qreal w) {setSize(QSizeF(w, size().height()));} diff --git a/qad_blockview/blockview.cpp b/qad_blockview/blockview.cpp index 38e6ea7..7b436b7 100644 --- a/qad_blockview/blockview.cpp +++ b/qad_blockview/blockview.cpp @@ -5,6 +5,7 @@ #include #include #include +#include BlockView::BlockView(QWidget * parent): QGraphicsView(parent), tmp_bus(true) { @@ -280,7 +281,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { if (mm_ci) { if (mm_ci->data(1004) == "pin" && m_connect) { if (qgraphicsitem_cast(mm_ci)->state() == BlockItemPin::Hover) { - trace_from = mm_ci->mapToScene(QPointF()); + trace_from = mm_ci->scenePos(); qgraphicsitem_cast(mm_ci)->clearStateStack(); tmp_bus.setBusType(qgraphicsitem_cast(mm_ci)->busType()); tmp_bus.setEndpointsNumber(3); @@ -764,7 +765,7 @@ QList BlockView::wrongConnectedBuses() const { QVector pins = b->pins(); foreach (BlockItemPin * p, pins) if (p->state() == BlockItemPin::Reject) { - QPointF pp = p->mapToScene(QPointF()); + QPointF pp = p->scenePos(); foreach (BlockBusItem * s, sl) if (s->pol.contains(pp)) if (!ret.contains(s)) @@ -807,6 +808,71 @@ QList BlockView::connectionBuses(BlockItem * b0, BlockItem * b1 } +bool BlockView::connectPins(BlockItemPin * p0, BlockItemPin * p1) { + if (!p0 || !p1) return false; + if (p0->busType() != p1->busType()) return false; + QList bl0 = p0->connectedBuses(), bl1 = p1->connectedBuses(); + if (!(bl0.toSet() & bl1.toSet()).isEmpty()) return true; + BlockBusItem * nb = new BlockBusItem(); + nb->setBusType(p0->busType()); + //nb->setEndpointsNumber(3); + loadBus(nb); + if (!bl0.isEmpty() && !bl1.isEmpty()) { // connect two existing buses + } else { + if ((bl0.isEmpty() && !bl1.isEmpty()) || (bl1.isEmpty() && !bl0.isEmpty())) { // connect empty pin to existing bus + BlockItemPin * ep = 0; + BlockBusItem * eb = 0; + if (bl0.isEmpty()) {ep = p0; eb = bl1[0];} + else {ep = p1; eb = bl0[0];} + double md = -1; int mi = -1; + QPointF sp = ep->scenePos(); + if (eb->pol.size() == 2) { + eb->selSegment = 0; + eb->addPoint((eb->pol[0] + eb->pol[1]) / 2.); + eb->selPoint = -1; + mi = 2; + } else { + for (int i = 0; i < eb->pol.size(); ++i) { + if (eb->ends.contains(i)) continue; + double cd = QVector2D(sp - eb->pol[i]).lengthSquared(); + if (md < 0 || md > cd) { + md = cd; + mi = i; + } + } + } + if (mi < 0) { + return false; + } + trace(ep->scenePos(), eb->pol[mi], nb); + if (nb->pol.size() < 2) { + delete nb; + return false; + } + nb->pol.pop_back(); + int lp = eb->pol.size(); + eb->pol << nb->pol; + for (int i = 0; i < nb->pol.size() - 1; ++i) + eb->segments << QPair(lp + i, lp + i + 1); + eb->segments << QPair(mi, lp + nb->pol.size() - 1); + eb->updateGeometry(); + delete nb; + } else { // connect two empty pins + trace(p0->scenePos(), p1->scenePos(), nb); + if (nb->pol.isEmpty()) { + delete nb; + return false; + } + addItem(nb); + } + } + reconnectAll(); + emit actionEvent(BlockItemBase::BusAdd, QList() << nb); + emit connectionsChanged(); + return true; +} + + void BlockView::restoreSelState() { foreach (QGraphicsItem * i, sel_items) { i->setPos(i->data(1001).toPointF()); @@ -874,8 +940,8 @@ void BlockView::trace(QPointF scene_pos_from, QPointF scene_pos_to, BlockBusItem wavetrace.fill(QRect(ir.topLeft() / grid_step + dp, ir.bottomRight() / grid_step + dp), BlockViewWavetrace::Blocked); QVector pins = qgraphicsitem_cast(i)->pins(); foreach (BlockItemPin * p, pins) { - if (p->busType() == tmp_bus.busType()) - wavetrace.fill(quantize(p->mapToScene(QPointF()), grid_step).toPoint() / grid_step + dp, BlockViewWavetrace::Empty); + if (p->busType() == bus->busType()) + wavetrace.fill(quantize(p->scenePos(), grid_step).toPoint() / grid_step + dp, BlockViewWavetrace::Empty); } } if (m_trace_with_buses) { @@ -963,7 +1029,7 @@ void BlockView::matchBus() { if (m_pin_mc) { foreach (BlockItem * b_, blockl) foreach (BlockItemPin * p_, b_->pins()) - if (p_->mapToScene(QPointF()) == point) { + if (p_->scenePos() == point) { return; } @@ -1257,7 +1323,7 @@ void BlockView::reconnectAll() { QPointF cp = b->pol[conns[c]]; for (int j = 0; j < pins.size(); ++j) { if (!pins[j]->isVisible()) continue; - QPointF pp = pins[j]->mapToScene(QPointF()); + QPointF pp = pins[j]->scenePos(); if (cp == pp) { //qDebug() << "found"; if (b->busType() == pins[j]->busType()) { diff --git a/qad_blockview/blockview.h b/qad_blockview/blockview.h index 8c7ef82..7bc871f 100644 --- a/qad_blockview/blockview.h +++ b/qad_blockview/blockview.h @@ -68,6 +68,7 @@ public: QList decors() const; BlockBusItem * connectionBus(BlockItem * b0, BlockItem * b1) const; QList connectionBuses(BlockItem * b0, BlockItem * b1) const; + bool connectPins(BlockItemPin * p0, BlockItemPin * p1); protected: void _init(); diff --git a/qad_blockview/blockviewwavetrace.cpp b/qad_blockview/blockviewwavetrace.cpp index 0052e44..c070555 100644 --- a/qad_blockview/blockviewwavetrace.cpp +++ b/qad_blockview/blockviewwavetrace.cpp @@ -94,7 +94,7 @@ bool BlockViewWavetrace::trace(const QPoint & start, const QPoint & finish) { } } cpnts = npnts; - //cout << cl << ": " << cpnts.size() << endl; + //qDebug() << cl << ": " << cpnts.size(); } return false; }