Skip to content

Commit

Permalink
Add systems and sub systems
Browse files Browse the repository at this point in the history
Icon view for systems with shapes
Use oms3_getElements
  • Loading branch information
adeas31 committed Nov 5, 2018
1 parent 3b94ba5 commit 99d3ba8
Show file tree
Hide file tree
Showing 8 changed files with 182 additions and 72 deletions.
4 changes: 1 addition & 3 deletions OMEdit/OMEditGUI/Annotations/ShapeAnnotation.cpp
Expand Up @@ -1694,9 +1694,7 @@ void ShapeAnnotation::contextMenuEvent(QGraphicsSceneContextMenuEvent *pEvent)
}
} else if (mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getLibraryType()== LibraryTreeItem::OMS) {
BitmapAnnotation *pBitmapAnnotation = dynamic_cast<BitmapAnnotation*>(this);
if (pBitmapAnnotation && mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getOMSElement()
&& (mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getOMSElement()->type == oms_component_fmu_old
|| mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getOMSElement()->type == oms_component_table_old)) {
if (pBitmapAnnotation && mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getOMSElement()) {
menu.addAction(mpDeleteSubModelIconAction);
} else {
return;
Expand Down
20 changes: 18 additions & 2 deletions OMEdit/OMEditGUI/Component/Component.cpp
Expand Up @@ -1515,6 +1515,21 @@ void Component::drawInterfacePoints()
*/
void Component::drawOMSComponent()
{
if (mpLibraryTreeItem->getOMSElement() && mpLibraryTreeItem->getOMSElement()->type == oms_element_system) {
if (!mpLibraryTreeItem->getModelWidget()) {
MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel()->showModelWidget(mpLibraryTreeItem, false);
}
// draw shapes first
drawOMSComponentShapes();
// draw connectors now
// foreach (Component *pComponent, mpLibraryTreeItem->getModelWidget()->getDiagramGraphicsView()->getComponentsList()) {
// Component *pNewComponent = new Component(pComponent, this, getRootParentComponent());
// mComponentsList.append(pNewComponent);
// }
}
// return to avoid the old code. The code below should be removed later on.
return;

if (mpLibraryTreeItem->getOMSElement()) { // if component is fmu
if (!mpLibraryTreeItem->getModelWidget()) {
MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel()->showModelWidget(mpLibraryTreeItem, false);
Expand Down Expand Up @@ -1606,7 +1621,7 @@ void Component::drawOMSComponent()
*/
void Component::drawOMSComponentShapes()
{
foreach (ShapeAnnotation *pShapeAnnotation, mpLibraryTreeItem->getModelWidget()->getDiagramGraphicsView()->getShapesList()) {
foreach (ShapeAnnotation *pShapeAnnotation, mpLibraryTreeItem->getModelWidget()->getIconGraphicsView()->getShapesList()) {
if (dynamic_cast<RectangleAnnotation*>(pShapeAnnotation)) {
mShapesList.append(new RectangleAnnotation(pShapeAnnotation, this));
} else if (dynamic_cast<TextAnnotation*>(pShapeAnnotation)) {
Expand Down Expand Up @@ -2844,7 +2859,8 @@ void Component::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
menu.addAction(pComponent->getSubModelAttributesAction());
break;
case LibraryTreeItem::OMS:
if (pComponent->getLibraryTreeItem()->getOMSElement() && pComponent->getLibraryTreeItem()->getOMSElement()->type == oms_element_fmu) {
if (pComponent->getLibraryTreeItem()->getOMSElement()
&& pComponent->getLibraryTreeItem()->getOMSElement()->type == oms_element_component) {
menu.addAction(pComponent->getFMUPropertiesAction());
}
break;
Expand Down
32 changes: 20 additions & 12 deletions OMEdit/OMEditGUI/Modeling/LibraryTreeWidget.cpp
Expand Up @@ -322,7 +322,7 @@ QString LibraryTreeItem::getTooltip() const {
.arg(Helper::type).arg("Model")
.arg(Helper::fileLocation).arg(mFileName);
} else if (mpOMSElement && mpOMSElement->type == oms_element_system) {
tooltip = QString("%1 %2<br />%3: %4<br />%5: %6<br />%7: %8<br />%9: %10<br />%11: %12")
tooltip = QString("%1 %2<br />%3: %4<br />%5: %6")
.arg(Helper::name).arg(mName)
.arg(Helper::type).arg(OMSProxy::getSystemTypeString(mSystemType))
.arg(Helper::fileLocation).arg(mFileName);
Expand Down Expand Up @@ -2283,17 +2283,19 @@ void LibraryTreeModel::createLibraryTreeItems(LibraryTreeItem *pLibraryTreeItem)
}
}
} else if (pLibraryTreeItem->getLibraryType() == LibraryTreeItem::OMS) {
// oms_element_t** pElements = NULL;
// if (pLibraryTreeItem->getOMSElement() && pLibraryTreeItem->getOMSElement()->type == oms_element_system &&
// OMSProxy::instance()->getElements(pLibraryTreeItem->getNameStructure(), &pElements)) {
// for (int i = 0 ; pElements[i] ; i++) {
// QString name = StringHandler::getLastWordAfterDot(pElements[i]->name);
// createOMSLibraryTreeItemImpl(name, QString("%1.%2").arg(pLibraryTreeItem->getNameStructure()).arg(name),
// "", pLibraryTreeItem->isSaved(), pLibraryTreeItem, pElements[i]);
// }
// } else if (pLibraryTreeItem->getOMSElement()) {
// createOMSConnectorLibraryTreeItems(pLibraryTreeItem);
// }
// we only call oms3_getElements on the model
if (pLibraryTreeItem->isTopLevel()) {
oms3_element_t** pElements = NULL;
if (OMSProxy::instance()->getElements(pLibraryTreeItem->getNameStructure(), &pElements)) {
for (int i = 0 ; pElements[i] ; i++) {
QString name = QString(pElements[i]->name);
createOMSLibraryTreeItemImpl(name, QString("%1.%2").arg(pLibraryTreeItem->getNameStructure()).arg(name),
"", pLibraryTreeItem->isSaved(), pLibraryTreeItem, pElements[i]);
}
}
} else if (pLibraryTreeItem->getOMSElement()) {
createOMSConnectorLibraryTreeItems(pLibraryTreeItem);
}
} else {
qDebug() << "Unable to create LibraryTreeItems, unknown library type.";
}
Expand Down Expand Up @@ -2442,6 +2444,12 @@ LibraryTreeItem* LibraryTreeModel::createOMSLibraryTreeItemImpl(QString name, QS
OMSProxy::instance()->getElement(pLibraryTreeItem->getNameStructure(), &pOMSElement);
}
pLibraryTreeItem->setOMSElement(pOMSElement);
if (pLibraryTreeItem->getOMSElement() && pLibraryTreeItem->getOMSElement()->type == oms_element_system) {
oms_system_enu_t systemType;
if (OMSProxy::instance()->getSystemType(pLibraryTreeItem->getNameStructure(), &systemType)) {
pLibraryTreeItem->setSystemType(systemType);
}
}
pLibraryTreeItem->setOMSConnector(pOMSConnector);
if (pParentLibraryTreeItem && pLibraryTreeItem->getOMSElement() && pLibraryTreeItem->getOMSElement()->type == oms_component_fmu_old) {
const oms_fmu_info_t *pFMUInfo;
Expand Down
106 changes: 83 additions & 23 deletions OMEdit/OMEditGUI/Modeling/ModelWidgetContainer.cpp
Expand Up @@ -1335,9 +1335,7 @@ bool GraphicsView::isAnyItemSelectedAndEditable(int key)
return false;
}
if (mpModelWidget->getLibraryTreeItem()->getLibraryType() == LibraryTreeItem::OMS) {
if (mpModelWidget->getLibraryTreeItem()->getOMSElement()
&& (mpModelWidget->getLibraryTreeItem()->getOMSElement()->type == oms_component_fmu_old
|| mpModelWidget->getLibraryTreeItem()->getOMSElement()->type == oms_component_table_old)) {
if (mpModelWidget->getLibraryTreeItem()->getOMSElement()) {
switch (key) {
case Qt::Key_Delete:
case Qt::Key_R: // rotate
Expand Down Expand Up @@ -2692,8 +2690,7 @@ void GraphicsView::contextMenuEvent(QContextMenuEvent *event)
if (mpModelWidget->getLibraryTreeItem()->getOMSElement()) {
if (mpModelWidget->getLibraryTreeItem()->getOMSElement()->type == oms_element_system) {
menu.addAction(MainWindow::instance()->getAddSubModelAction());
} else if (mpModelWidget->getLibraryTreeItem()->getOMSElement()->type == oms_component_fmu_old
|| mpModelWidget->getLibraryTreeItem()->getOMSElement()->type == oms_component_table_old) {
} else if (mpModelWidget->getLibraryTreeItem()->getOMSElement()->type == oms_element_component) {
menu.addAction(MainWindow::instance()->getAddOrEditSubModelIconAction());
}
menu.addAction(MainWindow::instance()->getAddConnectorAction());
Expand Down Expand Up @@ -3104,13 +3101,9 @@ ModelWidget::ModelWidget(LibraryTreeItem* pLibraryTreeItem, ModelWidgetContainer
mpUndoView = new QUndoView(mpUndoStack);
}
mpEditor = 0;
if ((mpLibraryTreeItem->getOMSElement() && mpLibraryTreeItem->getOMSElement()->type == oms_component_fmu_old)
|| (mpLibraryTreeItem->getOMSElement() && mpLibraryTreeItem->getOMSElement()->type == oms_component_table_old)
|| mpLibraryTreeItem->getOMSConnector()) {
mpUndoStack->setEnabled(false);
drawOMSModelElements();
mpUndoStack->setEnabled(true);
}
mpUndoStack->setEnabled(false);
drawOMSModelIconElements();
mpUndoStack->setEnabled(true);
} else {
// icon graphics framework
mpIconGraphicsScene = 0;
Expand Down Expand Up @@ -3739,14 +3732,10 @@ void ModelWidget::createModelWidgetComponents()
mpEditor->hide(); // set it hidden so that Find/Replace action can get correct value.
connect(OptionsDialog::instance(), SIGNAL(omsimulatorEditorSettingsChanged()), pOMSimulatorHighlighter, SLOT(settingsChanged()));
}
// only get the components and connections if the we are not creating a new class.
if (mpLibraryTreeItem->getOMSElement() && mpLibraryTreeItem->getOMSElement()->type == oms_element_system &&
!mpLibraryTreeItem->getFileName().isEmpty()) {
mpUndoStack->setEnabled(false);
drawOMSModelElements();
drawOMSModelConnections();
mpUndoStack->setEnabled(true);
}
mpUndoStack->setEnabled(false);
drawOMSModelDiagramElements();
drawOMSModelConnections();
mpUndoStack->setEnabled(true);
mpDiagramGraphicsScene->clearSelection();
mpModelStatusBar->addPermanentWidget(mpReadOnlyLabel, 0);
mpModelStatusBar->addPermanentWidget(mpViewTypeLabel, 0);
Expand Down Expand Up @@ -5664,6 +5653,78 @@ void ModelWidget::getCompositeModelConnections()
}
}

void ModelWidget::drawOMSModelIconElements()
{
if (mpLibraryTreeItem->isTopLevel()) {
return;
} else if (mpLibraryTreeItem->getOMSElement() && mpLibraryTreeItem->getOMSElement()->type == oms_element_system) {
if (mpLibraryTreeItem->getOMSElement()->geometry && mpLibraryTreeItem->getOMSElement()->geometry->iconSource) {
// Draw bitmap with icon source
QUrl url(mpLibraryTreeItem->getOMSElement()->geometry->iconSource);
QFileInfo fileInfo(url.toLocalFile());
BitmapAnnotation *pBitmapAnnotation = new BitmapAnnotation(fileInfo.absoluteFilePath(), mpIconGraphicsView);
pBitmapAnnotation->initializeTransformation();
pBitmapAnnotation->drawCornerItems();
pBitmapAnnotation->setCornerItemsActiveOrPassive();
mpIconGraphicsView->addShapeToList(pBitmapAnnotation);
mpIconGraphicsView->addItem(pBitmapAnnotation);
} else {
// Rectangle shape as base
RectangleAnnotation *pRectangleAnnotation = new RectangleAnnotation(mpIconGraphicsView);
pRectangleAnnotation->initializeTransformation();
pRectangleAnnotation->drawCornerItems();
pRectangleAnnotation->setCornerItemsActiveOrPassive();
mpIconGraphicsView->addShapeToList(pRectangleAnnotation);
mpIconGraphicsView->addItem(pRectangleAnnotation);
// Text for name
TextAnnotation *pTextAnnotation = new TextAnnotation(mpIconGraphicsView);
pTextAnnotation->initializeTransformation();
pTextAnnotation->drawCornerItems();
pTextAnnotation->setCornerItemsActiveOrPassive();
mpIconGraphicsView->addShapeToList(pTextAnnotation);
mpIconGraphicsView->addItem(pTextAnnotation);
}
}
}

void ModelWidget::drawOMSModelDiagramElements()
{
if (mpLibraryTreeItem->isTopLevel()) {
for (int i = 0 ; i < mpLibraryTreeItem->childrenSize() ; i++) {
LibraryTreeItem *pChildLibraryTreeItem = mpLibraryTreeItem->childAt(i);
if (pChildLibraryTreeItem->getOMSElement() && pChildLibraryTreeItem->getOMSElement()->geometry) {
// check if we have zero width and height
double x1, y1, x2, y2;
x1 = pChildLibraryTreeItem->getOMSElement()->geometry->x1;
y1 = pChildLibraryTreeItem->getOMSElement()->geometry->y1;
x2 = pChildLibraryTreeItem->getOMSElement()->geometry->x2;
y2 = pChildLibraryTreeItem->getOMSElement()->geometry->y2;
double width = x2 - x1;
double height = y2 - y1;
if (width <= 0 && height <= 0) {
x1 = -10.0;
y1 = -10.0;
x2 = 10.0;
y2 = 10.0;
}
// Load the ModelWidget if not loaded already
if (!pChildLibraryTreeItem->getModelWidget()) {
MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel()->showModelWidget(pChildLibraryTreeItem, false);
}

QString annotation = QString("Placement(true,-,-,%1,%2,%3,%4,%5,-,-,-,-,-,-,)")
.arg(x1).arg(y1)
.arg(x2).arg(y2)
.arg(pChildLibraryTreeItem->getOMSElement()->geometry->rotation);
AddSystemCommand *pAddSystemCommand = new AddSystemCommand(pChildLibraryTreeItem->getName(), pChildLibraryTreeItem,
annotation, mpDiagramGraphicsView, true,
pChildLibraryTreeItem->getSystemType());
mpUndoStack->push(pAddSystemCommand);
}
}
}
}

/*!
* \brief ModelWidget::drawOMSModelElements
* Draws the OMSimulator model elements.
Expand Down Expand Up @@ -5703,7 +5764,7 @@ void ModelWidget::drawOMSModelElements()
mpUndoStack->push(pAddSubModelCommand);
}
}
} else if (mpLibraryTreeItem->getOMSElement()->type == oms_component_fmu_old || mpLibraryTreeItem->getOMSElement()->type == oms_component_table_old) {
} else if (mpLibraryTreeItem->getOMSElement()->type == oms_element_component) {
if (mpLibraryTreeItem->getOMSElement()->geometry && mpLibraryTreeItem->getOMSElement()->geometry->iconSource) {
// Draw bitmap with icon source
QUrl url(mpLibraryTreeItem->getOMSElement()->geometry->iconSource);
Expand Down Expand Up @@ -6616,8 +6677,7 @@ void ModelWidgetContainer::currentModelWidgetChanged(QMdiSubWindow *pSubWindow)
oms = true;
oms_submodel = false;
oms_connector = false;
if (pLibraryTreeItem->getOMSElement() && (pLibraryTreeItem->getOMSElement()->type == oms_component_fmu_old
|| pLibraryTreeItem->getOMSElement()->type == oms_component_table_old)) {
if (pLibraryTreeItem->getOMSElement()) {
oms_submodel = true;
}
if (pLibraryTreeItem->getOMSConnector()) {
Expand Down
2 changes: 2 additions & 0 deletions OMEdit/OMEditGUI/Modeling/ModelWidgetContainer.h
Expand Up @@ -488,6 +488,8 @@ class ModelWidget : public QWidget
void getCompositeModelSubModels();
void getCompositeModelConnections();
void drawOMSModelElements();
void drawOMSModelIconElements();
void drawOMSModelDiagramElements();
void drawOMSModelConnections();
private slots:
void showIconView(bool checked);
Expand Down
43 changes: 41 additions & 2 deletions OMEdit/OMEditGUI/Modeling/ModelicaClassDialog.cpp
Expand Up @@ -2052,6 +2052,7 @@ CreateModelDialog::CreateModelDialog(QWidget *pParent)
mpRootSystemGroupBox = new QGroupBox(tr("Root System"));
// system widget
mpSystemWidget = new SystemWidget(this);
mpSystemWidget->getNameTextBox()->setText("Root");
QHBoxLayout *pSystemGroupBoxLayout = new QHBoxLayout;
pSystemGroupBoxLayout->setAlignment(Qt::AlignLeft | Qt::AlignTop);
pSystemGroupBoxLayout->addWidget(mpSystemWidget);
Expand Down Expand Up @@ -2172,6 +2173,13 @@ void AddSystemDialog::addSystem()

LibraryTreeItem *pParentLibraryTreeItem;
pParentLibraryTreeItem = mpGraphicsView->getModelWidget()->getModelWidgetContainer()->getCurrentModelWidget()->getLibraryTreeItem();
// Check if Model already have the system
if (pParentLibraryTreeItem->isTopLevel() && pParentLibraryTreeItem->childrenSize() > 0) {
QMessageBox::critical(this, QString("%1 - %2").arg(Helper::applicationName, Helper::error),
tr("A model already have a system. Only one system is allowed inside a model."), Helper::ok);
return;
}
// Check if system already exists
for (int i = 0 ; i < pParentLibraryTreeItem->childrenSize() ; i++) {
LibraryTreeItem *pChildLibraryTreeItem = pParentLibraryTreeItem->child(i);
if (pChildLibraryTreeItem && pChildLibraryTreeItem->getName().compare(mpSystemWidget->getNameTextBox()->text()) == 0) {
Expand All @@ -2182,9 +2190,40 @@ void AddSystemDialog::addSystem()
return;
}
}
// Check if system is allowed
oms_system_enu_t systemType = (oms_system_enu_t)mpSystemWidget->getTypeComboBox()->itemData(mpSystemWidget->getTypeComboBox()->currentIndex()).toInt();
switch (systemType) {
case oms_system_tlm:
if (pParentLibraryTreeItem->getOMSElement()) {
QMessageBox::critical(this, QString("%1 - %2").arg(Helper::applicationName, Helper::error),
tr("A TLM system must be the the root system of a model."), Helper::ok);
return;
}
break;
case oms_system_wc:
if (pParentLibraryTreeItem->getOMSElement() && oms_system_tlm != pParentLibraryTreeItem->getSystemType())
{
QMessageBox::critical(this, QString("%1 - %2").arg(Helper::applicationName, Helper::error),
tr("A WC system must be the root system or a subsystem of a TLM system."), Helper::ok);
return;
}
break;
case oms_system_sc:
if (pParentLibraryTreeItem->getOMSElement() && oms_system_wc != pParentLibraryTreeItem->getSystemType()) {
QMessageBox::critical(this, QString("%1 - %2").arg(Helper::applicationName, Helper::error),
tr("A SC system must be the root system or a subsystem of a WC system."), Helper::ok);
return;
}
break;
default:
// Should never be reached.
break;
}

// add the system
QString annotation = QString("Placement(true,-,-,-10.0,-10.0,10.0,10.0,0,-,-,-,-,-,-,)");
AddSystemCommand *pAddSystemCommand = new AddSystemCommand(mpSystemWidget->getNameTextBox()->text(), 0, annotation, mpGraphicsView, false,
(oms_system_enu_t)mpSystemWidget->getTypeComboBox()->itemData(mpSystemWidget->getTypeComboBox()->currentIndex()).toInt());
AddSystemCommand *pAddSystemCommand = new AddSystemCommand(mpSystemWidget->getNameTextBox()->text(), 0, annotation,
mpGraphicsView, false, systemType);
mpGraphicsView->getModelWidget()->getUndoStack()->push(pAddSystemCommand);
mpGraphicsView->getModelWidget()->updateModelText();
accept();
Expand Down
43 changes: 15 additions & 28 deletions OMEdit/OMEditGUI/OMS/OMSProxy.cpp
Expand Up @@ -118,32 +118,6 @@ OMSProxy::OMSProxy()
oms2_setLoggingCallback(loggingCallback);
}

/*!
* \brief OMSProxy::getElementTypeString
* Returns the oms3_element_enu_t as string.
* \param type
* \return
*/
//QString OMSProxy::getElementTypeString(oms3_element_enu_t type)
//{
// switch (type) {
// case oms_element_system:
// return "System";
// case oms_element_external:
// return "External Model";
// case oms_element_fmu:
// return "FMU";
// case oms_element_table:
// return "Table";
// case oms_element_port:
// return "Port";
// case oms_element_none:
// default:
// // should never be reached
// return "";
// }
//}

/*!
* \brief OMSProxy::getSystemTypeString
* Returns the oms_system_enu_t as string.
Expand Down Expand Up @@ -288,6 +262,19 @@ bool OMSProxy::addSystem(QString cref, oms_system_enu_t type)
return statusToBool(status);
}

/*!
* \brief OMSProxy::getSystemType
* Get the system type.
* \param cref
* \param pType
* \return
*/
bool OMSProxy::getSystemType(QString cref, oms_system_enu_t *pType)
{
oms_status_enu_t status = oms3_getSystemType(cref.toStdString().c_str(), pType);
return statusToBool(status);
}

/*!
* \brief OMSProxy::newFMIModel
* Creates a new FMI model.
Expand Down Expand Up @@ -491,9 +478,9 @@ bool OMSProxy::setElementGeometry(QString cref, const ssd_element_geometry_t* pG
* \param pElements
* \return
*/
bool OMSProxy::getElements(QString cref, oms_element_t*** pElements)
bool OMSProxy::getElements(QString cref, oms3_element_t*** pElements)
{
oms_status_enu_t status = oms2_getElements(cref.toStdString().c_str(), pElements);
oms_status_enu_t status = oms3_getElements(cref.toStdString().c_str(), pElements);
return statusToBool(status);
}

Expand Down

0 comments on commit 99d3ba8

Please sign in to comment.