Skip to content

Commit

Permalink
Get the model connections
Browse files Browse the repository at this point in the history
  • Loading branch information
adeas31 committed Feb 28, 2018
1 parent 0e3a5eb commit 3fe1d13
Show file tree
Hide file tree
Showing 9 changed files with 176 additions and 25 deletions.
12 changes: 12 additions & 0 deletions OMEdit/OMEditGUI/Annotations/LineAnnotation.cpp
Expand Up @@ -1114,6 +1114,18 @@ void LineAnnotation::updateConnectionAnnotation()
if (mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getLibraryType()== LibraryTreeItem::CompositeModel) {
CompositeModelEditor *pCompositeModelEditor = dynamic_cast<CompositeModelEditor*>(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;
} else {
// get the connection line annotation.
QString annotationString = QString("annotate=").append(getShapeAnnotation());
Expand Down
5 changes: 4 additions & 1 deletion OMEdit/OMEditGUI/Component/Component.cpp
Expand Up @@ -1603,12 +1603,15 @@ void Component::drawSignals()
{
oms_signal_t** pInterfaces = mpLibraryTreeItem->getOMSComponent()->interfaces;
ComponentInfo *pComponentInfo = 0;
QString name;
for (int i = 0 ; pInterfaces[i] ; i++) {
switch (pInterfaces[i]->causality) {
case oms_causality_input:
case oms_causality_output:
pComponentInfo = new ComponentInfo;
pComponentInfo->setName(pInterfaces[i]->name);
name = StringHandler::getLastWordAfterDot(pInterfaces[i]->name);
name = name.split(':', QString::SkipEmptyParts).last();
pComponentInfo->setName(name);
//pComponentInfo->setClassName(pInterfaces[i]->type);
pComponentInfo->setOMSCausality(pInterfaces[i]->causality);
mComponentsList.append(new Component(pComponentInfo, mpLibraryTreeItem, this));
Expand Down
6 changes: 3 additions & 3 deletions OMEdit/OMEditGUI/Component/Component.h
Expand Up @@ -122,8 +122,8 @@ class ComponentInfo : public QObject
int getDimensions() const {return mDimensions;}
void setTLMCausality(QString causality) {mTLMCausality = causality;}
QString getTLMCausality() const {return mTLMCausality;}
void setOMSCausality(oms_causality_t causality) {mOMSCausality = causality;}
oms_causality_t getOMSCausality() const {return mOMSCausality;}
void setOMSCausality(oms_causality_enu_t causality) {mOMSCausality = causality;}
oms_causality_enu_t getOMSCausality() const {return mOMSCausality;}
void setDomain(QString domain) {mDomain = domain;}
QString getDomain() const {return mDomain;}
// operator overloading
Expand Down Expand Up @@ -160,7 +160,7 @@ class ComponentInfo : public QObject
int mDimensions;
QString mTLMCausality;
QString mDomain;
oms_causality_t mOMSCausality;
oms_causality_enu_t mOMSCausality;

bool isModiferClassRecord(QString modifierName, Component *pComponent);
};
Expand Down
2 changes: 1 addition & 1 deletion OMEdit/OMEditGUI/Modeling/LibraryTreeWidget.cpp
Expand Up @@ -4029,7 +4029,7 @@ void LibraryWidget::openOMSModelFile(QFileInfo fileInfo, bool showProgress)
pLibraryTreeItem = mpLibraryTreeModel->createLibraryTreeItem(LibraryTreeItem::OMS, modelName, modelName, fileInfo.absoluteFilePath(), true,
mpLibraryTreeModel->getRootLibraryTreeItem());
// set the component type
oms_component_type_t componentType = oms_component_none;
oms_component_type_enu_t componentType = oms_component_none;
OMSProxy::instance()->getComponentType(pLibraryTreeItem->getNameStructure(), &componentType);
pLibraryTreeItem->setOMSComponentType(componentType);
pLibraryTreeItem->setOMSComponent(0);
Expand Down
6 changes: 3 additions & 3 deletions OMEdit/OMEditGUI/Modeling/LibraryTreeWidget.h
Expand Up @@ -147,8 +147,8 @@ class LibraryTreeItem : public QObject
bool isExpanded() const {return mExpanded;}
void setNonExisting(bool nonExisting) {mNonExisting = nonExisting;}
bool isNonExisting() const {return mNonExisting;}
void setOMSComponentType(oms_component_type_t type) {mOMSComponentType = type;}
oms_component_type_t getOMSComponentType() const {return mOMSComponentType;}
void setOMSComponentType(oms_component_type_enu_t type) {mOMSComponentType = type;}
oms_component_type_enu_t getOMSComponentType() const {return mOMSComponentType;}
void setOMSComponent(oms_component_t *pOMSComponent) {mpOMSComponent = pOMSComponent;}
oms_component_t* getOMSComponent() const {return mpOMSComponent;}
QString getTooltip() const;
Expand Down Expand Up @@ -198,7 +198,7 @@ class LibraryTreeItem : public QObject
QString mClassTextAfter;
bool mExpanded;
bool mNonExisting;
oms_component_type_t mOMSComponentType;
oms_component_type_enu_t mOMSComponentType;
oms_component_t *mpOMSComponent;
signals:
void loaded(LibraryTreeItem *pLibraryTreeItem);
Expand Down
93 changes: 92 additions & 1 deletion OMEdit/OMEditGUI/Modeling/ModelWidgetContainer.cpp
Expand Up @@ -3525,7 +3525,7 @@ void ModelWidget::createModelWidgetComponents()
// only get the components and connectoi if the we are not creating a new class.
if (!mpLibraryTreeItem->getFileName().isEmpty()) {
drawOMSModelComponents();
//getCompositeModelConnections();
drawOMSModelConnections();
}
mpDiagramGraphicsScene->clearSelection();
mpModelStatusBar->addPermanentWidget(mpReadOnlyLabel, 0);
Expand Down Expand Up @@ -5384,6 +5384,97 @@ void ModelWidget::drawOMSModelComponents()
}
}

/*!
* \brief ModelWidget::drawOMSModelConnections
* Gets the OMSimulator model connections and draws them.
*/
void ModelWidget::drawOMSModelConnections()
{
MessagesWidget *pMessagesWidget = MessagesWidget::instance();
oms_connection_t** pConnections = NULL;
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);
if (startConnectionList.size() < 2) {
continue;
}
Component *pStartSubModelComponent = mpDiagramGraphicsView->getComponentObject(startConnectionList.at(0));
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),
Helper::scriptingKind, Helper::errorLevel));
continue;
}
// get start interface point
Component *pStartInterfacePointComponent = getConnectorComponent(pStartSubModelComponent, startConnectionList.at(1));
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),
Helper::scriptingKind, Helper::errorLevel));
continue;
}
// get end submodel
QStringList endConnectionList = StringHandler::getLastWordAfterDot(pConnections[i]->to).split(':', QString::SkipEmptyParts);
if (endConnectionList.size() < 2) {
continue;
}
Component *pEndSubModelComponent = mpDiagramGraphicsView->getComponentObject(endConnectionList.at(0));
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),
Helper::scriptingKind, Helper::errorLevel));
continue;
}
// get end interface point
Component *pEndInterfacePointComponent = getConnectorComponent(pEndSubModelComponent, endConnectionList.at(1));
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),
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]));
}
} else {
QPointF startPoint = pStartInterfacePointComponent->mapToScene(pStartInterfacePointComponent->boundingRect().center());
points.append(point.arg(startPoint.x()).arg(startPoint.y()));
QPointF endPoint = pEndInterfacePointComponent->mapToScene(pEndInterfacePointComponent->boundingRect().center());
points.append(point.arg(endPoint.x()).arg(endPoint.y()));
}
QString pointsString = QString("{%1}").arg(points.join(","));
shapesList = StringHandler::getStrings(StringHandler::removeFirstLastCurlBrackets(QString(annotation).arg(pointsString)), '(', ')');
// Now parse the shapes available in list
QString lineShape = "";
foreach (QString shape, shapesList) {
if (shape.startsWith("Line")) {
lineShape = shape.mid(QString("Line").length());
lineShape = StringHandler::removeFirstLastParentheses(lineShape);
break; // break the loop once we have got the line annotation.
}
}
LineAnnotation *pConnectionLineAnnotation = new LineAnnotation(lineShape, pStartInterfacePointComponent, pEndInterfacePointComponent,
mpDiagramGraphicsView);
pConnectionLineAnnotation->setStartComponentName(pConnections[i]->from);
pConnectionLineAnnotation->setEndComponentName(pConnections[i]->to);

