void Fixture::setFixtureDefinition(const QLCFixtureDef* fixtureDef, const QLCFixtureMode* fixtureMode) { if (fixtureDef != NULL && fixtureMode != NULL) { m_fixtureDef = fixtureDef; m_fixtureMode = fixtureMode; // If there are no head entries in the mode, create one that contains // all channels. This const_cast is a bit heretic, but it's easier this // way, than to change everything def & mode related non-const, which would // be worse than one constness violation here. QLCFixtureMode* mode = const_cast<QLCFixtureMode*> (fixtureMode); if (mode->heads().size() == 0) { QLCFixtureHead head; for (int i = 0; i < mode->channels().size(); i++) head.addChannel(i); mode->insertHead(-1, head); } // Cache all head channels mode->cacheHeads(); if (m_genericChannel != NULL) delete m_genericChannel; m_genericChannel = NULL; } else { m_fixtureDef = NULL; m_fixtureMode = NULL; createGenericChannel(); } emit changed(m_id); }
void FixtureGroup_Test::assignFixtureNoSize() { QLCPoint pt; FixtureGroup grp(m_doc); QCOMPARE(grp.headList().size(), 0); Fixture* fxi = new Fixture(m_doc); fxi->setChannels(2); m_doc->addFixture(fxi); grp.assignFixture(fxi->id()); QCOMPARE(grp.headList().size(), 2); QCOMPARE(grp.size(), QSize(1, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 0)] == GroupHead(0, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 1)] == GroupHead(0, 1)); // Same fixture can't be at two places grp.assignFixture(0, QLCPoint(100, 100)); QCOMPARE(grp.headList().size(), 2); QCOMPARE(grp.size(), QSize(1, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 0)] == GroupHead(0, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 1)] == GroupHead(0, 1)); fxi = new Fixture(m_doc); fxi->setChannels(1); m_doc->addFixture(fxi); grp.assignFixture(fxi->id()); QCOMPARE(grp.headList().size(), 3); QCOMPARE(grp.size(), QSize(1, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 0)] == GroupHead(0, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 1)] == GroupHead(0, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 2)] == GroupHead(1, 0)); QLCFixtureDef* def = m_doc->fixtureDefCache()->fixtureDef("Futurelight", "DJScan250"); QVERIFY(def != NULL); QLCFixtureMode* mode = def->modes().first(); QVERIFY(mode != NULL); fxi = new Fixture(m_doc); fxi->setFixtureDefinition(def, mode); m_doc->addFixture(fxi); grp.assignFixture(fxi->id()); QCOMPARE(grp.headList().size(), 4); QCOMPARE(grp.size(), QSize(1, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 0)] == GroupHead(0, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 1)] == GroupHead(0, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 2)] == GroupHead(1, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 3)] == GroupHead(2, 0)); def = m_doc->fixtureDefCache()->fixtureDef("i-Pix", "BB4"); QVERIFY(def != NULL); mode = def->modes().last(); QVERIFY(mode != NULL); QCOMPARE(mode->heads().size(), 4); fxi = new Fixture(m_doc); fxi->setFixtureDefinition(def, mode); m_doc->addFixture(fxi); grp.assignFixture(fxi->id()); QCOMPARE(grp.headList().size(), 8); QCOMPARE(grp.size(), QSize(1, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 0)] == GroupHead(0, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 1)] == GroupHead(0, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 2)] == GroupHead(1, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 3)] == GroupHead(2, 0)); // BB4 heads QVERIFY(grp.headHash()[QLCPoint(0, 4)] == GroupHead(3, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 5)] == GroupHead(3, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 6)] == GroupHead(3, 2)); QVERIFY(grp.headHash()[QLCPoint(0, 7)] == GroupHead(3, 3)); }
void QLCFixtureMode_Test::copy() { QLCFixtureMode* mode = new QLCFixtureMode(m_fixtureDef); mode->setName("Test Mode"); mode->insertChannel(m_ch1, 0); mode->insertChannel(m_ch2, 1); mode->insertChannel(m_ch3, 2); mode->insertChannel(m_ch4, 3); QLCFixtureHead head; head.addChannel(0); head.addChannel(1); head.addChannel(2); mode->insertHead(-1, head); /* Create a copy of the mode to the same fixtureDef as the original */ QLCFixtureMode* copy = new QLCFixtureMode(m_fixtureDef, mode); QVERIFY(copy != NULL); QVERIFY(copy->name() == "Test Mode"); QVERIFY(copy->channels().size() == 4); QVERIFY(copy->channel(0) == m_ch1); QVERIFY(copy->channel(1) == m_ch2); QVERIFY(copy->channel(2) == m_ch3); QVERIFY(copy->channel(3) == m_ch4); QCOMPARE(copy->heads().size(), 1); QVERIFY(copy->heads().at(0).channels().contains(0) == true); QVERIFY(copy->heads().at(0).channels().contains(1) == true); QVERIFY(copy->heads().at(0).channels().contains(2) == true); delete copy; copy = NULL; /* Create another fixture def with some channels matching, some not */ QLCFixtureDef* anotherDef = new QLCFixtureDef(); QLCChannel* ch1 = new QLCChannel(); ch1->setName("Channel 1"); // Should match anotherDef->addChannel(ch1); QLCChannel* ch2 = new QLCChannel(); ch2->setName("Channel 2, not the same name"); // Shouldn't match anotherDef->addChannel(ch2); QLCChannel* ch3 = new QLCChannel(); ch3->setName("Channel 3, still not the same name"); // Shouldn't match anotherDef->addChannel(ch3); QLCChannel* ch4 = new QLCChannel(); ch4->setName("Channel 4"); // Should match anotherDef->addChannel(ch4); QLCChannel* ch5 = new QLCChannel(); ch5->setName("Channel 5"); // Shouldn't match since original has 4 chans anotherDef->addChannel(ch5); /* Create a copy of the mode to the other fixtureDef */ copy = new QLCFixtureMode(anotherDef, mode); QVERIFY(copy->name() == "Test Mode"); QVERIFY(copy->channels().size() == 2); QVERIFY(copy->channel(0)->name() == "Channel 1"); QVERIFY(copy->channel(0) == ch1); QVERIFY(copy->channel(1)->name() == "Channel 4"); QVERIFY(copy->channel(1) == ch4); delete copy; delete anotherDef; }
void QLCFixtureMode_Test::heads() { QLCFixtureMode* mode = new QLCFixtureMode(m_fixtureDef); QLCFixtureHead head; head.addChannel(0); head.addChannel(10); head.addChannel(20); mode->insertHead(-1, head); QCOMPARE(mode->heads().size(), 1); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QLCFixtureHead head2; head2.addChannel(1); head2.addChannel(2); mode->insertHead(10, head2); QCOMPARE(mode->heads().size(), 2); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QVERIFY(mode->m_heads[1].m_channels.contains(0) == false); QVERIFY(mode->m_heads[1].m_channels.contains(1) == true); QVERIFY(mode->m_heads[1].m_channels.contains(2) == true); QLCFixtureHead head3; head3.addChannel(3); head3.addChannel(4); mode->insertHead(1, head3); QCOMPARE(mode->heads().size(), 3); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QVERIFY(mode->m_heads[1].m_channels.contains(3) == true); QVERIFY(mode->m_heads[1].m_channels.contains(4) == true); QVERIFY(mode->m_heads[2].m_channels.contains(1) == true); QVERIFY(mode->m_heads[2].m_channels.contains(2) == true); QLCFixtureHead head4; head4.addChannel(15); head4.addChannel(16); mode->replaceHead(4, head4); QCOMPARE(mode->heads().size(), 3); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QVERIFY(mode->m_heads[1].m_channels.contains(3) == true); QVERIFY(mode->m_heads[1].m_channels.contains(4) == true); QVERIFY(mode->m_heads[2].m_channels.contains(1) == true); QVERIFY(mode->m_heads[2].m_channels.contains(2) == true); mode->replaceHead(2, head4); QCOMPARE(mode->heads().size(), 3); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QVERIFY(mode->m_heads[1].m_channels.contains(3) == true); QVERIFY(mode->m_heads[1].m_channels.contains(4) == true); QVERIFY(mode->m_heads[2].m_channels.contains(15) == true); QVERIFY(mode->m_heads[2].m_channels.contains(16) == true); mode->removeHead(15); QCOMPARE(mode->heads().size(), 3); mode->removeHead(1); QCOMPARE(mode->heads().size(), 2); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QVERIFY(mode->m_heads[1].m_channels.contains(15) == true); QVERIFY(mode->m_heads[1].m_channels.contains(16) == true); mode->removeHead(0); QCOMPARE(mode->heads().size(), 1); QVERIFY(mode->m_heads[0].m_channels.contains(15) == true); QVERIFY(mode->m_heads[0].m_channels.contains(16) == true); mode->removeHead(0); QCOMPARE(mode->heads().size(), 0); delete mode; }
void MainView2D::createFixtureItem(quint32 fxID, quint16 headIndex, quint16 linkedIndex, QVector3D pos, bool mmCoords) { if (isEnabled() == false) return; if (m_gridItem == NULL) initialize2DProperties(); qDebug() << "[MainView2D] Creating fixture with ID" << fxID << headIndex << linkedIndex << "pos:" << pos; Fixture *fixture = m_doc->fixture(fxID); if (fixture == NULL) return; quint32 itemID = FixtureUtils::fixtureItemID(fxID, headIndex, linkedIndex); QLCFixtureMode *fxMode = fixture->fixtureMode(); QQuickItem *newFixtureItem = qobject_cast<QQuickItem*>(fixtureComponent->create()); quint32 itemFlags = m_monProps->fixtureFlags(fxID, headIndex, linkedIndex); newFixtureItem->setParentItem(m_gridItem); newFixtureItem->setProperty("itemID", itemID); if (itemFlags & MonitorProperties::HiddenFlag) newFixtureItem->setProperty("visible", false); if (fxMode != NULL && fixture->type() != QLCFixtureDef::Dimmer) { QLCPhysical phy = fxMode->physical(); //qDebug() << "Current mode fixture heads:" << fxMode->heads().count(); newFixtureItem->setProperty("headsNumber", fxMode->heads().count()); if (fixture->channelNumber(QLCChannel::Pan, QLCChannel::MSB) != QLCChannel::invalid()) { int panDeg = phy.focusPanMax(); if (panDeg == 0) panDeg = 360; newFixtureItem->setProperty("panMaxDegrees", panDeg); } if (fixture->channelNumber(QLCChannel::Tilt, QLCChannel::MSB) != QLCChannel::invalid()) { int tiltDeg = phy.focusTiltMax(); if (tiltDeg == 0) tiltDeg = 270; newFixtureItem->setProperty("tiltMaxDegrees", tiltDeg); } } QPointF itemPos; QSizeF size = FixtureUtils::item2DDimension(fixture->type() == QLCFixtureDef::Dimmer ? NULL : fxMode, m_monProps->pointOfView()); if (mmCoords == false && (pos.x() != 0 || pos.y() != 0)) { float gridUnits = m_monProps->gridUnits() == MonitorProperties::Meters ? 1000.0 : 304.8; itemPos.setX((pos.x() * gridUnits) / m_cellPixels); itemPos.setY((pos.y() * gridUnits) / m_cellPixels); } if (m_monProps->containsItem(fxID, headIndex, linkedIndex)) { itemPos = FixtureUtils::item2DPosition(m_monProps, m_monProps->pointOfView(), pos); newFixtureItem->setProperty("rotation", FixtureUtils::item2DRotation(m_monProps->pointOfView(), m_monProps->fixtureRotation(fxID, headIndex, linkedIndex))); } else { itemPos = FixtureUtils::available2DPosition(m_doc, m_monProps->pointOfView(), QRectF(itemPos.x(), itemPos.y(), size.width(), size.height())); // add the new fixture to the Doc monitor properties QVector3D newPos = FixtureUtils::item3DPosition(m_monProps, itemPos, 1000.0); m_monProps->setFixturePosition(fxID, headIndex, linkedIndex, newPos); m_monProps->setFixtureFlags(fxID, headIndex, linkedIndex, 0); Tardis::instance()->enqueueAction(Tardis::FixtureSetPosition, itemID, QVariant(QVector3D(0, 0, 0)), QVariant(newPos)); } newFixtureItem->setProperty("mmXPos", itemPos.x()); newFixtureItem->setProperty("mmYPos", itemPos.y()); newFixtureItem->setProperty("mmWidth", size.width()); newFixtureItem->setProperty("mmHeight", size.height()); newFixtureItem->setProperty("fixtureName", fixture->name()); // and finally add the new item to the items map m_itemsMap[itemID] = newFixtureItem; QByteArray values; updateFixture(fixture, values); }