Salome HOME
Merge branch 'Dev_0.6.1' of newgeom:newgeom into Dev_0.6.1
authorvsv <vitaly.smetannikov@opencascade.com>
Mon, 22 Dec 2014 14:21:37 +0000 (17:21 +0300)
committervsv <vitaly.smetannikov@opencascade.com>
Mon, 22 Dec 2014 14:21:37 +0000 (17:21 +0300)
33 files changed:
CMakeCommon/FindCAS.cmake
CMakeLists.txt
env_Salome.bat
linux_env.sh
msvc10_env.bat
src/Config/CMakeLists.txt
src/Config/Config_Common.cpp
src/Config/Config_Keywords.h
src/Config/Config_ModuleReader.cpp
src/Config/Config_ModuleReader.h
src/Config/Config_WidgetAPI.cpp
src/Config/plugins.xml
src/ConnectorPlugin/CMakeLists.txt [new file with mode: 0644]
src/ConnectorPlugin/ConnectorPlugin.py [new file with mode: 0644]
src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py [new file with mode: 0644]
src/ConnectorPlugin/ExtrusionToMesh.py [new file with mode: 0644]
src/ConnectorPlugin/plugin-Connector.xml [new file with mode: 0644]
src/ConstructionPlugin/ConstructionPlugin_Plugin.h
src/Events/Events_Loop.cpp
src/ExchangePlugin/ExchangePlugin_Plugin.h
src/FeaturesPlugin/FeaturesPlugin_Plugin.h
src/GeomAPI/CMakeLists.txt
src/GeomAlgoAPI/CMakeLists.txt
src/GeomDataAPI/CMakeLists.txt
src/Model/Model_Session.cpp
src/Model/Model_Update.cpp
src/ModelAPI/CMakeLists.txt
src/ModelAPI/ModelAPI.i
src/ModelAPI/ModelAPI_AttributeRefAttr.h
src/ModelAPI/ModelAPI_Plugin.h
src/ModelAPI/ModelAPI_Session.cpp
src/ModelAPI/ModelAPI_Session.h
src/SketchPlugin/SketchPlugin_Plugin.h

index 1d066b168ff38cfe7a915975b5a9428d09a79553..b610c2915d5f027ec9b77f77fec29cd393daf9bf 100644 (file)
@@ -94,7 +94,6 @@ FIND_LIBRARY(CAS_FWOSPlugin FWOSPlugin )
 MESSAGE(STATUS "FWOS " ${CAS_FWOSPlugin})
 
 FIND_LIBRARY(CAS_PTKernel PTKernel )
-FIND_LIBRARY(CAS_TKAdvTools TKAdvTools )
 FIND_LIBRARY(CAS_TKBin TKBin )
 FIND_LIBRARY(CAS_TKBinL TKBinL )
 FIND_LIBRARY(CAS_TKBinTObj TKBinTObj )
