Xcos MVC: implement 'equations' 67/15367/10
Paul Bignier [Fri, 10 Oct 2014 14:20:02 +0000 (16:20 +0200)]
 * For the moment it can only contain scalar reals in 'parameters' value.
   To extend that, the information would require to be saved in the view (Adapters) instead of the model.

Change-Id: Iac3fa05cfd7054b28d932daa04e153a1b106e4c5

scilab/modules/scicos/src/cpp/Model_getObjectProperties.cpp
scilab/modules/scicos/src/cpp/Model_setObjectProperties.cpp
scilab/modules/scicos/src/cpp/model/Block.hxx
scilab/modules/scicos/src/cpp/view_scilab/BlockAdapter.cpp
scilab/modules/scicos/src/cpp/view_scilab/BlockAdapter.hxx
scilab/modules/scicos/src/cpp/view_scilab/ModelAdapter.cpp
scilab/modules/scicos/tests/unit_tests/model/Block.dia.ref
scilab/modules/scicos/tests/unit_tests/model/Block.tst
scilab/modules/scicos/tests/unit_tests/model/Diagram.dia.ref
scilab/modules/scicos/tests/unit_tests/model/SuperBlock.dia.ref

index faf6664..3f945be 100644 (file)
@@ -528,6 +528,9 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
             case EXPRS:
                 o->getExprs(v);
                 return true;
+            case EQUATIONS:
+                o->getEquations(v);
+                return true;
             default:
                 break;
         }
index dffae67..da2f172 100644 (file)
@@ -478,6 +478,8 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
         {
             case EXPRS:
                 return o->setExprs(v);
+            case EQUATIONS:
+                return o->setEquations(v);
             default:
                 break;
         }
index 48661af..aabf9fa 100644 (file)
@@ -405,6 +405,22 @@ private:
         return SUCCESS;
     }
 
+    void getEquations(std::vector<std::string>& data) const
+    {
+        data = m_equations;
+    }
+
+    update_status_t setEquations(const std::vector<std::string>& data)
+    {
+        if (data == m_equations)
+        {
+            return NO_CHANGES;
+        }
+
+        m_equations = data;
+        return SUCCESS;
+    }
+
     void getUID(std::string& data) const
     {
         data = m_uid;
@@ -650,7 +666,6 @@ private:
     std::string m_style;
     int m_nzcross;
     int m_nmode;
-    // FIXME: find an appropriate way to store 'equations'
     std::vector<std::string> m_equations;
     std::string m_uid;
 
index e8d86aa..1fee00d 100644 (file)
@@ -69,7 +69,6 @@ struct model
         {
             // Decrease rpar_content's ref count to counter the increases from the other Adapters
             rpar_content->DecreaseRef();
-            rpar_content->DecreaseRef();
             ret->set(rpar, rpar_content);
         }
 
index 93d18eb..c1e5430 100644 (file)
@@ -48,7 +48,6 @@ public:
 
 private:
     types::InternalType* rpar_content;
-
     types::InternalType* doc_content;
 };
 
index f80b76d..c571d11 100644 (file)
@@ -21,6 +21,7 @@
 #include "double.hxx"
 #include "string.hxx"
 #include "list.hxx"
+#include "tlist.hxx"
 #include "user.hxx"
 
 #include "Controller.hxx"
@@ -49,6 +50,12 @@ const std::string output ("output");
 const std::string inimpl ("inimpl");
 const std::string outimpl ("outimpl");
 