mpUndoStack->push(new AddConnectionCommand(pConnectionLineAnnotation, false));
}
}
}

/*!
* \brief ModelWidget::showIconView
* \param checked
Expand Down
1 change: 1 addition & 0 deletions OMEdit/OMEditGUI/Modeling/ModelWidgetContainer.h
Expand Up @@ -468,6 +468,7 @@ class ModelWidget : public QWidget
void getCompositeModelSubModels();
void getCompositeModelConnections();
void drawOMSModelComponents();
void drawOMSModelConnections();
private slots:
void showIconView(bool checked);
void showDiagramView(bool checked);
Expand Down
69 changes: 55 additions & 14 deletions OMEdit/OMEditGUI/OMS/OMSProxy.cpp
Expand Up @@ -42,7 +42,7 @@
* \param type
* \param message
*/
void loggingCallback(oms_message_type_t type, const char *message)
void loggingCallback(oms_message_type_enu_t type, const char *message)
{
QString level = Helper::notificationLevel;
switch (type) {
Expand Down Expand Up @@ -103,11 +103,11 @@ OMSProxy::OMSProxy()

/*!
* \brief OMSProxy::statusToBool
* Converts the oms_status_t to bool.
* Converts the oms_status_enu_t to bool.
* \param status
* \return
*/
bool OMSProxy::statusToBool(oms_status_t status)
bool OMSProxy::statusToBool(oms_status_enu_t status)
{
switch (status) {
case oms_status_ok:
Expand Down Expand Up @@ -156,7 +156,7 @@ void OMSProxy::setWorkingDirectory(QString path)
*/
bool OMSProxy::newFMIModel(QString ident)
{
oms_status_t status = oms2_newFMIModel(ident.toStdString().c_str());
oms_status_enu_t status = oms2_newFMIModel(ident.toStdString().c_str());
return statusToBool(status);
}

Expand All @@ -178,7 +178,7 @@ void OMSProxy::setLoggingLevel(int logLevel)
*/
bool OMSProxy::newTLMModel(QString ident)
{
oms_status_t status = oms2_newTLMModel(ident.toStdString().c_str());
oms_status_enu_t status = oms2_newTLMModel(ident.toStdString().c_str());
return statusToBool(status);
}

Expand All @@ -190,7 +190,7 @@ bool OMSProxy::newTLMModel(QString ident)
*/
bool OMSProxy::unloadModel(QString ident)
{
oms_status_t status = oms2_unloadModel(ident.toStdString().c_str());
oms_status_enu_t status = oms2_unloadModel(ident.toStdString().c_str());
return statusToBool(status);
}

Expand All @@ -203,7 +203,7 @@ bool OMSProxy::unloadModel(QString ident)
*/
bool OMSProxy::renameModel(QString identOld, QString identNew)
{
oms_status_t status = oms2_renameModel(identOld.toStdString().c_str(), identNew.toStdString().c_str());
oms_status_enu_t status = oms2_renameModel(identOld.toStdString().c_str(), identNew.toStdString().c_str());
return statusToBool(status);
}

Expand All @@ -217,7 +217,7 @@ bool OMSProxy::renameModel(QString identOld, QString identNew)
bool OMSProxy::loadModel(QString filename, QString* pModelName)
{
char* ident = NULL;
oms_status_t status = oms2_loadModel(filename.toStdString().c_str(), &ident);
oms_status_enu_t status = oms2_loadModel(filename.toStdString().c_str(), &ident);
*pModelName = QString(ident);
return statusToBool(status);
}
Expand All @@ -231,7 +231,7 @@ bool OMSProxy::loadModel(QString filename, QString* pModelName)
*/
bool OMSProxy::saveModel(QString filename, QString ident)
{
oms_status_t status = oms2_saveModel(filename.toStdString().c_str(), ident.toStdString().c_str());
oms_status_enu_t status = oms2_saveModel(filename.toStdString().c_str(), ident.toStdString().c_str());
return statusToBool(status);
}

Expand All @@ -242,9 +242,9 @@ bool OMSProxy::saveModel(QString filename, QString ident)
* \param pType
* \return
*/
bool OMSProxy::getComponentType(QString ident, oms_component_type_t* pType)
bool OMSProxy::getComponentType(QString ident, oms_component_type_enu_t* pType)
{
oms_status_t status = oms2_getComponentType(ident.toStdString().c_str(), pType);
oms_status_enu_t status = oms2_getComponentType(ident.toStdString().c_str(), pType);
return statusToBool(status);
}

Expand All @@ -257,7 +257,7 @@ bool OMSProxy::getComponentType(QString ident, oms_component_type_t* pType)
*/
bool OMSProxy::getComponents(QString cref, oms_component_t*** pComponents)
{
oms_status_t status = oms2_getComponents(cref.toStdString().c_str(), pComponents);
oms_status_enu_t status = oms2_getComponents(cref.toStdString().c_str(), pComponents);
return statusToBool(status);
}

Expand All @@ -270,7 +270,7 @@ bool OMSProxy::getComponents(QString cref, oms_component_t*** pComponents)
*/
bool OMSProxy::getElementGeometry(QString cref, const ssd_element_geometry_t** pGeometry)
{
oms_status_t status = oms2_getElementGeometry(cref.toStdString().c_str(), pGeometry);
oms_status_enu_t status = oms2_getElementGeometry(cref.toStdString().c_str(), pGeometry);
return statusToBool(status);
}

Expand All @@ -283,6 +283,47 @@ bool OMSProxy::getElementGeometry(QString cref, const ssd_element_geometry_t** p
*/
bool OMSProxy::setElementGeometry(QString cref, const ssd_element_geometry_t* pGeometry)
{
oms_status_t status = oms2_setElementGeometry(cref.toStdString().c_str(), pGeometry);
oms_status_enu_t status = oms2_setElementGeometry(cref.toStdString().c_str(), pGeometry);
return statusToBool(status);
}

/*!
* \brief OMSProxy::getConnections
* Get the model connections
* \param cref
* \param pConnections
* \return
*/
bool OMSProxy::getConnections(QString cref, oms_connection_t*** pConnections)
{
oms_status_enu_t status = oms2_getConnections(cref.toStdString().c_str(), pConnections);
return statusToBool(status);
}

/*!
* \brief OMSProxy::getConnectionGeometry
* Gets the connection geometry
* \param signalA
* \param signalB
* \param pGeometry
* \return
*/
bool OMSProxy::getConnectionGeometry(QString signalA, QString signalB, const ssd_connection_geometry_t** pGeometry)
{
oms_status_enu_t status = oms2_getConnectionGeometry(signalA.toStdString().c_str(), signalB.toStdString().c_str(), pGeometry);
return statusToBool(status);
}

/*!
* \brief OMSProxy::setConnectionGeometry
* Sets the connection geometry
* \param signalA
* \param signalB
* \param pGeometry
* \return
*/
bool OMSProxy::setConnectionGeometry(QString signalA, QString signalB, const ssd_connection_geometry_t* pGeometry)
{
oms_status_enu_t status = oms2_setConnectionGeometry(signalA.toStdString().c_str(), signalB.toStdString().c_str(), pGeometry);
return statusToBool(status);
}
7 changes: 5 additions & 2 deletions OMEdit/OMEditGUI/OMS/OMSProxy.h
Expand Up @@ -52,7 +52,7 @@ class OMSProxy : public QObject
static OMSProxy *mpInstance;
public:
static OMSProxy* instance() {return mpInstance;}
bool statusToBool(oms_status_t status);
bool statusToBool(oms_status_enu_t status);
void setLogFile(QString filename);
void setTempDirectory(QString path);
void setWorkingDirectory(QString path);
Expand All @@ -63,10 +63,13 @@ class OMSProxy : public QObject
bool renameModel(QString identOld, QString identNew);
bool loadModel(QString filename, QString* pModelName);
bool saveModel(QString filename, QString ident);
bool getComponentType(QString ident, oms_component_type_t* pType);
bool getComponentType(QString ident, oms_component_type_enu_t* pType);
bool getComponents(QString cref, oms_component_t*** pComponents);
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);
};

#endif // OMSPROXY_H

0 comments on commit 3fe1d13

Please sign in to comment.