@@ -179,7 +178,6 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(CAS
       REQUIRED_VARS CAS_INCLUDE_DIRS  
         CAS_FWOSPlugin
         CAS_PTKernel
-        CAS_TKAdvTools
         CAS_TKBin
         CAS_TKBinL
         CAS_TKBinTObj
index 1d1120f84a40d7c0abae8c6ef2db6be0075ab990..ede88ffa09ce6e2d7aed432ad68b6900ffb11a9b 100644 (file)
@@ -60,6 +60,8 @@ ADD_SUBDIRECTORY (src/XGUI)
 ADD_SUBDIRECTORY (src/GeomApp)
 ADD_SUBDIRECTORY (src/ExchangePlugin)
 ADD_SUBDIRECTORY (src/GeomValidators)
+ADD_SUBDIRECTORY (src/ConnectorPlugin)
+
 
 IF(${HAVE_SALOME})
        ADD_SUBDIRECTORY (src/NewGeom)
index ffad9939b00fed2da1f8575426baac8882dc0011..ca536a79758326adca659951c46e9dcb837bdf85 100644 (file)
@@ -90,7 +90,7 @@ IF "%ARCH%" == "Win64" (
 
 @SET NEW_GEOM_CONFIG_FILE=%ROOT_DIR%\install\plugins
 @SET PATH=%ROOT_DIR%\install\plugins;%ROOT_DIR%\install\bin;%PATH%
-@SET PYTHONPATH=%ROOT_DIR%\install\swig;%PYTHONPATH%
+@SET PYTHONPATH=%ROOT_DIR%\install\swig;%ROOT_DIR%\install\plugins;%PYTHONPATH%
 
 @SET LightAppConfig=%ROOT_DIR%\install\share\salome\resources\newgeom;%GUI_ROOT_DIR%\share\salome\resources\gui
 @SET NewGeomResources=%ROOT_DIR%\install\resources
index fcbe77b868e98322647ced4401e595e1065a1a57..b58d16324ca82a3b78cf7a03151e1e651e710f94 100644 (file)
@@ -37,7 +37,8 @@ export PATH=${CASROOT}:${PATH}
 #------ NewGEOM ------
 export NEWGEOM_ROOT_DIR=${ROOT_DIR}/install
 export PATH=${NEWGEOM_ROOT_DIR}/bin:${NEWGEOM_ROOT_DIR}/plugins:${PATH}
-export PYTHONPATH=${NEWGEOM_ROOT_DIR}/swig:${PYTHONPATH}
+export PYTHONPATH=${NEWGEOM_ROOT_DIR}/swig:${NEWGEOM_ROOT_DIR}/plugins:${PYTHONPATH}
 export LD_LIBRARY_PATH=${NEWGEOM_ROOT_DIR}/bin:${NEWGEOM_ROOT_DIR}/swig:${NEWGEOM_ROOT_DIR}/plugins:${LD_LIBRARY_PATH}
 export NEW_GEOM_CONFIG_FILE=${NEWGEOM_ROOT_DIR}/plugins
 export NewGeomResources=${NEWGEOM_ROOT_DIR}/resources
+
index 613e3147842063c0b62483ebb4fd3f73cd11f50d..5822d74684ba99233c2f0178300f2b4c5faf481b 100644 (file)
@@ -81,7 +81,7 @@ set PATH=%CMAKEDIR%\bin;%PATH%
 @REM -------------------------
 @REM QT
 @SET QTDIR=%PDIR%\qt-4.8.4
-@ECHO -- Creating qt.conf... 
+@ECHO -- Creating qt.conf... in %QTDIR%
 @ECHO [Paths] > %QTDIR%/bin/qt.conf
 @ECHO Prefix = %QTDIR:\=/% >> %QTDIR%/bin/qt.conf
 @SET PATH=%QTDIR%\bin;%PATH%
@@ -127,7 +127,7 @@ set PATH=%CMAKEDIR%\bin;%PATH%
 
 @SET NEW_GEOM_CONFIG_FILE=%ROOT_DIR%\install\plugins
 @SET PATH=%ROOT_DIR%\install\plugins;%ROOT_DIR%\install\bin;%PATH%
-@SET PYTHONPATH=%ROOT_DIR%\install\swig;%PYTHONPATH%
+@SET PYTHONPATH=%ROOT_DIR%\install\swig;%ROOT_DIR%\install\plugins;%PYTHONPATH%
 
 @REM -------------------------
 @REM PTHREAD
index 90f4f18c00e5cb426aa19410379b5094cbe10070..c5ee88f7817fc6702c22500e4096b4b5c1a0e977 100644 (file)
@@ -3,7 +3,8 @@
 INCLUDE(Common)
 INCLUDE(XMLProcessing)
 
-INCLUDE_DIRECTORIES (${PROJECT_SOURCE_DIR}/src/Events) 
+INCLUDE_DIRECTORIES (${PROJECT_SOURCE_DIR}/src/Events
+                     ${PYTHON_INCLUDE_DIRS}) 
 
 SET(PROJECT_HEADERS
   Config_def.h
@@ -46,6 +47,7 @@ SET(XML_RESOURCES
 SET(PROJECT_LIBRARIES
     Events
     ${LIBXML2_LIBRARIES}
+    ${PYTHON_LIBRARIES}
 )
 
 SOURCE_GROUP ("Resource Files" FILES ${XML_RESOURCES})
index e0837036eb71d200a1a40581e3a98ad3854dfcba..634a4337ff73b7c0eb0c92d9eedf9581eece9798 100644 (file)
@@ -20,6 +20,8 @@
 \r
 bool isElementNode(xmlNodePtr theNode)\r
 {\r
+  if (!theNode)\r
+    return false;\r
   return theNode->type == XML_ELEMENT_NODE;\r
 }\r
 \r
index 90f7fcb67450cce3c2302ee9572ad016d239e15e..bc9f4e419bae005781f5767e4311b8ba6526534d 100644 (file)
@@ -75,11 +75,14 @@ const static char* CONTAINER_PAGE_NAME = "title";
 /*
  * Hardcoded xml entities of plugins.xml
  */
+
+const static char* PLUGIN_FILE = "plugins.xml";
 const static char* NODE_PLUGIN = "plugin";
 const static char* NODE_PLUGINS = "plugins";
 
 const static char* PLUGINS_MODULE = "module";
 const static char* PLUGIN_CONFIG = "configuration";
 const static char* PLUGIN_LIBRARY = "library";
+const static char* PLUGIN_SCRIPT = "script";
 
 #endif /* CONFIG_KEYWORDS_H_ */
index 2d4502ab5df77b602b388e005fd5dd76d9b2f862..21925af599b1b91fca64131371d931ed98ad6443 100644 (file)
@@ -16,6 +16,9 @@
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 
+// Have to be included before std headers
+#include <Python.h>
+
 //Necessary for cerr
 #include <iostream>
 
 #include <dlfcn.h>
 #endif
 
+std::map<std::string, Config_ModuleReader::PluginType> Config_ModuleReader::myPluginTypes;
+
 Config_ModuleReader::Config_ModuleReader(const char* theEventGenerated)
-    : Config_XMLReader("plugins.xml"),
+    : Config_XMLReader(PLUGIN_FILE),
       myEventGenerated(theEventGenerated)
 {
 }
@@ -58,7 +63,10 @@ void Config_ModuleReader::processNode(xmlNodePtr theNode)
   if (isNode(theNode, NODE_PLUGIN, NULL)) {
     std::string aPluginConf = getProperty(theNode, PLUGIN_CONFIG);
     std::string aPluginLibrary = getProperty(theNode, PLUGIN_LIBRARY);
-    std::list<std::string> aFeatures = importPlugin(aPluginLibrary, aPluginConf);
+    std::string aPluginScript = getProperty(theNode, PLUGIN_SCRIPT);
+    std::string aPluginName = addPlugin(aPluginLibrary, aPluginScript, aPluginConf);
+
+    std::list<std::string> aFeatures = importPlugin(aPluginName, aPluginConf);
     std::list<std::string>::iterator it = aFeatures.begin();
     for (; it != aFeatures.end(); it++) {
       myFeaturesInFiles[*it] = aPluginConf;
@@ -72,19 +80,87 @@ bool Config_ModuleReader::processChildren(xmlNodePtr theNode)
 }
 
 std::list<std::string> Config_ModuleReader::importPlugin(const std::string& thePluginLibrary,
-                                                         const std::string& thePluginFile)
+                                                         const std::string& thePluginXmlConf)
 {
-  if (thePluginFile.empty()) {  //probably a third party library
+  if (thePluginXmlConf.empty()) {  //probably a third party library
     loadLibrary(thePluginLibrary);
     return std::list<std::string>();
   }
 
-  Config_FeatureReader aReader = Config_FeatureReader(thePluginFile, thePluginLibrary,
+  Config_FeatureReader aReader = Config_FeatureReader(thePluginXmlConf,
+                                                      thePluginLibrary,
                                                       myEventGenerated);
   aReader.readAll();
   return aReader.features();
 }
 
+std::string Config_ModuleReader::addPlugin(const std::string& aPluginLibrary,
+                                           const std::string& aPluginScript,
+                                           const std::string& aPluginConf)
+{
+  PluginType aType = Config_ModuleReader::Binary;
+  std::string aPluginName;
+  if (!aPluginLibrary.empty()) {
+    aPluginName = aPluginLibrary;
+    if (aPluginConf.empty()) {
+      aType = Config_ModuleReader::Intrenal;
+    }
+  } else if (!aPluginScript.empty()) {
+    aPluginName = aPluginScript;
+    aType = Config_ModuleReader::Python;
+  }
+  if(!aPluginName.empty()) {
+    myPluginTypes[aPluginName] = aType;
+
+  }
+  return aPluginName;
+}
+
+void Config_ModuleReader::loadPlugin(const std::string thePluginName)
+{
+  PluginType aType = Config_ModuleReader::Binary;
+  if(myPluginTypes.find(thePluginName) != myPluginTypes.end()) {
+    aType = myPluginTypes.at(thePluginName);
+  }
+  switch (aType) {
+    case Config_ModuleReader::Python:
+      loadScript(thePluginName);
+      break;
+    case Config_ModuleReader::Binary:
+    case Config_ModuleReader::Intrenal:
+    default:
+      loadLibrary(thePluginName);
+      break;
+  }
+}
+
+void Config_ModuleReader::loadScript(const std::string theFileName)
+{
+  /* aquire python thread */
+  PyGILState_STATE gstate = PyGILState_Ensure();
+  PyObject* module = PyImport_ImportModule(theFileName.c_str());
+
+  if (!module) {
+    std::string anErrorMsg = "An error occured while importing " + theFileName;
+    //Get detailed error message:
+    if (PyErr_Occurred()) {
+      PyObject *ptype, *pvalue, *ptraceback;
+      PyErr_Fetch(&ptype, &pvalue, &ptraceback);
+      std::string aPyError = std::string(PyString_AsString(pvalue));
+      if (!aPyError.empty()) {
+        anErrorMsg += ":\n" + aPyError;
+      }
+      Py_XDECREF(ptype);
+      Py_XDECREF(pvalue);
+      Py_XDECREF(ptraceback);
+    }
+    Events_Error::send(anErrorMsg);
+  }
+
+  /* release python thread */
+  PyGILState_Release(gstate);
+}
+
 void Config_ModuleReader::loadLibrary(const std::string theLibName)
 {
   std::string aFileName = library(theLibName);
@@ -93,16 +169,15 @@ void Config_ModuleReader::loadLibrary(const std::string theLibName)
 
 #ifdef WIN32
   HINSTANCE aModLib = ::LoadLibrary(aFileName.c_str());
-  if (!aModLib && theLibName != "DFBrowser") {  // don't shor error for internal debugging tool
-    std::string errorMsg = "Failed to load " + aFileName;
-    std::cerr << errorMsg << std::endl;
-    Events_Error::send(errorMsg);
-  }
 #else
   void* aModLib = dlopen( aFileName.c_str(), RTLD_LAZY | RTLD_GLOBAL );
-  if ( !aModLib && theLibName != "DFBrowser") {  // don't shor error for internal debugging tool
-    std::cerr << "Failed to load " << aFileName.c_str() << std::endl;
-  }
 #endif
+  if(!aModLib && theLibName != "DFBrowser") { // don't show error for internal debugging tool
+    std::string anErrorMsg = "Failed to load " + aFileName;
+    #ifndef WIN32
+    anErrorMsg += ": " + std::string(dlerror());
+    #endif
+    Events_Error::send(anErrorMsg);
+  }
 }
 
index eb571063a161283f160331dace035302a19cd776..2281eb5cd33910e46bd16949e25b8b8b7afe6f7e 100644 (file)
 
 class Config_ModuleReader : public Config_XMLReader
 {
+  enum PluginType {
+    Binary = 0,
+    Intrenal = 1,
+    Python = 2
+  };
 
  public:
   CONFIG_EXPORT Config_ModuleReader(const char* theEventGenerated = 0);
@@ -28,8 +33,11 @@ class Config_ModuleReader : public Config_XMLReader
 
   CONFIG_EXPORT std::string getModuleName();
 
+  CONFIG_EXPORT static void loadPlugin(const std::string thePluginName);
   /// loads the library with specific name, appends "lib*.dll" or "*.so" depending on the platform
   CONFIG_EXPORT static void loadLibrary(const std::string theLibName);
+  /// loads the python module with specified name
+  CONFIG_EXPORT static void loadScript(const std::string theFileName);
 
  protected:
   void processNode(xmlNodePtr aNode);
@@ -37,9 +45,13 @@ class Config_ModuleReader : public Config_XMLReader
 
   std::list<std::string> importPlugin(const std::string& thePluginLibrary,
                                       const std::string& thePluginFile);
+  std::string addPlugin(const std::string& aPluginLibrary,
+                        const std::string& aPluginScript,
+                        const std::string& aPluginConf);
 
  private:
   std::map<std::string, std::string> myFeaturesInFiles;
+  static std::map<std::string, PluginType> myPluginTypes;
   const char* myEventGenerated;
 
 };
index 994a46f99c9a300205331c5c5d1c85389e964535..bcf543bd17e21d93e81cfa832545a3672d594d8c 100644 (file)
@@ -47,10 +47,10 @@ bool Config_WidgetAPI::toChildWidget()
 {
   if (myCurrentNode && hasChild(myCurrentNode)) {
     myCurrentNode = myCurrentNode->children;
-    while (!isElementNode(myCurrentNode)) {
+    while (myCurrentNode && !isElementNode(myCurrentNode)) {
       myCurrentNode = myCurrentNode->next;
     }
-    return true;
+    return myCurrentNode != NULL;
   }
   return false;
 }
index ede1536faa9eec813a6ea9f488021cf691e33760..00f45dba9e9c5d1a49d53e88c56292926a490c36 100644 (file)
@@ -6,7 +6,8 @@
   <plugin library="ConstructionPlugin" configuration="plugin-Construction.xml"/>
   <plugin library="FeaturesPlugin" configuration="plugin-Features.xml"/>
   <plugin library="ExchangePlugin" configuration="plugin-Exchange.xml"/>
+  <plugin script="ConnectorPlugin" configuration="plugin-Connector.xml"/>
   <plugin library="SketchSolver"/>
   <plugin library="GeomValidators"/>
-  <plugin library="DFBrowser"/>
+  <plugin library="DFBrowser" internal="true"/>
 </plugins>
diff --git a/src/ConnectorPlugin/CMakeLists.txt b/src/ConnectorPlugin/CMakeLists.txt
new file mode 100644 (file)
index 0000000..9aafdea
--- /dev/null
@@ -0,0 +1,14 @@
+INCLUDE(Common)
+
+SET(PYTHON_FILES
+    ConnectorPlugin.py
+    ConnectorPlugin_ExportFeature.py
+)
+
+SET(XML_RESSOURCES
+  plugin-Connector.xml
+)
+
+ADD_CUSTOM_TARGET(ConnectorPlugin SOURCES ${PYTHON_FILES} ${XML_RESSOURCES})
+
+INSTALL(FILES ${PYTHON_FILES} ${XML_RESSOURCES} DESTINATION plugins)
diff --git a/src/ConnectorPlugin/ConnectorPlugin.py b/src/ConnectorPlugin/ConnectorPlugin.py
new file mode 100644 (file)
index 0000000..b532bbd
--- /dev/null
@@ -0,0 +1,25 @@
+"""
+Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+"""
+
+import ModelAPI
+
+from ConnectorPlugin_ExportFeature import ExportFeature
+
+
+class ConnectorPlugin(ModelAPI.ModelAPI_Plugin):
+
+    def __init__(self):
+        ModelAPI.ModelAPI_Plugin.__init__(self)
+        pass
+
+    def createFeature(self, theFeatureID):
+        if theFeatureID == ExportFeature.ID():
+            return ExportFeature().__disown__()
+        else:
+            print "ConnectorPlugin: No such feature %s" % theFeatureID
+
+plugin = ConnectorPlugin()
+aSession = ModelAPI.ModelAPI_Session.get()
+print "Module loaded. Session", aSession
+aSession.registerPlugin(plugin)
diff --git a/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py b/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py
new file mode 100644 (file)
index 0000000..953b31c
--- /dev/null
@@ -0,0 +1,67 @@
+"""
+Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+"""
+
+import ModelAPI
+import salome
+from salome.geom import geomBuilder
+
+
+class ExportFeature(ModelAPI.ModelAPI_Feature):
+
+    "Feature to create a box by drawing a sketch and extruding it"
+
+    def __init__(self):
+        ModelAPI.ModelAPI_Feature.__init__(self)
+
+    @staticmethod
+    def ID():
+        return "ExportToGEOM"
+
+    def getKind(self):
+        return ExportFeature.ID()
+
+    # This feature is action: has no property pannel and executes immideately
+    def isAction(self):
+        return True
+
+    def initAttributes(self):
+        # This feature has no attributes, but should perfore some actions on initialization
+        aSession = ModelAPI.ModelAPI_Session.get()
+        aPart = aSession.activeDocument()
+        # Get all bodies
+        kResultBodyType = "ResultBody"
+        aPartSize = aPart.size(kResultBodyType)
+        if aPartSize == 0:
+            print "No results in the active document"
+            return
+
+        aResultList = [aPart.object(kResultBodyType, idx) for idx in xrange(aPartSize)]
+        for idx, aResult in enumerate(aResultList):
+            aBodyResult = modelAPI_ResultBody(aResult)
+            if not aBodyResult:
+                continue
+            aShape = aBodyResult.shape()
+            aDump = aShape.getShapeStream()
+            # Load shape to SALOME Geom
+            geompy = geomBuilder.New(salome.myStudy)
+            aBrep = geompy.RestoreShape(aDump)
+            geompy.addToStudy(aBrep, "NewGeomShape_{0}".format(idx))
+
+    def execute(self):
+        # Nothing to execute: all logic would be in the initAttributes
+        pass
+
+# TEST
+"""
+if __name__=='__main__':
+  session = ModelAPI.ModelAPI_Session.get()
+  part = session.activeDocument()
+  session.startOperation()
+  feature = part.addFeature('Box')
+  feature.real('box_width').setValue(10)
+  feature.real('box_length').setValue(10)
+  feature.real('box_height').setValue(10)
+  feature.execute()
+  session.finishOperation()
+"""
diff --git a/src/ConnectorPlugin/ExtrusionToMesh.py b/src/ConnectorPlugin/ExtrusionToMesh.py
new file mode 100644 (file)
index 0000000..7eb0a68
--- /dev/null
@@ -0,0 +1,92 @@
+#=========================================================================
+# Creation of the circular Sketch, then Extrusion (cylinder), 
+# then export to the old GEOM and usage of SMESH for meshing.
+# Based on SALOME 7.4.0 and NewGEOM version: master 18Dec2014.
+#=========================================================================
+from ModelAPI import *
+from GeomDataAPI import *
+from GeomAlgoAPI import *
+from GeomAPI import *
+
+aSession = ModelAPI_Session.get()
+aDocument = aSession.moduleDocument()
+
+# Create a part for extrusion
+aSession.startOperation()
+aPartFeature = aDocument.addFeature("Part")
+aSession.finishOperation()
+
+aPartResult = modelAPI_ResultPart(aPartFeature.firstResult())
+aPart = aPartResult.partDoc()
+
+#=========================================================================
+# Create a sketch circle to extrude
+#=========================================================================
+aSession.startOperation()
+aSketchFeature = modelAPI_CompositeFeature(aPart.addFeature("Sketch"))
+origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
+origin.setValue(0, 0, 0)
+dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
+dirx.setValue(1, 0, 0)
+diry = geomDataAPI_Dir(aSketchFeature.attribute("DirY"))
+diry.setValue(0, 1, 0)
+norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
+norm.setValue(0, 0, 1)
+# Create circle
+aSketchCircle = aSketchFeature.addFeature("SketchCircle")
+anCircleCentr = geomDataAPI_Point2D(aSketchCircle.attribute("CircleCenter"))
+aCircleRadius = aSketchCircle.real("CircleRadius")
+anCircleCentr.setValue(50., 50)
+aCircleRadius.setValue(20.)
+aSession.finishOperation()
+
+#=========================================================================
+# Make extrusion on circle
+#=========================================================================
+# Build shape from sketcher results
+aSketchResult = aSketchFeature.firstResult()
+aSketchEdges = modelAPI_ResultConstruction(aSketchResult).shape()
+origin = geomDataAPI_Point(aSketchFeature.attribute("Origin")).pnt()
+dirX = geomDataAPI_Dir(aSketchFeature.attribute("DirX")).dir()
+dirY = geomDataAPI_Dir(aSketchFeature.attribute("DirY")).dir()
+norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm")).dir()
+aSketchFaces = ShapeList()
+GeomAlgoAPI_SketchBuilder.createFaces(
+    origin, dirX, dirY, norm, aSketchEdges, aSketchFaces)
+
+# Create extrusion
+anExtrusionFt = aPart.addFeature("Extrusion")
+anExtrusionFt.selection("extrusion_face").setValue(
+    aSketchResult, aSketchFaces[0])
+anExtrusionFt.real("extrusion_size").setValue(50)
+anExtrusionFt.boolean("extrusion_reverse").setValue(False)
+anExtrusionFt.execute()
+aSession.finishOperation()
+
+# Check extrusion results
+anExtrusionResult = modelAPI_ResultBody(anExtrusionFt.firstResult())
+
+#==================================================
+# Transfer shape to Geom module of Salome
+#==================================================
+aShape = anExtrusionResult.shape()
+aDump = aShape.getShapeStream()
+
+# Load shape to SALOME Geom
+import salome
+from salome.geom import geomBuilder
+geompy = geomBuilder.New(salome.myStudy)
+aBrep = geompy.RestoreShape(aDump)
+geompy.addToStudy(aBrep, "NewGeomShape")
+
+# Meshing of the Shape
+from salome.smesh import smeshBuilder
+meshpy = smeshBuilder.New(salome.myStudy)
+aMesh = meshpy.Mesh(aBrep)
+Regular_1D = aMesh.Segment()
+Max_Size_1 = Regular_1D.MaxSize(5)
+MEFISTO_2D = aMesh.Triangle(algo=smeshBuilder.MEFISTO)
+isDone = aMesh.Compute()
+assert (isDone)
+meshpy.SetName(aMesh.GetMesh(), 'NewGeomMesh')
+
diff --git a/src/ConnectorPlugin/plugin-Connector.xml b/src/ConnectorPlugin/plugin-Connector.xml
new file mode 100644 (file)
index 0000000..93b3977
--- /dev/null
@@ -0,0 +1,12 @@
+<plugin>
+  <workbench id="Features" document="Part">
+    <group id="Exchange">
+      <feature
+        id="ExportToGEOM"
+        title="Export to GEOM"
+        tooltip="Exports all data in GEOM compatible format"
+        icon=":pictures/part_ico.png">
+      </feature>
+    </group>
+  </workbench>
+</plugin>
\ No newline at end of file
index a8c3049c83a9e5b531eeb104bad9e56a7dceaa08..39f2449fc5fad4e942953f8015801b66bc39d42c 100644 (file)
@@ -18,7 +18,6 @@ class CONSTRUCTIONPLUGIN_EXPORT ConstructionPlugin_Plugin : public ModelAPI_Plug
   virtual FeaturePtr createFeature(std::string theFeatureID);
 
  public:
-  /// Is needed for python wrapping by swig
   ConstructionPlugin_Plugin();
 };
 
index 3ab9a1cafe5e1e7450e89be8ebbb278ef40eec9e..139e862340007e89ce5dec7723768cb401df18cd 100644 (file)
@@ -127,6 +127,7 @@ void Events_Loop::flush(const Events_ID& theID)
     std::shared_ptr<Events_Message> aGroup = aMyGroup->second;
     myGroups.erase(aMyGroup);
     send(aGroup, false);
+
     if (!aWasFlushed)
       myFlushed.erase(myFlushed.find(theID.myID));
   }
index 0671d1b597f6ad4889581bd1c7613899cea3ab48..89531bd8a225a3dccf26d764875132f95f592a3d 100644 (file)
@@ -18,7 +18,6 @@ class EXCHANGEPLUGIN_EXPORT ExchangePlugin_Plugin : public ModelAPI_Plugin
   virtual FeaturePtr createFeature(std::string theFeatureID);
 
  public:
-  /// Is needed for python wrapping by swig
   ExchangePlugin_Plugin();
 };
 
index b78a545177a6d91db47f7dd5eba57971ec05ba18..651de9badeffa4e5ee1b4fc61f873d9b7fa248f1 100644 (file)
@@ -18,7 +18,6 @@ class FEATURESPLUGIN_EXPORT FeaturesPlugin_Plugin : public ModelAPI_Plugin
   virtual FeaturePtr createFeature(std::string theFeatureID);
 
  public:
-  /// Is needed for python wrapping by swig
   FeaturesPlugin_Plugin();
 };
 
index 2df13f8cc8165fc8942ce7b6121aa0e2f3ef939e..0de88e1edf91ef91631f56abee2b149da1e21ac6 100644 (file)
@@ -65,7 +65,7 @@ SET(PROJECT_LIBRARIES
 ADD_DEFINITIONS(-DGEOMAPI_EXPORTS ${CAS_DEFINITIONS})
 ADD_LIBRARY(GeomAPI SHARED ${PROJECT_SOURCES} ${PROJECT_HEADERS})
 
-SET(CMAKE_SWIG_FLAGS "")
+SET(CMAKE_SWIG_FLAGS -threads -Wall)
 
 SET_SOURCE_FILES_PROPERTIES(GeomAPI.i PROPERTIES CPLUSPLUS ON)
 SET_SOURCE_FILES_PROPERTIES(GeomAPI.i PROPERTIES SWIG_DEFINITIONS "-shadow")
index 584e3b77dbc6b4503f0b61b0ad70576437df8ca3..5ae5c8e50fee6e2f4f5e3037c29cb1066342d4df 100644 (file)
@@ -45,7 +45,7 @@ SET(PROJECT_LIBRARIES
 ADD_DEFINITIONS(-DGEOMALGOAPI_EXPORTS ${CAS_DEFINITIONS})
 ADD_LIBRARY(GeomAlgoAPI SHARED ${PROJECT_SOURCES} ${PROJECT_HEADERS})
 
-SET(CMAKE_SWIG_FLAGS "")
+SET(CMAKE_SWIG_FLAGS "-Wall")
 
 SET_SOURCE_FILES_PROPERTIES(GeomAlgoAPI.i PROPERTIES CPLUSPLUS ON)
 SET_SOURCE_FILES_PROPERTIES(GeomAlgoAPI.i PROPERTIES SWIG_DEFINITIONS "-shadow")
index 8a058088e35cb54234d14ee4fc0d53f678a472c5..1f8880b751c479b752b6b736ba1eb38b3b90869f 100644 (file)
@@ -12,7 +12,7 @@ SET(PROJECT_HEADERS
     GeomDataAPI_Point2D.h
 )
 
-SET(CMAKE_SWIG_FLAGS "")
+SET(CMAKE_SWIG_FLAGS "-Wall")
 
 SET_SOURCE_FILES_PROPERTIES(GeomDataAPI.i PROPERTIES CPLUSPLUS ON)
 SET_SOURCE_FILES_PROPERTIES(GeomDataAPI.i PROPERTIES SWIG_DEFINITIONS "-shadow")
index d264be4d34519940d9dd5cda5dbc55886f388248..9430c7a16fce92d46ae8ac72f9cd2c08504e160d 100644 (file)
@@ -106,8 +106,9 @@ void Model_Session::redo()
 
 FeaturePtr Model_Session::createFeature(string theFeatureID)
 {
-  if (this != myImpl)
+  if (this != myImpl) {
     return myImpl->createFeature(theFeatureID);
+  }
 
   // load all information about plugins, features and attributes
   LoadPluginsInfo();
@@ -123,7 +124,7 @@ FeaturePtr Model_Session::createFeature(string theFeatureID)
     myCurrentPluginName = aPlugin.first;
     if (myPluginObjs.find(myCurrentPluginName) == myPluginObjs.end()) {
       // load plugin library if not yet done
-      Config_ModuleReader::loadLibrary(myCurrentPluginName);
+      Config_ModuleReader::loadPlugin(myCurrentPluginName);
     }
     if (myPluginObjs.find(myCurrentPluginName) != myPluginObjs.end()) {
       FeaturePtr aCreated = myPluginObjs[myCurrentPluginName]->createFeature(theFeatureID);
index 7360d0d1ef51fe79f1dfe65b332b765b4fb75301..91751aa772becc664787e5ce6007dfe6f0c17507 100644 (file)
@@ -82,6 +82,8 @@ void Model_Update::processEvent(const std::shared_ptr<Events_Message>& theMessag
     std::set<ObjectPtr>::const_iterator anObjIter = anObjs.cbegin();
     for(; anObjIter != anObjs.cend(); anObjIter++) {
       myJustCreatedOrUpdated.insert(*anObjIter);
+      // TODO(mpv): check the next line. Came into dev 0.6.1 from BR_PYTHON_PLUGIN
+      // (*anObjIter)->data()->mustBeUpdated(true); // object must be updated because it was changed
     }
     if (theMessage->eventID() == kMovedEvent)
       return; // this event is for solver update, not here
@@ -329,7 +331,9 @@ bool Model_Update::updateFeature(FeaturePtr theFeature)
       } else { // for automatically updated features (on abort, etc) it is necessary to redisplay anyway
         redisplayWithResults(theFeature, ModelAPI_StateNothing);
       }
-    } else {  // returns also true is results were updated: for sketch that refers to sub-features but results of sub-features were changed
+    } else {
+      // returns also true is results were updated: for sketch that 
+      // refers to sub-features but results of sub-features were changed
       const std::list<std::shared_ptr<ModelAPI_Result> >& aResults = theFeature->results();
       std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aRIter = aResults.begin();
       for (; aRIter != aResults.cend(); aRIter++) {
index 9729cc4b9f7dfc171a0832fe0c82ca79bb4dd7e0..e30ddf142f04d85ffa7d5271d29ac62228068689 100644 (file)
@@ -50,8 +50,9 @@ SET(PROJECT_SOURCES
 SET(PROJECT_LIBRARIES
     Config
 )
-
+SET(CMAKE_SWIG_FLAGS -threads -Wall)
 ADD_DEFINITIONS(-DMODELAPI_EXPORTS)
+
 ADD_LIBRARY(ModelAPI SHARED ${PROJECT_SOURCES} ${PROJECT_HEADERS})
 SET_TARGET_PROPERTIES(ModelAPI PROPERTIES LINKER_LANGUAGE CXX)
 TARGET_LINK_LIBRARIES(ModelAPI ${PROJECT_LIBRARIES})
@@ -63,7 +64,6 @@ INCLUDE_DIRECTORIES(
   ../GeomAlgoAPI
 )
 
-SET(CMAKE_SWIG_FLAGS "")
 
 SET_SOURCE_FILES_PROPERTIES(ModelAPI.i PROPERTIES CPLUSPLUS ON)
 # "-includeall" is not needed: it starts to follow the standard inludes (like "string") without success
index 1558e49dc64c226f2027e9732caedb7b92cf2354..bdf6c28e52b440c0161f3fd7a0010419d974c8d9 100644 (file)
@@ -1,5 +1,13 @@
 /* ModelAPI.i */
-%module ModelAPI
+%module(directors="1") ModelAPI
+%feature("director:except") {
+    if ($error != NULL) {
+      PyErr_Print();
+      std::cerr << std::endl;
+      throw Swig::DirectorMethodException();
+    }
+}
+
 %{
   #include "GeomAPI_Interface.h"
   #include "GeomAPI_Shape.h"
@@ -8,6 +16,7 @@
   #include "ModelAPI_Session.h"
   #include "ModelAPI_Object.h"
   #include "ModelAPI_Feature.h"
+  #include "ModelAPI_Plugin.h"
   #include "ModelAPI_CompositeFeature.h"
   #include "ModelAPI_Data.h"
   #include "ModelAPI_Attribute.h"
 %include "std_list.i"
 %include "std_shared_ptr.i"
 
+// directors
+%feature("director") ModelAPI_Plugin;
+%feature("director") ModelAPI_Object;
+%feature("director") ModelAPI_Feature;
+
 // shared pointers
 // For ModelAPI_ResultConstruction.shape()
 %shared_ptr(GeomAPI_Interface)
 %shared_ptr(GeomAPI_Shape)
 %shared_ptr(ModelAPI_Document)
 %shared_ptr(ModelAPI_Session)
+%shared_ptr(ModelAPI_Plugin)
 %shared_ptr(ModelAPI_Object)
 %shared_ptr(ModelAPI_Feature)
 %shared_ptr(ModelAPI_CompositeFeature)
 %include "GeomAPI_Shape.h"
 %include "ModelAPI_Document.h"
 %include "ModelAPI_Session.h"
+%include "ModelAPI_Plugin.h"
 %include "ModelAPI_Object.h"
 %include "ModelAPI_Feature.h"
 %include "ModelAPI_CompositeFeature.h"
 %include "ModelAPI_ResultParameters.h"
 %include "ModelAPI_Tools.h"
 
+// std::list -> [] 
 %template(ObjectList) std::list<std::shared_ptr<ModelAPI_Object> >;
 %template(ResultList) std::list<std::shared_ptr<ModelAPI_Result> >;
 %template(DocumentList) std::list<std::shared_ptr<ModelAPI_Document> >;
 
+// std::dynamic_pointer_cast
 template<class T1, class T2> std::shared_ptr<T1> shared_ptr_cast(std::shared_ptr<T2> theObject);
 %template(modelAPI_CompositeFeature) shared_ptr_cast<ModelAPI_CompositeFeature, ModelAPI_Feature>;
 %template(modelAPI_Feature) shared_ptr_cast<ModelAPI_Feature, ModelAPI_Object>;
+
+%template(modelAPI_Result) shared_ptr_cast<ModelAPI_Result, ModelAPI_Object>;
 %template(modelAPI_ResultConstruction) shared_ptr_cast<ModelAPI_ResultConstruction, ModelAPI_Result>;
 %template(modelAPI_ResultBody) shared_ptr_cast<ModelAPI_ResultBody, ModelAPI_Result>;
 %template(modelAPI_ResultPart) shared_ptr_cast<ModelAPI_ResultPart, ModelAPI_Result>;
 %template(modelAPI_ResultGroup) shared_ptr_cast<ModelAPI_ResultPart, ModelAPI_ResultGroup>;
+
+// Attribute casts
+%template(modelAPI_AttributeDocRef)        shared_ptr_cast<ModelAPI_AttributeDocRef, ModelAPI_Attribute>;
+%template(modelAPI_AttributeDouble)        shared_ptr_cast<ModelAPI_AttributeDouble, ModelAPI_Attribute>;
+%template(modelAPI_AttributeInteger)       shared_ptr_cast<ModelAPI_AttributeInteger, ModelAPI_Attribute>;
+%template(modelAPI_AttributeString)        shared_ptr_cast<ModelAPI_AttributeString, ModelAPI_Attribute>;
+%template(modelAPI_AttributeReference)     shared_ptr_cast<ModelAPI_AttributeReference, ModelAPI_Attribute>;
+%template(modelAPI_AttributeRefAttr)       shared_ptr_cast<ModelAPI_AttributeRefAttr, ModelAPI_Attribute>;
+%template(modelAPI_AttributeBoolean)       shared_ptr_cast<ModelAPI_AttributeBoolean, ModelAPI_Attribute>;
+%template(modelAPI_AttributeSelection)     shared_ptr_cast<ModelAPI_AttributeSelection, ModelAPI_Attribute>;
+%template(modelAPI_AttributeSelectionList) shared_ptr_cast<ModelAPI_AttributeSelectionList, ModelAPI_Attribute>;
+%template(modelAPI_AttributeRefList)       shared_ptr_cast<ModelAPI_AttributeRefList, ModelAPI_Attribute>;
index 1558c233ba3fbb32a5813850b3d518f525f02d23..bfbd03ff6f0c89a8f8a7380244a292fceda5f14f 100644 (file)
@@ -23,10 +23,10 @@ class ModelAPI_AttributeRefAttr : public ModelAPI_Attribute
   MODELAPI_EXPORT virtual bool isObject() = 0;
 
   /// Defines the reference to the attribute
-  MODELAPI_EXPORT virtual void setAttr(std::shared_ptr<ModelAPI_Attribute> theAttr) = 0;
+  MODELAPI_EXPORT virtual void setAttr(AttributePtr theAttr) = 0;
 
   /// Returns attribute referenced from this attribute
-  MODELAPI_EXPORT virtual std::shared_ptr<ModelAPI_Attribute> attr() = 0;
+  MODELAPI_EXPORT virtual AttributePtr attr() = 0;
 
   /// Defines the reference to the object
   MODELAPI_EXPORT virtual void setObject(ObjectPtr theFeature) = 0;
index c3fc113f758a603f097f1ef904944072121fe700..b23bf3f1244d42e7def9a94af7afd743a97e4d9c 100644 (file)
@@ -28,12 +28,6 @@ class MODELAPI_EXPORT ModelAPI_Plugin
   virtual ~ModelAPI_Plugin()
   {
   }
-
- protected:
-  /// Is needed for python wrapping by swig
-  ModelAPI_Plugin()
-  {
-  }
 };
 
 #endif
index d11dd623d2c4588f975a02345fc9348e74cfa456..946096f28cd658795b5a0f204c3f3924e07247d5 100644 (file)
@@ -46,10 +46,6 @@ using namespace std;
 /// Manager that will be initialized from Model package, one per application
 std::shared_ptr<ModelAPI_Session> MY_MANAGER;
 
-ModelAPI_Session::ModelAPI_Session()
-{
-}
-
 void ModelAPI_Session::setSession(std::shared_ptr<ModelAPI_Session> theManager)
 {
   MY_MANAGER = theManager;
index 4b1549b716fba367725700bb4271b888581b9a4b..f3ebb3d00aa4c5bdd4bf419c1b411f64e8b5c2fb 100644 (file)
@@ -96,9 +96,6 @@ class MODELAPI_EXPORT ModelAPI_Session
   /// Returns the validators factory: the only one instance per application
   virtual ModelAPI_ValidatorsFactory* validators() = 0;
 
-  /// Is needed for python wrapping by swig, call Get to get an instance
-  ModelAPI_Session();
-
   /// To virtually destroy the fields of successors
   virtual ~ModelAPI_Session()
   {
index fad6fa739df89b3b55d9a66ede701a2dd67bc863..a02ef822c85e1bbdc88de7c458dc031c84aa2ca6 100644 (file)
@@ -20,7 +20,6 @@ class SKETCHPLUGIN_EXPORT SketchPlugin_Plugin : public ModelAPI_Plugin, public E
   virtual FeaturePtr createFeature(std::string theFeatureID);
 
  public:
-  /// Is needed for python wrapping by swig
   SketchPlugin_Plugin();
   //! Redefinition of Events_Listener method
   virtual void processEvent(const std::shared_ptr<Events_Message>& theMessage);