From 0731b2d6c26ea18dce4f67d1e30806fe214a266e Mon Sep 17 00:00:00 2001 From: Adeel Asghar Date: Fri, 2 Mar 2018 15:15:30 +0100 Subject: [PATCH] Adapted to new connection APIs --- .../OMEditGUI/Annotations/LineAnnotation.cpp | 47 +++++++++++++---- OMEdit/OMEditGUI/Annotations/LineAnnotation.h | 1 + OMEdit/OMEditGUI/Component/Component.cpp | 3 +- .../Modeling/ModelWidgetContainer.cpp | 50 +++++++++++++------ OMEdit/OMEditGUI/OMS/OMSProxy.cpp | 46 +++++++++++------ OMEdit/OMEditGUI/OMS/OMSProxy.h | 5 +- 6 files changed, 108 insertions(+), 44 deletions(-) diff --git a/OMEdit/OMEditGUI/Annotations/LineAnnotation.cpp b/OMEdit/OMEditGUI/Annotations/LineAnnotation.cpp index 01edac1c852..4545473700d 100644 --- a/OMEdit/OMEditGUI/Annotations/LineAnnotation.cpp +++ b/OMEdit/OMEditGUI/Annotations/LineAnnotation.cpp @@ -1022,6 +1022,41 @@ void LineAnnotation::setAligned(bool aligned) update(); } +/*! + * \brief LineAnnotation::updateOMSConnection + * Updates the OMSimulator model connection + */ +void LineAnnotation::updateOMSConnection() +{ + // connection geometry + ssd_connection_geometry_t* pConnectionGeometry = new ssd_connection_geometry_t; + pConnectionGeometry->n = mPoints.size(); + pConnectionGeometry->pointsX = new double[mPoints.size()]; + pConnectionGeometry->pointsY = new double[mPoints.size()]; + for (int i = 0 ; i < mPoints.size() ; i++) { + pConnectionGeometry->pointsX[i] = mPoints.at(i).x(); + pConnectionGeometry->pointsY[i] = mPoints.at(i).y(); + } + // connection + oms_connection_t connection; + connection.type = oms_connection_fmi; + connection.parent = new char[mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure().toStdString().size() + 1]; + strcpy(connection.parent, mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure().toStdString().c_str()); + connection.conA = new char[getStartComponentName().toStdString().size() + 1]; + strcpy(connection.conA, getStartComponentName().toStdString().c_str()); + connection.conB = new char[getEndComponentName().toStdString().size() + 1]; + strcpy(connection.conB, getEndComponentName().toStdString().c_str()); + connection.geometry = pConnectionGeometry; + OMSProxy::instance()->updateConnection(mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure(), + getStartComponentName(), getEndComponentName(), &connection); + delete[] connection.parent; + delete[] connection.conA; + delete[] connection.conB; + delete[] pConnectionGeometry->pointsX; + delete[] pConnectionGeometry->pointsY; + delete pConnectionGeometry; +} + QVariant LineAnnotation::itemChange(GraphicsItemChange change, const QVariant &value) { ShapeAnnotation::itemChange(change, value); @@ -1115,17 +1150,7 @@ void LineAnnotation::updateConnectionAnnotation() CompositeModelEditor *pCompositeModelEditor = dynamic_cast(mpGraphicsView->getModelWidget()->getEditor()); pCompositeModelEditor->updateConnection(this); } else if (mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getLibraryType()== LibraryTreeItem::OMS) { - ssd_connection_geometry_t connectionGeometry; - connectionGeometry.n = mPoints.size(); - connectionGeometry.pointsX = new double[mPoints.size()]; - connectionGeometry.pointsY = new double[mPoints.size()]; - for (int i = 0 ; i < mPoints.size() ; i++) { - connectionGeometry.pointsX[i] = mPoints.at(i).x(); - connectionGeometry.pointsY[i] = mPoints.at(i).y(); - } - OMSProxy::instance()->setConnectionGeometry(getStartComponentName(), getEndComponentName(), &connectionGeometry); - delete[] connectionGeometry.pointsX; - delete[] connectionGeometry.pointsY; + updateOMSConnection(); } else { // get the connection line annotation. QString annotationString = QString("annotate=").append(getShapeAnnotation()); diff --git a/OMEdit/OMEditGUI/Annotations/LineAnnotation.h b/OMEdit/OMEditGUI/Annotations/LineAnnotation.h index e6d392f58a1..0554eaf41d6 100644 --- a/OMEdit/OMEditGUI/Annotations/LineAnnotation.h +++ b/OMEdit/OMEditGUI/Annotations/LineAnnotation.h @@ -128,6 +128,7 @@ class LineAnnotation : public ShapeAnnotation void setShapeFlags(bool enable); void updateShape(ShapeAnnotation *pShapeAnnotation); void setAligned(bool aligned); + void updateOMSConnection(); protected: QVariant itemChange(GraphicsItemChange change, const QVariant &value); diff --git a/OMEdit/OMEditGUI/Component/Component.cpp b/OMEdit/OMEditGUI/Component/Component.cpp index 786caa48b27..26c8c36ccbe 100644 --- a/OMEdit/OMEditGUI/Component/Component.cpp +++ b/OMEdit/OMEditGUI/Component/Component.cpp @@ -868,7 +868,8 @@ void Component::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, if (mTransformation.isValid()) { setVisible(mTransformation.getVisible()); if (mpStateComponentRectangle) { - if (isVisible() && mpLibraryTreeItem && mpLibraryTreeItem->getLibraryType() == LibraryTreeItem::Modelica && mpLibraryTreeItem->isState()) { + if (isVisible() && mpLibraryTreeItem && mpLibraryTreeItem->getLibraryType() == LibraryTreeItem::Modelica && + mpLibraryTreeItem->isState()) { if (mHasTransition && mIsInitialState) { mpStateComponentRectangle->setLinePattern(StringHandler::LineSolid); mpStateComponentRectangle->setLineThickness(0.5); diff --git a/OMEdit/OMEditGUI/Modeling/ModelWidgetContainer.cpp b/OMEdit/OMEditGUI/Modeling/ModelWidgetContainer.cpp index 14baef98cab..7f47631b341 100644 --- a/OMEdit/OMEditGUI/Modeling/ModelWidgetContainer.cpp +++ b/OMEdit/OMEditGUI/Modeling/ModelWidgetContainer.cpp @@ -589,6 +589,12 @@ void GraphicsView::addConnectionToClass(LineAnnotation *pConnectionLineAnnotatio if (pCompositeModelEditor) { pCompositeModelEditor->createConnection(pConnectionLineAnnotation); } + } else if (mpModelWidget->getLibraryTreeItem()->getLibraryType()== LibraryTreeItem::OMS) { + if (OMSProxy::instance()->addConnection(mpModelWidget->getLibraryTreeItem()->getNameStructure(), + pConnectionLineAnnotation->getStartComponentName(), + pConnectionLineAnnotation->getEndComponentName())) { + pConnectionLineAnnotation->updateOMSConnection(); + } } else { MainWindow *pMainWindow = MainWindow::instance(); if (pMainWindow->getOMCProxy()->addConnection(pConnectionLineAnnotation->getStartComponentName(), @@ -614,6 +620,10 @@ void GraphicsView::deleteConnectionFromClass(LineAnnotation *pConnectionLineAnno if (mpModelWidget->getLibraryTreeItem()->getLibraryType()== LibraryTreeItem::CompositeModel) { CompositeModelEditor *pCompositeModelEditor = dynamic_cast(mpModelWidget->getEditor()); pCompositeModelEditor->deleteConnection(pConnectionLineAnnotation->getStartComponentName(), pConnectionLineAnnotation->getEndComponentName()); + } else if (mpModelWidget->getLibraryTreeItem()->getLibraryType()== LibraryTreeItem::OMS) { + OMSProxy::instance()->deleteConnection(mpModelWidget->getLibraryTreeItem()->getNameStructure(), + pConnectionLineAnnotation->getStartComponentName(), + pConnectionLineAnnotation->getEndComponentName()); } else { pMainWindow->getOMCProxy()->deleteConnection(pConnectionLineAnnotation->getStartComponentName(), pConnectionLineAnnotation->getEndComponentName(), @@ -1332,6 +1342,8 @@ Component* GraphicsView::connectorComponentAtPosition(QPoint position) !mpModelWidget->getLibraryTreeItem()->isSystemLibrary() && ((pComponent->getLibraryTreeItem() && pComponent->getLibraryTreeItem()->isConnector()) || (mpModelWidget->getLibraryTreeItem()->getLibraryType() == LibraryTreeItem::CompositeModel && + pComponent->getComponentType() == Component::Port) || + (mpModelWidget->getLibraryTreeItem()->getLibraryType() == LibraryTreeItem::OMS && pComponent->getComponentType() == Component::Port))) { return pComponent; } @@ -1359,7 +1371,8 @@ Component* GraphicsView::stateComponentAtPosition(QPoint position) if (pRootComponent && !pRootComponent->isSelected()) { if (MainWindow::instance()->getTransitionModeAction()->isChecked() && mViewType == StringHandler::Diagram && !mpModelWidget->getLibraryTreeItem()->isSystemLibrary() && - ((pComponent->getLibraryTreeItem() && pComponent->getLibraryTreeItem()->isState()))) { + ((pComponent->getLibraryTreeItem() && pComponent->getLibraryTreeItem()->getLibraryType() == LibraryTreeItem::Modelica && + pComponent->getLibraryTreeItem()->isState()))) { return pComponent; } } @@ -1424,14 +1437,22 @@ void GraphicsView::addConnection(Component *pComponent) removeCurrentConnection(); } } else { + QString startComponentNameTemplate, endComponentNameTemplate; + if (mpModelWidget->getLibraryTreeItem()->getLibraryType() == LibraryTreeItem::OMS) { + startComponentNameTemplate = QString("%1:%2"); + endComponentNameTemplate = QString("%1:%2"); + } else { + startComponentNameTemplate = QString("%1.%2"); + endComponentNameTemplate = QString("%1.%2"); + } QString startComponentName, endComponentName; if (pStartComponent->getParentComponent()) { - startComponentName = QString(pStartComponent->getRootParentComponent()->getName()).append(".").append(pStartComponent->getName()); + startComponentName = startComponentNameTemplate.arg(pStartComponent->getRootParentComponent()->getName()).arg(pStartComponent->getName()); } else { startComponentName = pStartComponent->getName(); } if (pComponent->getParentComponent()) { - endComponentName = QString(pComponent->getRootParentComponent()->getName()).append(".").append(pComponent->getName()); + endComponentName = endComponentNameTemplate.arg(pComponent->getRootParentComponent()->getName()).arg(pComponent->getName()); } else { endComponentName = pComponent->getName(); } @@ -5395,7 +5416,7 @@ void ModelWidget::drawOMSModelConnections() if (OMSProxy::instance()->getConnections(mpLibraryTreeItem->getNameStructure(), &pConnections)) { for (int i = 0 ; pConnections[i] ; i++) { // get start submodel - QStringList startConnectionList = StringHandler::getLastWordAfterDot(pConnections[i]->from).split(':', QString::SkipEmptyParts); + QStringList startConnectionList = QString(pConnections[i]->conA).split(':', QString::SkipEmptyParts); if (startConnectionList.size() < 2) { continue; } @@ -5403,7 +5424,7 @@ void ModelWidget::drawOMSModelConnections() if (!pStartSubModelComponent) { pMessagesWidget->addGUIMessage(MessageItem(MessageItem::Modelica, "", false, 0, 0, 0, 0, GUIMessages::getMessage(GUIMessages::UNABLE_FIND_COMPONENT_IN_CONNECTION) - .arg(startConnectionList.at(0)).arg(pConnections[i]->from), + .arg(startConnectionList.at(0)).arg(pConnections[i]->conA), Helper::scriptingKind, Helper::errorLevel)); continue; } @@ -5412,12 +5433,12 @@ void ModelWidget::drawOMSModelConnections() if (!pStartInterfacePointComponent) { pMessagesWidget->addGUIMessage(MessageItem(MessageItem::Modelica, "", false, 0, 0, 0, 0, GUIMessages::getMessage(GUIMessages::UNABLE_FIND_COMPONENT_IN_CONNECTION) - .arg(startConnectionList.at(1)).arg(pConnections[i]->from), + .arg(startConnectionList.at(1)).arg(pConnections[i]->conA), Helper::scriptingKind, Helper::errorLevel)); continue; } // get end submodel - QStringList endConnectionList = StringHandler::getLastWordAfterDot(pConnections[i]->to).split(':', QString::SkipEmptyParts); + QStringList endConnectionList = QString(pConnections[i]->conB).split(':', QString::SkipEmptyParts); if (endConnectionList.size() < 2) { continue; } @@ -5425,7 +5446,7 @@ void ModelWidget::drawOMSModelConnections() if (!pEndSubModelComponent) { pMessagesWidget->addGUIMessage(MessageItem(MessageItem::Modelica, "", false, 0, 0, 0, 0, GUIMessages::getMessage(GUIMessages::UNABLE_FIND_COMPONENT_IN_CONNECTION) - .arg(endConnectionList.at(0)).arg(pConnections[i]->to), + .arg(endConnectionList.at(0)).arg(pConnections[i]->conB), Helper::scriptingKind, Helper::errorLevel)); continue; } @@ -5434,19 +5455,18 @@ void ModelWidget::drawOMSModelConnections() if (!pEndInterfacePointComponent) { pMessagesWidget->addGUIMessage(MessageItem(MessageItem::Modelica, "", false, 0, 0, 0, 0, GUIMessages::getMessage(GUIMessages::UNABLE_FIND_COMPONENT_IN_CONNECTION) - .arg(endConnectionList.at(1)).arg(pConnections[i]->to), + .arg(endConnectionList.at(1)).arg(pConnections[i]->conB), Helper::scriptingKind, Helper::errorLevel)); continue; } // default connection annotation QString annotation = QString("{Line(true,{0.0,0.0},0,%1,{0,0,0},LinePattern.Solid,0.25,{Arrow.None,Arrow.None},3,Smooth.None)}"); QStringList shapesList; - const ssd_connection_geometry_t *pConnectionGeometry; QString point = QString("{%1,%2}"); QStringList points; - if (OMSProxy::instance()->getConnectionGeometry(pConnections[i]->from, pConnections[i]->to, &pConnectionGeometry)) { - for (unsigned int i = 0 ; i < pConnectionGeometry->n ; i++) { - points.append(point.arg(pConnectionGeometry->pointsX[i]).arg(pConnectionGeometry->pointsY[i])); + if (pConnections[i]->geometry && pConnections[i]->geometry->n > 0) { + for (unsigned int j = 0 ; j < pConnections[i]->geometry->n ; j++) { + points.append(point.arg(pConnections[i]->geometry->pointsX[j]).arg(pConnections[i]->geometry->pointsY[j])); } } else { QPointF startPoint = pStartInterfacePointComponent->mapToScene(pStartInterfacePointComponent->boundingRect().center()); @@ -5467,8 +5487,8 @@ void ModelWidget::drawOMSModelConnections() } LineAnnotation *pConnectionLineAnnotation = new LineAnnotation(lineShape, pStartInterfacePointComponent, pEndInterfacePointComponent, mpDiagramGraphicsView); - pConnectionLineAnnotation->setStartComponentName(pConnections[i]->from); - pConnectionLineAnnotation->setEndComponentName(pConnections[i]->to); + pConnectionLineAnnotation->setStartComponentName(pConnections[i]->conA); + pConnectionLineAnnotation->setEndComponentName(pConnections[i]->conB); mpUndoStack->push(new AddConnectionCommand(pConnectionLineAnnotation, false)); } diff --git a/OMEdit/OMEditGUI/OMS/OMSProxy.cpp b/OMEdit/OMEditGUI/OMS/OMSProxy.cpp index 334c54b5b2b..40b2739f780 100644 --- a/OMEdit/OMEditGUI/OMS/OMSProxy.cpp +++ b/OMEdit/OMEditGUI/OMS/OMSProxy.cpp @@ -203,7 +203,7 @@ bool OMSProxy::unloadModel(QString ident) */ bool OMSProxy::renameModel(QString identOld, QString identNew) { - oms_status_enu_t status = oms2_renameModel(identOld.toStdString().c_str(), identNew.toStdString().c_str()); + oms_status_enu_t status = oms2_rename(identOld.toStdString().c_str(), identNew.toStdString().c_str()); return statusToBool(status); } @@ -301,29 +301,45 @@ bool OMSProxy::getConnections(QString cref, oms_connection_t*** pConnections) } /*! - * \brief OMSProxy::getConnectionGeometry - * Gets the connection geometry - * \param signalA - * \param signalB - * \param pGeometry + * \brief OMSProxy::addConnection + * Adds the connection + * \param cref + * \param conA + * \param conB * \return */ -bool OMSProxy::getConnectionGeometry(QString signalA, QString signalB, const ssd_connection_geometry_t** pGeometry) +bool OMSProxy::addConnection(QString cref, QString conA, QString conB) { - oms_status_enu_t status = oms2_getConnectionGeometry(signalA.toStdString().c_str(), signalB.toStdString().c_str(), pGeometry); + oms_status_enu_t status = oms2_addConnection(cref.toStdString().c_str(), conA.toStdString().c_str(), conB.toStdString().c_str()); return statusToBool(status); } /*! - * \brief OMSProxy::setConnectionGeometry - * Sets the connection geometry - * \param signalA - * \param signalB - * \param pGeometry + * \brief OMSProxy::deleteConnection + * Deletes the connection + * \param cref + * \param conA + * \param conB + * \return + */ +bool OMSProxy::deleteConnection(QString cref, QString conA, QString conB) +{ + oms_status_enu_t status = oms2_deleteConnection(cref.toStdString().c_str(), conA.toStdString().c_str(), conB.toStdString().c_str()); + return statusToBool(status); +} + +/*! + * \brief OMSProxy::updateConnection + * Updates the connection + * \param cref + * \param conA + * \param conB + * \param connection * \return */ -bool OMSProxy::setConnectionGeometry(QString signalA, QString signalB, const ssd_connection_geometry_t* pGeometry) +bool OMSProxy::updateConnection(QString cref, QString conA, QString conB, const oms_connection_t *connection) { - oms_status_enu_t status = oms2_setConnectionGeometry(signalA.toStdString().c_str(), signalB.toStdString().c_str(), pGeometry); + oms_status_enu_t status = oms2_updateConnection(cref.toStdString().c_str(), conA.toStdString().c_str(), + conB.toStdString().c_str(), connection); return statusToBool(status); } diff --git a/OMEdit/OMEditGUI/OMS/OMSProxy.h b/OMEdit/OMEditGUI/OMS/OMSProxy.h index 30e81bd0053..214546b219c 100644 --- a/OMEdit/OMEditGUI/OMS/OMSProxy.h +++ b/OMEdit/OMEditGUI/OMS/OMSProxy.h @@ -68,8 +68,9 @@ class OMSProxy : public QObject bool getElementGeometry(QString cref, const ssd_element_geometry_t** pGeometry); bool setElementGeometry(QString cref, const ssd_element_geometry_t* pGeometry); bool getConnections(QString cref, oms_connection_t*** pConnections); - bool setConnectionGeometry(QString signalA, QString signalB, const ssd_connection_geometry_t* pGeometry); - bool getConnectionGeometry(QString signalA, QString signalB, const ssd_connection_geometry_t** pGeometry); + bool addConnection(QString cref, QString conA, QString conB); + bool deleteConnection(QString cref, QString conA, QString conB); + bool updateConnection(QString cref, QString conA, QString conB, const oms_connection_t* connection); }; #endif // OMSPROXY_H