+const std::wstring modelica (L"modelica");
+const std::wstring model (L"model");
+const std::wstring inputs (L"inputs");
+const std::wstring outputs (L"outputs");
+const std::wstring parameters (L"parameters");
+
 struct sim
 {
 
@@ -719,7 +726,7 @@ bool setPropList(ModelAdapter& adaptor, Controller& controller, const object_pro
                 m = pBool->getRows();
                 n = pBool->getCols();
 
-                // It takes 1 int (4 bytes) to save 1 bool (1 int: 4 byte)
+                // It takes 1 int (4 bytes) to save 1 bool (1 int: 4 bytes)
                 // So reserve m*n and 2 integers for the matrix dimensions
                 numberOfIntNeeded = m * n;
                 prop_content.resize(prop_content.size() + 2 + numberOfIntNeeded);
@@ -1239,40 +1246,353 @@ struct equations
 
     static types::InternalType* get(const ModelAdapter& adaptor, const Controller& controller)
     {
-        // silent unused parameter warnings
-        (void) adaptor;
-        (void) controller;
+        ScicosID adaptee = adaptor.getAdaptee()->id();
+
+        std::vector<std::string> equations;
+        controller.getObjectProperty(adaptee, BLOCK, EQUATIONS, equations);
+
+        if (equations.size() == 0)
+        {
+            return new types::List();
+        }
+
+        types::TList* o = new types::TList();
+
+        // Header, starting with "modelica"
+        types::String* header = new types::String(1, 5);
+        header->set(0, modelica.c_str());
+        header->set(1, model.c_str());
+        header->set(2, inputs.c_str());
+        header->set(3, outputs.c_str());
+        header->set(4, parameters.c_str());
+        o->set(0, header);
+
+        // 'model'
+        types::String* modelField = new types::String(1, 1);
+        modelField->set(0, equations[0].c_str());
+        o->set(1, modelField);
+
+        // 'inputs'
+        std::istringstream inputsSizeStr (equations[1]);
+        int inputsSize;
+        inputsSizeStr >> inputsSize;
+        if (inputsSize == 0)
+        {
+            types::Double* inputsField = types::Double::Empty();
+            o->set(2, inputsField);
+        }
+        else
+        {
+            types::String* inputsField = new types::String(inputsSize, 1);
+            for (int i = 0; i < inputsSize; ++i)
+            {
+                inputsField->set(i, equations[i + 2].c_str());
+            }
+            o->set(2, inputsField);
+        }
+
+        // 'outputs'
+        std::istringstream outputsSizeStr (equations[2 + inputsSize]);
+        int outputsSize;
+        outputsSizeStr >> outputsSize;
+        if (outputsSize == 0)
+        {
+            types::Double* outputsField = types::Double::Empty();
+            o->set(3, outputsField);
+        }
+        else
+        {
+            types::String* outputsField = new types::String(outputsSize, 1);
+            for (int i = 0; i < outputsSize; ++i)
+            {
+                outputsField->set(i, equations[i + 3 + inputsSize].c_str());
+            }
+            o->set(3, outputsField);
+        }
+
+        // 'parameters'
+        types::List* parametersField = new types::List();
+
+        // 'parameters' names
+        std::istringstream parametersSizeStr (equations[3 + inputsSize + outputsSize]);
+        int parametersSize;
+        parametersSizeStr >> parametersSize;
+        if (parametersSize == 0)
+        {
+            types::Double* parametersNames = types::Double::Empty();
+            parametersField->set(0, parametersNames);
+        }
+        else
+        {
+            types::String* parametersNames = new types::String(parametersSize, 1);
+            for (int i = 0; i < parametersSize; ++i)
+            {
+                parametersNames->set(i, equations[i + 4 + inputsSize + outputsSize].c_str());
+            }
+            parametersField->set(0, parametersNames);
+        }
 
-        // FIXME: implement as a stored modelica equations
+        // 'parameters' values
+        types::List* parametersValues = new types::List();
+        for (int i = 0; i < parametersSize; ++i)
+        {
+            std::istringstream parametersValueStr (equations[i + 4 + inputsSize + outputsSize + parametersSize]);
+            double parametersVal;
+            parametersValueStr >> parametersVal;
+            types::Double* parametersValue = new types::Double(parametersVal);
+            parametersValues->set(i, parametersValue);
+        }
+        parametersField->set(1, parametersValues);
+
+        o->set(4, parametersField);
 
-        // Return a default empty list.
-        return new types::List();
+        return o;
     }
 
     static bool set(ModelAdapter& adaptor, types::InternalType* v, Controller& controller)
     {
-        if (v->getType() != types::InternalType::ScilabList)
+        ScicosID adaptee = adaptor.getAdaptee()->id();
+
+        if (v->getType() == types::InternalType::ScilabList)
+        {
+            types::List* current = v->getAs<types::List>();
+            if (current->getSize() != 0)
+            {
+                return false;
+            }
+            return true;
+        }
+
+        if (v->getType() != types::InternalType::ScilabTList)
         {
             return false;
         }
 
-        types::List* current = v->getAs<types::List>();
+        types::TList* current = v->getAs<types::TList>();
 
-        if (current->getSize() == 0)
+        // Check the header
+        types::String* header = current->getFieldNames();
+        if (header->getSize() != 5)
         {
-            return true;
+            return false;
+        }
+        if (header->get(0) != modelica)
+        {
+            return false;
+        }
+        if (header->get(1) != model)
+        {
+            return false;
+        }
+        if (header->get(2) != inputs)
+        {
+            return false;
+        }
+        if (header->get(3) != outputs)
+        {
+            return false;
+        }
+        if (header->get(4) != parameters)
+        {
+            return false;
+        }
+
+        // 'model'
+        std::vector<std::string> equations;
+        if (current->get(1)->getType() != types::InternalType::ScilabString)
+        {
+            return false;
+        }
+        types::String* modelField = current->get(1)->getAs<types::String>();
+        if (modelField->getSize() != 1)
+        {
+            return false;
+        }
+        std::string modelFieldStored;
+        char* c_str; // Temporary buffer used for conversions
+        c_str = wide_string_to_UTF8(modelField->get(0));
+        modelFieldStored = std::string(c_str);
+        FREE(c_str);
+        equations.push_back(modelFieldStored);
+
+        // 'inputs'
+        size_t inputsSize;
+        if (current->get(2)->getType() == types::InternalType::ScilabDouble)
+        {
+            types::Double* inputsField = current->get(2)->getAs<types::Double>();
+            if (inputsField->getSize() != 0)
+            {
+                return false;
+            }
+            inputsSize = 0;
+            std::ostringstream strInputs;
+            strInputs << inputsSize;
+            std::string inputsSizeStr = strInputs.str();
+            equations.push_back(inputsSizeStr); // When 'inputs'=[], just insert "0" in 'equations'
+        }
+        else
+        {
+            if (current->get(2)->getType() != types::InternalType::ScilabString)
+            {
+                return false;
+            }
+            types::String* inputsField = current->get(2)->getAs<types::String>();
+            inputsSize = inputsField->getSize();
+            equations.resize(equations.size() + 1 + inputsSize);
+            std::ostringstream strInputs;
+            strInputs << inputsSize;
+            std::string inputsSizeStr = strInputs.str();
+            equations[1] = inputsSizeStr; // Saving the size of the 'inputs' field'
+            for (size_t i = 0; i < inputsSize; ++i)
+            {
+                std::string inputsFieldStored;
+                c_str = wide_string_to_UTF8(inputsField->get(i));
+                inputsFieldStored = std::string(c_str);
+                FREE(c_str);
+                equations[i + 2] = inputsFieldStored;
+            }
+        }
+
+        // 'outputs'
+        size_t outputsSize;
+        if (current->get(3)->getType() == types::InternalType::ScilabDouble)
+        {
+            types::Double* outputsField = current->get(3)->getAs<types::Double>();
+            if (outputsField->getSize() != 0)
+            {
+                return false;
+            }
+            outputsSize = 0;
+            std::ostringstream strOutputs;
+            strOutputs << outputsSize;
+            std::string outputsSizeStr = strOutputs.str();
+            equations.push_back(outputsSizeStr); // When 'outputs'=[], just insert "0" in 'equations'
         }
         else
         {
-            // silent unused parameter warnings
-            (void) adaptor;
-            (void) v;
-            (void) controller;
+            if (current->get(3)->getType() != types::InternalType::ScilabString)
+            {
+                return false;
+            }
+            types::String* outputsField = current->get(3)->getAs<types::String>();
+            outputsSize = outputsField->getSize();
+            equations.resize(equations.size() + 1 + outputsSize);
+            std::ostringstream strOutputs;
+            strOutputs << outputsSize;
+            std::string outputsSizeStr = strOutputs.str();
+            equations[2 + inputsSize] = outputsSizeStr; // Saving the size of the 'outputs' field'
+            for (size_t i = 0; i < outputsSize; ++i)
+            {
+                std::string outputsFieldStored;
+                c_str = wide_string_to_UTF8(outputsField->get(i));
+                outputsFieldStored = std::string(c_str);
+                FREE(c_str);
+                equations[i + 3 + inputsSize] = outputsFieldStored;
+            }
+        }
 
-            // FIXME: implement as a stored modelica equations
-            // FIXME: get the input list and store it in the equations field
+        // 'parameters'
+        if (current->get(4)->getType() != types::InternalType::ScilabList)
+        {
+            return false;
+        }
+        types::List* list = current->get(4)->getAs<types::List>();
+        if (list->getSize() < 1)
+        {
             return false;
         }
+
+        // 'parameters' names
+        size_t parametersSize;
+        if (list->get(0)->getType() == types::InternalType::ScilabDouble)
+        {
+            types::Double* parametersNames = list->get(0)->getAs<types::Double>();
+            if (parametersNames->getSize() != 0)
+            {
+                return false;
+            }
+            // When 'parameters(1)'=[], just insert "0" in 'equations', set in the model and return
+            parametersSize = 0;
+            std::ostringstream strParameters;
+            strParameters << parametersSize;
+            std::string parametersSizeStr = strParameters.str();
+            equations.push_back(parametersSizeStr);
+
+            controller.setObjectProperty(adaptee, BLOCK, EQUATIONS, equations);
+            return true;
+        }
+        else
+        {
+            if (list->get(0)->getType() != types::InternalType::ScilabString)
+            {
+                return false;
+            }
+            types::String* parametersNames = list->get(0)->getAs<types::String>();
+            parametersSize = parametersNames->getSize();
+            equations.resize(equations.size() + 1 + parametersSize);
+            std::ostringstream strParameters;
+            strParameters << parametersSize;
+            std::string parametersSizeStr = strParameters.str();
+            equations[3 + inputsSize + outputsSize] = parametersSizeStr; // Saving the size of the 'parameters' field'
+            for (size_t i = 0; i < parametersSize; ++i)
+            {
+                std::string parametersName;
+                c_str = wide_string_to_UTF8(parametersNames->get(i));
+                parametersName = std::string(c_str);
+                FREE(c_str);
+                equations[i + 4 + inputsSize + outputsSize] = parametersName;
+            }
+        }
+
+        // 'parameters' values
+        if (list->get(1)->getType() == types::InternalType::ScilabDouble)
+        {
+            if (parametersSize > 1)
+            {
+                return false;
+            }
+            types::Double* parameterVal = list->get(1)->getAs<types::Double>();
+            if (parameterVal->getSize() != 1)
+            {
+                return false;
+            }
+            std::ostringstream strParameterVal;
+            strParameterVal << parameterVal->get(0);
+            std::string parameterValStr = strParameterVal.str();
+            equations.push_back(parameterValStr);
+        }
+        else
+        {
+            if (list->get(1)->getType() != types::InternalType::ScilabList)
+            {
+                return false;
+            }
+            types::List* list2 = list->get(1)->getAs<types::List>();
+            if (list2->getSize() != static_cast<int>(parametersSize))
+            {
+                return false;
+            }
+            equations.resize(equations.size() + parametersSize);
+            for (size_t i = 0; i < parametersSize; ++i)
+            {
+                if (list2->get(i)->getType() != types::InternalType::ScilabDouble)
+                {
+                    return false;
+                }
+                types::Double* parametersVal = list2->get(i)->getAs<types::Double>();
+                if (parametersVal->getSize() != 1)
+                {
+                    return false;
+                }
+                std::ostringstream strParametersVal;
+                strParametersVal << parametersVal->get(0);
+                std::string parametersValStr = strParametersVal.str();
+                equations[i + 4 + inputsSize + outputsSize + parametersSize] = parametersValStr;
+            }
+        }
+
+        controller.setObjectProperty(adaptee, BLOCK, EQUATIONS, equations);
+        return true;
     }
 };
 
index b6675e1..c39b15b 100644 (file)
@@ -137,6 +137,7 @@ propertyUpdated( 5 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 5 , BLOCK , IPAR ) : NO_CHANGES
 propertyUpdated( 5 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 5 , BLOCK , EXPRS ) : SUCCESS
+propertyUpdated( 5 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 5 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 objectCreated( 6 , PORT )
 propertyUpdated( 6 , PORT , FIRING ) : NO_CHANGES
@@ -302,6 +303,7 @@ propertyUpdated( 9 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 9 , BLOCK , IPAR ) : NO_CHANGES
 propertyUpdated( 9 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 9 , BLOCK , EXPRS ) : SUCCESS
+propertyUpdated( 9 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 9 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 objectCreated( 10 , PORT )
 propertyUpdated( 10 , PORT , FIRING ) : NO_CHANGES
@@ -467,6 +469,7 @@ propertyUpdated( 13 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 13 , BLOCK , IPAR ) : NO_CHANGES
 propertyUpdated( 13 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 13 , BLOCK , EXPRS ) : SUCCESS
+propertyUpdated( 13 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 13 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 objectCreated( 14 , PORT )
 propertyUpdated( 14 , PORT , FIRING ) : NO_CHANGES
@@ -758,6 +761,7 @@ propertyUpdated( 21 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 21 , BLOCK , IPAR ) : SUCCESS
 propertyUpdated( 21 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 21 , BLOCK , EXPRS ) : SUCCESS
+propertyUpdated( 21 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 21 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 objectCreated( 22 , PORT )
 propertyUpdated( 22 , PORT , FIRING ) : NO_CHANGES
@@ -984,8 +988,74 @@ o.model.odstate
        ans(4)
   32  32
   32  32
-// Check that all the model items are freed
-clear
+// Test 'equations'
+o = VsourceAC("define")
+objectCreated( 29 , BLOCK )
+propertyUpdated( 29 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , GEOMETRY ) : SUCCESS
+propertyUpdated( 29 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , EXPRS ) : SUCCESS
+objectCreated( 30 , PORT )
+propertyUpdated( 30 , PORT , SOURCE_BLOCK ) : SUCCESS
+propertyUpdated( 30 , PORT , PORT_KIND ) : SUCCESS
+propertyUpdated( 29 , BLOCK , INPUTS ) : SUCCESS
+objectCreated( 31 , PORT )
+propertyUpdated( 31 , PORT , SOURCE_BLOCK ) : SUCCESS
+propertyUpdated( 31 , PORT , PORT_KIND ) : SUCCESS
+propertyUpdated( 29 , BLOCK , OUTPUTS ) : SUCCESS
+propertyUpdated( 29 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 30 , PORT , IMPLICIT ) : NO_CHANGES
+propertyUpdated( 31 , PORT , IMPLICIT ) : NO_CHANGES
+propertyUpdated( 30 , PORT , STYLE ) : NO_CHANGES
+propertyUpdated( 31 , PORT , STYLE ) : NO_CHANGES
+propertyUpdated( 30 , PORT , LABEL ) : NO_CHANGES
+propertyUpdated( 31 , PORT , LABEL ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , SIM_FUNCTION_NAME ) : SUCCESS
+propertyUpdated( 29 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 30 , PORT , DATATYPE ) : SUCCESS
+propertyUpdated( 31 , PORT , DATATYPE ) : SUCCESS
+propertyUpdated( 29 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , ODSTATE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , RPAR ) : SUCCESS
+propertyUpdated( 29 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , OPAR ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , SIM_DEP_UT ) : SUCCESS
+propertyUpdated( 29 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , NMODE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , EQUATIONS ) : SUCCESS
+propertyUpdated( 29 , BLOCK , UID ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , INTERFACE_FUNCTION ) : SUCCESS
+propertyUpdated( 29 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , EXPRS ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 30 , PORT , IMPLICIT ) : SUCCESS
+propertyUpdated( 31 , PORT , IMPLICIT ) : NO_CHANGES
+propertyUpdated( 30 , PORT , STYLE ) : NO_CHANGES
+propertyUpdated( 31 , PORT , STYLE ) : NO_CHANGES
+propertyUpdated( 30 , PORT , LABEL ) : NO_CHANGES
+propertyUpdated( 31 , PORT , LABEL ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , STYLE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , GEOMETRY ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , ANGLE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , EXPRS ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 30 , PORT , IMPLICIT ) : NO_CHANGES
+propertyUpdated( 31 , PORT , IMPLICIT ) : SUCCESS
+propertyUpdated( 30 , PORT , STYLE ) : NO_CHANGES
+propertyUpdated( 31 , PORT , STYLE ) : NO_CHANGES
+propertyUpdated( 30 , PORT , LABEL ) : NO_CHANGES
+propertyUpdated( 31 , PORT , LABEL ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , STYLE ) : NO_CHANGES
 propertyUpdated( 24 , BLOCK , INPUTS ) : SUCCESS
 propertyUpdated( 24 , BLOCK , OUTPUTS ) : NO_CHANGES
 propertyUpdated( 24 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
@@ -1007,3 +1077,77 @@ propertyUpdated( 24 , BLOCK , EVENT_INPUTS ) : SUCCESS
 propertyUpdated( 24 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
 objectDeleted( 28 , PORT )
 objectDeleted( 24 , BLOCK )
+o  = 
+o.model.equations
+ ans  =
+       ans(1)
+!modelica  model  inputs  outputs  parameters  !
+       ans(2)
+ VsourceAC
+       ans(3)
+ p
+       ans(4)
+ n
+       ans(5)
+        ans(5)(1)
+!VA  !
+!    !
+!f   !
+        ans(5)(2)
+         ans(5)(2)(1)
+    220.
+         ans(5)(2)(2)
+    50.
+o.model.equations = modelica();
+propertyUpdated( 29 , BLOCK , SIM_FUNCTION_NAME ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , SIM_FUNCTION_API ) : NO_CHANGES
+propertyUpdated( 30 , PORT , DATATYPE ) : NO_CHANGES
+propertyUpdated( 30 , PORT , DATATYPE ) : NO_CHANGES
+propertyUpdated( 30 , PORT , DATATYPE ) : NO_CHANGES
+propertyUpdated( 31 , PORT , DATATYPE ) : NO_CHANGES
+propertyUpdated( 31 , PORT , DATATYPE ) : NO_CHANGES
+propertyUpdated( 31 , PORT , DATATYPE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , STATE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , DSTATE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , ODSTATE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , RPAR ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , IPAR ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , OPAR ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , SIM_BLOCKTYPE ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , SIM_DEP_UT ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , LABEL ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , NZCROSS ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , NMODE ) : NO_CHANGES
+o.model.equations
+ ans  =
+       ans(1)
+!modelica  model  inputs  outputs  parameters  !
+       ans(2)
+ VsourceAC
+       ans(3)
+ p
+       ans(4)
+ n
+       ans(5)
+        ans(5)(1)
+!VA  !
+!    !
+!f   !
+        ans(5)(2)
+         ans(5)(2)(1)
+    220.
+         ans(5)(2)(2)
+    50.
+// Check that all the model items are freed
+clear
+propertyUpdated( 29 , BLOCK , INPUTS ) : SUCCESS
+propertyUpdated( 29 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+objectDeleted( 30 , PORT )
+propertyUpdated( 29 , BLOCK , INPUTS ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , OUTPUTS ) : SUCCESS
+propertyUpdated( 29 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 29 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+objectDeleted( 31 , PORT )
+objectDeleted( 29 , BLOCK )
index 62de4e8..75e0420 100644 (file)
@@ -97,6 +97,12 @@ o.model.opar
 o.model.odstate = list([1 2 3; 4 5 6], ["Hello" "world!"; "Test" "123"], [%i 2 3*%i; 4 5*%i 6], uint32([32 32; 32 32]));
 o.model.odstate
 
+// Test 'equations'
+o = VsourceAC("define")
+o.model.equations
+o.model.equations = modelica();
+o.model.equations
+
 
 // Check that all the model items are freed
 clear
index 5d6d41d..e5bf870 100644 (file)
@@ -715,6 +715,7 @@ propertyUpdated( 27 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 27 , BLOCK , IPAR ) : NO_CHANGES
 propertyUpdated( 27 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 27 , BLOCK , EXPRS ) : SUCCESS
+propertyUpdated( 27 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 27 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 objectCreated( 28 , PORT )
 propertyUpdated( 28 , PORT , FIRING ) : NO_CHANGES
@@ -776,6 +777,7 @@ propertyUpdated( 31 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 31 , BLOCK , IPAR ) : SUCCESS
 propertyUpdated( 31 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 31 , BLOCK , EXPRS ) : SUCCESS
+propertyUpdated( 31 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 31 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 objectCreated( 32 , PORT )
 propertyUpdated( 32 , PORT , FIRING ) : NO_CHANGES
@@ -840,6 +842,7 @@ propertyUpdated( 37 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 37 , BLOCK , IPAR ) : SUCCESS
 propertyUpdated( 37 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 37 , BLOCK , EXPRS ) : SUCCESS
+propertyUpdated( 37 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 37 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 objectCreated( 38 , PORT )
 propertyUpdated( 38 , PORT , FIRING ) : NO_CHANGES
@@ -913,42 +916,6 @@ scs_m.objs(3).model.in
   - 1.
 // Check that all the model items are freed
 clear
-propertyUpdated( 10 , PORT , CONNECTED_SIGNALS ) : SUCCESS
-propertyUpdated( 18 , PORT , CONNECTED_SIGNALS ) : SUCCESS
-objectDeleted( 15 , LINK )
-objectDeleted( 14 , LINK )
-propertyUpdated( 11 , BLOCK , INPUTS ) : SUCCESS
-propertyUpdated( 11 , BLOCK , OUTPUTS ) : NO_CHANGES
-propertyUpdated( 11 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
-propertyUpdated( 11 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
-objectDeleted( 12 , PORT )
-propertyUpdated( 11 , BLOCK , INPUTS ) : NO_CHANGES
-propertyUpdated( 11 , BLOCK , OUTPUTS ) : NO_CHANGES
-propertyUpdated( 11 , BLOCK , EVENT_INPUTS ) : SUCCESS
-propertyUpdated( 11 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
-objectDeleted( 13 , PORT )
-propertyUpdated( 11 , BLOCK , INPUTS ) : NO_CHANGES
-propertyUpdated( 11 , BLOCK , OUTPUTS ) : NO_CHANGES
-propertyUpdated( 11 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
-propertyUpdated( 11 , BLOCK , EVENT_OUTPUTS ) : SUCCESS
-objectDeleted( 18 , PORT )
-objectDeleted( 11 , BLOCK )
-propertyUpdated( 8 , BLOCK , INPUTS ) : SUCCESS
-propertyUpdated( 8 , BLOCK , OUTPUTS ) : NO_CHANGES
-propertyUpdated( 8 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
-propertyUpdated( 8 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
-objectDeleted( 9 , PORT )
-propertyUpdated( 8 , BLOCK , INPUTS ) : SUCCESS
-propertyUpdated( 8 , BLOCK , OUTPUTS ) : NO_CHANGES
-propertyUpdated( 8 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
-propertyUpdated( 8 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
-objectDeleted( 17 , PORT )
-propertyUpdated( 8 , BLOCK , INPUTS ) : NO_CHANGES
-propertyUpdated( 8 , BLOCK , OUTPUTS ) : NO_CHANGES
-propertyUpdated( 8 , BLOCK , EVENT_INPUTS ) : SUCCESS
-propertyUpdated( 8 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
-objectDeleted( 10 , PORT )
-objectDeleted( 8 , BLOCK )
 propertyUpdated( 4 , BLOCK , INPUTS ) : SUCCESS
 propertyUpdated( 4 , BLOCK , OUTPUTS ) : NO_CHANGES
 propertyUpdated( 4 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
@@ -965,6 +932,24 @@ propertyUpdated( 4 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
 propertyUpdated( 4 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
 objectDeleted( 7 , PORT )
 objectDeleted( 4 , BLOCK )
+propertyUpdated( 11 , BLOCK , INPUTS ) : SUCCESS
+propertyUpdated( 11 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+objectDeleted( 12 , PORT )
+propertyUpdated( 11 , BLOCK , INPUTS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , EVENT_INPUTS ) : SUCCESS
+propertyUpdated( 11 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+objectDeleted( 13 , PORT )
+propertyUpdated( 11 , BLOCK , INPUTS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 11 , BLOCK , EVENT_OUTPUTS ) : SUCCESS
+propertyUpdated( 15 , LINK , DESTINATION_PORT ) : SUCCESS
+objectDeleted( 18 , PORT )
+objectDeleted( 11 , BLOCK )
+objectDeleted( 24 , LINK )
 propertyUpdated( 26 , LINK , PARENT_DIAGRAM ) : SUCCESS
 propertyUpdated( 27 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
 propertyUpdated( 31 , BLOCK , PARENT_DIAGRAM ) : SUCCESS
@@ -1005,4 +990,22 @@ propertyUpdated( 35 , LINK , SOURCE_PORT ) : SUCCESS
 objectDeleted( 34 , PORT )
 objectDeleted( 31 , BLOCK )
 objectDeleted( 25 , DIAGRAM )
-objectDeleted( 24 , LINK )
+propertyUpdated( 8 , BLOCK , INPUTS ) : SUCCESS
+propertyUpdated( 8 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+objectDeleted( 9 , PORT )
+propertyUpdated( 8 , BLOCK , INPUTS ) : SUCCESS
+propertyUpdated( 8 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+objectDeleted( 17 , PORT )
+propertyUpdated( 8 , BLOCK , INPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , EVENT_INPUTS ) : SUCCESS
+propertyUpdated( 8 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+propertyUpdated( 15 , LINK , SOURCE_PORT ) : SUCCESS
+objectDeleted( 10 , PORT )
+objectDeleted( 8 , BLOCK )
+objectDeleted( 15 , LINK )
+objectDeleted( 14 , LINK )
index 60ce7c9..e6c59a0 100644 (file)
@@ -147,6 +147,7 @@ propertyUpdated( 6 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 6 , BLOCK , IPAR ) : SUCCESS
 propertyUpdated( 6 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 6 , BLOCK , EXPRS ) : SUCCESS
+propertyUpdated( 6 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 6 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 propertyUpdated( 6 , BLOCK , INPUTS ) : NO_CHANGES
 objectCreated( 7 , PORT )
@@ -185,6 +186,7 @@ propertyUpdated( 8 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 8 , BLOCK , IPAR ) : SUCCESS
 propertyUpdated( 8 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 8 , BLOCK , EXPRS ) : SUCCESS
+propertyUpdated( 8 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 8 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 objectCreated( 9 , PORT )
 propertyUpdated( 9 , PORT , FIRING ) : NO_CHANGES
@@ -248,18 +250,18 @@ propertyUpdated( 10 , BLOCK , NZCROSS ) : NO_CHANGES
 propertyUpdated( 10 , BLOCK , NMODE ) : NO_CHANGES
 propertyUpdated( 10 , BLOCK , UID ) : NO_CHANGES
 propertyUpdated( 10 , BLOCK , INTERFACE_FUNCTION ) : SUCCESS
-propertyUpdated( 4 , BLOCK , INPUTS ) : SUCCESS
-propertyUpdated( 4 , BLOCK , OUTPUTS ) : NO_CHANGES
-propertyUpdated( 4 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
-propertyUpdated( 4 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
-objectDeleted( 5 , PORT )
-objectDeleted( 4 , BLOCK )
 propertyUpdated( 2 , BLOCK , INPUTS ) : NO_CHANGES
 propertyUpdated( 2 , BLOCK , OUTPUTS ) : SUCCESS
 propertyUpdated( 2 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
 propertyUpdated( 2 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
 objectDeleted( 3 , PORT )
 objectDeleted( 2 , BLOCK )
+propertyUpdated( 4 , BLOCK , INPUTS ) : SUCCESS
+propertyUpdated( 4 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 4 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+objectDeleted( 5 , PORT )
+objectDeleted( 4 , BLOCK )
 sb  = 
 sb.graphics
  ans  =
@@ -697,6 +699,7 @@ propertyUpdated( 23 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 23 , BLOCK , IPAR ) : SUCCESS
 propertyUpdated( 23 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 23 , BLOCK , EXPRS ) : SUCCESS
+propertyUpdated( 23 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 23 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 propertyUpdated( 23 , BLOCK , INPUTS ) : NO_CHANGES
 propertyUpdated( 23 , BLOCK , OUTPUTS ) : NO_CHANGES
@@ -735,6 +738,7 @@ propertyUpdated( 25 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 25 , BLOCK , IPAR ) : NO_CHANGES
 propertyUpdated( 25 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 25 , BLOCK , EXPRS ) : SUCCESS
+propertyUpdated( 25 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 25 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 propertyUpdated( 25 , BLOCK , INPUTS ) : NO_CHANGES
 propertyUpdated( 25 , BLOCK , OUTPUTS ) : NO_CHANGES
@@ -809,6 +813,7 @@ propertyUpdated( 30 , BLOCK , ODSTATE ) : NO_CHANGES
 propertyUpdated( 30 , BLOCK , IPAR ) : NO_CHANGES
 propertyUpdated( 30 , BLOCK , OPAR ) : NO_CHANGES
 propertyUpdated( 30 , BLOCK , EXPRS ) : NO_CHANGES
+propertyUpdated( 30 , BLOCK , EQUATIONS ) : NO_CHANGES
 propertyUpdated( 30 , BLOCK , PARENT_DIAGRAM ) : NO_CHANGES
 propertyUpdated( 30 , BLOCK , INPUTS ) : NO_CHANGES
 propertyUpdated( 30 , BLOCK , OUTPUTS ) : NO_CHANGES
@@ -1343,6 +1348,34 @@ clk.model.rpar.objs(6).to
     2.    1.    1.
 // Check that all the model items are freed
 clear
+propertyUpdated( 10 , BLOCK , INPUTS ) : SUCCESS
+propertyUpdated( 10 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 10 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 10 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+objectDeleted( 11 , PORT )
+propertyUpdated( 10 , BLOCK , INPUTS ) : NO_CHANGES
+propertyUpdated( 10 , BLOCK , OUTPUTS ) : SUCCESS
+propertyUpdated( 10 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 10 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+objectDeleted( 12 , PORT )
+propertyUpdated( 1 , DIAGRAM , CHILDREN ) : SUCCESS
+propertyUpdated( 6 , BLOCK , INPUTS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , OUTPUTS ) : SUCCESS
+propertyUpdated( 6 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 6 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+objectDeleted( 7 , PORT )
+propertyUpdated( 10 , BLOCK , CHILDREN ) : SUCCESS
+objectDeleted( 6 , BLOCK )
+propertyUpdated( 1 , DIAGRAM , CHILDREN ) : SUCCESS
+propertyUpdated( 8 , BLOCK , INPUTS ) : SUCCESS
+propertyUpdated( 8 , BLOCK , OUTPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
+propertyUpdated( 8 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
+objectDeleted( 9 , PORT )
+propertyUpdated( 10 , BLOCK , CHILDREN ) : SUCCESS
+objectDeleted( 8 , BLOCK )
+objectDeleted( 1 , DIAGRAM )
+objectDeleted( 10 , BLOCK )
 propertyUpdated( 38 , BLOCK , INPUTS ) : NO_CHANGES
 propertyUpdated( 38 , BLOCK , OUTPUTS ) : NO_CHANGES
 propertyUpdated( 38 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
@@ -1401,31 +1434,3 @@ propertyUpdated( 22 , DIAGRAM , CHILDREN ) : SUCCESS
 objectDeleted( 37 , LINK )
 objectDeleted( 22 , DIAGRAM )
 objectDeleted( 38 , BLOCK )
-propertyUpdated( 10 , BLOCK , INPUTS ) : SUCCESS
-propertyUpdated( 10 , BLOCK , OUTPUTS ) : NO_CHANGES
-propertyUpdated( 10 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
-propertyUpdated( 10 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
-objectDeleted( 11 , PORT )
-propertyUpdated( 10 , BLOCK , INPUTS ) : NO_CHANGES
-propertyUpdated( 10 , BLOCK , OUTPUTS ) : SUCCESS
-propertyUpdated( 10 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
-propertyUpdated( 10 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
-objectDeleted( 12 , PORT )
-propertyUpdated( 1 , DIAGRAM , CHILDREN ) : SUCCESS
-propertyUpdated( 6 , BLOCK , INPUTS ) : NO_CHANGES
-propertyUpdated( 6 , BLOCK , OUTPUTS ) : SUCCESS
-propertyUpdated( 6 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
-propertyUpdated( 6 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
-objectDeleted( 7 , PORT )
-propertyUpdated( 10 , BLOCK , CHILDREN ) : SUCCESS
-objectDeleted( 6 , BLOCK )
-propertyUpdated( 1 , DIAGRAM , CHILDREN ) : SUCCESS
-propertyUpdated( 8 , BLOCK , INPUTS ) : SUCCESS
-propertyUpdated( 8 , BLOCK , OUTPUTS ) : NO_CHANGES
-propertyUpdated( 8 , BLOCK , EVENT_INPUTS ) : NO_CHANGES
-propertyUpdated( 8 , BLOCK , EVENT_OUTPUTS ) : NO_CHANGES
-objectDeleted( 9 , PORT )
-propertyUpdated( 10 , BLOCK , CHILDREN ) : SUCCESS
-objectDeleted( 8 , BLOCK )
-objectDeleted( 1 , DIAGRAM )
-objectDeleted( 10 , BLOCK )